From cd87e41e62169b9bb893be0188ee53f95b295e22 Mon Sep 17 00:00:00 2001
From: raiyanbinmohsin
Date: Thu, 10 Jun 2021 19:41:29 +0600
Subject: [PATCH] Merge tag 'android-11.0.0_r38' of
https://android.googlesource.com/platform/frameworks/base into r11.0
Android 11.0.0 Release 38 (RQ3A.210605.005)
---
cmds/statsd/src/atoms.proto | 16 +-
core/java/android/app/Activity.java | 6 -
.../android/app/ActivityManagerInternal.java | 22 +
core/java/android/app/ActivityThread.java | 4 +
core/java/android/app/AppOpsManager.java | 4 +-
.../admin/DevicePolicyManagerInternal.java | 7 +
.../android/app/backup/BackupManager.java | 22 +-
.../pm/parsing/ParsingPackageImpl.java | 4 +
.../hardware/camera2/CameraManager.java | 7 +-
.../hardware/display/DisplayManager.java | 58 +-
.../android/hardware/usb/AccessoryFilter.java | 2 +-
core/java/android/nfc/NfcAdapter.java | 6 +
core/java/android/os/Process.java | 49 ++
.../InsetsAnimationThreadControlRunner.java | 3 +
.../android/view/InsetsSourceConsumer.java | 15 +-
.../android/view/WindowlessWindowManager.java | 17 +-
core/java/android/widget/RemoteViews.java | 8 +
.../internal/app/NetInitiatedActivity.java | 31 -
.../com/android/internal/app/ProcessMap.java | 4 +-
core/res/AndroidManifest.xml | 8 +
.../car_borderless_button_text_color.xml | 1 +
core/res/res/color-car/car_switch_track.xml | 27 +
.../drawable-car/car_button_background.xml | 22 +
.../res/res/drawable-car/car_switch_track.xml | 2 +-
core/res/res/values-as/strings.xml | 4 +-
core/res/res/values-az/strings.xml | 8 +-
core/res/res/values-be/strings.xml | 10 +-
core/res/res/values-bg/strings.xml | 4 +-
core/res/res/values-bn/strings.xml | 2 +-
core/res/res/values-bs/strings.xml | 2 +-
core/res/res/values-ca/strings.xml | 14 +-
core/res/res/values-cs/strings.xml | 2 +-
core/res/res/values-es-rUS/strings.xml | 42 +-
core/res/res/values-eu/strings.xml | 78 +-
core/res/res/values-fa/strings.xml | 6 +-
core/res/res/values-fr-rCA/strings.xml | 4 +-
core/res/res/values-fr/strings.xml | 4 +-
core/res/res/values-gu/strings.xml | 10 +-
core/res/res/values-hi/strings.xml | 10 +-
core/res/res/values-hr/strings.xml | 12 +-
core/res/res/values-hu/strings.xml | 2 +-
core/res/res/values-hy/strings.xml | 4 +-
core/res/res/values-in/strings.xml | 8 +-
core/res/res/values-iw/strings.xml | 646 +++++++--------
core/res/res/values-ja/strings.xml | 14 +-
core/res/res/values-kk/strings.xml | 24 +-
core/res/res/values-km/strings.xml | 2 +-
core/res/res/values-kn/strings.xml | 4 +-
core/res/res/values-ko/strings.xml | 4 +-
core/res/res/values-ky/strings.xml | 24 +-
core/res/res/values-lo/strings.xml | 2 +-
core/res/res/values-mk/strings.xml | 6 +-
core/res/res/values-ml/strings.xml | 8 +-
core/res/res/values-mn/strings.xml | 18 +-
core/res/res/values-mr/strings.xml | 22 +-
core/res/res/values-ms/strings.xml | 8 +-
core/res/res/values-my/strings.xml | 4 +-
core/res/res/values-ne/strings.xml | 4 +-
core/res/res/values-nl/strings.xml | 132 +--
core/res/res/values-or/strings.xml | 14 +-
core/res/res/values-pa/strings.xml | 4 +-
core/res/res/values-pl/strings.xml | 2 +-
core/res/res/values-pt-rBR/strings.xml | 2 +-
core/res/res/values-pt-rPT/strings.xml | 6 +-
core/res/res/values-pt/strings.xml | 2 +-
core/res/res/values-ru/strings.xml | 8 +-
core/res/res/values-sq/strings.xml | 2 +-
core/res/res/values-sv/strings.xml | 20 +-
core/res/res/values-sw/strings.xml | 4 +-
core/res/res/values-ta/strings.xml | 10 +-
core/res/res/values-te/strings.xml | 100 +--
core/res/res/values-tl/strings.xml | 2 +-
core/res/res/values-tr/strings.xml | 2 +-
core/res/res/values-uk/strings.xml | 2 +-
core/res/res/values-uz/strings.xml | 16 +-
core/res/res/values-vi/strings.xml | 6 +-
core/res/res/values-zh-rHK/strings.xml | 6 +-
core/res/res/values-zh-rTW/strings.xml | 2 +-
core/res/res/values/attrs_car.xml | 24 +
data/etc/car/Android.bp | 26 +-
...l => com.android.car.activityresolver.xml} | 12 +-
...support.xml => com.android.car.rotary.xml} | 12 +-
data/etc/car/com.android.car.shell.xml | 4 +-
.../pipeline/skia/SkiaRecordingCanvas.cpp | 3 +-
.../location/GpsNetInitiatedHandler.java | 3 -
media/java/android/media/MediaRouter.java | 10 +-
media/java/android/mtp/MtpDatabase.java | 120 +--
.../layout-land/keyguard_pin_view.xml | 1 +
.../layout/keyguard_container.xml | 5 +-
.../res-keyguard/layout/keyguard_pin_view.xml | 1 +
.../res-keyguard/layout/num_pad_keys.xml | 2 -
.../res-keyguard/values/dimens.xml | 4 +-
.../res-keyguard/values/styles.xml | 7 +-
.../layout/car_fullscreen_user_switcher.xml | 16 +-
.../res/layout/car_top_navigation_bar.xml | 4 +-
.../car_top_navigation_bar_unprovisioned.xml | 3 +-
.../res/layout/headsup_container_bottom.xml | 3 +-
.../layout/notification_center_activity.xml | 21 +-
.../layout/notification_panel_container.xml | 2 +-
.../res/layout/sysui_overlay_window.xml | 30 +-
.../keyguard/CarKeyguardViewController.java | 8 +-
.../NotificationPanelViewController.java | 24 +
.../FullScreenUserSwitcherViewController.java | 21 +-
.../userswitcher/UserSwitcherContainer.java | 73 ++
.../car/window/OverlayViewController.java | 65 ++
.../OverlayViewGlobalStateController.java | 14 +
.../wm/DisplaySystemBarsController.java | 39 +-
.../OverlayViewGlobalStateControllerTest.java | 111 ++-
.../wm/DisplaySystemBarsControllerTest.java | 12 +-
.../res/values-en-rXC/strings.xml | 17 -
.../res/values-fa/strings.xml | 4 +-
.../res/values-hu/strings.xml | 2 +-
.../res/values-ky/strings.xml | 2 +-
.../res/values-mn/strings.xml | 2 +-
.../res/values-ur/strings.xml | 2 +-
.../res/values-eu/strings.xml | 2 +-
.../InputDevices/res/values-eu/strings.xml | 8 +-
.../InputDevices/res/values-ta/strings.xml | 2 +-
.../res/values-ca/strings.xml | 6 +-
.../res/values-iw/strings.xml | 28 +-
.../res/values-sv/strings.xml | 4 +-
.../packageinstaller/InstallSuccess.java | 99 ++-
.../PackageInstallerActivity.java | 12 +-
.../PrintSpooler/res/values-fa/strings.xml | 4 +-
.../PrintSpooler/res/values-iw/strings.xml | 20 +-
.../PrintSpooler/res/values-nl/strings.xml | 6 +-
.../PrintSpooler/res/values-or/strings.xml | 4 +-
.../PrintSpooler/res/values-uk/strings.xml | 2 +-
.../res/values-nl/strings.xml | 4 +-
.../SettingsLib/res/values-am/strings.xml | 4 +-
.../SettingsLib/res/values-ar/strings.xml | 2 +-
.../SettingsLib/res/values-az/strings.xml | 2 +-
.../res/values-b+sr+Latn/strings.xml | 2 +-
.../SettingsLib/res/values-bg/strings.xml | 2 +-
.../SettingsLib/res/values-bs/strings.xml | 2 +-
packages/SettingsLib/res/values-ca/arrays.xml | 2 +-
.../SettingsLib/res/values-ca/strings.xml | 2 +-
.../SettingsLib/res/values-da/strings.xml | 4 +-
.../SettingsLib/res/values-de/strings.xml | 2 +-
.../SettingsLib/res/values-el/strings.xml | 2 +-
.../SettingsLib/res/values-es-rUS/strings.xml | 6 +-
.../SettingsLib/res/values-eu/strings.xml | 2 +-
.../SettingsLib/res/values-fa/strings.xml | 8 +-
.../SettingsLib/res/values-fr-rCA/strings.xml | 4 +-
.../SettingsLib/res/values-gl/strings.xml | 2 +-
packages/SettingsLib/res/values-gu/arrays.xml | 2 +-
.../SettingsLib/res/values-gu/strings.xml | 4 +-
.../SettingsLib/res/values-hy/strings.xml | 2 +-
.../SettingsLib/res/values-is/strings.xml | 4 +-
packages/SettingsLib/res/values-iw/arrays.xml | 38 +-
.../SettingsLib/res/values-iw/strings.xml | 144 ++--
.../SettingsLib/res/values-kk/strings.xml | 10 +-
.../SettingsLib/res/values-km/strings.xml | 2 +-
.../SettingsLib/res/values-kn/strings.xml | 2 +-
packages/SettingsLib/res/values-ky/arrays.xml | 16 +-
.../SettingsLib/res/values-ky/strings.xml | 8 +-
.../SettingsLib/res/values-lt/strings.xml | 2 +-
packages/SettingsLib/res/values-mk/arrays.xml | 4 +-
.../SettingsLib/res/values-ml/strings.xml | 2 +-
.../SettingsLib/res/values-mn/strings.xml | 6 +-
.../SettingsLib/res/values-mr/strings.xml | 6 +-
.../SettingsLib/res/values-ms/strings.xml | 4 +-
.../SettingsLib/res/values-my/strings.xml | 2 +-
.../SettingsLib/res/values-nb/strings.xml | 4 +-
packages/SettingsLib/res/values-ne/arrays.xml | 2 +-
.../SettingsLib/res/values-ne/strings.xml | 4 +-
packages/SettingsLib/res/values-nl/arrays.xml | 10 +-
.../SettingsLib/res/values-nl/strings.xml | 106 +--
.../SettingsLib/res/values-or/strings.xml | 4 +-
.../SettingsLib/res/values-pa/strings.xml | 4 +-
.../SettingsLib/res/values-pl/strings.xml | 2 +-
.../SettingsLib/res/values-ru/strings.xml | 2 +-
.../SettingsLib/res/values-si/strings.xml | 2 +-
.../SettingsLib/res/values-sl/strings.xml | 2 +-
.../SettingsLib/res/values-sr/strings.xml | 2 +-
.../SettingsLib/res/values-sw/strings.xml | 2 +-
.../SettingsLib/res/values-ta/strings.xml | 2 +-
packages/SettingsLib/res/values-te/arrays.xml | 2 +-
.../SettingsLib/res/values-te/strings.xml | 18 +-
.../SettingsLib/res/values-th/strings.xml | 2 +-
.../SettingsLib/res/values-uk/strings.xml | 2 +-
.../SettingsLib/res/values-uz/strings.xml | 6 +-
.../SettingsLib/res/values-zh-rCN/strings.xml | 2 +-
.../SettingsLib/res/values-zh-rHK/strings.xml | 2 +-
.../SettingsLib/res/values-zh-rTW/strings.xml | 6 +-
.../LocalBluetoothProfileManager.java | 5 +-
.../bluetooth/MapClientProfile.java | 2 -
.../settingslib/fuelgauge/BatteryStatus.java | 8 +-
.../settingslib/media/LocalMediaManager.java | 2 +-
packages/Shell/Android.bp | 22 +-
packages/Shell/res/values-iw/strings.xml | 16 +-
packages/Shell/res/values-ky/strings.xml | 2 +-
packages/Shell/res/values-nl/strings.xml | 4 +-
packages/Shell/res/values-sv/strings.xml | 10 +-
.../shell/BugreportProgressService.java | 4 +-
.../SimAppDialog/res/values-mn/strings.xml | 4 +-
.../SoundPicker/res/values-pa/strings.xml | 2 +-
.../systemui/plugins/FalsingManager.java | 5 +-
.../NotificationSwipeActionHelper.java | 11 +-
.../res-keyguard/values-ar/strings.xml | 2 +-
.../res-keyguard/values-b+sr+Latn/strings.xml | 2 +-
.../res-keyguard/values-bg/strings.xml | 2 +-
.../res-keyguard/values-ca/strings.xml | 2 +-
.../res-keyguard/values-eu/strings.xml | 2 +-
.../res-keyguard/values-gl/strings.xml | 2 +-
.../res-keyguard/values-hy/strings.xml | 12 +-
.../res-keyguard/values-is/strings.xml | 2 +-
.../res-keyguard/values-it/strings.xml | 2 +-
.../res-keyguard/values-iw/strings.xml | 82 +-
.../res-keyguard/values-kk/strings.xml | 2 +-
.../res-keyguard/values-kn/strings.xml | 2 +-
.../res-keyguard/values-ml/strings.xml | 2 +-
.../res-keyguard/values-mn/strings.xml | 2 +-
.../res-keyguard/values-nl/strings.xml | 8 +-
.../res-keyguard/values-pa/strings.xml | 4 +-
.../res-keyguard/values-pl/strings.xml | 2 +-
.../res-keyguard/values-si/strings.xml | 2 +-
.../res-keyguard/values-sr/strings.xml | 2 +-
.../res-keyguard/values-te/strings.xml | 2 +-
.../res-keyguard/values-uk/strings.xml | 2 +-
.../res-keyguard/values-uz/strings.xml | 2 +-
.../res-keyguard/values-zh-rHK/strings.xml | 2 +-
.../res-keyguard/values-zh-rTW/strings.xml | 2 +-
.../res-product/values-az/strings.xml | 4 +-
.../res-product/values-iw/strings.xml | 10 +-
.../res-product/values-nl/strings.xml | 4 +-
.../res/drawable/ic_battery_unknown.xml | 24 +
packages/SystemUI/res/values-af/strings.xml | 3 +
packages/SystemUI/res/values-am/strings.xml | 5 +-
packages/SystemUI/res/values-ar/strings.xml | 5 +-
packages/SystemUI/res/values-as/strings.xml | 7 +-
packages/SystemUI/res/values-az/strings.xml | 3 +
.../SystemUI/res/values-b+sr+Latn/strings.xml | 3 +
packages/SystemUI/res/values-be/strings.xml | 11 +-
packages/SystemUI/res/values-bg/strings.xml | 5 +-
packages/SystemUI/res/values-bn/strings.xml | 11 +-
packages/SystemUI/res/values-bs/strings.xml | 13 +-
packages/SystemUI/res/values-ca/strings.xml | 5 +-
packages/SystemUI/res/values-cs/strings.xml | 5 +-
packages/SystemUI/res/values-da/strings.xml | 15 +-
packages/SystemUI/res/values-de/strings.xml | 7 +-
packages/SystemUI/res/values-el/strings.xml | 7 +-
.../SystemUI/res/values-en-rAU/strings.xml | 3 +
.../SystemUI/res/values-en-rCA/strings.xml | 3 +
.../SystemUI/res/values-en-rGB/strings.xml | 3 +
.../SystemUI/res/values-en-rIN/strings.xml | 3 +
.../SystemUI/res/values-en-rXC/strings.xml | 3 +
.../SystemUI/res/values-es-rUS/strings.xml | 15 +-
packages/SystemUI/res/values-es/strings.xml | 3 +
packages/SystemUI/res/values-et/strings.xml | 3 +
packages/SystemUI/res/values-eu/strings.xml | 21 +-
packages/SystemUI/res/values-fa/strings.xml | 7 +-
packages/SystemUI/res/values-fi/strings.xml | 5 +-
.../SystemUI/res/values-fr-rCA/strings.xml | 3 +
packages/SystemUI/res/values-fr/strings.xml | 31 +-
packages/SystemUI/res/values-gl/strings.xml | 13 +-
packages/SystemUI/res/values-gu/strings.xml | 19 +-
packages/SystemUI/res/values-hi/strings.xml | 25 +-
packages/SystemUI/res/values-hr/strings.xml | 11 +-
packages/SystemUI/res/values-hu/strings.xml | 5 +-
packages/SystemUI/res/values-hy/strings.xml | 19 +-
packages/SystemUI/res/values-in/strings.xml | 23 +-
packages/SystemUI/res/values-is/strings.xml | 3 +
packages/SystemUI/res/values-it/strings.xml | 7 +-
packages/SystemUI/res/values-iw/strings.xml | 193 ++---
.../SystemUI/res/values-iw/strings_tv.xml | 4 +-
packages/SystemUI/res/values-ja/strings.xml | 3 +
packages/SystemUI/res/values-ka/strings.xml | 3 +
packages/SystemUI/res/values-kk/strings.xml | 43 +-
packages/SystemUI/res/values-km/strings.xml | 23 +-
packages/SystemUI/res/values-kn/strings.xml | 5 +-
packages/SystemUI/res/values-ko/strings.xml | 11 +-
packages/SystemUI/res/values-ky/strings.xml | 31 +-
packages/SystemUI/res/values-lo/strings.xml | 7 +-
packages/SystemUI/res/values-lt/strings.xml | 5 +-
packages/SystemUI/res/values-lv/strings.xml | 5 +-
packages/SystemUI/res/values-mk/strings.xml | 5 +-
packages/SystemUI/res/values-ml/strings.xml | 11 +-
packages/SystemUI/res/values-mn/strings.xml | 27 +-
packages/SystemUI/res/values-mr/strings.xml | 3 +
packages/SystemUI/res/values-ms/strings.xml | 5 +-
packages/SystemUI/res/values-my/strings.xml | 13 +-
packages/SystemUI/res/values-nb/strings.xml | 3 +
packages/SystemUI/res/values-ne/strings.xml | 21 +-
packages/SystemUI/res/values-nl/strings.xml | 231 +++---
packages/SystemUI/res/values-or/strings.xml | 11 +-
packages/SystemUI/res/values-pa/strings.xml | 7 +-
packages/SystemUI/res/values-pl/strings.xml | 5 +-
.../SystemUI/res/values-pt-rBR/strings.xml | 17 +-
.../SystemUI/res/values-pt-rPT/strings.xml | 9 +-
packages/SystemUI/res/values-pt/strings.xml | 17 +-
packages/SystemUI/res/values-ro/strings.xml | 3 +
packages/SystemUI/res/values-ru/strings.xml | 3 +
packages/SystemUI/res/values-si/strings.xml | 3 +
packages/SystemUI/res/values-sk/strings.xml | 3 +
packages/SystemUI/res/values-sl/strings.xml | 5 +-
packages/SystemUI/res/values-sq/strings.xml | 3 +
packages/SystemUI/res/values-sr/strings.xml | 3 +
packages/SystemUI/res/values-sv/strings.xml | 31 +-
packages/SystemUI/res/values-sw/strings.xml | 9 +-
packages/SystemUI/res/values-ta/strings.xml | 23 +-
packages/SystemUI/res/values-te/strings.xml | 49 +-
packages/SystemUI/res/values-th/strings.xml | 9 +-
packages/SystemUI/res/values-tl/strings.xml | 7 +-
packages/SystemUI/res/values-tr/strings.xml | 5 +-
packages/SystemUI/res/values-uk/strings.xml | 5 +-
packages/SystemUI/res/values-ur/strings.xml | 3 +
packages/SystemUI/res/values-uz/strings.xml | 9 +-
packages/SystemUI/res/values-vi/strings.xml | 13 +-
.../SystemUI/res/values-zh-rCN/strings.xml | 12 +-
.../SystemUI/res/values-zh-rHK/strings.xml | 7 +-
.../SystemUI/res/values-zh-rTW/strings.xml | 9 +-
packages/SystemUI/res/values-zu/strings.xml | 3 +
packages/SystemUI/res/values/config.xml | 4 +
packages/SystemUI/res/values/strings.xml | 9 +
.../keyguard/KeyguardUpdateMonitor.java | 11 +-
.../android/systemui/BatteryMeterView.java | 51 +-
.../src/com/android/systemui/SwipeHelper.java | 9 +-
.../com/android/systemui/SystemUIService.java | 11 +-
.../biometrics/AuthBiometricFaceView.java | 13 +-
.../AuthBiometricFingerprintView.java | 2 +-
.../biometrics/AuthBiometricView.java | 8 +-
.../com/android/systemui/bubbles/Bubble.java | 4 +-
.../systemui/bubbles/BubbleController.java | 6 +-
.../systemui/bubbles/BubbleDataRepository.kt | 15 +-
.../systemui/bubbles/BubbleViewInfoTask.java | 4 +-
.../classifier/FalsingManagerFake.java | 2 +-
.../classifier/FalsingManagerImpl.java | 2 +-
.../classifier/FalsingManagerProxy.java | 4 +-
.../brightline/BrightLineFalsingManager.java | 3 +-
.../brightline/FalsingDataProvider.java | 5 +-
.../android/systemui/doze/DozeSensors.java | 23 +-
.../android/systemui/doze/DozeTriggers.java | 24 +-
.../media/MediaCarouselScrollHandler.kt | 4 +-
.../systemui/media/MediaControlPanel.java | 8 +-
.../systemui/media/MediaDataManager.kt | 1 +
.../systemui/privacy/PrivacyItemController.kt | 8 +-
.../screenshot/SaveImageInBackgroundTask.java | 20 +-
.../stackdivider/DividerImeController.java | 8 +-
.../systemui/stackdivider/DividerView.java | 21 +-
.../stackdivider/WindowManagerProxy.java | 5 +-
.../systemui/statusbar/DragDownHelper.java | 4 +-
.../KeyguardIndicationController.java | 138 +++-
.../statusbar/PulseExpansionHandler.kt | 3 +-
.../systemui/statusbar/StatusBarIconView.java | 27 +
.../stack/NotificationSwipeHelper.java | 2 +-
.../phone/EdgeBackGestureHandler.java | 27 +-
.../phone/KeyguardAffordanceHelper.java | 5 +-
.../NotificationPanelViewController.java | 8 +-
.../statusbar/phone/PanelViewController.java | 23 +-
.../statusbar/policy/BatteryController.java | 3 +
.../policy/BatteryControllerImpl.java | 28 +
.../statusbar/policy/BatteryStateNotifier.kt | 90 +++
.../systemui/util/wakelock/WakeLock.java | 3 +-
.../systemui/wm/DisplayImeController.java | 165 ++--
.../bubbles/BubbleControllerTest.java | 87 ++
.../systemui/doze/DozeSensorsTest.java | 10 +-
.../systemui/doze/DozeTriggersTest.java | 1 +
.../systemui/media/MediaDataManagerTest.kt | 23 +
.../privacy/PrivacyItemControllerFlagsTest.kt | 214 -----
.../privacy/PrivacyItemControllerTest.kt | 330 --------
.../KeyguardIndicationControllerTest.java | 15 +-
.../statusbar/StatusBarIconViewTest.java | 10 +
.../policy/BatteryControllerTest.java | 37 +
.../policy/BatteryStateNotifierTest.kt | 81 ++
.../res/values-mcc310-mnc004-nl/strings.xml | 4 +-
packages/Tethering/res/values-nl/strings.xml | 2 +-
.../server/backup/BackupManagerService.java | 7 +
services/core/Android.bp | 7 +
.../com/android/server/BatteryService.java | 2 +
.../server/BluetoothAirplaneModeListener.java | 4 +-
.../android/server/StorageManagerService.java | 19 +-
.../com/android/server/TelephonyRegistry.java | 3 +
.../accounts/AccountManagerService.java | 6 +-
.../com/android/server/am/ActiveServices.java | 67 +-
.../server/am/ActivityManagerService.java | 57 +-
.../java/com/android/server/am/AppErrors.java | 55 +-
.../android/server/am/CachedAppOptimizer.java | 177 ++--
.../server/am/FgsWhileInUseTempAllowList.java | 82 ++
.../com/android/server/am/OomAdjuster.java | 3 +
.../com/android/server/am/ProcessList.java | 6 +-
.../com/android/server/am/ProcessRecord.java | 31 +-
.../android/server/appop/AppOpsService.java | 8 +
.../server/display/DisplayManagerService.java | 8 +
.../display/DisplayManagerShellCommand.java | 13 +
.../server/display/DisplayModeDirector.java | 741 +++++++++++++----
.../server/display/WifiDisplayAdapter.java | 7 +-
.../SyntheticPasswordManager.java | 3 +-
.../media/MediaButtonReceiverHolder.java | 9 +-
.../server/media/MediaSessionRecord.java | 12 +
.../server/media/MediaSessionService.java | 24 +
.../server/media/MediaShellCommand.java | 2 +-
.../net/NetworkPolicyManagerService.java | 14 +-
.../notification/EventConditionProvider.java | 2 +-
.../NotificationManagerService.java | 98 ++-
.../ScheduleConditionProvider.java | 2 +-
.../com/android/server/pm/ApexManager.java | 5 +-
.../server/pm/PackageManagerService.java | 35 +-
.../server/pm/PackageManagerShellCommand.java | 13 +
.../server/policy/PhoneWindowManager.java | 12 +-
.../server/policy/WindowManagerPolicy.java | 6 +-
.../stats/pull/StatsPullAtomService.java | 30 +-
.../server/storage/StorageUserConnection.java | 279 +++----
.../{wm => }/utils/DeviceConfigInterface.java | 13 +-
.../wallpaper/WallpaperManagerService.java | 10 +-
.../server/wm/ActivityMetricsLogger.java | 4 +-
.../android/server/wm/ActivityStarter.java | 6 +-
.../com/android/server/wm/DisplayContent.java | 12 +
.../wm/EnsureActivitiesVisibleHelper.java | 9 +-
.../server/wm/HighRefreshRateBlacklist.java | 2 +-
.../server/wm/ImeInsetsSourceProvider.java | 26 +-
.../server/wm/InsetsControlTarget.java | 7 +
.../com/android/server/wm/InsetsPolicy.java | 4 +
.../server/wm/InsetsSourceProvider.java | 2 +-
.../server/wm/SplashScreenStartingData.java | 4 +-
.../core/java/com/android/server/wm/Task.java | 10 +-
.../android/server/wm/TaskDisplayArea.java | 5 +-
.../server/wm/WindowManagerConstants.java | 2 +-
.../server/wm/WindowManagerService.java | 5 +-
.../server/wm/WindowProcessController.java | 30 +-
.../com/android/server/wm/WindowToken.java | 12 +-
.../DevicePolicyManagerService.java | 38 +-
.../server/am/CachedAppOptimizerTest.java | 4 +-
services/tests/servicestests/Android.bp | 3 +-
.../display/DisplayModeDirectorTest.java | 753 +++++++++++++++++-
.../locksettings/SyntheticPasswordTests.java | 42 +-
.../testutils}/FakeDeviceConfigInterface.java | 16 +-
.../notification/BuzzBeepBlinkTest.java | 12 +-
.../NotificationManagerServiceTest.java | 53 +-
.../server/notification/RoleObserverTest.java | 4 +-
.../ActivityMetricsLaunchObserverTests.java | 16 +
.../server/wm/DisplayContentTests.java | 31 +
.../wm/HighRefreshRateBlacklistTest.java | 2 +-
.../wm/ImeInsetsSourceProviderTest.java | 20 +
.../server/wm/TestWindowManagerPolicy.java | 6 +-
.../server/wm/WindowManagerConstantsTest.java | 2 +-
.../android/server/wm/WindowTestsBase.java | 9 +
.../telephony/CarrierConfigManager.java | 16 +
.../android/telephony/SubscriptionInfo.java | 4 +-
.../telephony/SubscriptionManager.java | 8 +
.../android/telephony/TelephonyManager.java | 6 +
.../android/telephony/ims/ImsReasonInfo.java | 8 +
.../internal/telephony/ITelephony.aidl | 5 +
443 files changed, 6009 insertions(+), 3346 deletions(-)
create mode 100644 core/res/res/color-car/car_switch_track.xml
create mode 100644 core/res/res/values/attrs_car.xml
rename data/etc/car/{com.android.car.floatingcardslauncher.xml => com.android.car.activityresolver.xml} (59%)
rename data/etc/car/{com.android.car.companiondevicesupport.xml => com.android.car.rotary.xml} (59%)
create mode 100644 packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitcherContainer.java
delete mode 100644 packages/CarrierDefaultApp/res/values-en-rXC/strings.xml
create mode 100644 packages/SystemUI/res/drawable/ic_battery_unknown.xml
create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt
delete mode 100644 packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerFlagsTest.kt
delete mode 100644 packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt
create mode 100644 packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt
create mode 100644 services/core/java/com/android/server/am/FgsWhileInUseTempAllowList.java
rename services/core/java/com/android/server/{wm => }/utils/DeviceConfigInterface.java (90%)
rename services/tests/{wmtests/src/com/android/server/wm/utils => servicestests/utils/com/android/server/testutils}/FakeDeviceConfigInterface.java (92%)
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 55e1186d8610..8416ff4d557e 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -3612,11 +3612,11 @@ message AppStartOccurred {
// Empty if not set.
optional string launch_token = 13;
- // The compiler filter used when when the package was optimized.
- optional int32 package_optimization_compilation_filter = 14;
-
// The reason why the package was optimized.
- optional int32 package_optimization_compilation_reason = 15;
+ optional int32 package_optimization_compilation_reason = 14;
+
+ // The compiler filter used when when the package was optimized.
+ optional int32 package_optimization_compilation_filter = 15;
}
message AppStartCanceled {
@@ -3662,11 +3662,11 @@ message AppStartFullyDrawn {
// App startup time (until call to Activity#reportFullyDrawn()).
optional int64 app_startup_time_millis = 6;
- // The compiler filter used when when the package was optimized.
- optional int32 package_optimization_compilation_filter = 7;
-
// The reason why the package was optimized.
- optional int32 package_optimization_compilation_reason = 8;
+ optional int32 package_optimization_compilation_reason = 7;
+
+ // The compiler filter used when when the package was optimized.
+ optional int32 package_optimization_compilation_filter = 8;
}
/**
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index e123af728b20..c976a9bfb30d 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -5183,12 +5183,6 @@ protected void onApplyThemeResource(Resources.Theme theme, @StyleRes int resid,
* #checkSelfPermission(String)}.
*
*
- * Calling this API for permissions already granted to your app would show UI
- * to the user to decide whether the app can still hold these permissions. This
- * can be useful if the way your app uses data guarded by the permissions
- * changes significantly.
- *
- *
* You cannot request a permission if your activity sets {@link
* android.R.styleable#AndroidManifestActivity_noHistory noHistory} to
* true
because in this case the activity would not receive
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index a5965bc7f85f..e977bab7374e 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -377,6 +377,21 @@ public abstract void setDebugFlagsForStartingActivity(ActivityInfo aInfo, int st
*/
public abstract boolean hasRunningForegroundService(int uid, int foregroundServiceType);
+ /**
+ * Returns {@code true} if the given notification channel currently has a
+ * notification associated with a foreground service. This is an AMS check
+ * because that is the source of truth for the FGS state.
+ */
+ public abstract boolean hasForegroundServiceNotification(String pkg, @UserIdInt int userId,
+ String channelId);
+
+ /**
+ * If the given app has any FGSs whose notifications are in the given channel,
+ * stop them.
+ */
+ public abstract void stopForegroundServicesForChannel(String pkg, @UserIdInt int userId,
+ String channelId);
+
/**
* Registers the specified {@code processObserver} to be notified of future changes to
* process state.
@@ -440,4 +455,11 @@ public abstract int broadcastIntent(Intent intent,
* @return true if exists, false otherwise.
*/
public abstract boolean isPendingTopUid(int uid);
+
+ public abstract void tempAllowWhileInUsePermissionInFgs(int uid, long duration);
+
+ public abstract boolean isTempAllowlistedForFgsWhileInUse(int uid);
+
+ public abstract boolean canAllowWhileInUsePermissionInFgs(int pid, int uid,
+ @NonNull String packageName);
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 079259866145..2ba11e3a4b02 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4603,6 +4603,10 @@ public void handleTopResumedActivityChanged(IBinder token, boolean onTop, String
}
if (r.isTopResumedActivity == onTop) {
+ if (!Build.IS_DEBUGGABLE) {
+ Slog.w(TAG, "Activity top position already set to onTop=" + onTop);
+ return;
+ }
throw new IllegalStateException("Activity top position already set to onTop=" + onTop);
}
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 7bfc4603f060..6baabb69e028 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -2436,9 +2436,9 @@ public static String flagsToString(@OpFlags int flags) {
false, // READ_MEDIA_AUDIO
false, // WRITE_MEDIA_AUDIO
false, // READ_MEDIA_VIDEO
- false, // WRITE_MEDIA_VIDEO
+ true, // WRITE_MEDIA_VIDEO
false, // READ_MEDIA_IMAGES
- false, // WRITE_MEDIA_IMAGES
+ true, // WRITE_MEDIA_IMAGES
true, // LEGACY_STORAGE
false, // ACCESS_ACCESSIBILITY
false, // READ_DEVICE_IDENTIFIERS
diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java
index 62ac84b2b1e6..d24694faff93 100644
--- a/core/java/android/app/admin/DevicePolicyManagerInternal.java
+++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java
@@ -16,6 +16,7 @@
package android.app.admin;
+import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Intent;
@@ -221,6 +222,7 @@ public abstract void broadcastIntentToCrossProfileManifestReceiversAsUser(Intent
/**
* Returns the profile owner component for the given user, or {@code null} if there is not one.
*/
+ @Nullable
public abstract ComponentName getProfileOwnerAsUser(int userHandle);
/**
@@ -234,4 +236,9 @@ public abstract void broadcastIntentToCrossProfileManifestReceiversAsUser(Intent
* {@link #supportsResetOp(int)} is true.
*/
public abstract void resetOp(int op, String packageName, @UserIdInt int userId);
+
+ /**
+ * Returns whether the given package is a device owner or a profile owner in the calling user.
+ */
+ public abstract boolean isDeviceOrProfileOwnerInCallingUser(String packageName);
}
diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java
index 3bc043ee0912..acaea5fdd609 100644
--- a/core/java/android/app/backup/BackupManager.java
+++ b/core/java/android/app/backup/BackupManager.java
@@ -21,10 +21,14 @@
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.TestApi;
+import android.app.compat.CompatChanges;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledAfter;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -391,6 +395,17 @@ public boolean isBackupEnabled() {
return false;
}
+
+ /**
+ * If this change is enabled, the {@code BACKUP} permission needed for
+ * {@code isBackupServiceActive()} will be enforced on the service end
+ * rather than client-side in {@link BackupManager}.
+ * @hide
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.R)
+ public static final long IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE = 158482162;
+
/**
* Report whether the backup mechanism is currently active.
* When it is inactive, the device will not perform any backup operations, nor will it
@@ -401,8 +416,11 @@ public boolean isBackupEnabled() {
@SystemApi
@RequiresPermission(android.Manifest.permission.BACKUP)
public boolean isBackupServiceActive(UserHandle user) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
- "isBackupServiceActive");
+ if (!CompatChanges.isChangeEnabled(
+ IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE)) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
+ "isBackupServiceActive");
+ }
checkServiceBinder();
if (sService != null) {
try {
diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
index f932bc250e28..2da93ca34019 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
@@ -98,6 +98,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
public static ForInternedStringValueMap sForInternedStringValueMap =
Parcelling.Cache.getOrCreate(ForInternedStringValueMap.class);
public static ForStringSet sForStringSet = Parcelling.Cache.getOrCreate(ForStringSet.class);
+ public static ForInternedStringSet sForInternedStringSet =
+ Parcelling.Cache.getOrCreate(ForInternedStringSet.class);
protected static ParsedIntentInfo.StringPairListParceler sForIntentInfoPairs =
Parcelling.Cache.getOrCreate(ParsedIntentInfo.StringPairListParceler.class);
@@ -1026,6 +1028,7 @@ public void writeToParcel(Parcel dest, int flags) {
dest.writeBoolean(this.forceQueryable);
dest.writeParcelableList(this.queriesIntents, flags);
sForInternedStringList.parcel(this.queriesPackages, dest, flags);
+ sForInternedStringSet.parcel(this.queriesProviders, dest, flags);
dest.writeString(this.appComponentFactory);
dest.writeString(this.backupAgentName);
dest.writeInt(this.banner);
@@ -1188,6 +1191,7 @@ public ParsingPackageImpl(Parcel in) {
this.forceQueryable = in.readBoolean();
this.queriesIntents = in.createTypedArrayList(Intent.CREATOR);
this.queriesPackages = sForInternedStringList.unparcel(in);
+ this.queriesProviders = sForInternedStringSet.unparcel(in);
this.appComponentFactory = in.readString();
this.backupAgentName = in.readString();
this.banner = in.readInt();
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 352ae9da2289..6c8a8d37c707 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -1367,6 +1367,8 @@ public void onCameraClosed(String id) {
// devices going offline (in real world scenarios, these permissions aren't
// changeable). Future calls to getCameraIdList() will reflect the changes in
// the camera id list after getCameraIdListNoLazy() is called.
+ // We need to remove the torch ids which may have been associated with the
+ // devices removed as well. This is the same situation.
cameraStatuses = mCameraService.addListener(testListener);
mCameraService.removeListener(testListener);
for (CameraStatus c : cameraStatuses) {
@@ -1385,6 +1387,7 @@ public void onCameraClosed(String id) {
}
for (String id : deviceIdsToRemove) {
onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, id);
+ mTorchStatus.remove(id);
}
} catch (ServiceSpecificException e) {
// Unexpected failure
@@ -2051,7 +2054,9 @@ public void binderDied() {
// Tell listeners that the cameras and torch modes are unavailable and schedule a
// reconnection to camera service. When camera service is reconnected, the camera
// and torch statuses will be updated.
- for (int i = 0; i < mDeviceStatus.size(); i++) {
+ // Iterate from the end to the beginning befcause onStatusChangedLocked removes
+ // entries from the ArrayMap.
+ for (int i = mDeviceStatus.size() - 1; i >= 0; i--) {
String cameraId = mDeviceStatus.keyAt(i);
onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, cameraId);
}
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index c1ba2094d3cf..8c4a3bf8c434 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -61,6 +61,9 @@ public final class DisplayManager {
* {@link #EXTRA_WIFI_DISPLAY_STATUS} extra.
*
* This broadcast is only sent to registered receivers and can only be sent by the system.
+ *
+ * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} permission is required to
+ * receive this broadcast.
*
* @hide
*/
@@ -875,37 +878,76 @@ public interface DisplayListener {
public interface DeviceConfig {
/**
- * Key for refresh rate in the zone defined by thresholds.
+ * Key for refresh rate in the low zone defined by thresholds.
*
+ * Note that the name and value don't match because they were added before we had a high
+ * zone to consider.
* @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER
* @see android.R.integer#config_defaultZoneBehavior
*/
- String KEY_REFRESH_RATE_IN_ZONE = "refresh_rate_in_zone";
+ String KEY_REFRESH_RATE_IN_LOW_ZONE = "refresh_rate_in_zone";
/**
- * Key for accessing the display brightness thresholds for the configured refresh rate zone.
+ * Key for accessing the low display brightness thresholds for the configured refresh
+ * rate zone.
* The value will be a pair of comma separated integers representing the minimum and maximum
* thresholds of the zone, respectively, in display backlight units (i.e. [0, 255]).
+ *
+ * Note that the name and value don't match because they were added before we had a high
+ * zone to consider.
*
* @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER
* @see android.R.array#config_brightnessThresholdsOfPeakRefreshRate
* @hide
*/
- String KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS =
+ String KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS =
"peak_refresh_rate_brightness_thresholds";
/**
- * Key for accessing the ambient brightness thresholds for the configured refresh rate zone.
- * The value will be a pair of comma separated integers representing the minimum and maximum
- * thresholds of the zone, respectively, in lux.
+ * Key for accessing the low ambient brightness thresholds for the configured refresh
+ * rate zone. The value will be a pair of comma separated integers representing the minimum
+ * and maximum thresholds of the zone, respectively, in lux.
*
+ * Note that the name and value don't match because they were added before we had a high
+ * zone to consider.
+ *
* @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER
* @see android.R.array#config_ambientThresholdsOfPeakRefreshRate
* @hide
*/
- String KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS =
+ String KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS =
"peak_refresh_rate_ambient_thresholds";
+ /**
+ * Key for refresh rate in the high zone defined by thresholds.
+ *
+ * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER
+ * @see android.R.integer#config_fixedRefreshRateInHighZone
+ */
+ String KEY_REFRESH_RATE_IN_HIGH_ZONE = "refresh_rate_in_high_zone";
+
+ /**
+ * Key for accessing the display brightness thresholds for the configured refresh rate zone.
+ * The value will be a pair of comma separated integers representing the minimum and maximum
+ * thresholds of the zone, respectively, in display backlight units (i.e. [0, 255]).
+ *
+ * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER
+ * @see android.R.array#config_brightnessHighThresholdsOfFixedRefreshRate
+ * @hide
+ */
+ String KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS =
+ "fixed_refresh_rate_high_display_brightness_thresholds";
+ /**
+ * Key for accessing the ambient brightness thresholds for the configured refresh rate zone.
+ * The value will be a pair of comma separated integers representing the minimum and maximum
+ * thresholds of the zone, respectively, in lux.
+ *
+ * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER
+ * @see android.R.array#config_ambientHighThresholdsOfFixedRefreshRate
+ * @hide
+ */
+ String KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS =
+ "fixed_refresh_rate_high_ambient_brightness_thresholds";
/**
* Key for default peak refresh rate
*
diff --git a/core/java/android/hardware/usb/AccessoryFilter.java b/core/java/android/hardware/usb/AccessoryFilter.java
index f22dad4124d2..f4c73d56e433 100644
--- a/core/java/android/hardware/usb/AccessoryFilter.java
+++ b/core/java/android/hardware/usb/AccessoryFilter.java
@@ -101,7 +101,7 @@ public void write(XmlSerializer serializer)throws IOException {
public boolean matches(UsbAccessory acc) {
if (mManufacturer != null && !acc.getManufacturer().equals(mManufacturer)) return false;
if (mModel != null && !acc.getModel().equals(mModel)) return false;
- return !(mVersion != null && !acc.getVersion().equals(mVersion));
+ return !(mVersion != null && !mVersion.equals(acc.getVersion()));
}
/**
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index c61f10f50c93..dc4ce039bf77 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -677,6 +677,12 @@ public static NfcAdapter getDefaultAdapter(Context context) {
throw new IllegalArgumentException(
"context not associated with any application (using a mock context?)");
}
+
+ if (getServiceInterface() == null) {
+ // NFC is not available
+ return null;
+ }
+
/* use getSystemService() for consistency */
NfcManager manager = (NfcManager) context.getSystemService(Context.NFC_SERVICE);
if (manager == null) {
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index efea9537c4cf..feabd06acb8b 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -31,8 +31,12 @@
import libcore.io.IoUtils;
+import java.io.BufferedReader;
import java.io.FileDescriptor;
+import java.io.FileReader;
+import java.io.IOException;
import java.util.Map;
+import java.util.StringTokenizer;
import java.util.concurrent.TimeoutException;
/**
@@ -202,6 +206,12 @@ public class Process {
*/
public static final int SE_UID = 1068;
+ /**
+ * Defines the UID/GID for the iorapd.
+ * @hide
+ */
+ public static final int IORAPD_UID = 1071;
+
/**
* Defines the UID/GID for the NetworkStack app.
* @hide
@@ -1393,4 +1403,43 @@ public static void waitForProcessDeath(int pid, int timeout)
}
private static native int nativePidFdOpen(int pid, int flags) throws ErrnoException;
+
+ /**
+ * Checks if a process corresponding to a specific pid owns any file locks.
+ * @param pid The process ID for which we want to know the existence of file locks.
+ * @return true If the process holds any file locks, false otherwise.
+ * @throws IOException if /proc/locks can't be accessed.
+ *
+ * @hide
+ */
+ public static boolean hasFileLocks(int pid) throws Exception {
+ BufferedReader br = null;
+
+ try {
+ br = new BufferedReader(new FileReader("/proc/locks"));
+ String line;
+
+ while ((line = br.readLine()) != null) {
+ StringTokenizer st = new StringTokenizer(line);
+
+ for (int i = 0; i < 5 && st.hasMoreTokens(); i++) {
+ String str = st.nextToken();
+ try {
+ if (i == 4 && Integer.parseInt(str) == pid) {
+ return true;
+ }
+ } catch (NumberFormatException nfe) {
+ throw new Exception("Exception parsing /proc/locks at \" "
+ + line + " \", token #" + i);
+ }
+ }
+ }
+
+ return false;
+ } finally {
+ if (br != null) {
+ br.close();
+ }
+ }
+ }
}
diff --git a/core/java/android/view/InsetsAnimationThreadControlRunner.java b/core/java/android/view/InsetsAnimationThreadControlRunner.java
index 123604489da4..09e4557135b5 100644
--- a/core/java/android/view/InsetsAnimationThreadControlRunner.java
+++ b/core/java/android/view/InsetsAnimationThreadControlRunner.java
@@ -108,6 +108,9 @@ public InsetsAnimationThreadControlRunner(SparseArray contr
mControl = new InsetsAnimationControlImpl(controls, frame, state, listener,
types, mCallbacks, durationMs, interpolator, animationType);
InsetsAnimationThread.getHandler().post(() -> {
+ if (mControl.isCancelled()) {
+ return;
+ }
Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW,
"InsetsAsyncAnimation: " + WindowInsets.Type.toString(types), types);
listener.onReady(mControl, types);
diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java
index 700dc66fab55..ba40459692f7 100644
--- a/core/java/android/view/InsetsSourceConsumer.java
+++ b/core/java/android/view/InsetsSourceConsumer.java
@@ -113,13 +113,20 @@ public void setControl(@Nullable InsetsSourceControl control,
InsetsState.typeToString(control.getType()),
mController.getHost().getRootViewTitle()));
}
- // We are loosing control
if (mSourceControl == null) {
+ // We are loosing control
mController.notifyControlRevoked(this);
- // Restore server visibility.
- mState.getSource(getType()).setVisible(
- mController.getLastDispatchedState().getSource(getType()).isVisible());
+ // Check if we need to restore server visibility.
+ final InsetsSource source = mState.getSource(mType);
+ final boolean serverVisibility =
+ mController.getLastDispatchedState().getSourceOrDefaultVisibility(mType);
+ if (source.isVisible() != serverVisibility) {
+ source.setVisible(serverVisibility);
+ mController.notifyVisibilityChanged();
+ }
+
+ // For updateCompatSysUiVisibility
applyLocalVisibilityOverride();
} else {
// We are gaining control, and need to run an animation since previous state
diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java
index 1af4c3636ac5..f0006d988163 100644
--- a/core/java/android/view/WindowlessWindowManager.java
+++ b/core/java/android/view/WindowlessWindowManager.java
@@ -156,7 +156,10 @@ public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attr
mStateForWindow.put(window.asBinder(), state);
}
- return WindowManagerGlobal.ADD_OKAY | WindowManagerGlobal.ADD_FLAG_APP_VISIBLE;
+ final int res = WindowManagerGlobal.ADD_OKAY | WindowManagerGlobal.ADD_FLAG_APP_VISIBLE;
+
+ // Include whether the window is in touch mode.
+ return isInTouchMode() ? res | WindowManagerGlobal.ADD_FLAG_IN_TOUCH_MODE : res;
}
/**
@@ -207,6 +210,15 @@ private boolean isOpaque(WindowManager.LayoutParams attrs) {
return !PixelFormat.formatHasAlpha(attrs.format);
}
+ private boolean isInTouchMode() {
+ try {
+ return WindowManagerGlobal.getWindowSession().getInTouchMode();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to check if the window is in touch mode", e);
+ }
+ return false;
+ }
+
/** @hide */
protected SurfaceControl getSurfaceControl(View rootView) {
final ViewRootImpl root = rootView.getViewRootImpl();
@@ -268,7 +280,8 @@ public int relayout(IWindow window, int seq, WindowManager.LayoutParams inAttrs,
}
}
- return 0;
+ // Include whether the window is in touch mode.
+ return isInTouchMode() ? WindowManagerGlobal.RELAYOUT_RES_IN_TOUCH_MODE : 0;
}
@Override
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 7016c5cf0de6..a9b2c4df255f 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -593,6 +593,14 @@ public Resources.Theme getTheme() {
public String getPackageName() {
return mContextForResources.getPackageName();
}
+
+ @Override
+ public boolean isRestricted() {
+ // Override isRestricted and direct to resource's implementation. The isRestricted is
+ // used for determining the risky resources loading, e.g. fonts, thus direct to context
+ // for resource.
+ return mContextForResources.isRestricted();
+ }
}
private class SetEmptyView extends Action {
diff --git a/core/java/com/android/internal/app/NetInitiatedActivity.java b/core/java/com/android/internal/app/NetInitiatedActivity.java
index 92e9fe492442..5efeb0fc928e 100644
--- a/core/java/com/android/internal/app/NetInitiatedActivity.java
+++ b/core/java/com/android/internal/app/NetInitiatedActivity.java
@@ -17,18 +17,14 @@
package com.android.internal.app;
import android.app.AlertDialog;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.IntentFilter;
import android.location.LocationManagerInternal;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
-import android.widget.Toast;
import com.android.internal.R;
import com.android.internal.location.GpsNetInitiatedHandler;
@@ -43,7 +39,6 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa
private static final String TAG = "NetInitiatedActivity";
private static final boolean DEBUG = true;
- private static final boolean VERBOSE = false;
private static final int POSITIVE_BUTTON = AlertDialog.BUTTON_POSITIVE;
private static final int NEGATIVE_BUTTON = AlertDialog.BUTTON_NEGATIVE;
@@ -55,17 +50,6 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa
private int default_response = -1;
private int default_response_timeout = 6;
- /** Used to detect when NI request is received */
- private BroadcastReceiver mNetInitiatedReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (DEBUG) Log.d(TAG, "NetInitiatedReceiver onReceive: " + intent.getAction());
- if (intent.getAction() == GpsNetInitiatedHandler.ACTION_NI_VERIFY) {
- handleNIVerify(intent);
- }
- }
- };
-
private final Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
@@ -109,14 +93,12 @@ protected void onCreate(Bundle savedInstanceState) {
protected void onResume() {
super.onResume();
if (DEBUG) Log.d(TAG, "onResume");
- registerReceiver(mNetInitiatedReceiver, new IntentFilter(GpsNetInitiatedHandler.ACTION_NI_VERIFY));
}
@Override
protected void onPause() {
super.onPause();
if (DEBUG) Log.d(TAG, "onPause");
- unregisterReceiver(mNetInitiatedReceiver);
}
/**
@@ -141,17 +123,4 @@ private void sendUserResponse(int response) {
LocationManagerInternal lm = LocalServices.getService(LocationManagerInternal.class);
lm.sendNiResponse(notificationId, response);
}
-
- @UnsupportedAppUsage
- private void handleNIVerify(Intent intent) {
- int notifId = intent.getIntExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_NOTIF_ID, -1);
- notificationId = notifId;
-
- if (DEBUG) Log.d(TAG, "handleNIVerify action: " + intent.getAction());
- }
-
- private void showNIError() {
- Toast.makeText(this, "NI error" /* com.android.internal.R.string.usb_storage_error_message */,
- Toast.LENGTH_LONG).show();
- }
}
diff --git a/core/java/com/android/internal/app/ProcessMap.java b/core/java/com/android/internal/app/ProcessMap.java
index 81036f7ecba8..4917a47eb000 100644
--- a/core/java/com/android/internal/app/ProcessMap.java
+++ b/core/java/com/android/internal/app/ProcessMap.java
@@ -22,7 +22,7 @@
public class ProcessMap {
final ArrayMap> mMap
= new ArrayMap>();
-
+
public E get(String name, int uid) {
SparseArray uids = mMap.get(name);
if (uids == null) return null;
@@ -58,4 +58,6 @@ public ArrayMap> getMap() {
public int size() {
return mMap.size();
}
+
+ public void putAll(ProcessMap other) { mMap.putAll(other.mMap); }
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index dbbfe14b9943..844dd877ceda 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -115,6 +115,12 @@
+
+
+
+
+
+
@@ -485,6 +491,8 @@
+
+
diff --git a/core/res/res/color-car/car_borderless_button_text_color.xml b/core/res/res/color-car/car_borderless_button_text_color.xml
index 1cdd6cd901af..0a86e4012e99 100644
--- a/core/res/res/color-car/car_borderless_button_text_color.xml
+++ b/core/res/res/color-car/car_borderless_button_text_color.xml
@@ -16,5 +16,6 @@ limitations under the License.
+
diff --git a/core/res/res/color-car/car_switch_track.xml b/core/res/res/color-car/car_switch_track.xml
new file mode 100644
index 000000000000..8ca67dd8dda9
--- /dev/null
+++ b/core/res/res/color-car/car_switch_track.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
diff --git a/core/res/res/drawable-car/car_button_background.xml b/core/res/res/drawable-car/car_button_background.xml
index e568aebfe81d..13b0ec13f355 100644
--- a/core/res/res/drawable-car/car_button_background.xml
+++ b/core/res/res/drawable-car/car_button_background.xml
@@ -25,6 +25,22 @@ limitations under the License.
android:color="#0059B3"/>
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
-
@@ -47,6 +63,12 @@ limitations under the License.
+ -
+
+
+
+
+
-
-
diff --git a/core/res/res/drawable-car/car_switch_track.xml b/core/res/res/drawable-car/car_switch_track.xml
index cb0b9beeeab6..51e9f7eb4ebc 100644
--- a/core/res/res/drawable-car/car_switch_track.xml
+++ b/core/res/res/drawable-car/car_switch_track.xml
@@ -41,7 +41,7 @@
android:right="@dimen/car_switch_track_margin_size">
+ android:tint="@color/car_switch_track">
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 4ff2a6a062ec..2ca98b4c5f22 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -100,7 +100,7 @@
"নেটৱৰ্ক পীয়েৰে TTY ম\'ড HCOলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"
"নেটৱৰ্ক পীয়েৰে TTY ম\'ড VCO লৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"
"নেটৱৰ্ক পীয়েৰে TTY ম\'ড OFFলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"
- "কণ্ঠস্বৰ"
+ "Voice"
"ডেটা"
"ফেক্স"
"এছএমএছ"
@@ -2000,7 +2000,7 @@
"ৰুটিন ম’ডৰ তথ্য জাননী"
"চ্চাৰ্জ কৰাৰ সচৰাচৰ সময়ৰ আগতেই বেটাৰি শেষ হ’ব পাৰে"
"বেটাৰিৰ খৰচ কমাবলৈ বেটাৰি সঞ্চয়কাৰী অন কৰা হৈছে"
- "বেটাৰি সঞ্চয়কাৰী"
+ "বেটাৰী সঞ্চয়কাৰী"
"বেটাৰি সঞ্চয়কাৰী অফ কৰা হ’ল"
"ফ\'নটোত পর্যাপ্ত পৰিমাণে চার্জ আছে। সুবিধাবোৰ আৰু সীমাবদ্ধ কৰা নাই।"
"টেবলেটটোত পর্যাপ্ত পৰিমাণে চার্জ আছে। সুবিধাবোৰ আৰু সীমাবদ্ধ কৰা নাই।"
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 1d5d6d87b2c5..36c293c491c6 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -317,7 +317,7 @@
"Həyati əlamətlər haqqında sensor dataya daxil olun"
"Pəncərənin məzmununu əldə edin"
"Əlaqədə olduğunuz pəncərənin məzmununu nəzərdən keçirin."
- "Toxunaraq Kəşf et funksiyasını yandırın"
+ "Toxunuşla öyrənmə funksiyasını aktiv edin"
"Tıklanan hissələr səsləndiriləcək və ekran jestlərlə idarə oluna biləcək."
"Yazdığınız mətni izləyin"
"Kredit kartı nömrələri və parollar kimi şəxsi məlumatlar daxildir."
@@ -1615,7 +1615,7 @@
"Android TV cihazını kiliddən çıxarmaq üçün %d dəfə yanlış cəhd etdiniz. Android TV cihazınız defolt fabrik dəyərlərinə sıfırlanacaq."
"Siz telefonun kilidini açmaq üçün %d yanlış cəhd etmisiniz. Telefon artıq defolt zavod halına sıfırlanacaq."
"Siz kilidi açmaq üçün şablonu %1$d dəfə səhv çəkdiniz. %2$d daha uğursuz cəhddən sonra planşetinizin kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə ərzində bir daha yoxlayın."
- "Kiliddən çıxarma modelini %1$d dəfə yanlış çəkdiniz. Daha %2$d yanlış cəhddən sonra Android TV cihazını e-poçt hesabınızla kiliddən çıxarmağınız tələb olunacaq.\n\n %3$d saniyə sonra yenidən cəhd edin."
+ "Kiliddən çıxarma modelini %1$d dəfə yanlış çəkdiniz. Daha %2$d yanlış cəhddən sonra Android TV cihazını e-poçt hesabınızla kiliddən çıxarmağınız tələb olunacaq.\n\n %3$d saniyə sonra cəhd edin."
"Siz artıq modeli %1$d dəfə yanlış daxil etmisiniz.%2$d dəfə də yanlış daxil etsəniz, telefonun kilidinin açılması üçün elektron poçt ünvanınız tələb olunacaq.\n\n %3$d saniyə ərzində yenidən cəhd edin."
" - "
"Yığışdır"
@@ -1623,10 +1623,10 @@
"Əlçatımlılıq Qısayolu istifadə edilsin?"
"Qısayol aktiv olduqda, hər iki səs düyməsinə 3 saniyə basıb saxlamaqla əlçatımlılıq funksiyası başladılacaq."
"Əlçatımlılıq funksiyaları aktiv edilsin?"
- "Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyaları aktiv olur. Bu, cihazınızın işləmə qaydasını dəyişə bilər.\n\nCari funksiyalar:\n%1$s\nAyarlar və Əlçatımlılıq bölməsində seçilmiş funksiyaları dəyişə bilərsiniz."
+ "Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyaları aktiv olur. Cihazınızın işləmə qaydasını dəyişə bilər.\n\nCari funksiyalar:\n%1$s\nAyarlar və Əlçatımlılıq bölməsində seçilmiş funksiyaları dəyişə bilərsiniz."
" • %1$s\n"
"%1$s aktiv edilsin?"
- "Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyası olan %1$s aktiv olur. Bu, cihazınızın işləmə qaydasını dəyişə bilər.\n\nAyarlar və Əlçatımlılıq bölməsində bu qısayolu başqa bir funksiyata dəyişə bilərsiniz."
+ "Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyası olan %1$s aktiv olur. Cihazınızın işləmə qaydasını dəyişə bilər.\n\nAyarlar və Əlçatımlılıq bölməsində bu qısayolu başqa bir funksiyaya dəyişə bilərsiniz."
"Aktiv edin"
"Aktiv etməyin"
"AKTİV"
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 6fbdd4626b94..220c3520a1db 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -507,9 +507,9 @@
"Дазваляе праграме атрымліваць пакеты, адпраўленыя на ўсе прылады ў сетцы Wi-Fi з дапамогай групавых адрасоў, а не толькі на вашу прыладу Android TV. Праз гэта будзе спажывацца больш энергіі, чым у рэжыме нешматадраснай перадачы."
"Дазваляе прыкладанням атрымліваць пакеты, адпраўленыя на ўсе прылады з сеткi Wi-Fi з дапамогай групавых адрасоў, а не толькі на ваш тэлефон. Будзе выкарыстоўвацца больш энергіі, чым у рэжыме нешматадраснай перадачы."
"атрыманне доступу да налад прылады Bluetooth"
- "Дазваляе прыкладанням наладжваць лакальны планшэт Bluetooth, выяўляць і падлучаць выдаленыя прылады."
+ "Дазваляе праграме наладжваць лакальны планшэт Bluetooth, выяўляць і спалучаць выдаленыя прылады."
"Дазваляе праграме наладжваць канфігурацыю Bluetooth на прыладзе Android TV, а таксама выяўляць аддаленыя прылады і спалучацца з імі."
- "Дазваляе прыкладанням наладжваць лакальны тэлефон Bluetooth, а таксама знаходзіць выдаленыя прылады i падлучацца да ix."
+ "Дазваляе праграме наладжваць лакальны тэлефон Bluetooth, а таксама знаходзіць выдаленыя прылады i спалучаць ix."
"падключаць да WiMAX i адключаць ад яго"
"Дазваляе прыкладанню вызначаць, ці ўключаны WiMAX, і інфармацыю пра любую сетку WiMAX, якая спалучана з iншымi."
"Змяніць стан WiMAX"
@@ -775,7 +775,7 @@
"Гадавіна"
"Іншае"
"Карыстальніцкая"
- "Хатні"
+ "Асабістая"
"Працоўная"
"Іншая"
"Мабільны"
@@ -1355,7 +1355,7 @@
"Тэставы рэжым уключаны"
"Каб выключыць тэставы рэжым, скіньце налады да заводскіх значэнняў."
"Паслядоўная кансоль уключана"
- "Паказчык эфектыўнасці змяніўся. Каб выключыць кансоль, праверце загрузчык."
+ "Паказчык прадукцыйнасці змяніўся. Каб выключыць кансоль, праверце загрузчык."
"Вадкасць або смецце ў порце USB"
"Порт USB аўтаматычна адключаны. Каб даведацца больш, націсніце тут."
"Порт USB можна выкарыстоўваць"
@@ -1705,7 +1705,7 @@
"Каб пераключыцца на іншую функцыю, правядзіце ўверх трыма пальцамі і ўтрымлівайце іх на экране."
"Павелічэнне"
"Бягучы карыстальнік %1$s."
- "Пераход да %1$s..."
+ "Пераход у рэжым \"%1$s\"..."
"%1$s выходзіць з сістэмы…"
"Уладальнік"
"Памылка"
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index a7012a0c2745..8d3a23c99e3b 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1661,9 +1661,9 @@
"За превключване между функциите прекарайте три пръста нагоре и задръжте."
"Ниво на мащаба"
"Текущ потребител %1$s."
- "Превключва се към %1$s…"
+ "Превключва се към: %1$s…"
"%1$s излиза…"
- "собственик"
+ "Собственик"
"Грешка"
"Тази промяна не е разрешена от администратора ви"
"Няма намерено приложение за извършване на това действие"
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index c1c40991e902..9462be3f2f44 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1661,7 +1661,7 @@
"একটি ফিচার থেকে অন্যটিতে যেতে, তিনটি আঙ্গুল দিয়ে উপরের দিকে সোয়াইপ করে ধরে থাকুন।"
"বড় করে দেখা"
"বর্তমান ব্যবহারকারী %1$s৷"
- "%1$s নামের ব্যবহারকারীতে যাচ্ছে…"
+ "ব্যবহারকারী পরিবর্তন করে %1$s করা হচ্ছে…"
"%1$sকে লগ-আউট করা হচ্ছে..."
"মালিক"
"ত্রুটি"
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 5c5f82208499..7511455fc0ee 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1335,7 +1335,7 @@
"Omogućen način rada okvira za testiranje"
"Izvršite vraćanje na fabričke postavke da onemogućite način rada okvira za testiranje."
"Serijska konzola omogućena"
- "Izvedba je otežana. Da onemogućite, provjerite program za učitavanje operativnog sistema."
+ "Performanse su smanjene. Da onemogućite, provjerite program za učitavanje operativnog sistema."
"Tečnost ili nečistoće u USB priključku"
"USB priključak je automatski onemogućen. Dodirnite da saznate više."
"USB priključak je sada sigurno koristiti"
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index f85fe5ac9359..ca45c00fb8b3 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -524,10 +524,10 @@
"Permet que l\'aplicació conegui el nivell de complexitat del bloqueig de pantalla (alt, mitjà, baix o cap), que indica la llargària i el tipus de bloqueig de pantalla possibles. L\'aplicació també pot suggerir que els usuaris actualitzin el bloqueig de pantalla a un nivell determinat, però els usuaris poden ignorar aquestes recomanacions. Tingues en compte que el bloqueig de pantalla no s\'emmagatzema com a text sense format, de manera que l\'aplicació no coneix la contrasenya exacta."
"utilitza maquinari biomètric"
"Permet que l\'aplicació faci servir maquinari biomètric per a l\'autenticació"
- "Gestionar el maquinari d\'empremtes dactilars"
+ "Gestionar el maquinari d\'empremtes digitals"
"Permet que l\'aplicació invoqui mètodes per afegir i suprimir plantilles d\'empremtes dactilars que es puguin fer servir."
- "Utilitzar el maquinari d\'empremtes dactilars"
- "Permet que l\'aplicació faci servir maquinari d\'empremtes dactilars per a l\'autenticació"
+ "Utilitzar el maquinari d\'empremtes digitals"
+ "Permet que l\'aplicació faci servir maquinari d\'empremtes digitals per a l\'autenticació"
"modificar la teva col·lecció de música"
"Permet que l\'aplicació modifiqui la teva col·lecció de música."
"modificar la teva col·lecció de vídeos"
@@ -552,7 +552,7 @@
"L\'empremta digital s\'ha autenticat"
"Cara autenticada"
"Cara autenticada; prem el botó per confirmar"
- "El maquinari per a empremtes dactilars no està disponible."
+ "El maquinari d\'empremtes digitals no està disponible."
"L\'empremta digital no es pot desar. Suprimeix-ne una."
"S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar."
"S\'ha cancel·lat l\'operació d\'empremta digital."
@@ -956,7 +956,7 @@
"Permet que l\'aplicació modifiqui l\'historial del navegador o els marcadors de la tauleta. Això pot permetre que l\'aplicació esborri o modifiqui les dades del navegador. Nota: És possible que aquest permís no s\'apliqui a navegadors de tercers o a altres aplicacions amb capacitats de navegació web."
"Permet que l\'aplicació modifiqui l\'historial o les adreces d\'interès que hagis desat al dispositiu Android TV. D\'aquesta manera, l\'aplicació pot esborrar o modificar les dades del navegador. Nota: és possible que aquest permís no s\'apliqui a navegadors de tercers ni a altres aplicacions amb funcions de navegació web."
"Permet que l\'aplicació modifiqui l\'historial del navegador o els marcadors del telèfon. Això pot permetre que l\'aplicació esborri o modifiqui les dades del navegador. Nota: És possible que aquest permís no s\'apliqui a navegadors de tercers o a altres aplicacions amb capacitats de navegació web."
- "configuració d\'una alarma"
+ "configurar una alarma"
"Permet que l\'aplicació defineixi una alarma en una aplicació de despertador instal·lada. És possible que algunes aplicacions de despertador no incorporin aquesta funció."
"afegeix bústia de veu"
"Permet que l\'aplicació afegeixi missatges a la safata d\'entrada de la bústia de veu."
@@ -996,7 +996,7 @@
- Darrers %d dies
- Darrer dia (%d)
- "El mes passat"
+ "Darrer mes"
"Més antigues"
"el %s"
"a les %s"
@@ -2029,7 +2029,7 @@
- %s i %d fitxers més
- %s i %d fitxer més
- "No hi ha cap recomanació de persones amb qui compartir"
+ "No hi ha cap suggeriment de persones amb qui compartir"
"Llista d\'aplicacions"
"Aquesta aplicació no té permís de gravació, però pot capturar àudio a través d\'aquest dispositiu USB."
"Inici"
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 0edeb0bad4bb..a5f421390d44 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1705,7 +1705,7 @@
"Chcete-li přepnout mezi funkcemi, přejeďte nahoru třemi prsty a podržte je."
"Zvětšení"
"Aktuální uživatel je %1$s."
- "Přepínání na účet %1$s…"
+ "Přepínání na uživatele %1$s…"
"Odhlašování uživatele %1$s…"
"Vlastník"
"Chyba"
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 4d93d6eaf641..5b216612430e 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -325,8 +325,8 @@
"Controla el posicionamiento y el nivel de zoom de la pantalla."
"Usar gestos"
"Permite presionar, deslizar, pellizcar y usar otros gestos."
- "Gestos del sensor de huellas digitales"
- "Captura los gestos que se hacen en el sensor de huellas digitales del dispositivo."
+ "Gestos del sensor de huellas dactilares"
+ "Captura los gestos que se hacen en el sensor de huellas dactilares del dispositivo."
"Tomar captura de pantalla"
"Puede tomar una captura de la pantalla."
"desactivar o modificar la barra de estado"
@@ -511,9 +511,9 @@
"Permite que la app conecte el dispositivo Android TV a redes WiMAX y que lo desconecte de ellas."
"Permite que la aplicación conecte el dispositivo a una red WiMAX y que lo desconecte de ella."
"vincular con dispositivos Bluetooth"
- "Permite que la aplicación vea la configuración de Bluetooth de la tablet y que cree y acepte conexiones con los dispositivos sincronizados."
- "Permite que la app vea la configuración de Bluetooth del dispositivo Android TV, así como que cree y acepte conexiones con los dispositivos sincronizados."
- "Permite que la aplicación vea la configuración de Bluetooth del dispositivo y que cree y acepte conexiones con los dispositivos sincronizados."
+ "Permite que la aplicación vea la configuración de Bluetooth de la tablet y que cree y acepte conexiones con los dispositivos vinculados."
+ "Permite que la app vea la configuración de Bluetooth del dispositivo Android TV, así como que cree y acepte conexiones con los dispositivos vinculados."
+ "Permite que la aplicación vea la configuración de Bluetooth del dispositivo y que cree y acepte conexiones con los dispositivos vinculados."
"Información sobre servicio de pago NFC preferido"
"Permite que la app reciba información del servicio de pago NFC preferido, como el servicio de asistencia registrado y el destino de la ruta."
"controlar la Transmisión de datos en proximidad"
@@ -524,10 +524,10 @@
"Permite que la app conozca el nivel de complejidad del bloqueo de pantalla (alta, media, baja o ninguna), lo que indica el rango de duración posible y el tipo de bloqueo. La app también puede sugerirles a los usuarios que actualicen el bloqueo de pantalla a un determinado nivel, aunque ellos pueden ignorar esta sugerencia y seguir navegando. Ten en cuenta que el bloqueo de pantalla no se almacena como texto sin formato, por lo que la app no conoce la contraseña exacta."
"usar hardware biométrico"
"Permite que la app use hardware biométrico para realizar la autenticación"
- "Administrar el hardware de huellas digitales"
- "Permite que la aplicación emplee métodos para agregar y eliminar plantillas de huellas digitales para su uso."
- "Utilizar hardware de huellas digitales"
- "Permite que la aplicación utilice el hardware de huellas digitales para realizar la autenticación."
+ "Administrar el hardware de huellas dactilares"
+ "Permite que la aplicación emplee métodos para agregar y eliminar plantillas de huellas dactilares para su uso."
+ "Utilizar hardware de huellas dactilares"
+ "Permite que la aplicación utilice el hardware de huellas dactilares para realizar la autenticación."
"modificar tu colección de música"
"Permite que la app modifique tu colección de música."
"modificar tu colección de videos"
@@ -542,31 +542,31 @@
"No se reconoció"
"Se canceló la autenticación"
"No se estableció ningún PIN, patrón ni contraseña"
- "Se detectó parcialmente la huella digital. Vuelve a intentarlo."
- "No se pudo procesar la huella digital. Vuelve a intentarlo."
- "El sensor de huellas digitales está sucio. Limpia el sensor y vuelve a intentarlo."
+ "Se detectó parcialmente la huella dactilar. Vuelve a intentarlo."
+ "No se pudo procesar la huella dactilar. Vuelve a intentarlo."
+ "El sensor de huellas dactilares está sucio. Limpia el sensor y vuelve a intentarlo."
"Moviste el dedo muy rápido. Vuelve a intentarlo."
"Moviste el dedo muy lento. Vuelve a intentarlo."
- "Se autenticó la huella digital"
+ "Se autenticó la huella dactilar"
"Se autenticó el rostro"
"Se autenticó el rostro; presiona Confirmar"
- "El hardware para detectar huellas digitales no está disponible."
- "No se puede almacenar la huella digital. Elimina una de las existentes."
- "Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo."
- "Se canceló la operación de huella digital."
- "El usuario canceló la operación de huella digital."
+ "El hardware para detectar huellas dactilares no está disponible."
+ "No se puede almacenar la huella dactilar. Elimina una de las existentes."
+ "Finalizó el tiempo de espera para la huella dactilar. Vuelve a intentarlo."
+ "Se canceló la operación de huella dactilar."
+ "El usuario canceló la operación de huella dactilar."
"Demasiados intentos. Vuelve a intentarlo más tarde."
- "Realizaste demasiados intentos. Se inhabilitó el sensor de huellas digitales."
+ "Realizaste demasiados intentos. Se inhabilitó el sensor de huellas dactilares."
"Vuelve a intentarlo."
"No se registraron huellas digitales."
- "Este dispositivo no tiene sensor de huellas digitales."
+ "Este dispositivo no tiene sensor de huellas dactilares."
"Se inhabilitó temporalmente el sensor."
"Dedo %d"
- "Ícono de huella digital"
+ "Ícono de huella dactilar"
"administrar el hardware de desbloqueo facial"
"Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso."
"usar el hardware de desbloqueo facial"
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 5e52506c40db..99012924a3e2 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -93,7 +93,7 @@
"Datu-konexioaren egoera"
"SMS mezuak"
"Erantzungailuko mezuak"
- "Wi-Fi bidezko deiak"
+ "Wifi bidezko deiak"
"SIMaren egoera"
"SIM txartelaren lehentasun handiko jakinarazpenak"
"Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du"
@@ -122,23 +122,23 @@
"Ibiltaritzari buruzko jakinarazpena aktibatuta"
"Ibiltaritzari buruzko jakinarazpena desaktibatuta"
"Zerbitzu bila"
- "Ezin izan dira konfiguratu Wi‑Fi bidezko deiak"
+ "Ezin izan dira konfiguratu wifi bidezko deiak"
- - "Wi-Fi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wi-Fi bidezko deiak Ezarpenak atalean. (Errore-kodea: %1$s)"
+ - "Wifi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wifi bidezko deiak Ezarpenak atalean. (Errore-kodea: %1$s)"
- - "Arazo bat izan da Wi‑Fi bidezko deiak zure operadorearekin erregistratzean: %1$s"
+ - "Arazo bat izan da wifi bidezko deiak zure operadorearekin erregistratzean: %1$s"
- "%s Wi-Fi bidezko deiak"
+ "%s operadorearen wifi bidezko deiak"
"%s operadorearen wifi bidezko deiak"
"WLAN bidezko deia"
"%s WLAN bidezko deia"
"%s wifia"
"Wi-Fi bidezko deiak | %s"
"%s VoWifi"
- "Wi-Fi bidezko deiak"
+ "Wifi bidezko deiak"
"Wifia"
"Wi-Fi bidezko deiak"
"VoWifi"
@@ -192,7 +192,7 @@
"Jabeak kudeatzen du gailua"
"Erakundeak kudeatzen du gailua eta baliteke sareko trafikoa gainbegiratzea. Sakatu hau xehetasunak ikusteko."
"Aplikazioek zure kokapena atzi dezakete"
- "Informazio gehiago lortzeko, jo IKT sailaren administratzailearengana"
+ "Informazio gehiago lortzeko, jo IKT saileko administratzailearengana"
"Herrialde-hautemailea"
"Kokapen-zerbitzua"
"Sentsorearen jakinarazpen-zerbitzua"
@@ -244,7 +244,7 @@
"Amaitu saioa"
"Pantaila-argazkia"
"Akatsen txostena"
- "Gailuaren uneko egoerari buruzko informazioa bilduko da, mezu elektroniko gisa bidaltzeko. Minutu batzuk igaroko dira akatsen txostena sortzen hasten denetik bidaltzeko prest egon arte. Itxaron, mesedez."
+ "Gailuaren oraingo egoerari buruzko informazioa bilduko da, mezu elektroniko gisa bidaltzeko. Minutu batzuk igaroko dira akatsen txostena sortzen hasten denetik bidaltzeko prest egon arte. Itxaron, mesedez."
"Txosten dinamikoa"
"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."
"Txosten osoa"
@@ -305,8 +305,8 @@
"atzitu gailuko argazkiak, multimedia-edukia eta fitxategiak"
"Mikrofonoa"
"grabatu audioa"
- "Ariketa fisikoa"
- "ariketa fisikoak atzitu"
+ "Jarduera fisiko"
+ "jarduera fisikoa atzitu"
"Kamera"
"atera argazkiak eta grabatu bideoak"
"Deien erregistroa"
@@ -348,13 +348,13 @@
"jaso testu-mezuak (MMSak)"
"MMS mezuak jasotzeko eta prozesatzeko baimena ematen die aplikazioei. Horrela, aplikazioak gailura bidalitako mezuak kontrola eta ezaba ditzake zuri erakutsi gabe."
"desbideratu sare mugikor bidezko igorpen-mezuak"
- "Sare mugikor bidezko igorpen-modulura lotzeko baimena ematen dio aplikazioari, sare mugikor bidezko igorpen-mezuak jaso ahala desbideratu ahal izateko. Sare mugikor bidezko igorpen-alertak kokapen batzuetan entregatzen dira larrialdi-egoeren berri emateko. Sare mugikor bidezko larrialdi-igorpenak jasotzean, aplikazio gaiztoek gailuaren errendimenduari edota funtzionamenduari eragin diezaiokete."
+ "Sare mugikor bidezko igorpen-modulura lotzeko baimena ematen dio aplikazioari, sare mugikor bidezko igorpen-mezuak jaso ahala desbideratu ahal izateko. Sare mugikor bidezko igorpen-alertak kokapen batzuetan entregatzen dira larrialdi-egoeren berri emateko. Sare mugikor bidezko larrialdi-igorpenak jasotzean, asmo txarreko aplikazioek gailuaren errendimenduari edota funtzionamenduari eragin diezaiokete."
"irakurri sare mugikor bidezko igorpen-mezuak"
- "Gailuak jasotako sare mugikor bidezko igorpenen mezuak irakurtzeko baimena ematen die aplikazioei. Sare mugikor bidezko igorpen-alertak kokapen batzuetan ematen dira larrialdi-egoeren berri emateko. Aplikazio gaiztoek gailuaren errendimendua edo funtzionamendua oztopa dezakete larrialdi-igorpen horietako bat jasotzen denean."
+ "Gailuak jasotako sare mugikor bidezko igorpenen mezuak irakurtzeko baimena ematen die aplikazioei. Sare mugikor bidezko igorpen-alertak kokapen batzuetan ematen dira larrialdi-egoeren berri emateko. Asmo txarreko aplikazioek gailuaren errendimendua edo funtzionamendua oztopa dezakete larrialdi-igorpen horietako bat jasotzen denean."
"irakurri harpidetutako jarioak"
"Une horretan sinkronizatutako jarioei buruzko xehetasunak lortzeko baimena ematen die aplikazioei."
"bidali eta ikusi SMS mezuak"
- "SMS mezuak bidaltzeko baimena ematen die aplikazioei. Horrela, ustekabeko gastuak eragin daitezke. Aplikazio gaiztoek erabil dezakete zuk berretsi gabeko mezuak bidalita gastuak eragiteko."
+ "SMS mezuak bidaltzeko baimena ematen die aplikazioei. Horrela, ustekabeko gastuak eragin daitezke. Asmo txarreko aplikazioek erabil dezakete zuk berretsi gabeko mezuak bidalita gastuak eragiteko."
"irakurri testu-mezuak (SMSak edo MMSak)"
"Aplikazioak tabletan gordetako SMS mezu (testu-mezu) guztiak irakur ditzake."
"Aplikazioek Android TV gailuan gordetako SMS (testu) mezu guztiak irakur ditzakete."
@@ -386,7 +386,7 @@
"neurtu aplikazioen biltegiratzeko tokia"
"Bere kodea, datuak eta cache-tamainak eskuratzeko baimena ematen die aplikazioei."
"aldatu sistemaren ezarpenak"
- "Sistemaren ezarpenen datuak aldatzeko baimena ematen die aplikazioei. Aplikazio gaiztoek sistemaren konfigurazioa hondatzeko erabil dezakete."
+ "Sistemaren ezarpenen datuak aldatzeko baimena ematen die aplikazioei. Asmo txarreko aplikazioek sistemaren konfigurazioa hondatzeko erabil dezakete."
"exekutatu abiaraztean"
"Sistema berrabiarazi bezain laster abiarazteko baimena ematen die aplikazioei. Horrela, agian denbora gehiago beharko du tabletak abiarazteko, eta tabletaren funtzionamendu orokorra mantso daiteke, baimen hori duten aplikazioak beti abian egongo baitira."
"Sistema abiarazi bezain laster beren burua abiarazteko baimena ematen die aplikazioei. Baliteke denbora gehiago behar izatea Android TV gailua abiarazteko eta aplikazioek gailua orokorrean mantsoago ibilarazteko baimena izatea, beti abian izango baita."
@@ -396,9 +396,9 @@
"Igorpen iraunkorrak egiteko baimena ematen die aplikazioei. Igorpena amaitu ondoren ere igortzen jarraitzen dute igorpen iraunkorrek. Gehiegi erabiliz gero, Android TV gailua motel edo ezegonkor ibiliko da, memoria gehiago erabiliko delako."
"Igorpen iraunkorrak emateko baimena ematen die; horiek igorpena amaitu ondoren mantentzen dira. Gehiegi erabiliz gero, telefonoa motel edo ezegonkor ibiliko da, memoria gehiago erabiliko delako."
"irakurri kontaktuak"
- "Tabletan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten tabletako kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke aplikazio gaiztoek zuk jakin gabe partekatzea datu horiek."
- "Android TV gailuan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten Android TV gailuko kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke aplikazio gaiztoek zuk jakin gabe partekatzea datu horiek."
- "Telefonoan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten telefonoko kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke aplikazio gaiztoek zuk jakin gabe partekatzea datu horiek."
+ "Tabletan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten tabletako kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke asmo txarreko aplikazioek zuk jakin gabe partekatzea datu horiek."
+ "Android TV gailuan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten Android TV gailuko kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke asmo txarreko aplikazioek zuk jakin gabe partekatzea datu horiek."
+ "Telefonoan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten telefonoko kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke asmo txarreko aplikazioek zuk jakin gabe partekatzea datu horiek."
"aldatu kontaktuak"
"Tabletan gordetako kontaktuei buruzko datuak aldatzeko baimena ematen dio aplikazioari. Baimen horrekin, aplikazioek kontaktuen datuak ezaba ditzakete."
"Android TV gailuan gordetako kontaktuei buruzko datuak aldatzeko baimena ematen dio aplikazioari. Baimen horrekin, aplikazioek kontaktuen datuak ezaba ditzakete."
@@ -406,9 +406,9 @@
"irakurri deien erregistroa"
"Aplikazioak deien historia irakur dezake."
"idatzi deien erregistroan"
- "Tabletaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Aplikazio gaiztoek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete."
- "Android TV gailuko deien erregistroa aldatzeko baimena ematen die aplikazioei, jasotako eta egindako deiei buruzko datuak barne. Baliteke aplikazio gaiztoek deien erregistroa ezabatzea edo aldatzea."
- "Telefonoaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Aplikazio gaiztoek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete."
+ "Tabletaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Asmo txarreko aplikazioek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete."
+ "Android TV gailuko deien erregistroa aldatzeko baimena ematen die aplikazioei, jasotako eta egindako deiei buruzko datuak barne. Baliteke asmo txarreko aplikazioek deien erregistroa ezabatzea edo aldatzea."
+ "Telefonoaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Asmo txarreko aplikazioek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete."
"Atzitu gorputzaren sentsoreak (adibidez, bihotz-maiztasunarenak)"
"Zure egoera fisikoa kontrolatzen duten sentsoreetako datuak (adibidez, bihotz-maiztasuna) atzitzeko baimena ematen die aplikazioei."
"irakurri egutegiko gertaerak eta xehetasunak"
@@ -433,11 +433,11 @@
"Aplikazioak edonoiz erabil dezake mikrofonoa audioa grabatzeko."
"bidali aginduak SIM txartelera"
"SIM txartelera aginduak bidaltzeko aukera ematen die aplikazioei. Oso arriskutsua da."
- "hauteman ariketa fisikoa"
- "Aplikazioak ariketa fisikoa hauteman dezake."
+ "hauteman jarduera fisiko"
+ "Aplikazioak jarduera fisiko hauteman dezake."
"atera argazkiak eta grabatu bideoak"
"Aplikazioak edonoiz erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko."
- "onartu aplikazio edo zerbitzu bati sistemako kamerak atzitzea argazkiak eta bideoak ateratzeko"
+ "eman sistemako kamerak atzitzeko baimena aplikazio edo zerbitzu bati argazkiak ateratzeko eta bideoak grabatzeko"
"Pribilegioa duen edo sistemakoa den aplikazio honek edonoiz erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko. Halaber, android.permission.CAMERA baimena izan behar du aplikazioak."
"eman jakinarazpenak jasotzeko baimena aplikazioari edo zerbitzuari kamerak ireki edo ixten direnean."
"Kamera ireki edo itxi dela (eta zer aplikaziorekin) dioten jakinarazpenak jaso ditzake aplikazio honek."
@@ -445,7 +445,7 @@
"Bibragailua kontrolatzeko aukera ematen die aplikazioei."
"Dardara-egoera atzitzeko baimena ematen dio aplikazioari."
"deitu zuzenean telefono-zenbakietara"
- "Telefono-zenbakietara zuk esku hartu gabe deitzeko baimena ematen die aplikazioei. Horrela, ustekabeko gastuak edo deiak eragin daitezke. Aplikazio gaiztoek erabil dezakete zuk berretsi gabeko deiak eginda gastuak eragiteko."
+ "Telefono-zenbakietara zuk esku hartu gabe deitzeko baimena ematen die aplikazioei. Horrela, ustekabeko gastuak edo deiak eragin daitezke. Asmo txarreko aplikazioek erabil dezakete zuk berretsi gabeko deiak eginda gastuak eragiteko."
"atzitu IMS dei-zerbitzua"
"Zuk ezer egin beharrik gabe deiak egiteko IMS zerbitzua erabiltzeko baimena ematen die aplikazioei."
"irakurri telefonoaren egoera eta identitatea"
@@ -658,7 +658,7 @@
"atzitu DRM ziurtagiriak"
"DRM ziurtagiriak hornitzea eta erabiltzeko baimena ematen die aplikazioei. Aplikazio normalek ez lukete beharko."
"Jaso Android Beam transferentzien egoera"
- "Uneko Android Beam transferentziei buruzko informazioa jasotzeko baimena ematen die aplikazioei"
+ "Oraingo Android Beam transferentziei buruzko informazioa jasotzeko baimena ematen die aplikazioei"
"kendu DRM ziurtagiriak"
"DRM ziurtagiriak kentzea baimentzen die aplikazioei. Aplikazio normalek ez lukete beharko."
"lotu operadorearen mezularitza-zerbitzuari"
@@ -961,7 +961,7 @@
"gehitu erantzungailua"
"Erantzungailuko sarrera-ontzian mezuak gehitzeko baimena ematen die aplikazioei."
"aldatu arakatzailearen geokokapenaren baimenak"
- "Arakatzailearen geokokapenaren baimenak aldatzeko baimena ematen die aplikazioei. Aplikazio gaiztoek hori erabil dezakete kokapenari buruzko informazioa haiek hautatutako webguneetara bidaltzeko."
+ "Arakatzailearen geokokapenaren baimenak aldatzeko baimena ematen die aplikazioei. Asmo txarreko aplikazioek hori erabil dezakete kokapenari buruzko informazioa haiek hautatutako webguneetara bidaltzeko."
"Arakatzaileak pasahitza gogoratzea nahi duzu?"
"Ez une honetan"
"Gogoratu"
@@ -1179,11 +1179,11 @@
"Eskala"
"Erakutsi beti"
"Gaitu hori berriro Sistemaren ezarpenak > Aplikazioak > Deskargatutakoak."
- "%1$s aplikazioak ez du onartzen uneko pantailaren tamaina eta espero ez bezala joka lezake."
+ "%1$s aplikazioak ez du onartzen pantailaren tamaina, eta baliteke espero ez bezala jokatzea."
"Erakutsi beti"
"Android sistema eragilearen bertsio bateraezin baterako dago egina %1$s; beraz, espero ez bezala funtziona lezake. Baliteke aplikazioaren bertsio eguneratuago bat eskuragarri egotea."
"Erakutsi beti"
- "Bilatu eguneratzea"
+ "Bilatu eguneratzeak"
"%1$s aplikazioak (%2$s prozesua) berak aplikatutako StrictMode gidalerroa urratu du."
"%1$s prozesuak bere kabuz ezarritako StrictMode gidalerroak urratu ditu."
"Telefonoa eguneratzen ari da…"
@@ -1203,15 +1203,15 @@
"%1$s abian da"
"Sakatu jokora itzultzeko"
"Aukeratu joko bat"
- "Funtzionamendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean."
+ "Errendimendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean."
"Itzuli %1$s aplikaziora"
"Ireki %1$s"
"Gorde gabe itxiko da %1$s"
"%1$s prozesuak memoria-muga gainditu du"
"Prest dago %1$s memoria-iraulketaren txostena"
- "Sortu da uneko memoria-iraulketaren txostena. Sakatu partekatzeko."
- "Uneko memoria-iraulketaren txostena partekatu nahi duzu?"
- "%1$s prozesuak memoria-muga (%2$s) gainditu du. Uneko memoria-iraulketaren txostena sortu da, garatzailearekin parteka dezazun. Kontuz: baliteke txosten horrek aplikazioak atzi dezakeen informazio pertsonala izatea."
+ "Sortu da memoria-iraulketaren txostena. Sakatu partekatzeko."
+ "Memoria-iraulketaren txostena partekatu nahi duzu?"
+ "%1$s prozesuak memoria-muga (%2$s) gainditu du. Memoria-iraulketaren txostena sortu da, garatzailearekin parteka dezazun. Kontuz: baliteke txosten horrek aplikazioak atzi dezakeen informazio pertsonala izatea."
"%1$s prozesuak bere memoria-muga (%2$s) gainditu du. Memoria-iraulketaren txosten bat duzu erabilgarri, hura partekatu nahi baduzu ere. Kontuz: baliteke txosten horrek prozesuak atzi dezakeen kontuzko informazio pertsonala izatea eta datu horien barnean zuk idatzitakoak egotea, besteak beste."
"%1$s prozesuaren memoria-iraulketaren txosten bat duzu erabilgarri, hura partekatu nahi baduzu ere. Kontuz: baliteke txosten horrek prozesuak atzi dezakeen kontuzko informazio pertsonala izatea eta datu horien barnean zuk idatzitakoak egotea, besteak beste."
"Aukeratu testurako ekintza"
@@ -1315,7 +1315,7 @@
"Proba-materialeko modua gaitu da"
"Proba-materialaren modua desgaitzeko, berrezarri jatorrizko datuak."
"Serie-kontsola gaituta"
- "Funtzionamenduari eragiten dio. Desgaitzeko, joan abiarazlera."
+ "Errendimenduari eragiten dio. Desgaitzeko, joan abiarazlera."
"Likidoa edo zikinkeriak daude USB atakan"
"USB ataka automatikoki desgaitu da. Informazio gehiago lortzeko, sakatu hau."
"Erabiltzeko moduan dago USB ataka"
@@ -1339,7 +1339,7 @@
"Ez baduzu nahi %s zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."
"Desaktibatu"
"%s egiaztatzen…"
- "Uneko edukia berrikusten"
+ "Edukia berrikusten"
"Euskarri berria: %s"
"%s ez da funtzionatzen ari"
"Sakatu konfiguratzeko"
@@ -1574,7 +1574,7 @@
"Pantaila integratua"
"HDMI pantaila"
"%1$d. gainjartzea"
- "%1$s: %2$d x %3$d, %4$d dpi"
+ "%1$s: %2$d × %3$d, %4$d dpi"
", segurua"
"Eredua ahaztu zaizu"
"Eredu okerra"
@@ -1623,7 +1623,7 @@
"Erabilerraztasun-lasterbidea erabili nahi duzu?"
"Lasterbidea aktibatuta dagoenean, bi bolumen-botoiak hiru segundoz sakatuta abiaraziko da erabilerraztasun-eginbidea."
"Erabilerraztasun-eginbideak aktibatu nahi dituzu?"
- "Eduki sakatuta bolumen-botoiak segundo batzuez erabilerraztasun-eginbideak aktibatzeko. Hori eginez gero, baliteke zure mugikorraren funtzionamendua aldatzea.\n\nUneko eginbideak:\n%1$s\nHautatutako eginbideak aldatzeko, joan Ezarpenak > Erabilerraztasuna atalera."
+ "Eduki sakatuta bolumen-botoiak segundo batzuez erabilerraztasun-eginbideak aktibatzeko. Hori eginez gero, baliteke zure mugikorraren funtzionamendua aldatzea.\n\nEginbideak:\n%1$s\nHautatutako eginbideak aldatzeko, joan Ezarpenak > Erabilerraztasuna atalera."
" • %1$s\n"
"%1$s aktibatu nahi duzu?"
"Eduki sakatuta bolumen-botoiak segundo batzuez %1$s izeneko erabilerraztasun-eginbidea aktibatzeko. Honen bidez, baliteke zure mugikorraren funtzionamendua aldatzea.\n\nLasterbide hau beste eginbide batengatik aldatzeko, joan Ezarpenak > Erabilerraztasuna atalera."
@@ -1660,8 +1660,8 @@
"Eginbide batetik bestera aldatzeko, pasatu bi hatz pantailaren behealdetik gora eta eduki sakatuta une batez."
"Eginbide batetik bestera aldatzeko, pasatu hiru hatz pantailaren behealdetik gora eta eduki sakatuta une batez."
"Lupa"
- "Uneko erabiltzailea: %1$s."
- "%1$s erabiltzailera aldatzen…"
+ "Erabiltzailea: %1$s."
+ "\"%1$s\" erabiltzailera aldatzen…"
"%1$s erabiltzailearen saioa amaitzen…"
"Jabea"
"Errorea"
@@ -1760,7 +1760,7 @@
"Idatzi administratzailearen PIN kodea"
"Idatzi PINa"
"Okerra"
- "Uneko PINa"
+ "Oraingo PINa"
"PIN berria"
"Berretsi PIN berria"
"Konfiguratu debekuak aldatu ahal izateko idatzi beharko den PIN kodea"
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 03a1456d00c5..3dd8173ae4e1 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -997,7 +997,7 @@
- %d روز قبل
"ماه گذشته"
- "قدیمی تر"
+ "قدیمیتر"
"در %s"
"در %s"
"در %s"
@@ -1423,7 +1423,7 @@
"شنونده اعلان"
"شنونده VR"
"ارائهدهنده وضعیت"
- "سرویس رتبهبندی اعلان"
+ "سرویس ردهبندی اعلان"
"VPN فعال شد"
"VPN را %s فعال کرده است"
"برای مدیریت شبکه ضربه بزنید."
@@ -1625,7 +1625,7 @@
"ویژگیهای دسترسپذیری روشن شود؟"
"با پایین نگه داشتن هردو کلید میزان صدا بهمدت چند ثانیه، ویژگیهای دسترسپذیری روشن میشود. با این کار نحوه عملکرد دستگاهتان تغییر میکند.\n\nویژگیهای فعلی:\n%1$s\nمیتوانید ویژگیهای انتخابی را در «تنظیمات > دسترسپذیری» تغییر دهید."
" • %1$s\n"
- "%1$s روشن شود؟"
+ "سرویس %1$s روشن شود؟"
"با پایین نگه داشتن هردو کلید میزان صدا بهمدت چند ثانیه، %1$s (یکی از ویژگیهای دسترسپذیری) روشن میشود. با این کار نحوه عملکرد دستگاهتان تغییر میکند.\n\nمیتوانید در «تنظیمات > دسترسپذیری»،این میانبر را به ویژگی دیگری تغییر دهید."
"روشن شود"
"روشن نشود"
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 29fe1364f1f4..8002080a1005 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -854,7 +854,7 @@
"Appels d\'urgence uniquement"
"Réseau verrouillé"
"La carte SIM est verrouillée par clé PUK."
- "Veuillez consulter le guide utilisateur ou contacter le service à la clientèle."
+ "Veuillez consulter le guide d\'utilisation ou contacter le service à la clientèle."
"La carte SIM est verrouillée."
"Déverrouillage de la carte SIM en cours…"
"Vous avez dessiné un schéma de déverrouillage incorrect à %1$d reprises.\n\nVeuillez réessayer dans %2$d secondes."
@@ -1661,7 +1661,7 @@
"Pour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec trois doigts et maintenez-les-y."
"Zoom"
"Utilisateur actuel : %1$s"
- "Changement d\'utilisateur (%1$s) en cours…"
+ "Passage au profil : %1$s…"
"Déconnexion de %1$s en cours..."
"Propriétaire"
"Erreur"
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index a5b1626aa404..7d777542e6f4 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1661,7 +1661,7 @@
"Pour changer de fonctionnalité, balayez l\'écran vers le haut avec trois doigts et appuyez de manière prolongée."
"Agrandissement"
"Utilisateur actuel : %1$s"
- "Chargement du profil de %1$s..."
+ "Passage au profil : %1$s..."
"Déconnexion de %1$s…"
"Propriétaire"
"Erreur"
@@ -2036,7 +2036,7 @@
"Retour"
"Applications récentes"
"Notifications"
- "Configuration rapide"
+ "Réglages rapides"
"Boîte de dialogue Marche/Arrêt"
"Verrouiller l\'écran"
"Capture d\'écran"
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 55e462c82572..758b2a014633 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -100,7 +100,7 @@
"પીઅરે TTY મોડ HCO ની વિનંતી કરી"
"પીઅરે TTY મોડ VCO ની વિનંતી કરી"
"પીઅરે TTY મોડ બંધ કરવાની વિનંતી કરી"
- "અવાજ"
+ "Voice"
"ડેટા"
"ફેક્સ"
"SMS"
@@ -350,7 +350,7 @@
"સેલ બ્રોડકાસ્ટ સંદેશા ફૉરવર્ડ કરો"
"સેલ બ્રોડકાસ્ટ સંદેશા પ્રાપ્ત થાય કે તરત ફૉરવર્ડ કરવા માટે સેલ બ્રોડકાસ્ટ મૉડ્યૂલ સાથે પ્રતિબદ્ધ થવા બાબતે ઍપને મંજૂરી આપે છે. તમને કટોકટીની પરિસ્થિતિની ચેતવણી આપવા માટે સેલ બ્રોડકાસ્ટ અલર્ટ અમુક સ્થાનોમાં ડિલિવર કરવામાં આવે છે. કટોકટી અંગેનો સેલ બ્રોડકાસ્ટ પ્રાપ્ત થાય, ત્યારે દુર્ભાવનાપૂર્ણ ઍપ તમારા ડિવાઇસના કાર્યપ્રદર્શન અથવા ઑપરેશનમાં વિક્ષેપ પાડે તેમ બની શકે છે."
"સેલ બ્રોડકાસ્ટ સંદેશા વાંચો"
- "એપ્લિકેશનને તમારા ઉપકરણ દ્વારા પ્રાપ્ત થયેલ સેલ બ્રોડકાસ્ટ સંદેશાને વાંચવાની મંજૂરી આપે છે. સેલ બ્રોડકાસ્ટ ચેતવણીઓ તમને કટોકટીની સ્થિતિઓ અંગે ચેતવવા માટે કેટલાક સ્થાનોમાં વિતરિત થાય છે. જ્યારે કટોકટીનો સેલ બ્રોડકાસ્ટ પ્રાપ્ત થાય ત્યારે દુર્ભાવનાપૂર્ણ ઍપ્લિકેશનો તમારા ઉપકરણના પ્રદર્શન અથવા ઓપરેશનમાં હસ્તક્ષેપ કરી શકે છે."
+ "ઍપ તમારા ડિવાઇસ દ્વારા પ્રાપ્ત થયેલ સેલ બ્રોડકાસ્ટ સંદેશાને વાંચવાની મંજૂરી આપે છે. સેલ બ્રોડકાસ્ટ ચેતવણીઓ તમને ઇમર્જન્સીની સ્થિતિઓ અંગે ચેતવવા માટે કેટલાક સ્થાનોમાં વિતરિત થાય છે. જ્યારે ઇમર્જન્સીનો સેલ બ્રોડકાસ્ટ પ્રાપ્ત થાય ત્યારે દુર્ભાવનાપૂર્ણ ઍપ તમારા ડિવાઇસના કાર્યપ્રદર્શન અથવા ઓપરેશનમાં હસ્તક્ષેપ કરી શકે છે."
"સબ્સ્ક્રાઇબ કરેલ ફીડ્સ વાંચો"
"એપ્લિકેશનને હાલમાં સમન્વયિત ફીડ્સ વિશે વિગતો મેળવવાની મંજૂરી આપે છે."
"SMS સંદેશા મોકલો અને જુઓ"
@@ -637,7 +637,7 @@
"એપ્લિકેશનને કૉલમાં વપરાશકર્તા અનુભવ પ્રદાન કરવાની મંજૂરી આપે છે."
"ઐતિહાસિક નેટવર્ક ઉપયોગ વાંચો"
"એપ્લિકેશનને ચોક્કસ નેટવર્ક્સ અને ઍપ્લિકેશનો માટે ઐતિહાસિક નેટવર્ક વપરાશ વાંચવાની મંજૂરી આપે છે."
- "નેટવર્ક નીતિ મેનેજ કરો"
+ "નેટવર્ક પૉલિસી મેનેજ કરો"
"ઍપને નેટવર્ક નીતિઓ મેનેજ કરવાની અને ઍપ-વિશિષ્ટ નિયમો નિર્ધારિત કરવાની મંજૂરી આપે છે."
"નેટવર્ક વપરાશ એકાઉન્ટિંગ સંશોધિત કરો"
"એપ્લિકેશનને કેવી રીતે ઍપ્લિકેશનો સામે નેટવર્ક વપરાશ ગણવામાં આવે છે તે સંશોધિત કરવાની મંજૂરી આપે છે. સામાન્ય ઍપ્લિકેશનો દ્વારા ઉપયોગમાં લેવા માટે નથી."
@@ -691,7 +691,7 @@
"ચેતવણી વિના આ Android TV ડિવાઇસ પર રહેલો આ વપરાશકર્તાનો ડેટા કાઢી નાખો."
"ચેતવણી વિના આ ફોન પરનો આ વપરાશકર્તાનો ડેટા કાઢી નાખો."
"ઉપકરણ વૈશ્વિક પ્રોક્સી સેટ કરો"
- "નીતિ સક્ષમ હોય તે વખતે ઉપયોગ કરવા માટેના ઉપકરણ વૈશ્વિક પ્રોક્સીને સેટ કરો. ફક્ત ઉપકરણના માલિક વૈશ્વિક પ્રોક્સી સેટ કરી શકે છે."
+ "પૉલિસી સક્ષમ હોય તે વખતે ઉપયોગ કરવા માટેના ડિવાઇસ વૈશ્વિક પ્રોક્સીને સેટ કરો. ફક્ત ડિવાઇસના માલિક વૈશ્વિક પ્રોક્સી સેટ કરી શકે છે."
"સ્ક્રીન લૉક પાસવર્ડ સમાપ્તિ સેટ કરો"
"કેટલા સમયાંતરે સ્ક્રીન લૉક પાસવર્ડ, પિન અથવા પૅટર્ન બદલવો આવશ્યક છે, તેને બદલો."
"સંગ્રહ એન્ક્રિપ્શન સેટ કરો"
@@ -1306,7 +1306,7 @@
"કનેક્ટ કરેલ ઉપકરણ ચાર્જ થઈ રહ્યું છે. વધુ વિકલ્પો માટે ટૅપ કરો."
"એનાલોગ ઑડિઓ ઍક્સેસરી મળી"
"જોડેલ ઉપકરણ આ ફોન સાથે સુસંગત નથી. વધુ જાણવા માટે ટૅપ કરો."
- "USB ડીબગિંગ કનેક્ટ થયું."
+ "USB ડિબગીંગ કનેક્ટ થયું."
"USB ડિબગીંગ બંધ કરવા માટે ટૅપ કરો"
"USB ડિબગીંગને અક્ષમ કરવા માટે પસંદ કરો."
"વાયરલેસ ડિબગીંગ કનેક્ટ કરો"
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 7d48ce034dbf..7fdbb8a60989 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -100,7 +100,7 @@
"पीयर ने टेलीटाइपराइटर (TTY) मोड एचसीओ (HCO) का अनुरोध किया"
"पीयर ने टेलीटाइपराइटर (TTY) मोड वीसीओ (VCO) का अनुरोध किया"
"पीयर ने टेलीटाइपराइटर (TTY) मोड बंद का अनुरोध किया"
- "आवाज़"
+ "Voice"
"डेटा"
"फ़ैक्स"
"मैसेज (एसएमएस)"
@@ -295,7 +295,7 @@
"प्रोफ़ाइल बदलकर वर्क प्रोफ़ाइल पर जाएं"
"संपर्क"
"अपने संपर्कों को ऐक्सेस करने की"
- "जगह"
+ "जगह की जानकारी"
"इस डिवाइस की जगह तक पहुंचने दें"
"कैलेंडर"
"अपने कैलेंडर को ऐक्सेस करने"
@@ -1153,7 +1153,7 @@
"सिस्टम सेटिंग और डाउनलोड किए गए ऐप में डिफ़ॉल्ट साफ़ करें."
"कोई कार्रवाई चुनें"
"USB डिवाइस के लिए कोई ऐप्स चुनें"
- "कोई भी ऐप्स यह कार्यवाही नहीं कर सकता."
+ "कोई भी ऐप्लिकेशन यह कार्रवाई नहीं कर सकता."
"%1$s रुक गया है"
"%1$s रुक गई है"
"%1$s रुक रहा है"
@@ -1326,7 +1326,7 @@
"आपके एडमिन ने इस डिवाइस की समस्या को हल करने में सहायता के लिए एक गड़बड़ी की रिपोर्ट का अनुरोध किया है. ऐप्लिकेशन और डेटा शेयर किए जा सकते हैं."
"शेयर करें"
"अस्वीकार करें"
- "इनपुट पद्धति चुनें"
+ "इनपुट का तरीका चुनें"
"सामान्य कीबोर्ड के सक्रिय होने के दौरान इसे स्क्रीन पर बनाए रखें"
"वर्चुअल कीबोर्ड दिखाएं"
"सामान्य कीबोर्ड कॉन्फ़िगर करें"
@@ -1618,7 +1618,7 @@
"आपने अपना लॉक खोलने का पैटर्न %1$d बार गलत तरीके से बनाया है. %2$d और गलत प्रयासों के बाद, आपसे अपने Android TV डिवाइस को अपने ईमेल खाते का इस्तेमाल करके अनलॉक करने के लिए कहा जाएगा.\n\n %3$d सेकंड बाद प्रयास करें."
"आपने अपने अनलॉक आकार को %1$d बार गलत तरीके से आरेखित किया है. %2$d और असफल प्रयासों के बाद, आपसे अपने फ़ोन को किसी ईमेल खाते का उपयोग करके अनलॉक करने के लिए कहा जाएगा.\n\n %3$d सेकंड में फिर से प्रयास करें."
" — "
- "निकालें"
+ "हटाएं"
"वॉल्यूम को सुझाए गए स्तर से ऊपर बढ़ाएं?\n\nअत्यधिक वॉल्यूम पर ज़्यादा समय तक सुनने से आपकी सुनने की क्षमता को नुकसान हो सकता है."
"सुलभता शॉर्टकट का इस्तेमाल करना चाहते हैं?"
"शॉर्टकट के चालू होने पर, दाेनाें वॉल्यूम बटन (आवाज़ कम या ज़्यादा करने वाले बटन) को तीन सेकंड तक दबाने से, सुलभता सुविधा शुरू हाे जाएगी."
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index d0ad16e93f9a..5d4905fb5680 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -71,7 +71,7 @@
"Trostrani poziv"
"Odbijanje neželjenih i neugodnih poziva"
"Isporuka pozivnog broja"
- "Ne ometaj"
+ "Ne uznemiravaj"
"Zadana postavka ID-a pozivatelja ima ograničenje. Sljedeći poziv: Ograničen"
"Zadana postavka ID-a pozivatelja ima ograničenje. Sljedeći poziv: Nije ograničen"
"Zadana postavka ID-a pozivatelja nema ograničenje. Sljedeći poziv: Ograničen"
@@ -668,8 +668,8 @@
"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."
"povezivanje s uslugama mobilnog operatera"
"Nositelju omogućuje povezivanje s uslugama mobilnog operatera. Ne bi trebalo biti potrebno za uobičajene aplikacije."
- "pristupi opciji Ne ometaj"
- "Omogućuje aplikaciji čitanje i pisanje konfiguracije opcije Ne ometaj."
+ "pristupi opciji Ne uznemiravaj"
+ "Omogućuje aplikaciji čitanje i pisanje konfiguracije opcije Ne uznemiravaj."
"pokrenuti upotrebu dopuštenja za pregled"
"Dopušta nositelju pokretanje upotrebe dopuštenja za aplikaciju. Ne bi smjelo biti potrebno za uobičajene aplikacije."
"Postavi pravila zaporke"
@@ -1327,7 +1327,7 @@
"Otkriven je analogni audiododatak"
"Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da biste saznali više."
"Priključen je alat za otklanjanje pogrešaka putem USB-a"
- "Dodirnite da isključite otklanjanje pogrešaka putem USB-a"
+ "Dodirnite da isključite otkl. pogrešaka putem USB-a"
"Odaberite da biste onemogućili rješavanje programske pogreške na USB-u."
"Bežično otklanjanje pogrešaka povezano"
"Dodirnite da biste isključili bežično otklanjanje pogrešaka"
@@ -1863,10 +1863,10 @@
"Do %1$s"
"Do %1$s (sljedeći alarm)"
"Dok ne isključite"
- "Dok ne isključite \"Ne ometaj\""
+ "Dok ne isključite \"Ne uznemiravaj\""
"%1$s/%2$s"
"Sažmi"
- "Ne ometaj"
+ "Ne uznemiravaj"
"Prekid rada"
"Noć radnog dana"
"Vikend"
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 34e1db5ef4ce..4492eec7d8be 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1785,7 +1785,7 @@
"Munkahelyi %1$s"
"2. munkahelyi %1$s"
"3. munkahelyi %1$s"
- "PIN-kód kérése a rögzítés feloldásához"
+ "PIN-kód kérése a kitűzés feloldásához"
"Feloldási minta kérése a rögzítés feloldásához"
"Jelszó kérése a rögzítés feloldásához"
"A rendszergazda által telepítve"
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index da83ae5ef6f3..2288e68d7b1b 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1421,7 +1421,7 @@
"Պաստառ"
"Փոխել պաստառը"
"Ծանուցման ունկնդիր"
- "VR ունկնդրիչ"
+ "VR ունկնիր"
"Պայմանների մատակարար"
"Ծանուցումների դասակարգման ծառայություն"
"VPN-ը ակտիվացված է"
@@ -1661,7 +1661,7 @@
"Մի գործառույթից մյուսին անցնելու համար երեք մատը սահեցրեք վերև և պահեք։"
"Խոշորացում"
"Ներկայիս օգտատերը %1$s:"
- "Փոխարկվում է %1$s-ին..."
+ "Անցում հետևյալ պրոֆիլին՝ %1$s..."
"Ելք %1$s-ից…"
"Սեփականատեր"
"Սխալ"
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index b72ffe219a05..12d479d95e8e 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -318,7 +318,7 @@
"Mengambil konten jendela"
"Memeriksa konten jendela tempat Anda berinteraksi."
"Mengaktifkan Jelajahi dengan Sentuhan"
- "Item yang diketuk akan diucapkan dengan jelas dan layar dapat dijelajahi menggunakan isyarat."
+ "Item yang diketuk akan diucapkan dengan jelas dan layar dapat dijelajahi menggunakan gestur."
"Mengamati teks yang Anda ketik"
"Meliputi data pribadi seperti nomor kartu kredit dan sandi."
"Mengontrol perbesaran layar"
@@ -1900,10 +1900,10 @@
"Ketuk untuk membuka kunci profil kerja"
"Terhubung ke %1$s"
"Ketuk untuk melihat file"
- "Pasang pin"
- "Pasang pin %1$s"
+ "Sematkan"
+ "Sematkan %1$s"
"Lepas pin"
- "Lepas pin %1$s"
+ "Lepas sematan %1$s"
"Info aplikasi"
"−%1$s"
"Memulai demo..."
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 00e3d60d9479..757041c4d397 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -34,7 +34,7 @@
"MSISDN1"
"בעיה בחיבור או קוד MMI לא חוקי."
"הפעולה מוגבלת למספרי חיוג קבועים בלבד."
- "לא ניתן לשנות את הגדרות העברת השיחות מהטלפון שלך כשאתה במצב נדידה."
+ "לא ניתן לשנות את הגדרות העברת השיחות מהטלפון במצב נדידה."
"השירות הופעל."
"השירות הופעל עבור:"
"השירות הושבת."
@@ -45,11 +45,11 @@
"קוד הגישה הישן שהקלדת שגוי."
"ה-PUK שהקלדת שגוי."
"קודי הגישה שהקלדת לא תואמים."
- "הקלד קוד גישה שאורכו 4 עד 8 ספרות."
+ "יש להקליד קוד אימות שאורכו 4 עד 8 ספרות."
"הקלד PUK באורך 8 מספרים או יותר."
- "כרטיס ה-SIM נעול באמצעות PUK. הקלד את קוד PUK כדי לבטל את נעילתו."
- "הקלד PUK2 כדי לבטל את חסימת כרטיס ה-SIM."
- "לא הצלחת. הפעל נעילת SIM/RUIM."
+ "כרטיס ה-SIM נעול באמצעות PUK. יש להקליד את קוד ה-PUK כדי לבטל את הנעילה."
+ "יש להקליד PUK2 כדי לבטל את חסימת כרטיס ה-SIM."
+ "לא הצלחת. יש להפעיל נעילת SIM/RUIM."
- נותרו לך %d ניסיונות לפני נעילת כרטיס ה-SIM.
- נותרו לך %d ניסיונות לפני נעילת כרטיס ה-SIM.
@@ -70,12 +70,12 @@
"מספר מתקשר נמצא"
"מספר מתקשר חסוי"
"שיחה עם שלושה משתתפים"
- "דחייה של שיחות מטרידות לא רצויות"
- "מסירת מספר מתקשר"
+ "דחיית שיחות מטרידות ולא רצויות"
+ "שליחת מספר מתקשר"
"נא לא להפריע"
- "זיהוי מתקשר עובר כברירת מחדל למצב מוגבל. השיחה הבאה: מוגבלת"
+ "השירות \'שיחה מזוהה\' עובר כברירת מחדל למצב מוגבל. השיחה הבאה: מוגבלת"
"זיהוי מתקשר עובר כברירת מחדל למצב מוגבל. השיחה הבאה: לא מוגבלת"
- "זיהוי מתקשר עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: מוגבלת"
+ "שירות \'שיחה מזוהה\' עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: מוגבלת"
"זיהוי מתקשר עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: לא מוגבלת"
"השירות לא הוקצה."
"אינך יכול לשנות את הגדרת זיהוי המתקשר."
@@ -84,9 +84,9 @@
"אין אפשרות לבצע שיחות רגילות"
"אין שירות קולי או שיחות חירום"
"הושבת באופן זמני על ידי הספק"
- "הושבת באופן זמני על ידי הספק עבור SIM %d"
+ "השירות הושבת באופן זמני על ידי הספק עבור SIM %d"
"לא ניתן להתחבר לרשת הסלולרית"
- "יש לנסות לשנות את הרשת המועדפת. ניתן להקיש כדי לשנות."
+ "אפשר לנסות לשנות את הרשת המועדפת. יש להקיש כדי לשנות אותה."
"שיחות חירום לא זמינות"
"לא ניתן לבצע שיחות חירום דרך Wi-Fi"
"התראות"
@@ -123,10 +123,10 @@
"נדידה - פונקציונליות חלקית של שירות"
"מודעת באנר נודדת מופעלת"
"מודעת באנר נודדת כבויה"
- "מחפש שירות"
- "לא ניתן היה להגדיר שיחות Wi-Fi"
+ "המערכת מחפשת שירות"
+ "לא ניתן היה להגדיר את התכונה \'שיחות Wi-Fi\'"
- - "כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, יש להפעיל שוב שיחות Wi-Fi ב\'הגדרות\'. (קוד שגיאה: %1$s)"
+ - "כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, צריך להפעיל שוב שיחות Wi-Fi ב\'הגדרות\'. (קוד שגיאה: %1$s)"
- "אירעה בעיה ברישום שיחות Wi-Fi אצל הספק שלך: %1$s"
@@ -150,24 +150,24 @@
"Wi-Fi בלבד"
"{0}: ללא העברה"
"{0}: {1}"
- "{0}: {1} כעבור {2} שניות"
+ "{0}: {1} אחרי {2} שניות"
"{0}: ללא העברה"
"{0}: ללא העברה"
"קוד תכונה הושלם."
"בעיה בחיבור או קוד תכונה לא תקין."
"אישור"
"אירעה שגיאת רשת."
- "לא ניתן למצוא את כתובת האתר."
+ "לא ניתן למצוא את כתובת ה-URL."
"סכימת אימות האתר אינה נתמכת."
"האימות נכשל."
"האימות דרך שרת ה-Proxy נכשל."
"לא ניתן להתחבר לשרת."
- "לא ניתן לתקשר עם השרת. נסה שוב מאוחר יותר."
+ "לא ניתן לתקשר עם השרת. אפשר לנסות שוב מאוחר יותר."
"חלף הזמן הקצוב של החיבור לשרת."
"הדף מכיל יותר מדי כתובות אתר להפניה מחדש של השרת."
"הפרוטוקול אינו נתמך."
"לא ניתן ליצור חיבור מאובטח."
- "אין אפשרות לפתוח את הדף מכיוון שכתובת האתר אינה חוקית."
+ "אין אפשרות לפתוח את הדף מכיוון שכתובת ה-URL אינה חוקית."
"לא ניתן לגשת לקובץ."
"הקובץ המבוקש לא נמצא."
"בקשות רבות מדי מעובדות. נסה שוב מאוחר יותר."
@@ -175,38 +175,38 @@
"סנכרון"
"לא ניתן לסנכרן"
"נעשה ניסיון למחוק יותר מדי %s."
- "שטח האחסון של הטאבלט מלא. מחק קבצים כדי לפנות מקום."
+ "נפח האחסון של הטאבלט מלא. צריך למחוק קבצים כדי לפנות מקום."
"שטח האחסון של השעון מלא. מחק כמה קבצים כדי לפנות שטח."
- "האחסון של מכשיר ה-Android TV מלא. יש למחוק חלק מהקבצים כדי לפנות שטח."
- "שטח האחסון של הטלפון מלא. מחק חלק מהקבצים כדי לפנות שטח."
+ "האחסון של מכשיר ה-Android TV מלא. יש למחוק חלק מהקבצים כדי לפנות מקום."
+ "מקום האחסון של הטלפון מלא. אפשר למחוק חלק מהקבצים כדי לפנות מקום."
- רשויות אישורים הותקנו
- רשויות אישורים הותקנו
- רשויות אישורים הותקנו
- רשות אישורים הותקנה
- "על ידי צד שלישי לא מוכר"
+ "על ידי צד שלישי לא ידוע"
"על ידי המנהל של פרופיל העבודה שלך"
"על ידי %s"
"פרופיל העבודה נמחק"
"אפליקציית הניהול של פרופיל העבודה חסרה או פגומה. כתוצאה מכך, פרופיל העבודה שלך נמחק, כולל כל הנתונים הקשורים אליו. לקבלת עזרה, פנה למנהל המערכת."
"פרופיל העבודה שלך אינו זמין עוד במכשיר הזה"
"בוצעו ניסיונות רבים מדי להזנת סיסמה"
- "מנהל המערכת ביטל את המכשיר לצורכי שימוש אישי"
+ "מנהל המערכת ביטל את האפשרות לשימוש במכשיר לצרכים אישיים"
"המכשיר מנוהל"
- "הארגון שלך מנהל מכשיר זה ועשוי לנטר את התנועה ברשת. הקש לקבלת פרטים."
+ "הארגון שלך מנהל את המכשיר הזה והוא עשוי לנטר את התנועה ברשת. יש להקיש לקבלת פרטים."
"לאפליקציות יש הרשאת גישה למיקום שלך"
"יש לפנות למנהל ה-IT כדי לקבל מידע נוסף"
"גלאי מדינה"
"שירות מיקום"
"שירות להתראות מחיישנים"
- "שירות דמדומים"
+ "Twilight Service"
"תתבצע מחיקה של המכשיר"
"לא ניתן להשתמש באפליקציה של מנהל המערכת.\n\nאם יש לך שאלות, יש ליצור קשר עם מנהל המערכת של הארגון."
"ההדפסה הושבתה על ידי %s."
"הפעלה של פרופיל העבודה שלך"
"האפליקציות שלך לשימוש אישי יהיו חסומות עד להפעלת פרופיל העבודה"
- "אפליקציות לשימוש אישי ייחסמו ב-%1$s בשעה %2$s. מנהל ה-IT לא מתיר השבתה של יותר מ-%3$d ימים של פרופיל העבודה."
+ "אפליקציות לשימוש אישי ייחסמו ב-%1$s בשעה %2$s. מנהל ה-IT לא מתיר השבתה של פרופיל העבודה ליותר מ-%3$d ימים."
"הפעלה"
"אני"
"אפשרויות טאבלט"
@@ -214,7 +214,7 @@
"אפשרויות טלפון"
"מצב שקט"
"הפעל חיבור אלחוטי"
- "כבה אלחוטי"
+ "כיבוי אלחוטי"
"נעילת מסך"
"כיבוי"
"צלצול כבוי"
@@ -223,17 +223,17 @@
"עדכון מערכת Android"
"מתכונן לעדכון…"
"מעבד את חבילת העדכון…"
- "מאתחל…"
+ "מתבצע אתחול…"
"איפוס לנתוני היצרן"
- "מאתחל…"
- "מכבה..."
- "הטאבלט שלך יכבה."
+ "מתבצע אתחול…"
+ "בתהליך כיבוי..."
+ "הטאבלט שלך ייכבה."
"מכשיר ה-Android TV יכבה."
"השעון יכבה."
"הטלפון שלך יכובה."
"האם ברצונך לבצע כיבוי?"
- "אתחל למצב בטוח"
- "האם ברצונך לאתחל ולעבור למצב בטוח? פעולה זו תשבית את כל יישומי צד שלישי שהתקנת. הם ישוחזרו לאחר הפעלה מחדש של המכשיר."
+ "אתחול למצב בטוח"
+ "האם לבצע אתחול ולעבור למצב בטוח? הפעולה הזו תשבית את כל האפליקציות של צד שלישי שהתקנת. הן ישוחזרו לאחר הפעלה מחדש של המכשיר."
"נוצרו לאחרונה"
"אין אפליקציות אחרונות"
"אפשרויות טאבלט"
@@ -248,9 +248,9 @@
"סיום הפעלה"
"צילום מסך"
"דיווח על באג"
- "פעולה זו תאסוף מידע על מצב המכשיר הנוכחי שלך על מנת לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת דיווח הבאג ועד לשליחת ההודעה בפועל. אנא המתן בסבלנות."
+ "הפעולה הזו תאסוף מידע על מצב המכשיר הנוכחי שלך כדי לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת הדיווח על הבאג ועד לשליחת ההודעה בפועל. יש להמתין בסבלנות."
"דוח אינטראקטיבי"
- "השתמש באפשרות זו ברוב המקרים. היא מאפשרת לך לעקוב אחר התקדמות הדוח, להזין פרטים נוספים על הבעיה וליצור צילומי מסך. היא עשויה להשמיט כמה קטעים שנמצאים פחות בשימוש ואשר יצירת הדיווח עליהם נמשכת זמן רב."
+ "כדאי להשתמש באפשרות הזו ברוב המקרים. היא מאפשרת לך לעקוב אחר התקדמות הדוח, להזין פרטים נוספים על הבעיה ולצלם את המסך. היא עשויה להשמיט כמה קטעים שנמצאים פחות בשימוש ושיצירת הדיווח עליהם נמשכת זמן רב."
"דוח מלא"
"השתמש באפשרות זו כדי שההפרעה למערכת תהיה מזערית, כשהמכשיר אינו מגיב או איטי מדי, או כשאתה זקוק לכל קטעי הדוח. לא ניתן להזין פרטים נוספים או ליצור צילומי מסך נוספים."
@@ -269,7 +269,7 @@
"מצב טיסה כבוי"
"הגדרות"
"סיוע"
- "Voice Assist"
+ "האסיסטנט"
"נעילה"
"999+"
"התראה חדשה"
@@ -322,7 +322,7 @@
"חיישנים לבישים"
"גישה אל נתוני חיישנים של הסימנים החיוניים שלך"
"אחזור תוכן של חלון"
- "בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה."
+ "בדיקת התוכן של חלון שאיתו מתבצעת אינטראקציה."
"הפעלה של \'גילוי באמצעות מגע\'"
"פריטים שעליהם תקיש יוקראו בקול, ותוכל לנווט במסך באמצעות תנועות."
"הצגת טקסט בזמן הקלדה"
@@ -333,18 +333,18 @@
"יכול להקיש, להחליק, לעשות תנועת צביטה ולבצע תנועות אחרות."
"תנועות של טביעות אצבעות"
"אפשרות לזהות תנועות בזמן נגיעה בחיישן טביעות האצבע של המכשיר."
- "שמירת צילום המסך"
+ "צילום המסך"
"ניתן לצלם צילום מסך של התצוגה."
- "השבת או שנה את שורת המצב"
- "מאפשר לאפליקציה להשבית את שורת המצב או להוסיף ולהסיר סמלי מערכת."
+ "השבתה או שינוי של שורת הסטטוס"
+ "מאפשרת לאפליקציה להשבית את שורת הסטטוס או להוסיף ולהסיר סמלי מערכת."
"להיות שורת הסטטוס"
- "מאפשר לאפליקציה להופיע בשורת המצב."
+ "מאפשרת לאפליקציה להופיע בשורת הסטטוס."
"הרחב/כווץ את שורת המצב"
"מאפשר לאפליקציה להרחיב או לכווץ את שורת המצב."
"התקן קיצורי דרך"
- "מאפשר לאפליקציה להוסיף קיצורי דרך במסך דף הבית ללא התערבות המשתמש."
- "להסרת התקנה של קיצורי דרך"
- "מאפשר לאפליקציה להסיר קיצורי דרך במסך דף הבית ללא התערבות המשתמש."
+ "מאפשרת לאפליקציה להוסיף קיצורי דרך במסך דף הבית ללא התערבות המשתמש."
+ "הסרת התקנה של קיצורי דרך"
+ "מאפשרת לאפליקציה להסיר קיצורי דרך במסך דף הבית ללא התערבות המשתמש."
"ניתוב מחדש של שיחות יוצאות"
"מאפשרת לאפליקציה לראות את המספר המחויג במהלך ביצוע שיחה יוצאת, עם האפשרות להפנות את השיחה למספר אחר או לבטל את השיחה לחלוטין."
"מענה לשיחות טלפון"
@@ -352,75 +352,75 @@
"קבלת הודעות טקסט (SMS)"
"מאפשר לאפליקציה לקבל ולעבד הודעות SMS. משמעות הדבר היא שהאפליקציה יכולה לעקוב אחר הודעות שנשלחו למכשיר או למחוק אותן מבלי להציג לך אותן."
"קבלת הודעות טקסט (MMS)"
- "מאפשר לאפליקציה לקבל ולעבד הודעות MMS. משמעות הדבר היא שהאפליקציה יכולה לעקוב אחר הודעות שנשלחו למכשיר או למחוק אותן מבלי להציג לך אותן."
+ "מאפשרת לאפליקציה לקבל ולעבד הודעות MMS. משמעות הדבר היא שהאפליקציה יכולה לעקוב אחר הודעות שנשלחו למכשיר או למחוק אותן מבלי להציג לך אותן."
"העברת הודעות של שידור סלולרי"
"מאפשרת לאפליקציה להתחייב למודול של השידור הסלולרי כדי להעביר הודעות של שידור סלולרי כשהן מתקבלות. התראות שידור סלולרי נשלחות במקומות מסוימים כדי להזהיר אותך מפני מצבי חירום. אפליקציות זדוניות עשויות להפריע לביצועים או לפעולה של המכשיר כאשר מתקבל שידור חירום סלולרי."
"קריאת הודעות שידור סלולרי"
"מאפשר לאפליקציה לקרוא הודעות שידור סלולרי שהתקבלו במכשיר שלך. התראות שידור סלולרי נשלחות במקומות מסוימים על מנת להזהיר אותך מפני מצבי חירום. אפליקציות זדוניות עשויות להפריע לביצועים או לפעולה של המכשיר שלך כאשר מתקבל שידור חירום סלולרי."
- "קרא עדכוני מנויים"
+ "קריאת עדכוני מינויים"
"מאפשר לאפליקציה לקבל פרטים על ההזנות הנוכחיות שמסונכרנות."
"שליחה והצגה של הודעות SMS"
"מאפשר לאפליקציה לשלוח הודעות SMS. הדבר עשוי לגרום לחיובים בלתי צפויים. אפליקציות זדוניות עלולות לגרום לעלויות על ידי שליחת הודעות ללא אישורך."
"קריאת הודעות הטקסט שלך (SMS או MMS)"
"אפליקציה זו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות בטאבלט."
- "אפליקציה זו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות במכשיר ה-Android TV."
+ "האפליקציה הזו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות במכשיר ה-Android TV."
"אפליקציה זו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות בטלפון."
"קבלת הודעות טקסט (WAP)"
- "מאפשר לאפליקציה לקבל ולעבד הודעות WAP. אישור זה כולל את היכולת לעקוב אחר הודעות שנשלחו אליך ולמחוק אותן מבלי להציג לך אותן."
+ "מאפשרת לאפליקציה לקבל ולעבד הודעות WAP. ההרשאה הזו כוללת את היכולת לעקוב אחר הודעות שנשלחו אליך ולמחוק אותן מבלי להציג לך אותן."
"אחזור אפליקציות פעילות"
- "מאפשר לאפליקציה לאחזר מידע לגבי משימות הפועלות כרגע ושפעלו לאחרונה. ייתכן שהדבר יתיר לאפליקציה לגלות מידע לגבי האפליקציות שבהן נעשה שימוש במכשיר."
+ "מאפשרת לאפליקציה לאחזר מידע לגבי משימות הפועלות כרגע וכאלו שפעלו לאחרונה. ייתכן שההרשאה הזו תתיר לאפליקציה לגלות מידע לגבי האפליקציות שבהן נעשה שימוש במכשיר."
"ניהול בעלים של פרופיל ומכשיר"
"מאפשרת לאפליקציות להגדיר את הבעלים של הפרופיל ואת בעל המכשיר."
"סידור מחדש של אפליקציות פעילות"
"מאפשר לאפליקציה להעביר משימות לחזית ולרקע. האפליקציה עשוי לעשות זאת ללא התערבותך."
"הפוך מצב מכונית לפעיל"
- "מאפשר לאפליקציה לאפשר את מצב מכונית."
+ "מאפשרת לאפליקציה להפעיל את מצב מכונית."
"סגירת אפליקציות אחרות"
"מאפשר לאפליקציה להפסיק תהליכים ברקע המבוצעים על ידי אפליקציות אחרות. הדבר עשוי לגרום להפסקת פעולתם של אפליקציות אחרות."
"אפליקציה זו יכולה להופיע מעל אפליקציות אחרות."
- "אפליקציה זו יכולה להופיע מעל אפליקציות אחרות או בחלקים אחרים של המסך. ייתכן שהדבר יפריע לך להשתמש באפליקציות וישנה את הופעתן."
+ "האפליקציה הזו יכולה להופיע מעל אפליקציות אחרות או בחלקים אחרים של המסך. ייתכן שהדבר יפריע לך להשתמש באפליקציות וישנה את האופן שבו הן מופיעות."
"פעולה ברקע"
- "האפליקציה הזו יכולה לפעול ברקע. ייתכן שהסוללה תתרוקן מהר יותר במצב זה."
+ "האפליקציה הזו יכולה לפעול ברקע. ייתכן שהסוללה תתרוקן מהר יותר במצב הזה."
"שימוש בנתונים ברקע"
- "האפליקציה הזו יכולה להשתמש בנתונים ברקע. ייתכן שצריכת הנתונים תעלה במצב זה."
+ "האפליקציה הזו יכולה להשתמש בנתונים ברקע. ייתכן שצריכת הנתונים תגדל במצב הזה."
"הגדרת האפליקציה לפעול תמיד"
"מאפשר לאפליקציה להפוך חלקים ממנו לקבועים בזיכרון. פעולה זו עשויה להגביל את הזיכרון הזמין לאפליקציות אחרים ולהאט את פעולת הטאבלט."
"מאפשרת לאפליקציה לאחסן חלקים שלה בזיכרון באופן קבוע. פעולה זו עשויה להגביל את הזיכרון הזמין לאפליקציות אחרות ולהאט את הפעולה של מכשיר ה-Android TV."
"מאפשר לאפליקציה להפוך חלקים ממנו לקבועים בזיכרון. פעולה זו עשויה להגביל את הזיכרון הזמין לאפליקציות אחרים ולהאט את פעולת הטלפון."
"הרצת שירות קדמה"
- "הרשאה זו מאפשרת לאפליקציה לעשות שימוש בשירותים בקדמה."
+ "ההרשאה הזו מאפשרת לאפליקציה להשתמש בשירותים שפועלים בחזית."
"מדידת נפח האחסון של אפליקציות"
"מאפשר לאפליקציה לאחזר את הקוד, הנתונים, וגודלי קובצי המטמון שלו"
"שינוי הגדרות מערכת"
- "מאפשר לאפליקציה לשנות את נתוני הגדרות המערכת. אפליקציות זדוניות עלולות לשבש את תצורת המערכת שלך."
+ "מאפשרת לאפליקציה לשנות את נתוני הגדרות המערכת. אפליקציות זדוניות עלולות לשבש את תצורת המערכת שלך."
"הפעלה בעת אתחול"
"מאפשר לאפליקציה להפעיל את עצמו מיד עם סיום תהליך האתחול של המערכת. משום כך הפעלת הטאבלט עשויה להתארך והאפליקציה עלולה להאט את הפעילות הכללית של הטאבלט, בשל פעילותה התמידית."
- "מאפשרת לאפליקציה להפעיל את עצמה ברגע שהמערכת מסיימת את ההפעלה. פעולה זו עשויה להאריך את הזמן שדרוש כדי להפעיל את מכשיר ה-Android TV, והיא מאפשרת לאפליקציה להאט את המכשיר כולו כי האפליקציה רצה כל הזמן."
+ "מאפשרת לאפליקציה להפעיל את עצמה ברגע שהמערכת מסיימת את ההפעלה. הפעולה הזו עשויה להאריך את הזמן שדרוש כדי להפעיל את מכשיר ה-Android TV, והיא מאפשרת לאפליקציה להאט את המכשיר כולו כי האפליקציה פועלת כל הזמן."
"מאפשר לאפליקציה להפעיל את עצמו מיד עם השלמת תהליך האתחול של המערכת. משום כך הפעלת הטלפון עשויה להתארך והאפליקציה עלולה להאט את הפעילות הכללית של הטלפון, בשל פעילותה התמידית."
- "שלח שידור דביק"
- "מאפשר לאפליקציה לשלוח שידורים דביקים, אשר נותרים לאחר סיום השידור. אפליקציות זדוניות עלולות להאט את פעילות הטאבלט או להפוך אותה לבלתי יציבה על ידי אילוץ המכשיר להשתמש ביותר מדי זיכרון."
+ "שליחת שידור במיקום קבוע"
+ "מאפשרת לאפליקציה לשלוח שידורים במיקום קבוע, אשר נותרים לאחר סיום השידור. אפליקציות זדוניות עלולות להאט את פעילות הטאבלט או להפוך אותה לבלתי יציבה על ידי אילוץ המכשיר להשתמש ביותר מדי זיכרון."
"מאפשרת לאפליקציה לשלוח שידורים \"דביקים\" (sticky), שנותרים לאחר שהשידור מסתיים. בעקבות שימוש מופרז באפשרות זו, שיעור ניצול הזיכרון יהיה גבוה מדי ומכשיר ה-Android TV עלול לפעול בצורה איטית או בלתי יציבה."
- "מאפשר לאפליקציה לשלוח שידורים דביקים, אשר נותרים לאחר סיום השידור. אפליקציות זדוניות עלולות להאט את פעילות הטלפון או להפוך אותה לבלתי יציבה על ידי אילוץ המכשיר להשתמש ביותר מדי זיכרון."
+ "מאפשרת לאפליקציה לשלוח שידורים במיקום קבוע, אשר נותרים לאחר סיום השידור. אפליקציות זדוניות עלולות להאט את פעילות הטלפון או להפוך אותה לבלתי יציבה על ידי אילוץ המכשיר להשתמש ביותר מדי זיכרון."
"קריאת אנשי הקשר שלך"
"מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים בטאבלט שלך. לאפליקציות תהיה גם גישה לחשבונות בטאבלט שיצרו אנשי קשר. פעולה זו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. הרשאה זו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך."
"מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים במכשיר ה-Android TV שלך. לאפליקציות תהיה גם גישה לחשבונות במכשיר ה-Android TV שיצרו אנשי קשר. פעולה זו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. הרשאה זו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך."
- "מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים בטלפון שלך. לאפליקציות תהיה גם גישה לחשבונות בטלפון שיצרו אנשי קשר. פעולה זו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. הרשאה זו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך."
+ "מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים בטלפון שלך. לאפליקציות תהיה גם גישה לחשבונות בטלפון שדרכם נוצרו אנשי קשר. הפעולה הזו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. ההרשאה הזו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך."
"שינוי אנשי הקשר שלך"
"מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים בטאבלט שלך. הרשאה זו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר."
- "מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים במכשיר ה-Android TV שלך. הרשאה זו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר."
+ "מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים במכשיר ה-Android TV שלך. ההרשאה הזו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר."
"מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים בטלפון שלך. הרשאה זו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר."
"קריאת יומן שיחות"
"אפליקציה זו יכולה לקרוא את היסטוריית השיחות שלך."
"כתיבת יומן שיחות"
- "מאפשר לאפליקציה לשנות את יומן השיחות של הטאבלט, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות לעשות בכך שימוש כדי למחוק או לשנות את יומן השיחות שלך."
+ "מאפשרת לאפליקציה לשנות את יומן השיחות של הטאבלט, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות לעשות בכך שימוש כדי למחוק או לשנות את יומן השיחות שלך."
"מאפשרת לאפליקציה לשנות את יומן השיחות של מכשיר ה-Android TV, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות להשתמש בכך כדי למחוק או לשנות את יומן השיחות."
"מאפשר לאפליקציה לשנות את יומן השיחות של הטלפון, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות לעשות בכך שימוש כדי למחוק או לשנות את יומן השיחות שלך."
"גישה אל חיישני גוף (כמו מוניטורים לקצב לב)"
- "מאפשר לאפליקציה לגשת אל נתוני חיישנים העוקבים אחר מצבך הגופני, כמו קצב הלב."
- "קריאה של אירועי יומן ופרטיהם"
- "אפליקציה זו יכולה לקרוא את כל אירועי היומן המאוחסנים בטאבלט, ולשתף או לשמור את נתוני היומן."
+ "מאפשרת לאפליקציה לגשת אל נתוני חיישנים העוקבים אחר מצבך הגופני, כמו קצב הלב."
+ "קריאה של אירועי יומן והפרטים שלהם"
+ "האפליקציה הזו יכולה לקרוא את כל אירועי היומן המאוחסנים בטאבלט, ולשתף או לשמור את נתוני היומן."
"אפליקציה זו יכולה לקרוא את כל אירועי היומן המאוחסנים במכשיר ה-Android TV, ולשתף או לשמור את נתוני היומן."
- "אפליקציה זו יכולה לקרוא את כל אירועי היומן המאוחסנים בטלפון, ולשתף או לשמור את נתוני היומן."
+ "האפליקציה הזו יכולה לקרוא את כל אירועי היומן המאוחסנים בטלפון, ולשתף או לשמור את נתוני היומן."
"הוספה ושינוי של אירועי יומן ושליחת אימייל לאורחים ללא ידיעת הבעלים"
"אפליקציה זו יכולה להוסיף, להסיר ולשנות אירועי יומן בטאבלט. האפליקציה יכולה לשנות אירועים בלי להודיע לבעליהם ולשלוח הודעות שעשויות להיראות כאילו נשלחו מבעלי יומנים."
"אפליקציה זו יכולה להוסיף, להסיר ולשנות אירועי יומן במכשיר ה-Android TV. האפליקציה יכולה לשלוח הודעות שעשויות להיראות כאילו נשלחו מבעלי יומנים ולשנות אירועים בלי להודיע על כך לבעליהם."
@@ -429,37 +429,37 @@
"מאפשרת לאפליקציה לגשת לפקודות נוספות של ספק המיקום. הרשאה זו עשויה לאפשר לאפליקציה לשבש את פעולת ה-GPS או מקורות מיקום אחרים."
"קבלת גישה למיקום מדויק בחזית בלבד"
"האפליקציה הזו יכולה לקבל את המיקום המדויק שלך משירותי המיקום כאשר היא בשימוש. האפליקציה תקבל את המיקום רק אם הפעלת את שירותי המיקום במכשיר. פעולה זו עלולה להגביר את השימוש בסוללה."
- "קבלת גישה למיקום משוער תתבצע בחזית בלבד"
+ "קבלת גישה למיקום משוער לאפליקציות בחזית בלבד"
"כאשר האפליקציה בשימוש היא יכולה לקבל משירותי המיקום את המיקום המשוער שלך. האפליקציה תקבל את המיקום רק אם הפעלת את שירותי המיקום במכשיר."
"גישה למיקום ברקע"
"לאפליקציה תמיד יש גישה למיקום, גם כשאינה בשימוש."
"שנה את הגדרות האודיו שלך"
"מאפשר לאפליקציה לשנות הגדרות אודיו גלובליות כמו עוצמת קול ובחירת הרמקול המשמש לפלט."
"הקלט אודיו"
- "אפליקציה זו יכולה להשתמש במיקרופון כדי להקליט אודיו בכל עת."
+ "האפליקציה תמיד יכולה להשתמש במיקרופון כדי להקליט אודיו."
"שליחת פקודות אל ה-SIM"
- "מאפשרת ליישום לשלוח פקודות ל-SIM. זוהי הרשאה מסוכנת מאוד."
+ "מאפשרת לאפליקציה לשלוח פקודות ל-SIM. זוהי הרשאה מסוכנת מאוד."
"זיהוי הפעילות הגופנית"
"האפליקציה מזהה את הפעילות הגופנית שלך."
- "צלם תמונות וסרטונים"
+ "צילום תמונות וסרטונים"
"אפליקציה זו יכולה להשתמש במצלמה כדי לצלם תמונות ולהקליט סרטונים בכל עת."
"הרשאת גישה לאפליקציה או לשירות למצלמות המערכת כדי לצלם תמונות וסרטונים"
- "אפליקציה זו בעלת ההרשאות, או אפליקציית המערכת הזו, יכולה לצלם תמונות ולהקליט סרטונים באמצעות מצלמת מערכת בכל זמן. בנוסף, לאפליקציה נדרשת ההרשאה android.permission.CAMERA"
+ "האפליקציה הזו בעלת ההרשאות, או אפליקציית המערכת הזו, יכולה לצלם תמונות ולהקליט סרטונים באמצעות מצלמת מערכת בכל זמן. בנוסף, לאפליקציה נדרשת ההרשאה android.permission.CAMERA"
"אפליקציה או שירות יוכלו לקבל קריאות חוזרות (callback) כשמכשירי מצלמה ייפתחו או ייסגרו."
"האפליקציה הזו יכולה לקבל קריאות חוזרות (callback) כשמכשיר מצלמה כלשהו נפתח (באמצעות אפליקציה) או נסגר."
"שליטה ברטט"
"מאפשר לאפליקציה לשלוט ברטט."
"מאפשרת לאפליקציה לקבל גישה למצב רטט."
- "התקשר ישירות למספרי טלפון"
+ "חיוג ישירות למספרי טלפון"
"מאפשר לאפליקציה להתקשר למספרי טלפון ללא התערבותך. פעולה זו עשויה לגרום לשיחות או לחיובים לא צפויים. שים לב שהדבר לא מאפשר לאפליקציה להתקשר למספרי חירום. אפליקציות זדוניות עשויות לגרום לעלויות על ידי ביצוע שיחות ללא התערבותך."
"גישה אל שירות שיחות IMS"
"מאפשר לאפליקציה להשתמש בשירות ה-IMS לביצוע שיחות ללא התערבותך."
"קריאת הסטטוס והזהות של הטלפון"
- "מאפשר לאפליקציה לגשת לתכונות הטלפון של המכשיר. אישור זה מתיר לאפליקציה לגלות את מספר הטלפון ואת זיהויי המכשיר, האם שיחה פעילה ואת המספר המרוחק המחובר באמצעות שיחה."
+ "מאפשרת לאפליקציה לגשת לתכונות הטלפון של המכשיר. ההרשאה הזו מתירה לאפליקציה לגלות את מספר הטלפון ואת מזהי המכשיר, אם השיחה פעילה ואת המספר המרוחק המחובר באמצעות שיחה."
"ניתוב שיחות דרך המערכת"
"מאפשרת לאפליקציה לנתב את השיחות דרך המערכת כדי לשפר את חוויית השיחה."
"ניתן להציג שיחות ולשלוט בהן באמצעות המערכת."
- "מאפשר לאפליקציה להציג שיחות נוכחיות ולשלוט בהן במכשיר. זה כולל פרטים כמו מספרי שיחה של שיחות ומצב השיחה."
+ "מאפשרת לאפליקציה להציג שיחות נוכחיות ולשלוט בהן במכשיר – כולל פרטים כמו מספרי שיחה של שיחות ומצב השיחה."
"פטור מהגבלות של הקלטת אודיו"
"פוטרת את האפליקציה מהגבלות של הקלטת אודיו."
"המשך שיחה מאפליקציה אחרת"
@@ -467,7 +467,7 @@
"גישה למספרי הטלפון"
"מתירה לאפליקציה גישה למספרי הטלפון במכשיר."
"מסך המכונית יישאר דלוק"
- "מנע מהטאבלט לעבור למצב שינה"
+ "מניעה מהטאבלט לעבור למצב שינה"
"מונעת ממכשיר ה-Android TV להיכנס למצב שינה"
"מניעת מעבר הטלפון למצב שינה"
"מסך המכונית יישאר דלוק כשהאפליקציה פועלת."
@@ -479,22 +479,22 @@
"מאפשרת לאפליקציה להשתמש במשדר האינפרה-אדום של מכשיר ה-Android TV."
"מאפשרת לאפליקציה להשתמש במשדר האינפרא-אדום של הטלפון."
"הגדרת טפט"
- "מאפשר לאפליקציה להגדיר את טפט המערכת."
+ "מאפשרת לאפליקציה להגדיר את טפט המערכת."
"התאמת גודל הטפט שלך"
"מאפשר לאפליקציה להגדיר את סמני הגודל של טפט המערכת."
- "הגדר אזור זמן"
- "מאפשר לאפליקציה לשנות את אזור הזמן של הטאבלט."
+ "הגדרת אזור זמן"
+ "מאפשרת לאפליקציה לשנות את אזור הזמן של הטאבלט."
"מאפשרת לאפליקציה לשנות את אזור הזמן של מכשיר ה-Android TV."
- "מאפשר לאפליקציה לשנות את אזור הזמן של הטלפון."
+ "מאפשר, לאפליקציה לשנות את אזור הזמן של הטלפון."
"חיפוש חשבונות במכשיר"
- "מאפשר לאפליקציה לקבל רשימה של חשבונות המוכרים לטאבלט. הדבר עשוי לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת."
+ "מאפשרת לאפליקציה לקבל רשימה של חשבונות המוכרים לטאבלט. הדבר עשוי לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת."
"מאפשרת לאפליקציה לקבל את רשימת החשבונות המוכרים למכשיר ה-Android TV. הפרטים עשויים לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת."
"מאפשר לאפליקציה לקבל רשימה של חשבונות המוכרים לטלפון. הדבר עשוי לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת."
- "הצג חיבורי רשת"
- "מאפשר לאפליקציה להציג מידע לגבי חיבורי רשת, למשל, אילו רשתות קיימות ומחוברות."
+ "הצגת חיבורי רשת"
+ "מאפשרת לאפליקציה להציג מידע לגבי חיבורי רשת, למשל, אילו רשתות קיימות ומחוברות."
"קבלת גישת רשת מלאה"
- "מאפשר לאפליקציה ליצור Sockets ולהשתמש בפרוטוקולי רשת מותאמים אישית. הדפדפן, כמו אפליקציות אחרות, מספק אמצעים לשליחת נתונים לאינטרנט, כך שאישור זה אינו נחוץ לשליחת נתונים לאינטרנט."
- "שנה את קישוריות הרשת"
+ "מאפשרת לאפליקציה ליצור Sockets ולהשתמש בפרוטוקולי רשת מותאמים אישית. הדפדפן, כמו אפליקציות אחרות, מספק אמצעים לשליחת נתונים לאינטרנט, כך שאישור זה אינו נחוץ לשליחת נתונים לאינטרנט."
+ "שינוי של קישוריות הרשת"
"מאפשר לאפליקציה לשנות את מצב הקישוריות של הרשת."
"שינוי של קישוריות קשורה"
"מאפשר לאפליקציה לשנות את מצב הקישוריות של רשת קשורה."
@@ -502,28 +502,28 @@
"מאפשר לאפליקציה להציג מידע על רשתות Wi-Fi, למשל, האם Wi-Fi מופעל, כמו גם שם מכשירי ה-Wi-Fi המחוברים."
"התחברות והתנתקות מ-Wi-Fi"
"מאפשר לאפליקציה להתחבר לנקודות גישת Wi-Fi ולהתנתק מהן, וכן לבצע שינויים בתצורת המכשיר עבור רשתות Wi-Fi."
- "אפשר קבלת שידורים מרובים ב-Wi-Fi"
+ "מאפשרת לקבל שידורים מרובים ב-Wi-Fi"
"מאפשר לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטאבלט שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה."
"מאפשרת לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות מולטיקאסט, ולא רק למכשיר ה-Android TV. צריכת החשמל תהיה גבוהה יותר מאשר במצב שאינו מולטיקאסט."
- "מאפשר לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטלפון שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה."
+ "מאפשרת לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטלפון שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה."
"גישה להגדרות Bluetooth"
"מאפשר לאפליקציה להגדיר את תצורתו של הטאבלט המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."
- "מאפשרת לאפליקציה להגדיר Bluetooth במכשיר ה-Android TV, ולגלות מכשירים מרוחקים ולבצע התאמה איתם."
+ "מאפשרת לאפליקציה להגדיר Bluetooth במכשיר ה-Android TV, ולגלות מכשירים מרוחקים ולבצע איתם התאמה."
"מאפשר לאפליקציה להגדיר את תצורתו של הטלפון המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."
"התחברות והתנתקות מ-WiMAX"
- "מאפשר לאפליקציה לדעת האם WiNMAX מופעל, כמו גם לקבל מידע האם רשתות WiNMAX כלשהן מחוברות."
+ "מאפשרת לאפליקציה לדעת האם WiNMAX מופעל, ולקבל מידע לגבי רשתות WiNMAX מחוברות."
"שנה את מצב WiMAX"
- "מאפשר לאפליקציה לחבר את הטאבלט לרשתות WiMAX ולהתנתק מהן."
+ "מאפשרת לאפליקציה לחבר את הטאבלט לרשתות WiMAX ולהתנתק מהן."
"מאפשרת לאפליקציה לחבר את מכשיר ה-Android TV לרשתות WiMAX ולהתנתק מהן."
"מאפשר לאפליקציה לחבר את הטלפון לרשתות WiMAX ולהתנתק מהן."
"התאמה למכשירי Bluetooth"
"מאפשר לאפליקציה להציג את תצורת ה-Bluetooth בטאבלט, וכן ליצור ולקבל חיבורים עם מכשירים מותאמים."
"מאפשרת לאפליקציה להציג את הגדרת ה-Bluetooth במכשיר ה-Android TV, וליצור ולקבל חיבורים עם מכשירים מותאמים."
- "מאפשר לאפליקציה להציג את תצורת ה-Bluetooth בטלפון, וכן ליצור ולקבל חיבורים עם מכשירים מותאמים."
+ "מאפשרת לאפליקציה להציג את תצורת ה-Bluetooth בטלפון, וכן ליצור ולקבל חיבורים עם מכשירים מותאמים."
"פרטים על שירות תשלום מועדף ב-NFC"
"מאפשרת לאפליקציה לקבל פרטים על שירות תשלום מועדף ב-NFC, כמו עזרים רשומים ויעד של נתיב."
"שלוט ב-Near Field Communication"
- "מאפשר לאפליקציה נהל תקשורת עם תגים, כרטיסים וקוראים מסוג \'תקשורת מטווח קצר\'."
+ "מאפשרת לאפליקציה נהל תקשורת עם תגים, כרטיסים וקוראים מסוג \'תקשורת מטווח קצר\' (NFC)."
"ביטול נעילת המסך שלך"
"מאפשר לאפליקציה להשבית את נעילת המקשים וכל אמצעי אבטחה משויך המבוסס על סיסמה. לדוגמה, הטלפון משבית את נעילת המקשים בעת קבלה של שיחת טלפון נכנסת, ולאחר מכן מפעיל מחדש את נעילת המקשים עם סיום השיחה."
"בקשת מידע לגבי מידת המורכבות של נעילת המסך"
@@ -532,8 +532,8 @@
"מאפשרת לאפליקציה להשתמש בחומרה ביומטרית לצורך אימות"
"ניהול חומרה של טביעות אצבעות"
"מאפשר לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות טביעות אצבעות שבהן ייעשה שימוש."
- "חומרה של טביעות אצבעות"
- "מאפשר לאפליקציה להשתמש בחומרה של טביעות אצבעות לצורך אימות"
+ "שימוש בחומרה של טביעות אצבעות"
+ "מאפשרת לאפליקציה להשתמש בחומרה של טביעות אצבעות לצורך אימות"
"לשנות את אוסף המוזיקה שלך"
"מאפשרת לאפליקציה לשנות את אוסף המוזיקה שלך."
"לשנות את אוסף הסרטונים שלך"
@@ -542,12 +542,12 @@
"מאפשרת לאפליקציה לשנות את אוסף התמונות שלך."
"לקרוא מיקומים מאוסף המדיה שלך"
"מאפשרת לאפליקציה לקרוא מיקומים מאוסף המדיה שלך."
- "אימות זהותך"
+ "אימות הזהות שלך"
"חומרה ביומטרית לא זמינה"
"האימות בוטל"
"לא זוהתה"
"האימות בוטל"
- "עוד לא הוגדרו קוד גישה, קו ביטול נעילה או סיסמה"
+ "עוד לא הוגדרו קוד אימות, קו ביטול נעילה או סיסמה"
"זוהתה טביעת אצבע חלקית. אפשר לנסות שוב."
"לא ניתן היה לעבד את טביעת האצבע. נסה שוב."
"החיישן של טביעות האצבעות מלוכלך. צריך לנקות אותו ולנסות שוב."
@@ -560,13 +560,13 @@
"זיהוי הפנים בוצע. יש ללחוץ על אישור"
"החומרה בשביל טביעות אצבעות אינה זמינה."
"לא ניתן לאחסן טביעת אצבע. יש להסיר טביעת אצבע קיימת."
- "חלף הזמן הקצוב לטביעת אצבע. אפשר לנסות שוב."
+ "נגמר הזמן הקצוב לטביעת אצבע. אפשר לנסות שוב."
"פעולת טביעת האצבע בוטלה."
- "פעולת טביעת האצבע בוטלה בידי המשתמש."
- "יותר מדי ניסיונות. נסה שוב מאוחר יותר."
+ "פעולת טביעת האצבע בוטלה על ידי המשתמש."
+ "יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר."
"יותר מדי ניסיונות. חיישן טביעות האצבע הושבת."
"כדאי לנסות שוב."
- "לא נרשמו טביעות אצבע."
+ "לא נסרקו טביעות אצבע."
"במכשיר זה אין חיישן טביעות אצבע."
"החיישן מושבת באופן זמני."
"אצבע %d"
@@ -577,22 +577,22 @@
"מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש."
"שימוש בחומרה לשחרור נעילה על ידי זיהוי פנים"
"מאפשרת לאפליקציה להשתמש בחומרה לשחרור נעילה על ידי זיהוי פנים לצורך אימות"
- "שחרור נעילה בזיהוי פנים"
- "יש לבצע רישום מחדש של הפנים שלך"
+ "שחרור נעילה על ידי זיהוי פנים"
+ "יש לבצע סריקה חוזרת של הפנים שלך"
"לשיפור הזיהוי יש לבצע רישום מחדש של הפנים שלך"
"לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב."
"בהיר מדי. צריך תאורה עדינה יותר."
"התמונה חשוכה מדי. צריך תאורה חזקה יותר."
"יש להרחיק את הטלפון."
"צריך לקרב את הטלפון."
- "צריך להגביה את הטלפון."
+ "צריך להרים את הטלפון גבוה יותר."
"צריך להוריד את הטלפון."
"צריך להזיז את הטלפון שמאלה."
"צריך להזיז את הטלפון ימינה."
"יש להביט ישירות אל המכשיר."
"עליך למקם את הפנים ישירות מול הטלפון."
"יותר מדי תנועה. יש להחזיק את הטלפון בצורה יציבה."
- "יש לרשום מחדש את הפנים."
+ "יש לסרוק שוב את הפנים."
"כבר לא ניתן לזהות פנים. יש לנסות שוב."
"דומה מדי, יש לשנות תנוחה."
"עליך ליישר קצת את הראש."
@@ -604,8 +604,8 @@
"לא ניתן לאמת את הפנים. החומרה לא זמינה."
"יש לנסות שוב את שחרור הנעילה על ידי זיהוי פנים."
- "לא ניתן לאחסן נתוני פנים. תחילה יש למחוק פנים ישנים."
- "פעולת הפנים בוטלה."
+ "לא ניתן לאחסן נתוני פנים חדשים. תחילה יש למחוק את הנתונים הישנים."
+ "הפעולה לאימות הפנים בוטלה."
"שחרור הנעילה על ידי זיהוי פנים בוטל על ידי המשתמש."
"יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר."
"יותר מדי ניסיונות. שחרור נעילה על ידי זיהוי פנים מושבת."
@@ -620,39 +620,39 @@
"קרא את הגדרות הסינכרון"
"מאפשר לאפליקציה לקרוא את הגדרות הסנכרון של חשבון. לדוגמה, ניתן לגלות כך האם האפליקציה \'אנשים\' מסונכרן עם חשבון כלשהו."
"הפעלת וכיבוי סנכרון"
- "מאפשר לאפליקציה לשנות את הגדרות הסנכרון של חשבון. לדוגמה, ניתן להשתמש בכך על מנת להפעיל סנכרון של האפליקציה \'אנשים\' עם חשבון כלשהו."
- "קרא את הנתונים הסטטיסטיים של הסינכרון"
- "מאפשר לאפליקציה לקרוא את סטטיסטיקת הסנכרון של חשבון, כולל היסטוריית אירועי הסנכרון וכמות הנתונים שסונכרנה."
+ "מאפשרת לאפליקציה לשנות את הגדרות הסנכרון של חשבונות. לדוגמה, אפשר להשתמש בהרשאה הזו כדי להפעיל סנכרון של האפליקציה \'אנשים\' עם חשבון כלשהו."
+ "קריאת הנתונים הסטטיסטיים של הסנכרון"
+ "מאפשרת לאפליקציה לקרוא את סטטיסטיקת הסנכרון של חשבון, כולל היסטוריית אירועי הסנכרון וכמות הנתונים שסונכרנה."
"קריאת התוכן של האחסון המשותף שלך"
"מאפשר לאפליקציה לקרוא את התוכן של האחסון המשותף."
"שינוי או מחיקה של תוכן האחסון המשותף שלך"
"מאפשר לאפליקציה לכתוב את התוכן של האחסון המשותף."
"ביצוע/קבלה של שיחות SIP"
"אפשר לאפליקציה לבצע ולקבל שיחות SIP."
- "רשום חיבורי Telecom SIM חדשים"
+ "רישום חיבורי Telecom SIM חדשים"
"מאפשר לאפליקציה לרשום חיבורי Telecom SIM חדשים."
"רשום חיבורי Telecom חדשים"
- "מאפשר לאפליקציה לרשום חיבורי תקשורת חדשים."
+ "מאפשרת לאפליקציה לרשום חיבורי תקשורת חדשים."
"ניהול חיבורי תקשורת"
"מאפשר לאפליקציה לנהל חיבורי תקשורת."
"צור אינטראקציה עם מסך שיחה נכנסת"
"מאפשר לאפליקציה לקבוע מתי ואיך המשתמש יראה את מסך השיחה הנכנסת."
"צור אינטראקציה עם שירותי טלפוניה"
- "מאפשר לאפליקציה ליצור אינטראקציה עם שירותי טלפוניה כדי לבצע/לקבל שיחות."
- "ספק חווית משתמש של שיחה נכנסת"
- "מאפשר לאפליקציה לספק חוויית משתמש של שיחה נכנסת."
+ "מאפשרת לאפליקציה ליצור אינטראקציה עם שירותי טלפוניה כדי לבצע ולקבל שיחות."
+ "סיפוק חווית שימוש של שיחה נכנסת"
+ "מאפשרת לאפליקציה לספק חוויית שימוש של שיחה נכנסת."
"קריאת נתוני שימוש היסטוריים ברשת"
"מאפשר לאפליקציה לקרוא נתוני שימוש היסטוריים ברשת עבור רשתות ואפליקציות ספציפיות."
"נהל מדיניות רשת"
- "מאפשר לאפליקציה לנהל מדיניות הרשת להגדיר כללים ספציפיים-לאפליקציה."
- "שנה ניהול חשבונות של שימוש ברשת"
- "הרשאה זו מאפשרת לאפליקציה לשנות את אופן החישוב של נתוני שימוש ברשת מול כל אפליקציה. לא מיועד לשימוש באפליקציות רגילות."
+ "מאפשרת לאפליקציה לנהל את מדיניות הרשת ולהגדיר כללים ספציפיים-לאפליקציה."
+ "שינוי ניהול החשבונות של שימוש ברשת"
+ "ההרשאה הזו מאפשרת לאפליקציה לשנות את אופן החישוב של נתוני שימוש ברשת מול כל אפליקציה. לא מיועדת לשימוש באפליקציות רגילות."
"גישה להתראות"
"מאפשר לאפליקציה לאחזר, לבדוק ולמחוק התראות, כולל כאלה שפורסמו על ידי אפליקציות אחרות."
"איגוד לשירות של מאזין להתראות"
- "הרשאה זו מאפשרת למשתמש לבצע איגוד לממשק הרמה העליונה של שירות מאזין להתראות. הרשאה זו אף פעם אינה נחוצה לאפליקציות רגילים."
+ "מאפשרת למשתמש לבצע איגוד לממשק הרמה העליונה של שירות האזנה להתראות. ההרשאה הזו אינה נחוצה לאפליקציות רגילות."
"איגוד לשירות ספק תנאי"
- "מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות ספק תנאי. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."
+ "מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות ספק תנאי. לא אמורה להיות נחוצה עבור אפליקציות רגילות."
"איגוד לשירות ׳חלום בהקיץ׳"
"מאפשרת לבעלים לבצע איגוד לממשק הרמה העליונה של שירות ׳חלום בהקיץ׳. הרשאה זו אף פעם אינה נחוצה לאפליקציות רגילות."
"הפעלה של אפליקציית תצורה שסופקה על ידי ספק"
@@ -670,13 +670,13 @@
"איגוד לשירות העברת הודעות של ספק"
"מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות העברת הודעות של ספק. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."
"איגוד לשירותי ספק"
- "מאפשר לבעלים לאגד לשירות ספק. לעולם לא אמור להיות נחוץ לאפליקציות רגילות."
+ "מאפשרת לבעלים לאגד לשירות ספק. לא נחוצה לאפליקציות רגילות בדרך כלל."
"גישה אל \'נא לא להפריע\'"
- "מאפשר לאפליקציה לקרוא ולכתוב את התצורה של \'נא לא להפריע\'."
+ "מאפשרת לאפליקציה לקרוא ולכתוב את התצורה של התכונה \'נא לא להפריע\'."
"התחלת צפייה בהרשאות השימוש"
"מאפשרת לבעלים להפעיל את השימוש בהרשאות עבור אפליקציה מסוימת. הרשאה זו אף פעם לא נדרשת עבור אפליקציות רגילות."
"הגדר כללי סיסמה"
- "קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי הגישה של מסך הנעילה."
+ "קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי האימות של מסך הנעילה."
"מעקב אחר ניסיונות לביטול של נעילת המסך"
"ניהול מעקב אחר מספר הסיסמאות השגויות שמוקלדות בעת ביטול נעילת המסך, וביצוע נעילה של הטאבלט, או מחיקה של כל נתוני הטאבלט, אם מוקלדות יותר מדי סיסמאות שגויות."
"מעקב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, כמו גם נעילה של מכשיר ה-Android TV או מחיקה של כל נתוני מכשיר ה-Android TV אם הוזנו יותר מדי סיסמאות שגויות."
@@ -689,23 +689,23 @@
"נעילת המסך"
"שליטה באופן ובתזמון של נעילת המסך."
"מחיקת כל הנתונים"
- "מחק את נתוני הטאבלט ללא אזהרה על ידי ביצוע איפוס נתוני יצרן."
+ "מחיקה של נתוני הטאבלט ללא אזהרה, באמצעות איפוס לנתוני היצרן."
"מחיקה ללא אזהרה של נתוני מכשיר ה-Android TV באמצעות איפוס לנתוני היצרן."
- "מחיקה של נתוני הטלפון, ללא אזהרה, על ידי ביצוע איפוס נתוני יצרן."
+ "מחיקה של נתוני הטלפון, ללא אזהרה, על ידי ביצוע איפוס לנתוני היצרן."
"מחיקת נתוני משתמש"
"מחיקה ללא אזהרה של נתוני המשתמש הזה בטאבלט הזה."
- "מחיקה ללא אזהרה של נתוני המשתמש הזה במכשיר ה-Android TV הזה."
+ "מחיקה של נתוני המשתמש הזה במכשיר ה-Android TV, ללא אזהרה."
"מחיקה ללא אזהרה של נתוני המשתמש הזה בטלפון הזה."
"הגדר את שרת ה-Proxy הכללי של המכשיר"
"הגדרה של שרת ה-proxy הגלובלי שבו ייעשה שימוש כשהמדיניות פועלת. רק הבעלים של המכשיר יכול להגדיר את שרת ה-proxy הגלובלי."
"הגדרת תפוגה לסיסמת מסך הנעילה"
"שינוי התדירות לדרישת השינוי של הסיסמה, קוד הגישה או קו ביטול הנעילה של מסך הנעילה."
- "הגדר הצפנת אחסון"
- "דרוש שנתוני אפליקציות מאוחסנות יהיו מוצפנים."
- "השבת מצלמות"
+ "הגדרת הצפנה של אחסון"
+ "נדרש שנתונים של אפליקציות מאוחסנות יהיו מוצפנים."
+ "השבתת מצלמות"
"מנע שימוש בכל המצלמות שבמכשיר."
- "השבת חלק מהתכונות של נעילת המסך"
- "מנע שימוש בחלק מהתכונות של נעילת המסך."
+ "השבתת חלק מהתכונות של נעילת המסך"
+ "מניעת שימוש בחלק מהתכונות של נעילת המסך."
- "בית"
- "נייד"
@@ -768,9 +768,9 @@
"TTY TDD"
"נייד של העבודה"
"זימונית מהעבודה"
- "מסייע"
+ "אסיסטנט"
"MMS"
- "מותאם אישית"
+ "בהתאמה אישית"
"תאריך לידה"
"יום השנה"
"אחר"
@@ -805,10 +805,10 @@
"אח"
"ילד"
"שותף לחיים"
- "אב"
+ "אבא"
"חבר"
"מנהל"
- "אם"
+ "אמא"
"הורה"
"שותף"
"הופנה על ידי"
@@ -820,38 +820,38 @@
"עבודה"
"אחר"
"לא נמצאה אפליקציה להצגת התוכן הזה."
- "הקלד קוד גישה"
- "הקלד את קוד ה-PUK וקוד הגישה החדש"
+ "יש להקליד קוד אימות"
+ "יש להקליד את קוד ה-PUK ואת קוד האימות החדש"
"קוד PUK"
- "קוד גישה חדש"
- "הקש כדי להקליד את הסיסמה"
+ "קוד אימות חדש"
+ "יש להקיש כדי להקליד את הסיסמה"
"הקלד סיסמה לביטול הנעילה"
- "הקלד קוד גישה לביטול הנעילה"
- "קוד גישה שגוי"
+ "יש להקליד קוד אימות לביטול הנעילה"
+ "קוד אימות שגוי"
"כדי לבטל את הנעילה, לחץ על \'תפריט\' ולאחר מכן על 0."
"מספר חירום"
"אין שירות"
"המסך נעול."
- "לחץ על \'תפריט\' כדי לבטל את הנעילה או כדי לבצע שיחת חירום."
- "לחץ על \'תפריט\' כדי לבטל את הנעילה."
- "שרטט קו לביטול נעילת המסך"
+ "יש ללחוץ על \'תפריט\' כדי לבטל את הנעילה או כדי לבצע שיחת חירום."
+ "יש ללחוץ על \'תפריט\' כדי לבטל את הנעילה."
+ "יש לשרטט קו לביטול נעילת המסך"
"שיחת חירום"
"חזרה לשיחה"
"נכון!"
"כדאי לנסות שוב"
"כדאי לנסות שוב"
"בטל את הנעילה לכל התכונות והנתונים"
- "חרגת ממספר הניסיונות המרבי של זיהוי פנים"
+ "חרגת ממספר הניסיונות המרבי לשחרור נעילה על ידי זיהוי פנים"
"אין כרטיס SIM"
"אין כרטיס SIM בטאבלט."
"אין כרטיס SIM במכשיר ה-Android TV."
"אין כרטיס SIM בטלפון."
- "הכנס כרטיס SIM."
- "כרטיס ה-SIM חסר או שלא ניתן לקרוא אותו. הכנס כרטיס SIM."
- "לא ניתן להשתמש בכרטיס SIM זה."
- "כרטיס ה-SIM שלך הושבת לצמיתות.\nפנה לספק השירות האלחוטי שלך לקבלת כרטיס SIM אחר."
+ "יש להכניס כרטיס SIM."
+ "כרטיס ה-SIM חסר או שלא ניתן לקרוא אותו. יש להכניס כרטיס SIM."
+ "לא ניתן להשתמש בכרטיס ה-SIM הזה."
+ "כרטיס ה-SIM שלך הושבת באופן סופי.\nיש לפנות לספק השירות האלחוטי שלך לקבלת כרטיס SIM אחר."
"הרצועה הקודמת"
- "הרצועה הבאה"
+ "הטראק הבא"
"השהה"
"הפעלה"
"הפסק"
@@ -860,15 +860,15 @@
"שיחות חירום בלבד"
"רשת נעולה"
"כרטיס SIM נעול באמצעות PUK."
- "עיין במדריך למשתמש או פנה לשירות הלקוחות."
+ "יש לעיין במדריך למשתמש או לפנות לשירות הלקוחות."
"כרטיס ה-SIM נעול."
"מבטל נעילה של כרטיס SIM…"
- "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות."
+ "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. \n\nיש לנסות שוב בעוד %2$d שניות."
"הקלדת סיסמה שגויה %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות."
"הקלדת קוד גישה שגוי %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות."
- "שרטטת באופן שגוי את קו ביטול הנעילה %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטאבלט באמצעות פרטי הכניסה שלך ל-Google.\n\nנסה שוב בעוד %3$d שניות."
+ "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטאבלט באמצעות פרטי הכניסה שלך ל-Google.\n\nיש לנסות שוב בעוד %3$d שניות."
"שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את הנעילה של מכשיר ה-Android TV באמצעות כניסה לחשבון Google שלך.\n\n נסה שוב בעוד %3$d שניות."
- "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. בעוד %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות פרטי הכניסה שלך ל-Google.\n\n נסה שוב בעוד %3$d שניות."
+ "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. בעוד %2$d ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטלפון באמצעות פרטי הכניסה שלך ל-Google.\n\n יש לנסות שוב בעוד %3$d שניות."
"ביצעת %1$d ניסיונות שגויים לביטול נעילת הטאבלט. לאחר %2$d ניסיונות כושלים נוספים, הטאבלט יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."
"ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, מכשיר ה-Android TV יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."
"ביצעת %1$d ניסיונות שגויים לביטול נעילת הטלפון. לאחר %2$d ניסיונות כושלים נוספים, הטלפון יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."
@@ -876,16 +876,16 @@
"ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV %d פעמים. מכשיר ה-Android TV יעבור כעת איפוס לברירת המחדל של היצרן."
"ביצעת %d ניסיונות שגויים לביטול נעילת הטלפון. הטלפון יעבור כעת איפוס לברירת המחדל של היצרן."
"נסה שוב בעוד %d שניות."
- "שכחת את הקו?"
- "ביטול נעילת חשבון"
+ "שכחת את קו ביטול הנעילה?"
+ "ביטול נעילת החשבון"
"בוצעו ניסיונות רבים מדי לשרטוט קו ביטול נעילה."
- "כדי לבטל את הנעילה, היכנס באמצעות חשבון Google שלך."
+ "כדי לבטל את הנעילה, עליך להיכנס באמצעות חשבון Google שלך."
"שם משתמש (אימייל)"
"סיסמה"
"כניסה"
"שם משתמש או סיסמה לא חוקיים."
- "שכחת את שם המשתמש או הסיסמה?\nהיכנס לכתובת ""google.com/accounts/recovery"
- "בודק..."
+ "שכחת את שם המשתמש או הסיסמה?\nאפשר להיכנס לכתובת ""google.com/accounts/recovery"
+ "בבדיקה..."
"בטל נעילה"
"קול פועל"
"ללא קול"
@@ -908,12 +908,12 @@
"סידור מחדש של Widgets התחיל."
"סידור מחדש של Widgets הסתיים."
"Widget %1$s נמחק."
- "הרחב את אזור ביטול הנעילה."
+ "הרחבה של אזור ביטול הנעילה."
"ביטול נעילה באמצעות הסטה."
"ביטול נעילה על ידי שרטוט קו."
"ביטול נעילה באמצעות זיהוי פנים."
"ביטול נעילה באמצעות קוד גישה."
- "ביטול נעילה של קוד הגישה ל-SIM."
+ "ביטול הנעילה של קוד האימות ל-SIM."
"ביטול נעילה של PUK ל-SIM."
"ביטול נעילה באמצעות סיסמה."
"אזור לשרטוט קו ביטול נעילה."
@@ -929,12 +929,12 @@
"הפעולה FACTORY_TEST נתמכת רק עבור חבילות שהותקנו ב-/system/app."
"לא נמצאה חבילה המספקת את הפעולה FACTORY_TEST."
"אתחל מחדש"
- "בדף שבכתובת \'%s\' כתוב כך:"
+ "בדף שבכתובת \'%s\' כתוב:"
"JavaScript"
"אישור ניווט"
"צא מדף זה"
- "הישאר בדף זה"
- "%s\n\nהאם אתה בטוח שברצונך לנווט אל מחוץ לדף זה?"
+ "להישאר בדף הזה"
+ "%s\n\nבטוח שברצונך לנווט אל מחוץ לדף הזה?"
"אישור"
"טיפ: הקש פעמיים כדי להגדיל ולהקטין."
"מילוי אוטומטי"
@@ -958,19 +958,19 @@
"אמירות"
"קריאת סימניות והיסטוריית האינטרנט שלך"
"מאפשר לאפליקציה לקרוא את ההיסטוריה של כל כתובות האתרים שבהן הדפדפן ביקר, ואת כל ה-Bookmarks של הדפדפן. שים לב: דפדפני צד שלישי או אפליקציות אחרות עם יכולות לדפדוף באינטרנט אינם יכולים לאכוף אישור זה."
- "כתיבת סימניות והיסטוריית אינטרנט"
+ "כתיבת סימניות והיסטורייה של אתרים"
"מאפשר לאפליקציה לשנות את ההיסטוריה או ה-Bookmarks של הדפדפן המאוחסנים בטאבלט. הדבר עשוי לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. שים לב: אישור זה אינו ניתן לאכיפה על ידי דפדפני צד שלישי או אפליקציות אחרות בעלות יכולות גלישה באינטרנט."
"מאפשרת לאפליקציה לשנות את הסימניות או את היסטוריית הדפדפן השמורות במכשיר ה-Android TV. הרשאה זו עשויה לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. הערה: ייתכן שההרשאה לא תיושם על ידי דפדפנים של צד שלישי או על ידי אפליקציות אחרות עם יכולות גלישה באינטרנט."
"מאפשר לאפליקציה לשנות את ההיסטוריה או ה-Bookmarks של הדפדפן המאוחסנים בטלפון. הדבר עשוי לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. שים לב: אישור זה אינו ניתן לאכיפה על ידי דפדפני צד שלישי או אפליקציות אחרות בעלות יכולות גלישה באינטרנט."
"הגדרת התראה"
- "מאפשר לאפליקציה להגדיר התראה באפליקציה מותקנת של שעון מעורר. אפליקציות מסוימות של שעון מעורר אינן מיישמות תכונה זו."
- "הוסף דואר קולי"
- "מאפשר לאפליקציה להוסיף הודעות לתיבת הדואר הקולי."
+ "מאפשרת לאפליקציה להגדיר התראה באפליקציה מותקנת של שעון מעורר. אפליקציות מסוימות של שעון מעורר אינן מיישמות את התכונה הזו."
+ "הוספה של דואר קולי"
+ "מאפשרת לאפליקציה להוסיף הודעות לתיבת הדואר הקולי."
"שינוי הרשאות המיקום הגיאוגרפי של הדפדפן"
"מאפשר לאפליקציה לשנות את הרשאות המיקום הגיאוגרפי של הדפדפן. אפליקציות זדוניות עלולות להשתמש בכך כדי לאפשר משלוח של פרטי מיקום לאתרים זדוניים אחרים."
"האם ברצונך שהדפדפן יזכור סיסמה זו?"
- "לא כעת"
- "זכור"
+ "לא עכשיו"
+ "כן, לשמור"
"אף פעם"
"אין לך הרשאה לפתוח דף זה."
"הטקסט הועתק ללוח."
@@ -990,11 +990,11 @@
"חיפוש…"
"חיפוש"
"שאילתת חיפוש"
- "נקה שאילתה"
- "שלח שאילתה"
+ "ניקוי שאילתה"
+ "שליחת שאילתה"
"חיפוש קולי"
- "האם להפעיל את התכונה \'חקור על ידי מגע\'?"
- "%1$s רוצה להפעיל את התכונה \'חקור על ידי מגע\'. כאשר התכונה \'חקור על ידי מגע\' מופעלת, אתה יכול לשמוע או לראות תיאורים של הפריטים שעליהם אצבעך מונחת או לקיים אינטראקציה עם הטאבלט באמצעות תנועות אצבע."
+ "האם להפעיל את התכונה \'גילוי באמצעות מגע\'?"
+ "%1$s רוצה להפעיל את התכונה \'גילוי באמצעות מגע\'. כאשר התכונה הזו מופעלת, אפשר לשמוע או לראות תיאורים של הפריטים שעליהם הנחת את האצבע או לקיים אינטראקציה עם הטאבלט באמצעות תנועות."
"%1$s רוצה להפעיל את התכונה \'חקור על ידי מגע\'. כאשר התכונה \'חקור על ידי מגע\' מופעלת, אתה יכול לשמוע או לראות תיאורים של הפריטים שעליהם אצבעך מונחת או לקיים אינטראקציה עם הטלפון באמצעות תנועות אצבע."
"לפני חודש אחד"
"לפני חודש אחד"
@@ -1002,7 +1002,7 @@
- %d הימים האחרונים
- %d הימים האחרונים
- %d הימים האחרונים
- - יום %d אחרון
+ - היום האחרון (%d)
"בחודש שעבר"
"ישן יותר"
@@ -1044,7 +1044,7 @@
- %d שנים
- %d שנים
- %d שנים
- - שנה %d
+ - שנה אחת (%d)
- בעוד %d דקות
@@ -1098,7 +1098,7 @@
- בעוד %d דקות
- בעוד %d דקות
- בעוד %d דקות
- - בעוד %d דקה
+ - בעוד דקה אחת (%d)
- בעוד %d שעות
@@ -1119,8 +1119,8 @@
- בעוד שנה %d
"בעיה בווידאו"
- "סרטון זה אינו חוקי להעברה כמדיה זורמת למכשיר זה."
- "לא ניתן להפעיל סרטון זה."
+ "לא ניתן להעביר את הסרטון הזה בסטרימינג למכשיר."
+ "לא ניתן להפעיל את הסרטון הזה."
"אישור"
"%1$s, %2$s"
"צהריים"
@@ -1129,15 +1129,15 @@
"חצות"
"%1$02d:%2$02d"
"%1$d:%2$02d:%3$02d"
- "בחר הכל"
- "חתוך"
- "העתק"
+ "בחירת הכול"
+ "חיתוך"
+ "העתקה"
"ההעתקה אל הלוח נכשלה"
"הדבק"
- "הדבק כטקסט פשוט"
- "החלף..."
+ "הדבקה כטקסט פשוט"
+ "החלפה..."
"מחיקה"
- "העתק כתובת אתר"
+ "העתקת כתובת URL"
"בחר טקסט"
"ביטול"
"בצע מחדש"
@@ -1147,17 +1147,17 @@
"מחיקה"
"שיטת קלט"
"פעולות טקסט"
- "שטח האחסון אוזל"
+ "מקום האחסון עומד להיגמר"
"ייתכן שפונקציות מערכת מסוימות לא יפעלו"
- "אין מספיק שטח אחסון עבור המערכת. ודא שיש לך שטח פנוי בגודל 250MB התחל שוב."
- "%1$s פועל"
+ "אין מספיק מקום אחסון עבור המערכת. עליך לוודא שיש לך מקום פנוי בנפח של 250MB ולהתחיל שוב."
+ "אפליקציית %1$s פועלת"
"הקש לקבלת מידע נוסף או כדי לעצור את האפליקציה."
"אישור"
"ביטול"
"אישור"
"ביטול"
"זהירות"
- "טוען..."
+ "בטעינה..."
"מופעל"
"כבוי"
"מסומן"
@@ -1165,44 +1165,44 @@
"השלמת פעולה באמצעות"
"להשלמת הפעולה באמצעות %1$s"
"השלם פעולה"
- "פתח באמצעות"
+ "פתיחה באמצעות"
"פתח באמצעות %1$s"
- "פתח"
+ "פתיחה"
"פתיחת קישורים של %1$s באמצעות"
"פתיחת קישורים באמצעות"
"פתיחת קישורים באמצעות %1$s"
"פתיחת קישורים של %1$s באמצעות %2$s"
"הענקת גישה"
- "ערוך באמצעות"
- "ערוך באמצעות %1$s"
+ "עריכה באמצעות"
+ "עריכה באמצעות %1$s"
"עריכה"
"שיתוף"
- "שתף באמצעות %1$s"
+ "שיתוף באמצעות %1$s"
"שתף"
"שליחה באמצעות"
"שליחה באמצעות %1$s"
- "שלח"
+ "שליחה"
"בחר אפליקציה שתשמש כדף הבית"
"השתמש ב-%1$s כדף הבית"
"צלם תמונה"
"צלם תמונה באמצעות"
"צילום תמונה באמצעות %1$s"
"צלם תמונה"
- "השתמש כברירת מחדל עבור פעולה זו."
+ "שימוש כברירת מחדל עבור הפעולה הזו."
"השתמש באפליקציה אחרת"
"נקה את הגדרת המחדל ב\'הגדרות מערכת\' < Google Apps < \'הורדות\'."
"בחירת פעולה"
- "בחר אפליקציה עבור התקן ה-USB"
- "אין אפליקציות שיכולות לבצע פעולה זו."
+ "בחירת אפליקציה עבור התקן ה-USB"
+ "אין אפליקציות שיכולות לבצע את הפעולה הזו."
"האפליקציה %1$s הפסיקה"
"התהליך %1$s הפסיק"
"האפליקציה %1$s נעצרת שוב ושוב"
"האפליקציה %1$s נעצרת שוב ושוב"
- "פתח שוב את האפליקציה"
+ "פתיחת האפליקציה מחדש"
"שליחת משוב"
"סגירה"
"השתק עד הפעלה מחדש של המכשיר"
- "המתן"
+ "להמתין"
"סגור את האפליקציה"
"האפליקציה %2$s אינה מגיבה"
@@ -1215,10 +1215,10 @@
"הדף אינו מגיב.\n\nהאם אתה רוצה לסגור אותו?"
"הפנייה מחדש של אפליקציה"
"%1$s פועל כעת."
- "%1$s הופעל במקור."
+ "אפליקציית %1$s הופעלה במקור."
"שינוי קנה-מידה"
- "הצג תמיד"
- "אפשר תכונה זו מחדש ב\'הגדרות מערכת\' < Google Apps < \'הורדות\'."
+ "להציג תמיד"
+ "אפשר להפעיל מחדש את התכונה הזו ב\'הגדרות מערכת\' < Google Apps < \'הורדות\'."
"%1$s אינו תומך בהגדרת הגודל הנוכחית של התצוגה, והתנהגותו עשויה להיות בלתי צפויה."
"הצג תמיד"
"%1$s נבנתה לגרסה לא תואמת של מערכת ההפעלה של Android ועלולה להתנהג באופן לא צפוי. ייתכן שקיימת גרסה מעודכנת של האפליקציה."
@@ -1231,23 +1231,23 @@
"הפעלת המכשיר מתחילה…"
"הפעלת הטלפון מתחילה…"
"הפעלת Android מתחילה…"
- "הפעלת הטאבלט מתחילה…"
+ "הטאבלט בתהליך הפעלה…"
"הפעלת המכשיר מתחילה…"
"מתבצעת אופטימיזציה של האחסון."
"עדכון המערכת לקראת סיום…"
"%1$s מבצעת שדרוג…"
- "מבצע אופטימיזציה של אפליקציה %1$d מתוך %2$d."
- "מכין את %1$s."
+ "מתבצעת אופטימיזציה של אפליקציה %1$d מתוך %2$d."
+ "המערכת מכינה את %1$s."
"מפעיל אפליקציות."
- "מסיים אתחול."
+ "תהליך האתחול בשלבי סיום."
"%1$s פועל"
"יש להקיש כדי לחזור למשחק"
"בחירת משחק"
"לקבלת ביצועים טובים יותר, רק אחד מבין המשחקים האלה יכול להיות פתוח בכל פעם."
"חזרה אל %1$s"
"פתיחת %1$s"
- "%1$s האפליקציה תיסגר ללא שמירה"
- "%1$s חורג מהגבלת הזיכרון"
+ "אפליקציית %1$s תיסגר ללא שמירה"
+ "%1$s חורג ממגבלת הזיכרון"
"Dump של ערימה בשביל %1$s מוכן"
"Dump של ערימה נאסף. יש להקיש כדי לשתף."
"האם לשתף את נתוני ה-Dump של הערימה?"
@@ -1264,7 +1264,7 @@
"עוצמת קול של התראה"
"עוצמת הקול של ההתראות"
"עוצמת קול"
- "עוצמת קול של Bluetooth"
+ "עוצמת הקול של Bluetooth"
"עוצמת קול של רינגטון"
"עוצמת קול של שיחות"
"עוצמת קול של מדיה"
@@ -1276,20 +1276,20 @@
"צלילי התראה"
"צלילי התראה"
"לא ידוע"
- "היכנס לרשת Wi-Fi"
- "היכנס לרשת"
+ "כניסה לרשת Wi-Fi"
+ "כניסה לרשת"
"ל-%1$s אין גישה לאינטרנט"
- "הקש לקבלת אפשרויות"
+ "יש להקיש לצפייה באפשרויות"
"לרשת הסלולרית אין גישה לאינטרנט"
"לרשת אין גישה לאינטרנט"
"לא ניתן לגשת לשרת DNS הפרטי"
"הקישוריות של %1$s מוגבלת"
- "כדי להתחבר למרות זאת יש להקיש"
+ "יש להקיש כדי להתחבר בכל זאת"
"מעבר אל %1$s"
"המכשיר משתמש ברשת %1$s כשלרשת %2$s אין גישה לאינטרנט. עשויים לחול חיובים."
- "עבר מרשת %1$s לרשת %2$s"
+ "בוצע מעבר מרשת %1$s לרשת %2$s"
- "חבילת גלישה"
- "Wi-Fi"
@@ -1298,14 +1298,14 @@
- "VPN"
"סוג רשת לא מזוהה"
- "קבל"
+ "אישור"
"דחה"
"הוסף תו"
- "שולח הודעות SMS"
- "<b> %1$s </ b> שולח מספר רב של הודעות SMS. האם ברצונך לאפשר לאפליקציה זו להמשיך לשלוח הודעות?"
+ "מתבצעת שליחה של הודעות SMS"
+ "האפליקציה <b> %1$s </ b> שולחת מספר רב של הודעות SMS. האם לאפשר לאפליקציה הזו להמשיך לשלוח הודעות?"
"כן, זה בסדר"
"עדיף שלא"
- "<b>%1$s</b> רוצה לשלוח הודעה אל <b>%2$s</b>."
+ "אפליקציית <b>%1$s</b> רוצה לשלוח הודעה אל <b>%2$s</b>."
"הדבר ""עלול לגרום לחיובים"" בחשבון המכשיר הנייד שלך."
"הדבר יגרום לחיובים בחשבון המכשיר הנייד שלך."
"שלח"
@@ -1315,7 +1315,7 @@
"אפשר תמיד"
"לעולם אל תאפשר"
"כרטיס ה-SIM הוסר"
- "הרשת הסלולרית לא תהיה זמינה עד שתפעיל מחדש לאחר הכנסת כרטיס SIM חוקי."
+ "הרשת הסלולרית לא תהיה זמינה עד שתבוצע הפעלה מחדש לאחר הכנסת כרטיס SIM חוקי."
"סיום"
"כרטיס ה-SIM נוסף"
"הפעל מחדש את המכשיר כדי לגשת אל הרשת הסלולרית."
@@ -1323,21 +1323,21 @@
"הפעלה של השירות הסלולרי"
"הורדה של אפליקציית הספק כדי להפעיל את כרטיס ה-SIM החדש"
"ניתן להוריד את האפליקציה %1$s כדי להפעיל את כרטיס ה-SIM החדש"
- "הורדת אפליקציה"
+ "להורדת האפליקציה"
"ה-SIM החדש הוכנס"
- "הקש כדי להגדיר"
+ "יש להקיש כדי להגדיר"
"הגדרת שעה"
"הגדרת תאריך"
"הגדרה"
- "בוצע"
+ "סיום"
"חדש: "
- "מטעם %1$s."
- "לא דרושים אישורים"
+ "מאת %1$s."
+ "לא נדרשות הרשאות"
"פעולה זו עשויה לחייב אותך בכסף:"
"אישור"
"טעינת המכשיר הזה באמצעות USB"
"טעינת המכשיר המחובר באמצעות USB"
- "העברת קבצים ב-USB מופעלת"
+ "האפשרות להעברת קבצים ב-USB מופעלת"
"PTP באמצעות USB מופעל"
"שיתוף אינטרנט בין מכשירים באמצעות USB מופעל"
"MIDI באמצעות USB מופעל"
@@ -1353,7 +1353,7 @@
"יש להקיש כדי להשבית ניפוי באגים אלחוטי"
"יש לבחור כדי להשבית ניפוי באגים אלחוטי."
"מצב מסגרת בדיקה הופעל"
- "כדי להשבית את מצב מסגרת בדיקה צריך לאפס להגדרות היצרן."
+ "כדי להשבית את מצב \'מסגרת בדיקה\' צריך לאפס להגדרות היצרן."
"קונסולה סדרתית מופעלת"
"קיימת השפעה על הביצועים. כדי להשבית, יש לבדוק את תוכנת האתחול."
"יש נוזלים או חלקיקים ביציאת ה-USB"
@@ -1363,12 +1363,12 @@
"עיבוד דוח על באג..."
"האם לשתף דוח על באג?"
"שיתוף דוח על באג…"
- "מנהל המערכת ביקש דוח על באג כדי לסייע בפתרון בעיות במכשיר זה. ייתכן שאפליקציות ונתונים ישותפו."
+ "מנהל המערכת ביקש דוח על באג כדי לסייע בפתרון בעיות במכשיר הזה. ייתכן שאפליקציות ונתונים ישותפו."
"שתף"
"עדיף שלא"
"בחר שיטת הזנה"
"להשאיר במסך בזמן שהמקלדת הפיזית פעילה"
- "הצג מקלדת וירטואלית"
+ "הצגת מקלדת וירטואלית"
"הגדרת מקלדת פיזית"
"הקש כדי לבחור שפה ופריסה"
" ABCDEFGHIJKLMNOPQRSTUVWXYZ"
@@ -1392,7 +1392,7 @@
"ייתכן שיהיה צורך לפרמט מחדש את המכשיר. יש להקיש כדי להוציא את המדיה."
"%s לא נתמך"
"המדיה %s לא פועלת"
- "מכשיר זה אינו תומך ב-%s זה. הקש כדי להגדיר בפורמט נתמך."
+ "אין תמיכה ב-%s במכשיר הזה. יש להקיש כדי לבצע הגדרה בפורמט נתמך."
"%s לא נתמך במכשיר הזה. בחר כדי להגדיר בפורמט שנתמך."
"ייתכן שיהיה צורך לפרמט מחדש את המכשיר"
"%s הוסר באופן בלתי צפוי"
@@ -1402,52 +1402,52 @@
"הוצאה של %s"
"אין להסיר"
"הגדרה"
- "הוצא"
- "גלה"
+ "הוצאה"
+ "עיון במדיה"
"החלפת פלט"
- "%s חסר"
+ "חסר: %s"
"יש להכניס שוב את ההתקן"
"מעביר את %s"
- "מעביר נתונים"
+ "מתבצעת העברה של נתונים"
"העברת התוכן הסתיימה"
"התוכן הועבר אל %s"
"לא ניתן היה להעביר תוכן"
"יש לנסות שוב להעביר את התוכן"
"הוסר"
- "הוצא"
+ "בוצעה הוצאה"
"בודק…"
"מוכן"
"לקריאה בלבד"
"הוסר בצורה לא בטוחה"
"פגום"
"לא נתמך"
- "מוציא…"
+ "מתבצעת הוצאה…"
"מפרמט…"
"לא הוכנס"
"לא נמצאו פעילויות תואמות."
"ניתוב פלט מדיה"
"מאפשר לאפליקציה לנתב פלט מדיה למכשירים חיצוניים אחרים."
"קריאת פעילות התקנה"
- "מאפשר לאפליקציה לקרוא הפעלות התקנה. הרשאה זו מאפשרת לה לראות פרטים על התקנות פעילות של חבילות."
+ "מאפשרת לאפליקציה לקרוא פעילויות התקנה. ההרשאה הזו מאפשרת לה לראות פרטים על התקנות פעילות של חבילות."
"בקשה להתקנת חבילות"
"מתיר לאפליקציה לבקש התקנה של חבילות."
"בקשה למחוק חבילות"
"מתיר לאפליקציה לבקש מחיקה של חבילות."
"בקשה להתעלם מאופטימיזציות של הסוללה"
- "מאפשר לאפליקציה לבקש רשות להתעלם מאופטימיזציות של הסוללה לאפליקציה הזו."
+ "מאפשרת לאפליקציה לבקש רשות להתעלם מאופטימיזציות של הסוללה לאפליקציה הזו."
"הקש פעמיים לבקרת מרחק מתצוגה"
"לא ניתן להוסיף widget."
"התחל"
"חיפוש"
- "שלח"
+ "שליחה"
"הבא"
"סיום"
"הקודם"
"בצע"
- "חייג למספר\nבאמצעות %s"
+ "חיוג למספר\nבאמצעות %s"
"צור איש קשר\nבאמצעות %s"
- "האפליקציות הבאות מבקשות אישור לגשת לחשבונך, כעת ובעתיד."
- "האם ברצונך לאפשר בקשה זו?"
+ "האפליקציות הבאות מבקשות אישור לגשת לחשבון שלך, עכשיו ובעתיד."
+ "לאפשר את הבקשה הזו?"
"בקשת גישה"
"כן, זה בסדר"
"עדיף שלא"
@@ -1459,7 +1459,7 @@
"סנכרון"
"נגישות"
"טפט"
- "שנה טפט"
+ "שינוי טפט"
"מאזין להתראות"
"VR ליסנר"
"ספק תנאי"
@@ -1467,7 +1467,7 @@
"VPN מופעל"
"VPN מופעל על ידי %s"
"הקש כדי לנהל את הרשת."
- "מחובר אל %s. הקש כדי לנהל את הרשת."
+ "בוצע חיבור אל %s. יש להקיש כדי לנהל את הרשת."
"ה-VPN שמופעל תמיד, מתחבר..."
"ה-VPN שפועל תמיד, מחובר"
"אין חיבור ל-VPN שפועל כל הזמן"
@@ -1495,11 +1495,11 @@
"שתף"
"מצא"
"חיפוש באינטרנט"
- "חפש את הבא"
- "חפש את הקודם"
+ "מציאת ההתאמה הבאה"
+ "חיפוש של הקודם"
"בקשת מיקום מאת %s"
"בקשת מיקום"
- "מבוקש על ידי %1$s (%2$s)"
+ "הבקשה נשלחה על ידי %1$s (%2$s)"
"כן"
"לא"
"בוצעה גישה למיקום בזמן מקרה חירום"
@@ -1509,22 +1509,22 @@
"יש %1$d פריטים שנמחקו עבור %2$s , בחשבון %3$s. איזו פעולה ברצונך לבצע?"
"מחק את הפריטים"
"בטל את פעולות המחיקה"
- "אל תעשה דבר כרגע"
+ "לא לבצע שום פעולה כרגע"
"בחירת חשבון"
"הוספת חשבון"
"הוספת חשבון"
"הוסף"
"הפחת"
"%s לחיצה ארוכה."
- "הסט למעלה כדי להוסיף ולמטה כדי להפחית."
+ "צריך להסיט למעלה כדי להוסיף ולמטה כדי להפחית."
"הוספת דקה"
- "הפחת דקה"
- "הוסף שעה"
- "הפחת שעה"
- "הגדר PM"
- "הגדר AM"
+ "הפחתת דקה"
+ "הוספת שעה"
+ "הפחתת שעה"
+ "הגדרת PM"
+ "הגדרת AM"
"הוסף חודש"
- "הפחת חודש"
+ "הפחתת חודש"
"הוסף יום"
"הפחת יום"
"הוסף שנה"
@@ -1541,15 +1541,15 @@
"בחר אפליקציה"
"לא ניתן היה להפעיל את %s"
"שתף עם"
- "שתף עם %s"
- "ידית להחלקה. לחיצה ארוכה."
+ "שיתוף עם %s"
+ "נקודת אחיזה להחלקה. לחיצה ארוכה."
"החלק לביטול נעילה."
"נווט לדף הבית"
- "נווט למעלה"
+ "ניווט למעלה"
"אפשרויות נוספות"
"%1$s, %2$s"
"%1$s, %2$s, %3$s"
- "אחסון שיתוף פנימי"
+ "אחסון פנימי משותף"
"כרטיס SD"
"כרטיס SD של %s"
"כונן USB"
@@ -1561,7 +1561,7 @@
"הגעת למגבלה של חבילת הגלישה"
"הגעת למגבלת נתוני Wi-Fi"
"הנתונים הושהו להמשך המחזור"
- "חריגה מהמגבלה של חבילת הגלישה"
+ "חרגת מהמגבלה של חבילת הגלישה"
"חריגה ממגבלת נתוני ה-Wi-Fi"
"חרגת ב-%s מעבר למגבלה המוגדרת"
"נתוני הרקע מוגבלים"
@@ -1584,7 +1584,7 @@
"טביעת אצבע SHA-256:"
"טביעת אצבע SHA-1:"
"הצג הכל"
- "בחר פעילות"
+ "בחירת פעילות"
"שתף עם"
"שולח…"
"להפעיל את הדפדפן?"
@@ -1602,14 +1602,14 @@
"מערכת"
"אודיו Bluetooth"
"צג אלחוטי"
- "העבר"
+ "העברה (cast)"
"התחברות למכשיר"
"העברת מסך אל מכשיר"
- "מחפש מכשירים…"
+ "המערכת מחפשת מכשירים…"
"הגדרות"
"נתק"
"סורק..."
- "מתחבר..."
+ "מתבצע חיבור..."
"זמין"
"לא זמין"
"בשימוש"
@@ -1635,42 +1635,42 @@
"כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים."
"הזן את קוד הגישה הרצוי"
"אשר את קוד הגישה הרצוי"
- "מבטל נעילה של כרטיס SIM…"
+ "מתבצע ביטול נעילה של כרטיס SIM…"
"קוד גישה שגוי."
"הקלד קוד גישה שאורכו 4 עד 8 ספרות."
"קוד PUK צריך להיות בן 8 ספרות."
- "הזן מחדש את קוד PUK הנכון. ניסיונות חוזרים ישביתו לצמיתות את כרטיס ה-SIM."
+ "יש להזין שוב את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM באופן סופי."
"קודי הגישה אינם תואמים"
"ניסיונות רבים מדי לשרטוט קו ביטול נעילה."
- "כדי לבטל את הנעילה, היכנס באמצעות חשבון Google שלך."
+ "כדי לבטל את הנעילה, עליך להיכנס באמצעות חשבון Google שלך."
"שם משתמש (אימייל)"
"סיסמה"
"כניסה"
"שם משתמש או סיסמה לא חוקיים."
"שכחת את שם המשתמש או הסיסמה?\nהיכנס לכתובת ""google.com/accounts/recovery"
- "בודק חשבון…"
+ "מתבצעת בדיקה של החשבון…"
"הקלדת קוד גישה שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות."
"הקלדת סיסמה שגויה %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות."
"שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות."
"ביצעת %1$d ניסיונות שגויים לביטול נעילת הטלפון. לאחר %2$d ניסיונות כושלים נוספים, הטאבלט יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."
- "ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, מכשיר ה-Android TV יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."
+ "ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, מכשיר ה-Android TV יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."
"ביצעת %1$d ניסיונות שגויים לביטול נעילת הטלפון. לאחר %2$d ניסיונות כושלים נוספים, הטלפון יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."
"ביצעת %d ניסיונות שגויים לביטול נעילת הטאבלט. הטאבלט יעבור כעת איפוס לברירת המחדל של היצרן."
"ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV %d פעמים. מכשיר ה-Android TV יעבור כעת איפוס לברירת המחדל של היצרן."
"ביצעת %d ניסיונות שגויים לביטול נעילת הטלפון. הטלפון יעבור כעת איפוס לברירת המחדל של היצרן."
- "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטאבלט באמצעות חשבון אימייל.\n\nנסה שוב בעוד %3$d שניות."
- "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את הנעילה של מכשיר ה-Android TV באמצעות חשבון אימייל.\n\n נסה שוב בעוד %3$d שניות."
+ "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטאבלט באמצעות חשבון אימייל.\n\nיש לנסות שוב בעוד %3$d שניות."
+ "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, יהיה צורך לבטל את הנעילה של מכשיר ה-Android TV באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד %3$d שניות."
"שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות חשבון אימייל.\n\nנסה שוב בעוד %3$d שניות."
" — "
- "הסר"
+ "הסרה"
"האם להעלות את עוצמת הקול מעל לרמה המומלצת?\n\nהאזנה בעוצמת קול גבוהה למשכי זמן ממושכים עלולה לפגוע בשמיעה."
"להשתמש בקיצור הדרך לתכונת הנגישות?"
"כשקיצור הדרך מופעל, לחיצה על שני לחצני עוצמת הקול למשך שלוש שניות מפעילה את תכונת הנגישות."
"להפעיל את תכונות הנגישות?"
- "לחיצה ארוכה על שני לחצני עוצמת הקול למשך מספר שניות מפעילה את תכונות הנגישות. בעקבות זאת, ייתכן שאופן הפעולה של המכשיר ישתנה.\n\nהתכונות הנוכחיות:\n%1$s\nניתן לשנות תכונות נבחרות ב\'הגדרות\' > \'נגישות\'."
+ "לחיצה ארוכה על שני לחצני עוצמת הקול למשך מספר שניות מפעילה את תכונות הנגישות. בעקבות זאת, ייתכן שאופן הפעולה של המכשיר ישתנה.\n\nהתכונות הנוכחיות:\n%1$s\nניתן לשנות את התכונות שנבחרו ב\'הגדרות\' > \'נגישות\'."
" • %1$s\n"
"להפעיל את %1$s?"
- "ניתן ללחוץ על שני מקשי עוצמת הקול למשך מספר שניות כדי להפעיל את %1$s, תכונת נגישות. בעקבות זאת, ייתכן שאופן הפעולה של המכשיר ישתנה.\n\nאפשר לשנות את מקשי הקיצור האלה לתכונה נוספת ב\'הגדרות\' > \'נגישות\'."
+ "לחיצה על שני מקשי עוצמת הקול למשך מספר שניות מפעילה את תכונת הנגישות %1$s. ייתכן שאופן הפעולה של המכשיר ישתנה בעקבות זאת.\n\nאפשר לשנות את מקשי הקיצור האלה לתכונה אחרת ב\'הגדרות\' > \'נגישות\'."
"אני רוצה להפעיל"
"לא להפעיל"
"מופעל"
@@ -1691,10 +1691,10 @@
"עריכת קיצורי הדרך"
"סיום"
"כבה את קיצור הדרך"
- "השתמש בקיצור הדרך"
+ "שימוש בקיצור הדרך"
"היפוך צבעים"
"תיקון צבעים"
- "לחצני עוצמת הקול נלחצו בלחיצה ארוכה. %1$s הופעל."
+ "לחצני עוצמת הקול נלחצו בלחיצה ארוכה. שירות %1$s הופעל."
"לחצני עוצמת הקול נלחצו בלחיצה ארוכה. %1$s הושבת."
"יש ללחוץ לחיצה ארוכה על שני לחצני עוצמת הקול למשך שלוש שניות כדי להשתמש בשירות %1$s"
"יש לבחור תכונה שתופעל בעת לחיצה על לחצן הנגישות:"
@@ -1705,12 +1705,12 @@
"כדי לעבור בין תכונות, יש להחליק כלפי מעלה בעזרת שלוש אצבעות ולהחזיק."
"הגדלה"
"המשתמש הנוכחי %1$s."
- "עובר אל %1$s…"
+ "מעבר אל %1$s…"
"מתבצע ניתוק של %1$s…"
"בעלים"
"שגיאה"
"מנהל המערכת שלך אינו מתיר שינוי זה"
- "לא נמצאה אפליקציה שתומכת בפעולה זו"
+ "לא נמצאה אפליקציה שתומכת בפעולה הזו"
"ביטול"
"ISO A0"
"ISO A1"
@@ -1800,46 +1800,46 @@
"לא ידוע"
"שירות ההדפסה לא הופעל"
"שירות %s מותקן"
- "הקש כדי להפעיל"
- "הזן את קוד הגישה של מנהל המכשיר"
+ "יש להקיש כדי להפעיל את השירות"
+ "יש להזין את קוד האימות של מנהל המכשיר"
"הזן קוד גישה"
"שגוי"
"קוד גישה נוכחי"
- "קוד גישה חדש"
+ "קוד אימות חדש"
"אשר את קוד הגישה החדש"
"צור קוד גישה לשינוי הגבלות"
- "קודי הגישה לא תואמים. נסה שוב."
+ "קודי האימות לא תואמים. יש לנסות שוב."
"קוד הגישה קצר מדי. חייב להיות באורך 4 ספרות לפחות."
- - נסה שוב בעוד %d שניות
- - נסה שוב בעוד %d שניות
- - נסה שוב בעוד %d שניות
- - נסה שוב בעוד שנייה אחת
+ - יש לנסות שוב בעוד %d שניות
+ - יש לנסות שוב בעוד %d שניות
+ - יש לנסות שוב בעוד %d שניות
+ - יש לנסות שוב בעוד שנייה אחת
- "נסה שוב מאוחר יותר"
+ "יש לנסות שוב מאוחר יותר"
"צפייה במסך מלא"
"כדי לצאת, פשוט מחליקים אצבע מלמעלה למטה."
"הבנתי"
- "בוצע"
+ "סיום"
"מחוון שעות מעגלי"
"מחוון דקות מעגלי"
"בחר שעות"
- "בחר דקות"
+ "בחירת דקות"
"בחר חודש ויום"
- "בחר שנה"
+ "בחירת שנה"
"%1$s נמחק"
"עבודה %1$s"
"%1$s שני בעבודה"
"%1$s שלישי בעבודה"
"בקש קוד גישה לפני ביטול הצמדה"
- "בקש קו ביטול נעילה לפני ביטול הצמדה"
+ "צריך לבקש קו ביטול נעילה לפני ביטול הצמדה"
"בקש סיסמה לפני ביטול הצמדה"
"הותקנה על ידי מנהל המערכת"
"עודכנה על ידי מנהל המערכת"
"נמחקה על ידי מנהל המערכת"
"אישור"
"כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Ok Google\n\n""למידע נוסף"
- "כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Ok Google"
+ "כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• משביתה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Hey Google"
"כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה נעשה שימוש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. המשמעות היא, למשל, שתמונות יוצגו רק לאחר שמקישים עליהן."
"להפעיל את חוסך הנתונים?"
"הפעלה"
@@ -1904,7 +1904,7 @@
"אירוע"
"שינה"
"%1$s משתיק חלק מהצלילים"
- "קיימת בעיה פנימית במכשיר שלך, וייתכן שהתפקוד שלו לא יהיה יציב עד שתבצע איפוס לנתוני היצרן."
+ "קיימת בעיה פנימית במכשיר שלך, וייתכן שהוא לא יתפקד כראוי עד שיבוצע איפוס לנתוני היצרן."
"קיימת בעיה פנימית במכשיר שלך. לקבלת פרטים, צור קשר עם היצרן."
"בקשת USSD שונתה לשיחה רגילה"
"בקשת USSD שונתה לבקשת SS"
@@ -1924,7 +1924,7 @@
"יציאת USB בציוד היקפי"
"אפשרויות נוספות"
"סגור את האפשרויות הנוספות"
- "הגדל"
+ "הגדלה"
"סגירה"
"%1$s: %2$s"
@@ -1937,7 +1937,7 @@
"עליך להגדיר את החשיבות של ההתראות האלה."
"ההודעה חשובה בשל האנשים המעורבים."
"התראות אפליקציה בהתאמה אישית"
- "האם לאפשר לאפליקציה %1$s ליצור משתמש חדש באמצעות %2$s (כבר קיים משתמש לחשבון הזה) ?"
+ "האם לאפשר לאפליקציה %1$s ליצור משתמש חדש באמצעות %2$s (כבר קיים משתמש לחשבון הזה)?"
"האם לאפשר לאפליקציה %1$s ליצור משתמש חדש באמצעות %2$s ?"
"הוספת שפה"
"העדפת אזור"
@@ -1946,7 +1946,7 @@
"כל השפות"
"כל האזורים"
"חיפוש"
- "האפליקציה אינה זמינה"
+ "האפליקציה לא זמינה"
"האפליקציה %1$s לא זמינה כרגע. את הזמינות שלה אפשר לנהל באפליקציה %2$s."
"מידע נוסף"
"ביטול ההשהיה של האפליקציה"
@@ -1958,13 +1958,13 @@
"האפליקציה הזו עוצבה לגרסה ישנה יותר של Android וייתכן שלא תפעל כראוי. ניתן לבדוק אם יש עדכונים או ליצור קשר עם המפתח."
"האם יש עדכון חדש?"
"יש לך הודעות חדשות"
- "פתח את אפליקציית ה-SMS כדי להציג"
+ "יש לפתוח את אפליקציית ה-SMS כדי להציג"
"ייתכן שחלק מהפונקציונליות תהיה מוגבלת"
"פרופיל העבודה נעול"
"הקש לביטול נעילת פרופיל העבודה"
- "מחובר אל %1$s"
+ "התבצע חיבור אל %1$s"
"הקש כדי להציג קבצים"
- "הצמד"
+ "הצמדה"
"הצמדה של %1$s"
"בטל הצמדה"
"ביטול ההצמדה של %1$s"
@@ -1983,15 +1983,15 @@
"חדשות וכתבי עת"
"מפות וניווט"
"פרודוקטיביות"
- "שטח האחסון במכשיר"
+ "נפח האחסון במכשיר"
"ניקוי באגים ב-USB"
"שעה"
"דקה"
"הגדרת שעה"
- "הזן שעה חוקית"
+ "יש להזין שעה חוקית"
"מהי השעה הנכונה"
"העבר למצב קלט טקסט לצורך הזנת השעה"
- "העבר למצב שעון לצורך הזנת השעה"
+ "מעבר למצב שעון לצורך הזנת השעה"
"אפשרויות מילוי אוטומטי"
"שמירה לצורך מילוי אוטומטי"
"לא ניתן למלא את התוכן באופן אוטומטי"
@@ -2024,11 +2024,11 @@
"כרטיס"
"שם משתמש"
"כתובת אימייל"
- "הישאר רגוע וחפש מחסה בקרבת מקום."
+ "חשוב להישאר רגועים ולחפש מחסה בקרבת מקום."
"יש להתפנות מיידית מאזורים הסמוכים לחופים ולנהרות למקום בטוח יותר, כגון שטח גבוה יותר."
"הישאר רגוע וחפש מחסה בקרבת מקום."
"בדיקה של הודעות חירום"
- "השב"
+ "תשובה"
"כרטיס ה-SIM לא מורשה לזיהוי קולי"
"ניהול התצורה של כרטיס ה-SIM לא מתאים לזיהוי קולי"
@@ -2036,7 +2036,7 @@
"הטלפון לא מורשה לזיהוי קולי"
"SIM %d אינו מאושר לשימוש ברשת"
"אין ניהול תצורה עבור SIM %d"
- "SIM %d אינו מאושר לשימוש ברשת"
+ "SIM %d אינו מאושר לשימוש ברשת"
"SIM %d אינו מאושר לשימוש ברשת"
"חלון קופץ"
"+ %1$d"
@@ -2046,7 +2046,7 @@
"לא ניתן היה לשחזר את קיצור הדרך"
"מקש הקיצור מושבת"
"הסרת התקנה"
- "רוצה לפתוח בכל זאת"
+ "לפתוח בכל זאת"
"אותרה אפליקציה מזיקה"
"%1$s רוצה להציג חלקים מ-%2$s"
"עריכה"
@@ -2055,7 +2055,7 @@
"שינויי מערכת"
"נא לא להפריע"
"חדש: מצב \'נא לא להפריע\' מסתיר התראות"
- "ניתן להקיש כדי לקבל מידע נוסף ולשנות."
+ "אפשר להקיש כדי לקבל מידע נוסף ולבצע שינויים."
"ההגדרה \'נא לא להפריע\' השתנתה"
"יש להקיש כדי לבדוק מה חסום."
"מערכת"
@@ -2082,7 +2082,7 @@
"תמונה"
"תמונה בפורמט %1$s"
"ארכיון"
- "קובץ ארכיון %1$s"
+ "קובץ ארכיון מסוג %1$s"
"מסמך"
"מסמך %1$s"
"גיליון אלקטרוני"
@@ -2190,8 +2190,8 @@
"נשלחת בקשה לביטול נעילה של PUK…"
"נשלחת בקשה לביטול נעילה של PUK…"
"נשלחת בקשה לביטול נעילה של PUK…"
- "נכשלה הבקשה לביטול הנעילה של רשת SIM."
- "נכשלה הבקשה לביטול הנעילה של תת-קבוצה ברשת SIM."
+ "לא ניתן היה לבטל את הנעילה של רשת SIM."
+ "לא ניתן היה לבטל את הנעילה של תת-קבוצה ברשת SIM."
"נכשלה הבקשה לביטול הנעילה של ספק שירות SIM."
"נכשלה הבקשה לביטול הנעילה של כרטיס SIM עסקי."
"נכשלה הבקשה לביטול נעילת SIM."
@@ -2199,27 +2199,27 @@
"נכשלה הבקשה לביטול הנעילה של RUIM network2."
"נכשלה הבקשה לביטול נעילה של RUIM hrpd."
"נכשלה הבקשה לביטול הנעילה של כרטיס RUIM עסקי."
- "נכשלה הבקשה לביטול הנעילה של ספק שירות RUIM."
- "נכשלה הבקשה לביטול הנעילה של כרטיס RUIM."
+ "לא ניתן היה לבטל את הנעילה של ספק שירות RUIM."
+ "לא ניתן היה לבטל את הנעילה של כרטיס RUIM."
"נכשל ביטול נעילה של PUK."
"נכשל ביטול נעילה של PUK."
- "נכשל ביטול נעילה של PUK."
+ "לא ניתן היה לבטל את הנעילה של PUK."
"נכשל ביטול נעילה של PUK."
- "נכשל ביטול נעילה של PUK."
- "נכשל ביטול נעילה של PUK."
- "נכשל ביטול נעילה של PUK."
- "נכשל ביטול נעילה של PUK."
- "נכשל ביטול נעילה של PUK."
- "נכשל ביטול נעילה של PUK."
+ "לא ניתן היה לבטל את הנעילה של PUK."
+ "לא ניתן היה לבטל נעילה של PUK."
+ "לא ניתן היה לבטל נעילה של PUK."
+ "לא ניתן היה לבטל את הנעילה של PUK."
+ "לא ניתן היה לבטל את הנעילה של PUK."
+ "לא ניתן היה לבטל נעילה של PUK."
"נכשל ביטול נעילה של PUK."
- "נכשלה הבקשה לביטול נעילת SPN."
- "נכשלה הבקשה לביטול הנעילה של PLMN לבית כשווה-ערך ל-SP."
+ "לא ניתן היה לבטל את נעילת SPN."
+ "לא ניתן היה לבטל את הנעילה של PLMN לבית כשווה-ערך ל-SP."
"נכשלה הבקשה לביטול נעילה של ICCID."
- "נכשלה הבקשה לביטול נעילה של IMPI."
- "נכשלה הבקשה לביטול הנעילה של ספק שירות של תת-קבוצה ברשת."
+ "לא ניתן היה לבטל נעילה של IMPI."
+ "לא ניתן היה לבטל הנעילה של ספק שירות של תת-קבוצה ברשת."
"ביטול הנעילה של רשת SIM בוצע בהצלחה."
"ביטול הנעילה של תת-קבוצה ברשת SIM בוצע בהצלחה."
- "ביטול הנעילה של ספק שירות SIM בוצע בהצלחה ."
+ "ביטול הנעילה של ספק שירות ה-SIM בוצע."
"ביטול הנעילה של כרטיס SIM עסקי בוצע בהצלחה."
"ביטול נעילת SIM בוצע בהצלחה."
"ביטול הנעילה של RUIM network1 בוצע בהצלחה."
@@ -2237,7 +2237,7 @@
"ביטול נעילה של PUK בוצע בהצלחה."
"ביטול נעילה של PUK בוצע בהצלחה."
"ביטול נעילה של PUK בוצע בהצלחה."
- "ביטול נעילה של PUK בוצע בהצלחה."
+ "הנעילה של PUK בוטלה."
"ביטול נעילה של PUK בוצע בהצלחה."
"ביטול נעילת SPN בוצע בהצלחה."
"בוצע בהצלחה ביטול הנעילה של PLMN לבית כשווה-ערך ל-SP."
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 44c901cebacc..4a8179142c5b 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -524,10 +524,10 @@
"このアプリに画面ロックの複雑さレベル(高、中、低、なし)を認識することを許可します。複雑さレベルは、画面ロックの文字数の範囲やタイプを示すものです。アプリから一定レベルまで画面ロックを更新するよう推奨されることもありますが、ユーザーは無視したり別の操作を行ったりできます。画面ロックは平文で保存されないため、アプリが正確なパスワードを知ることはありません。"
"生体認証ハードウェアの使用"
"生体認証ハードウェアを認証に使用することをアプリに許可します"
- "指紋ハードウェアの管理"
+ "指紋認証ハードウェアの管理"
"使用する指紋テンプレートの追加や削除を行う方法の呼び出しをアプリに許可します。"
- "指紋ハードウェアの使用"
- "指紋ハードウェアを認証に使用することをアプリに許可します"
+ "指紋認証ハードウェアの使用"
+ "指紋認証ハードウェアを認証に使用することをアプリに許可します"
"音楽コレクションの変更"
"音楽コレクションの変更をアプリに許可します。"
"動画コレクションの変更"
@@ -552,7 +552,7 @@
"指紋認証を完了しました"
"顔を認証しました"
"顔を認証しました。[確認] を押してください"
- "指紋ハードウェアは使用できません。"
+ "指紋認証ハードウェアは使用できません。"
"指紋を保存できません。既存の指紋を削除してください。"
"指紋の読み取りがタイムアウトになりました。もう一度お試しください。"
"指紋の操作をキャンセルしました。"
@@ -2040,9 +2040,9 @@
"電源ダイアログ"
"ロック画面"
"スクリーンショット"
- "画面上のユーザー補助のショートカット"
- "画面上のユーザー補助のショートカットの選択メニュー"
- "ユーザー補助のショートカット"
+ "画面上のユーザー補助機能のショートカット"
+ "画面上のユーザー補助機能のショートカットの選択メニュー"
+ "ユーザー補助機能のショートカット"
"%1$s のキャプション バーです。"
"%1$s は RESTRICTED バケットに移動しました。"
"%1$s:"
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 04020fb643a8..18476482fa42 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -665,7 +665,7 @@
"Иесіне оператордың хабар алмасу қызметінің жоғарғы деңгейлі интерфейсіне байластыруға рұқсат етеді. Қалыпты қолданбалар үшін ешқашан қажет болмайды."
"оператор қызметтеріне қосылу"
"Иесіне оператор қызметтеріне қосылуға мүмкіндік береді. Қалыпты қолданбалар үшін қажет болмайды."
- "\"Мазаламау\" режиміне кіру"
+ "Мазаламау режиміне кіру"
"Қолданбаға «Мазаламау» конфигурациясын оқу және жазу мүмкіндігін береді."
"рұқсаттарды пайдалану туралы деректерді көру"
"Пайдаланушы қолданбаға берілетін рұқсаттарды басқара алады. Ондай рұқсаттар әдеттегі қолданбаларға керек емес."
@@ -1618,7 +1618,7 @@
"Құлыпты ашу өрнегін %1$d рет дұрыс сызбадыңыз. Енді тағы %2$d рет қателессеңіз, Android TV құрылғыңыздың құлпын ашу үшін есептік жазбаңызға кіру керек болады.\n\n %3$d секундтан кейін қайталап көріңіз."
"Бекітпені ашу кескінін %1$d рет қате сыздыңыз. %2$d сәтсіз әрекеттен кейін телефоныңызды есептік жазба арқылы ашу өтінішін аласыз. \n\n %3$d секундтан кейін қайта әрекеттеніңіз."
" — "
- "Алып тастау"
+ "Жою"
"Дыбыс деңгейін ұсынылған деңгейден көтеру керек пе?\n\nЖоғары дыбыс деңгейінде ұзақ кезеңдер бойы тыңдау есту қабілетіңізге зиян тигізуі мүмкін."
"Арнайы мүмкіндік төте жолын пайдалану керек пе?"
"Түймелер тіркесімі қосулы кезде, екі дыбыс түймесін 3 секунд басып тұрсаңыз, \"Арнайы мүмкіндіктер\" функциясы іске қосылады."
@@ -1661,7 +1661,7 @@
"Бір функциядан екінші функцияға ауысу үшін үш саусақпен жоғары қарай сырғытып, ұстап тұрыңыз."
"Ұлғайту"
"Ағымдағы пайдаланушы %1$s."
- "%1$s ауысу орындалуда…"
+ "%1$s профиліне ауысу…"
"%1$s ішінен шығу…"
"Құрылғы иесі"
"Қателік"
@@ -1793,9 +1793,9 @@
"Әкімші жойған"
"Жарайды"
"Батарея жұмысының ұзақтығын арттыру үшін Батареяны үнемдеу режимі:\n\n•қараңғы тақырыпты іске қосады;\n•фондық әрекеттерді, кейбір көрнекі әсерлерді және \"Ok Google\" сияқты басқа да функцияларды өшіреді не шектейді.\n\n""Толығырақ"
- "Батарея ұзағырақ жұмыс істеуі үшін, Battery Saver:\n\n• қараңғы тақырыпты қосады;\n•фондық жұмысты, кейбір визуалды әсерлерді және \"Ok Google\" сияқты басқа функцияларды өшіреді не шектейді."
- "Дерек шығынын азайту үшін Data Saver функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге және алуға жол бермейді. Ашық тұрған қолданба деректерді пайдаланады, бірақ шектеулі шамада (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)."
- "Data Saver функциясын қосу керек пе?"
+ "Батарея ұзағырақ жұмыс істеуі үшін, Батареяны үнемдеу режимі:\n\n• қараңғы тақырыпты қосады;\n•фондық жұмысты, кейбір визуалды әсерлерді және \"Ok Google\" сияқты басқа функцияларды өшіреді не шектейді."
+ "Дерек шығынын азайту үшін Трафикті үнемдеу функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге және алуға жол бермейді. Ашық тұрған қолданба деректерді пайдаланады, бірақ шектеулі шамада (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)."
+ "Трафикті үнемдеу функциясын қосу керек пе?"
"Қосу"
- %1$d минут бойы (%2$s дейін)
@@ -1832,7 +1832,7 @@
"%1$s дейін"
"%1$s дейін (келесі дабыл)"
"Өшірілгенге дейін"
- "\"Мазаламау\" режимін өшіргенше"
+ "Мазаламау режимін өшіргенше"
"%1$s/%2$s"
"Тасалау"
"Мазаламау"
@@ -1987,10 +1987,10 @@
"Қоңыраулар мен хабарландырулардың вибрациясы болады"
"Қоңыраулар мен хабарландырулардың дыбыстық сигналы өшіріледі"
"Жүйе өзгерістері"
- "\"Мазаламау\" режимі"
- "Жаңа: \"Мазаламау\" режимі хабарландыруларды жасыруда"
+ "Мазаламау режимі"
+ "Жаңа: Мазаламау режимі хабарландыруларды жасыруда"
"Толығырақ ақпарат алу және өзгерту үшін түртіңіз."
- "\"Мазаламау\" режимі өзгерді"
+ "Мазаламау режимі өзгерді"
"Түймені түртіп, неге тыйым салынатынын көріңіз."
"Жүйе"
"Параметрлер"
@@ -1999,9 +1999,9 @@
"экранда басқа қолданбалардың үстінен көрсету"
"Режим туралы хабарландыру"
"Батарея заряды азаюы мүмкін"
- "Батарея ұзаққа жетуі үшін, Battery Saver іске қосылды"
+ "Батарея ұзаққа жетуі үшін, Батареяны үнемдеу режимі іске қосылды"
"Батареяны үнемдеу режимі"
- "Battery Saver өшірілді"
+ "Батареяны үнемдеу режимі өшірілді"
"Телефонның заряды жеткілікті. Функцияларға енді шектеу қойылмайды."
"Планшеттің заряды жеткілікті. Функцияларға енді шектеу қойылмайды."
"Құрылғының заряды жеткілікті. Функцияларға енді шектеу қойылмайды."
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 43f0a1ce43bc..95b253f25d78 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1093,7 +1093,7 @@
"កាត់"
"ចម្លង"
"មិនអាចចម្លងទៅអង្គចងចាំទេ"
- "បិទភ្ជាប់"
+ "ដាក់ចូល"
"បិទភ្ជាប់ជាអត្ថបទធម្មតា"
"ជំនួស..."
"លុប"
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 9b226889bd4f..37d20495cbde 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -100,7 +100,7 @@
"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO"
"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO"
"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಆಫ್ ಆಗಿದೆ"
- "ಧ್ವನಿ"
+ "Voice"
"ಡೇಟಾ"
"ಫ್ಯಾಕ್ಸ್"
"SMS"
@@ -1661,7 +1661,7 @@
"ವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."
"ಹಿಗ್ಗಿಸುವಿಕೆ"
"ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರು %1$s."
- "%1$s ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ…"
+ "%1$sಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ…"
"%1$s ಅವರನ್ನು ಲಾಗ್ ಔಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"
"ಮಾಲೀಕರು"
"ದೋಷ"
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 636de4e19f7c..7dcbaa00c476 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1661,7 +1661,7 @@
"기능 간에 전환하려면 세 손가락을 사용하여 위로 스와이프한 다음 잠시 기다립니다."
"확대"
"현재 사용자는 %1$s님입니다."
- "%1$s(으)로 전환하는 중…"
+ "%1$s로 전환하는 중…"
"%1$s님을 로그아웃하는 중…"
"소유자"
"오류"
@@ -1999,7 +1999,7 @@
"화면에서 다른 앱 위에 표시"
"루틴 모드 정보 알림"
"평소에 충전하는 시간 전에 배터리가 소진될 수 있습니다."
- "배터리 수명을 연장하기 위해 배터리 세이버가 활성화되었습니다."
+ "배터리 수명을 연장하기 위해 절전 모드가 활성화되었습니다."
"절전 모드"
"절전 모드가 사용 중지되었습니다"
"휴대전화의 배터리가 충분하므로 기능이 더 이상 제한되지 않습니다"
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index d9ea68602cf4..6420e45fe02e 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -290,7 +290,7 @@
"Батареянын кубаты жана трафиктин көлөмү жөнүндө билүү үчүн таптап коюңуз"
"%1$s, %2$s"
"Коопсуз режим"
- "Android тутуму"
+ "Android системасы"
"Жеке профилге которулуу"
"Жумуш профилине которулуу"
"Байланыштар"
@@ -306,7 +306,7 @@
"Микрофон"
"аудио жаздыруу"
"Кыймыл-аракет"
- "кыймыл-аракетиңизге мүмкүнчүлүк алат"
+ "кыймыл-аракеттериңизге көз салып турганга мүмкүнчүлүк алат"
"Камера"
"сүрөт жана видео тартууга"
"Чалуулар тизмеси"
@@ -324,7 +324,7 @@
"Көрүнүштү чоңойтуп кичирейтет"
"Экрандагы сүрөттү тууралап жайгаштырып, өлчөмүн өзгөртөт."
"Жаңсоолорду аткаруу"
- "Таптап, серпип, чымчып жана башка жаңсоолорду аткара алат."
+ "Таптап, сүрүп, чымчып жана башка жаңсоолорду аткара алат."
"Манжа изинин жаңсоолору"
"Түзмөктөгү манжа изинин сенсорунда жасалган жаңсоолорду жаздырып алат."
"Скриншот тартып алуу"
@@ -871,7 +871,7 @@
"Сиз телефонду бөгөттөн чыгарууга %d жолу туура эмес аракет кылдыңыз. Телефон баштапкы абалына келтирилет."
"%d секунддан кийин кайталаңыз."
"Сүрөт үлгүсүн унутуп калдыңызбы?"
- "Каттоо эсеби менен кулпусун ачуу"
+ "Аккаунт менен кулпусун ачуу"
"Өтө көп үлгү киргизүү аракети болду"
"Бөгөттөн чыгарыш үчүн, Google эсебиңиз менен кириңиз."
"Колдонуучунун аты (электрондук почта)"
@@ -996,7 +996,7 @@
- Акыркы %d күн
- Акыркы %d күн
- "Өткөн ай"
+ "Акыркы ай"
"Эскирээк"
"%s күнү"
"саат %s"
@@ -1177,16 +1177,16 @@
"%1$s азыр иштеп жатат."
"Башында %1$s жүргүзүлгөн."
"Шкала"
- "Ар дайым көрсөтүлсүн"
+ "Ар дайым көрүнсүн"
"Муну тутум жөндөөлөрүнөн кайра иштетүү > Колдонмолор > Жүктөлүп алынган."
"%1$s колдонмосу көрүнүштүн тандалган өлчөмүн экранда көрсөтө албайт жана туура эмес иштеши мүмкүн."
- "Ар дайым көрсөтүлсүн"
+ "Ар дайым көрүнсүн"
"%1$s Android OS тутуму менен иштеген түзмөктүн шайкеш келбеген версиясы үчүн орнотулган колдонмо жана туура эмес иштеши мүмкүн. Колдонмонун жаңыртылган версиясы жеткиликтүү болушу мүмкүн."
- "Ар дайым көрсөтүлсүн"
+ "Ар дайым көрүнсүн"
"Жаңыртууну издөө"
"%1$s колдонмосу (%2$s процесси) өз алдынча иштеткен StrictMode саясатын бузду."
"%1$s процесси өзүнүн мажбурланган StrictMode саясатын бузуп койду."
- "Телефон жаңыртылууда…"
+ "Телефон жаңырууда…"
"Планшет жаңыртылууда…"
"Түзмөк жаңыртылууда…"
"Телефон күйгүзүлүүдө…"
@@ -1196,7 +1196,7 @@
"Сактагыч ыңгайлаштырылууда."
"Тутумду жаңыртуу аяктоодо…"
"%1$s жаңыртылууда..."
- "%2$d ичинен %1$d колдонмо ыңгайлаштырылууда."
+ "%2$d ичинен %1$d колдонмо оптималдаштырылууда."
"%1$s даярдалууда."
"Колдонмолорду иштетип баштоо"
"Жүктөлүүдө"
@@ -1654,8 +1654,8 @@
"Үндү катуулатуу/акырындатуу баскычтары басылып, %1$s өчүрүлдү."
"%1$s кызматын колдонуу үчүн үнүн чоңойтуп/кичирейтүү баскычтарын үч секунд коё бербей басып туруңуз"
"Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштей турган функцияны тандаңыз:"
- "Атайын мүмкүнчүлүктөр жаңсоосу үчүн функцияны тандаңыз (эки манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):"
- "Атайын мүмкүнчүлүктөр жаңсоосу аркылуу иштетиле турган функцияны тандаңыз (үч манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):"
+ "Атайын мүмкүнчүлүктөр жаңсоосу үчүн функцияны тандаңыз (эки манжаңыз менен экранды ылдыйдан өйдө сүрүңүз):"
+ "Атайын мүмкүнчүлүктөр жаңсоосу аркылуу иштетиле турган функцияны тандаңыз (үч манжаңыз менен экранды ылдыйдан өйдө сүрүңүз):"
"Функцияларды которуштуруу үчүн, Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз."
"Функцияларды которуштуруу үчүн, эки манжаңыз менен өйдө сүрүп, кармап туруңуз."
"Башка функцияга которулуу үчүн үч манжаңыз менен экранды өйдө сүрүп, кармап туруңуз."
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 2197aee867f3..47bd5a8da60e 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1661,7 +1661,7 @@
"ເພື່ອສະຫຼັບລະຫວ່າງຄຸນສົມບັດຕ່າງໆ, ໃຫ້ປັດຂຶ້ນດ້ວຍສາມນິ້ວຄ້າງໄວ້."
"ການຂະຫຍາຍ"
"ຜູ່ໃຊ້ປັດຈຸບັນ %1$s ."
- "ກຳລັງສະລັບໄປຫາ %1$s…"
+ "ກຳລັງສະຫຼັບໄປຫາ%1$s…"
"ກຳລັງອອກຈາກລະບົບ %1$s…"
"ເຈົ້າຂອງ"
"ຜິດພາດ"
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index d61a278029b3..92d8e36fbe6b 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -20,7 +20,7 @@
- "Б"
+ "B"
"KB"
"MB"
"GB"
@@ -1900,8 +1900,8 @@
"Допрете за да го отклучите"
"Поврзан на %1$s"
"Допрете за да ги погледнете датотеките"
- "Прикачете"
- "Прикачи %1$s"
+ "Закачи"
+ "Закачи %1$s"
"Откачете"
"Откачи %1$s"
"Информации за апликација"
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index d30861f22b75..4a62f7286e63 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -100,7 +100,7 @@
"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO"
"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO"
"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഓഫ്\'"
- "ശബ്ദം"
+ "Voice"
"ഡാറ്റ"
"ഫാക്സ്"
"SMS"
@@ -1211,9 +1211,9 @@
"%1$s ഹീപ്പ് ഡംപ് തയ്യാറാണ്"
"ഹീപ്പ് ഡംപ് ശേഖരിച്ചു. പങ്കിടാൻ ടാപ്പ് ചെയ്യുക"
"ഹീപ്പ് ഡംപ് പങ്കിടണോ?"
- "%1$s പ്രോസസിന്, മെമ്മറി പരിധിയായ %2$s കവിഞ്ഞു. അതിന്റെ ഡവലപ്പറുമായി പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് നിങ്ങൾക്ക് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: ഈ ഹീപ്പ് ഡംപിൽ ആപ്പിന് ആക്സസുള്ള ഏതെങ്കിലും വ്യക്തിഗത വിവരം അടങ്ങിയിരിക്കാം."
- "%1$s പ്രോസസ് അതിൻ്റെ മെമ്മറി പരിധിയായ %2$s കവിഞ്ഞു. നിങ്ങൾക്ക് പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: പ്രോസസിന് ആക്സസ് ചെയ്യാനാകുന്ന, സൂക്ഷ്മമായി കൈകാര്യം ചെയ്യേണ്ട ഏതെങ്കിലും വ്യക്തിഗത വിവരം ഈ ഹീപ്പ് ഡംപിൽ അടങ്ങിയിരിക്കാം, നിങ്ങൾ ടൈപ്പ് ചെയ്തിട്ടുള്ള കാര്യങ്ങൾ ഇതിൽ ഉൾപ്പെട്ടിരിക്കാം."
- "നിങ്ങൾക്ക് പങ്കിടാൻ %1$s എന്നതിൻ്റെ പ്രോസസിൻ്റെ ഒരു ഹീപ്പ് ഡംപ് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: പ്രോസസിന് ആക്സസ് ചെയ്യാനാകുന്ന, സൂക്ഷ്മമായി കൈകാര്യം ചെയ്യേണ്ട ഏതെങ്കിലും വ്യക്തിഗത വിവരം ഈ ഹീപ്പ് ഡംപിൽ അടങ്ങിയിരിക്കാം, നിങ്ങൾ ടൈപ്പ് ചെയ്തിട്ടുള്ള കാര്യങ്ങൾ ഇതിൽ ഉൾപ്പെട്ടിരിക്കാം."
+ "%1$s പ്രോസസിന്, മെമ്മറി പരിധിയായ %2$s കവിഞ്ഞു. അതിന്റെ ഡവലപ്പറുമായി പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് നിങ്ങൾക്ക് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: ഈ ഹീപ്പ് ഡംപിൽ ആപ്പിന് ആക്സസുള്ള ഏതെങ്കിലും വ്യക്തിപരമായ വിവരങ്ങൾ അടങ്ങിയിരിക്കാം."
+ "%1$s പ്രോസസ് അതിൻ്റെ മെമ്മറി പരിധിയായ %2$s കവിഞ്ഞു. നിങ്ങൾക്ക് പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: പ്രോസസിന് ആക്സസ് ചെയ്യാനാകുന്ന, സൂക്ഷ്മമായി കൈകാര്യം ചെയ്യേണ്ട ഏതെങ്കിലും വ്യക്തിപരമായ വിവരങ്ങൾ ഈ ഹീപ്പ് ഡംപിൽ അടങ്ങിയിരിക്കാം, നിങ്ങൾ ടൈപ്പ് ചെയ്തിട്ടുള്ള കാര്യങ്ങൾ ഇതിൽ ഉൾപ്പെട്ടിരിക്കാം."
+ "നിങ്ങൾക്ക് പങ്കിടാൻ %1$s എന്നതിൻ്റെ പ്രോസസിൻ്റെ ഒരു ഹീപ്പ് ഡംപ് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: പ്രോസസിന് ആക്സസ് ചെയ്യാനാകുന്ന, സൂക്ഷ്മമായി കൈകാര്യം ചെയ്യേണ്ട ഏതെങ്കിലും വ്യക്തിപരമായ വിവരങ്ങൾ ഈ ഹീപ്പ് ഡംപിൽ അടങ്ങിയിരിക്കാം, നിങ്ങൾ ടൈപ്പ് ചെയ്തിട്ടുള്ള കാര്യങ്ങൾ ഇതിൽ ഉൾപ്പെട്ടിരിക്കാം."
"വാചകസന്ദേശത്തിനായി ഒരു പ്രവർത്തനം തിരഞ്ഞെടുക്കുക"
"റിംഗർ വോളിയം"
"മീഡിയ വോളിയം"
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 657f680fb8d9..ed77e86a2ad1 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -49,10 +49,10 @@
"8-с цөөнгүй тооноос бүтэх PUK-г бичнэ үү."
"SIM картны PUK-түгжигдсэн. Тайлах бол PUK кодыг бичнэ үү."
"SIM картыг блокоос гаргах бол PUK2-г бичнэ үү."
- "Амжилтгүй боллоо, СИМ/РҮИМ түгжээг идэвхжүүлнэ үү."
+ "Амжилтгүй боллоо, SIM/РҮИМ түгжээг идэвхжүүлнэ үү."
- - Таны СИМ түгжигдэхээс өмнө танд %d оролдлого хийх боломж үлдлээ.
- - Таны СИМ түгжигдэхээс өмнө танд %d оролдлого хийх боломж үлдлээ.
+ - Таны SIM түгжигдэхээс өмнө танд %d оролдлого хийх боломж үлдлээ.
+ - Таны SIM түгжигдэхээс өмнө танд %d оролдлого хийх боломж үлдлээ.
"IMEI"
"MEID"
@@ -317,7 +317,7 @@
"таны биеийн байдлын талаарх мэдрэгч бүхий өгөгдөлд нэвтрэх"
"Цонхны агуулгыг авах"
"Таны харилцан үйлчлэх цонхны контентоос шалгах."
- "Хүрч танихыг асаах"
+ "Хүрэлтээр сонсохыг асаах"
"Товшсон зүйлсийг чангаар хэлэх ба дэлгэцийг дохио ашиглан таних боломжтой."
"Бичсэн текстээ ажиглах"
"Кредит картын дугаар болон нууц үг зэрэг хувийн датаг агуулж байна."
@@ -798,7 +798,7 @@
"Туслагч"
"Ах"
"Хүүхэд"
- "Дотоод Түнш"
+ "Хамтран амьдрагч"
"Эцэг"
"Найз"
"Менежер"
@@ -987,9 +987,9 @@
"Асуулгыг цэвэрлэх"
"Асуулгыг илгээх"
"Дуут хайлт"
- "Хүрч хайх функцийг идэвхтэй болгох уу?"
- "%1$s нь Хүрч танихыг идэвхжүүлэхийг шаардаж байна. Хүрч таних идэвхжсэн үед та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба таблеттайгаа дохиогоор харилцах боломжтой."
- "%1$s нь Хүрч танихыг идэвхжүүлэхийг шаардаж байна. Хүрч таних идэвхжсэн тохиолдолд та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба утастайгаа дохиогоор харилцах боломжтой."
+ "Хүрэлтээр сонсохыг идэвхжүүлэх үү?"
+ "%1$s нь Хүрэлтээр сонсохыг идэвхжүүлэхийг шаардаж байна. Хүрэлтээр сонсох идэвхжсэн үед та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба таблеттайгаа дохиогоор харилцах боломжтой."
+ "%1$s нь Хүрэлтээр сонсохыг идэвхжүүлэхийг шаардаж байна. Хүрэлтээр сонсох идэвхжсэн тохиолдолд та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба утастайгаа дохиогоор харилцах боломжтой."
"1 сарын өмнө"
"1 сарын өмнө"
@@ -1856,7 +1856,7 @@
"Мэдэгдсэн"
"Дэлгэх"
"Буулгах"
- "унтраах/асаах өргөтгөл"
+ "асаах/унтраах өргөтгөл"
"Андройд USB Peripheral Port"
"Android"
"USB Peripheral Port"
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index a1c4b63b804b..46057eea940e 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -100,7 +100,7 @@
"समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली"
"समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली"
"समवयस्क व्यक्तीने TTY मोड बंद ची विनंती केली"
- "व्हॉइस"
+ "Voice"
"डेटा"
"फॅक्स"
"SMS"
@@ -146,11 +146,11 @@
"वाय-फायवरून कॉल करा"
"मोबाइल नेटवर्कवरून कॉल करा"
"केवळ वाय-फाय"
- "{0}: अग्रेषित केला नाही"
+ "{0}: फॉरवर्ड केला नाही"
"{0}: {1}"
"{0}: {2} सेकंदांनंतर {1}"
- "{0}: अग्रेषित केला नाही"
- "{0}: अग्रेषित केला नाही"
+ "{0}: फॉरवर्ड केला नाही"
+ "{0}: फॉरवर्ड केला नाही"
"वैशिष्ट्य कोड पूर्ण."
"कनेक्शन समस्या किंवा अवैध फीचर कोड."
"ठीक"
@@ -388,9 +388,9 @@
"सिस्टम सेटिंग्ज सुधारित करा"
"सिस्टीमचा सेटिंग्ज डेटा सुधारित करण्यासाठी अॅप ला अनुमती देते. दुर्भावनापूर्ण अॅप्स आपल्या सिस्टीमचे कॉंफिगरेशन दूषित करू शकतात."
"सुरूवातीस चालवा"
- "जसे सिस्टम बूट करणे समाप्त करते तसे अॅप ला स्वतः प्रारंभ करण्यास अनुमती देते. यामुळे टॅबलेट प्रारंभ करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर टॅबलेटला धीमे करण्यास अॅप ला अनुमती देते."
+ "जसे सिस्टम बूट करणे समाप्त करते तसे अॅप ला स्वतः सुरू करण्यास अनुमती देते. यामुळे टॅबलेट सुरू करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर टॅबलेटला धीमे करण्यास अॅप ला अनुमती देते."
"सिस्टम बूट होणे संपल्यावर ॲपला स्वतः सुरू होण्याची अनुमती देते. यामुळे तुमच्या Android TV डिव्हाइसला सुरू होण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर डिव्हाइसलाच धीमे करण्याची अनुमती ॲपला देते."
- "जसे सिस्टम बूट करणे समाप्त करते तसे अॅप ला स्वतः प्रारंभ करण्यास अनुमती देते. यामुळे फोन प्रारंभ करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर फोनला धीमे करण्यास अॅप ला अनुमती देते."
+ "जसे सिस्टम बूट करणे समाप्त करते तसे अॅप ला स्वतः सुरू करण्यास अनुमती देते. यामुळे फोन सुरू करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर फोनला धीमे करण्यास अॅप ला अनुमती देते."
"रोचक प्रसारण पाठवा"
"रोचक प्रसारणे पाठविण्यासाठी अॅप ला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो टॅब्लेटला धीमा किंवा अस्थिर करू शकतो."
"चिकट प्रसारणे पाठविण्यासाठी ॲपला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो तुमच्या Android TV डिव्हाइसला धीमा किंवा अस्थिर करू शकतो."
@@ -899,7 +899,7 @@
"स्थिती"
"कॅमेरा"
"मीडिया नियंत्रणे"
- "विजेट पुनर्क्रमित करणे प्रारंभ झाले."
+ "विजेट पुनर्क्रमित करणे सुरू झाले."
"विजेट पुनर्क्रमित करणे समाप्त झाले."
"विजेट %1$s हटविले."
"अनलॉक क्षेत्र विस्तृत करा."
@@ -1190,7 +1190,7 @@
"टॅबलेट अपडेट होत आहे…"
"डिव्हाइस अपडेट होत आहे…"
"फोन सुरू होत आहे…"
- "Android प्रारंभ करत आहे…"
+ "Android सुरू करत आहे…"
"टॅबलेट सुरू होत आहे…"
"डिव्हाइस सुरू होत आहे…"
"संचयन ऑप्टिमाइझ करत आहे."
@@ -1198,7 +1198,7 @@
"%1$s श्रेणीसुधारित करत आहे…"
"%2$d पैकी %1$d अॅप ऑप्टिमाइझ करत आहे."
"%1$s तयार करत आहे."
- "अॅप्स प्रारंभ करत आहे."
+ "अॅप्स सुरू करत आहे."
"बूट समाप्त होत आहे."
"रन होणारे %1$s"
"गेमवर परत जाण्यासाठी टॅप करा"
@@ -1275,7 +1275,7 @@
"नेहमी अनुमती द्या"
"कधीही अनुमती देऊ नका"
"सिम कार्ड काढले"
- "तुम्ही एक वैध सिम कार्ड घालून प्रारंभ करेपर्यंत मोबाइल नेटवर्क अनुपलब्ध असेल."
+ "तुम्ही एक वैध सिम कार्ड घालून सुरू करेपर्यंत मोबाइल नेटवर्क अनुपलब्ध असेल."
"पूर्ण झाले"
"सिम कार्ड जोडले"
"मोबाइल नेटवर्कवर अॅक्सेस करण्यासाठी तुमचे डिव्हाइस रीस्टार्ट करा."
@@ -1906,7 +1906,7 @@
"%1$s ला अनपिन करा"
"अॅप माहिती"
"−%1$s"
- "डेमो प्रारंभ करत आहे..."
+ "डेमो सुरू करत आहे..."
"डिव्हाइस रीसेट करत आहे..."
"%1$s अक्षम केले"
"कॉंफरन्स कॉल"
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index f715dc60459f..f8efcfd5216a 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -317,7 +317,7 @@
"akses data penderia tentang tanda vital anda"
"Dapatkan kembali kandungan tetingkap"
"Periksa kandungan tetingkap yang berinteraksi dengan anda."
- "Hidupkan Jelajah melalui Sentuhan"
+ "Hidupkan Teroka melalui Sentuhan"
"Item yang diketik akan dituturkan dengan lantang dan skrin boleh dijelajah menggunakan gerak isyarat."
"Perhatikan teks yang anda taip"
"Termasuk data peribadi seperti nombor kad kredit dan kata laluan."
@@ -987,9 +987,9 @@
"Pertanyaan jelas"
"Serah pertanyaan"
"Carian suara"
- "Dayakan Jelajah melalui Sentuhan?"
- "%1$s ingin mendayakan Jelajah melalui Sentuhan. Apabila Jelajah melalui Sentuhan didayakan, anda boleh mendengar atau melihat penerangan tentang apa di bawah jari anda atau melakukan gerak isyarat untuk berinteraksi dengan tablet."
- "%1$s ingin mendayakan Jelajah melalui Sentuhan. Apabila Jelajah melalui Sentuhan didayakan, anda boleh mendengar atau melihat penerangan tentang apa di bawah jari anda atau melakukan gerak isyarat untuk berinteraksi dengan telefon."
+ "Dayakan Teroka melalui Sentuhan?"
+ "%1$s 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 tablet."
+ "%1$s 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."
"1 bulan yang lalu"
"Sebelum 1 bulan yang lalu"
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 9ba7fef63773..c0e3fb9a30fb 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -633,8 +633,8 @@
"အက်ပ်အား အသုံးပြုသူက ခေါ်ဆိုမှုအဝင် မျက်နှာပြင် ဘယ်အချိန်မှာ ဘယ်လို မြင်ရမှာကို ထိန်းချုပ်ခွင့်ပေးရန်"
"တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှု"
"အက်ပ်အား ခေါ်ဆိုမှုများ လုပ်ခြင်း/လက်ခံခြင်း ပြုလုပ်နိုင်ရန် တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှုကို ခွင့်ပြုသည်။"
- "အသုံးပြုသူ အတွက် ခေါ်ဆိုမှုအဝင် လုပ်ကိုင်ပုံကို စီစဉ်ပေးခြင်း"
- "အက်ပ်အား အသုံးပြုသူ အတွက် ခေါ်ဆိုမှုအဝင် လုပ်ကိုင်ပုံကို စီစဉ်ခွင့် ပြုသည်။"
+ "အဝင်ခေါ်ဆိုမှုအတွက် အသုံးပြုသူ၏ နှစ်သက်မှုကို ခွင့်ပြုခြင်း"
+ "အဝင်ခေါ်ဆိုမှုအတွက် အသုံးပြုသူ၏ နှစ်သက်မှုကို ပံ့ပိုးပေးရန် အက်ပ်အား ခွင့်ပြုသည်။"
"ရာဇဝင်အလိုက် ကွန်ယက်သုံစွဲမှုအား ဖတ်ခြင်း"
"အက်ပ်အား အထူး ကွန်ရက်များ နှင့် အက်ပ်များ အတွက် ကွန်ရက် အသုံးပြုမှု မှတ်တမ်းကို ဖတ်ကြားခွင့် ပြုသည်။"
"ကွန်ယက်မူဝါဒအား စီမံခြင်း"
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index e2cf7f96035d..343d0b22e4d4 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -1091,7 +1091,7 @@
"%1$d:%2$02d:%3$02d"
"सबैलाई चयन गर्नुहोस्"
"काट्नुहोस्"
- "प्रतिलिपि बनाउनुहोस्"
+ "कपी गर्नुहोस्"
"क्लिपबोर्डमा प्रतिलिपि गर्न सकिएन"
"टाँस्नुहोस्"
"सामान्य पाठको रूपमा टाँस्नुहोस्"
@@ -1661,7 +1661,7 @@
"एउटा सुविधाबाट अर्को सुविधामा जान तीनवटा औँलाले माथितिर स्वाइप गरी स्क्रिनमा टच एण्ड होल्ड गर्नुहोस्।"
"म्याग्निफिकेसन"
"अहिलेको प्रयोगकर्ता %1$s।"
- "%1$s मा स्विच गर्दै..."
+ "स्विच गरेर %1$s बनाइँदै..."
"लग आउट गर्दै %1$s…"
"मालिक"
"त्रुटि"
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 594ea618e2a7..1a8ce28e3561 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -35,8 +35,8 @@
"Verbindingsprobleem of ongeldige MMI-code."
"Bewerking is beperkt tot vaste nummers."
"Kan instellingen voor doorschakelen van gesprekken niet wijzigen vanaf je telefoon tijdens roaming."
- "Service is ingeschakeld."
- "Service is ingeschakeld voor:"
+ "Service staat aan."
+ "Service staat aan voor:"
"Service is uitgeschakeld."
"De registratie is voltooid."
"Wissen uitgevoerd."
@@ -203,16 +203,16 @@
"Schakel je werkprofiel in"
"Je persoonlijke apps zijn geblokkeerd totdat je je werkprofiel inschakelt"
"Apps die worden gebruikt voor persoonlijke doeleinden, worden geblokkeerd op %1$s om %2$s. Je IT-beheerder staat niet toe dat je werkprofiel langer dan %3$d dagen is uitgeschakeld."
- "Inschakelen"
+ "Aanzetten"
"Ik"
"Tabletopties"
"Opties voor Android TV"
"Telefoonopties"
"Stille modus"
- "Draadloos inschakelen"
- "Draadloos uitschakelen"
+ "Draadloos aanzetten"
+ "Draadloos uitzetten"
"Schermvergrendeling"
- "Uitschakelen"
+ "Uitzetten"
"Belsoftware uit"
"Belsoftware op trillen"
"Belsoftware aan"
@@ -222,7 +222,7 @@
"Opnieuw opstarten…"
"Terugzetten op fabrieksinstellingen"
"Opnieuw opstarten…"
- "Uitschakelen..."
+ "Uitzetten…"
"Je tablet wordt uitgeschakeld."
"Je Android TV-apparaat wordt uitgeschakeld."
"Je horloge wordt uitgeschakeld."
@@ -236,7 +236,7 @@
"Opties voor Android TV"
"Telefoonopties"
"Schermvergrendeling"
- "Uitschakelen"
+ "Uitzetten"
"Aan/uit"
"Opnieuw opstarten"
"Noodgeval"
@@ -317,7 +317,7 @@
"toegang krijgen tot sensorgegevens over je vitale functies"
"Content van vensters ophalen"
"De content inspecteren van een venster waarmee je interactie hebt."
- "\'Verkennen via aanraking\' inschakelen"
+ "Verkennen via aanraking aanzetten"
"Aangetikte items worden hardop benoemd en het scherm kan worden verkend via gebaren."
"Tekst observeren die je typt"
"Omvat persoonsgegevens zoals creditcardnummers en wachtwoorden."
@@ -329,8 +329,8 @@
"Kan gebaren registreren die op de vingerafdruksensor van het apparaat worden getekend."
"Screenshot maken"
"Kan een screenshot van het scherm maken."
- "statusbalk uitschakelen of wijzigen"
- "Hiermee kan de app de statusbalk uitschakelen of systeempictogrammen toevoegen en verwijderen."
+ "statusbalk uitzetten of wijzigen"
+ "Hiermee kan de app de statusbalk uitzetten of systeemiconen toevoegen en verwijderen."
"de statusbalk zijn"
"Hiermee kan de app de statusbalk zijn."
"statusbalk uitvouwen/samenvouwen"
@@ -344,9 +344,9 @@
"telefoonoproepen beantwoorden"
"Hiermee kan de app een inkomende telefoonoproep beantwoorden."
"tekstberichten (SMS) ontvangen"
- "Hiermee kan de app sms-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven."
+ "Hiermee kan de app sms-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verstuurd, kan bijhouden of verwijderen zonder deze te tonen."
"tekstberichten (MMS) ontvangen"
- "Hiermee kan de app MMS-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven."
+ "Hiermee kan de app mms-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verstuurd, kan bijhouden of verwijderen zonder deze te tonen."
"Cell broadcast-berichten doorsturen"
"Hiermee kan de app de module voor cell broadcasts binden om cell broadcast-berichten door te sturen als die worden ontvangen. Cell broadcast-waarschuwingen worden op bepaalde locaties verzonden om je te waarschuwen voor noodsituaties. Schadelijke apps kunnen de prestaties of verwerking van je apparaat verstoren als een bericht met een noodmelding wordt ontvangen."
"infodienstberichten lezen"
@@ -360,15 +360,15 @@
"Deze app kan alle sms-berichten lezen die zijn opgeslagen op je Android TV-apparaat."
"Deze app kan alle sms-berichten lezen die zijn opgeslagen op je telefoon."
"tekstberichten (WAP) ontvangen"
- "Hiermee kan de app WAP-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven."
+ "Hiermee kan de app WAP-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verstuurd, kan bijhouden of verwijderen zonder deze te tonen."
"actieve apps ophalen"
"Hiermee kan de app informatie ophalen over actieve en recent uitgevoerde taken. Zo kan de app informatie vinden over welke apps op het apparaat worden gebruikt."
"profiel- en apparaateigenaren beheren"
"Apps toestaan de profieleigenaren en apparaateigenaar in te stellen."
"actieve apps opnieuw rangschikken"
"Hiermee kan de app taken naar de voor- en achtergrond verplaatsen. De app kan dit doen zonder om je bevestiging te vragen."
- "automodus inschakelen"
- "Hiermee kan de app de automodus inschakelen."
+ "automodus aanzetten"
+ "Hiermee kan de app de automodus aanzetten."
"andere apps sluiten"
"Hiermee kan de app achtergrondprocessen van andere apps beëindigen. Hierdoor kunnen andere apps worden gestopt."
"Deze app kan op de voorgrond vóór andere apps worden weergegeven"
@@ -484,7 +484,7 @@
"Hiermee krijgt de app toegang tot de lijst met accounts die op de tablet bekend zijn. Dit kunnen ook accounts zijn die zijn gemaakt door apps die je hebt geïnstalleerd."
"Hiermee kan de app de lijst met accounts ophalen die op het Android TV-apparaat bekend zijn. Dit kunnen ook accounts zijn die zijn gemaakt door apps die je hebt geïnstalleerd."
"Hiermee krijgt de app toegang tot de lijst met accounts die op de telefoon bekend zijn. Dit kunnen ook accounts zijn die zijn gemaakt door apps die je hebt geïnstalleerd."
- "netwerkverbindingen weergeven"
+ "netwerkverbindingen bekijken"
"Hiermee kan de app informatie bekijken over netwerkverbindingen, zoals welke netwerken er zijn en welke verbonden zijn."
"volledige netwerktoegang"
"Hiermee kan de app netwerksockets maken en aangepaste netwerkprotocollen gebruiken. De browser en andere apps bieden mogelijkheden om gegevens via internet te verzenden, dus deze rechten zijn niet vereist om gegevens via internet te verzenden."
@@ -492,8 +492,8 @@
"Hiermee kan de app de status van de netwerkverbinding wijzigen."
"getetherde verbinding wijzigen"
"Hiermee kan de app de status van de getetherde netwerkverbinding wijzigen."
- "wifi-verbindingen weergeven"
- "Hiermee kan de app informatie over wifi-netwerken bekijken, zoals of wifi is ingeschakeld en de naam van apparaten waarmee via wifi verbinding is gemaakt."
+ "wifi-verbindingen bekijken"
+ "Hiermee kan de app informatie over wifi-netwerken bekijken, zoals of wifi is aangezet en de naam van apparaten waarmee via wifi verbinding is gemaakt."
"Wifi-verbinding maken en verbreken"
"Hiermee kan de app zich koppelen aan en ontkoppelen van wifi-toegangspunten en wijzigingen aanbrengen in de apparaatconfiguratie voor wifi-netwerken."
"Wifi Multicast-ontvangst toestaan"
@@ -501,11 +501,11 @@
"Hiermee kan de app pakketten ontvangen die via multicastadressen naar alle apparaten in een wifi-netwerk worden verzonden, niet alleen naar je Android TV-apparaat. Het stroomgebruik ligt hierbij hoger dan in de niet-multicastmodus."
"Hiermee kan de app pakketten ontvangen die via multicastadressen naar alle apparaten in een wifi-netwerk worden verzonden, niet alleen naar je telefoon. Het stroomgebruik ligt hierbij hoger dan in de niet-multicastmodus."
"Bluetooth-instellingen openen"
- "Hiermee kan de app de lokale bluetooth-tablet configureren en externe apparaten zoeken en koppelen."
- "Hiermee kan de app Bluetooth op je Android TV-apparaat configureren en externe apparaten zoeken en koppelen."
- "Hiermee kan de app de lokale bluetooth-telefoon configureren en externe apparaten zoeken en koppelen."
+ "Hiermee kan de app de lokale bluetooth-tablet instellen en externe apparaten zoeken en koppelen."
+ "Hiermee kan de app Bluetooth op je Android TV-apparaat isntellen en externe apparaten zoeken en koppelen."
+ "Hiermee kan de app de lokale bluetooth-telefoon instellen en externe apparaten zoeken en koppelen."
"WiMAX-verbinding maken en verbreken"
- "Hiermee kan de app bepalen of WiMAX is ingeschakeld en informatie bekijken over alle WiMAX-netwerken waarmee verbinding is gemaakt."
+ "Hiermee kan de app bepalen of WiMAX aanstaat en informatie bekijken over alle WiMAX-netwerken waarmee verbinding is gemaakt."
"WiMAX-status wijzigen"
"Hiermee kan de app de tablet verbinden met WiMAX-netwerken en de verbinding daarmee verbreken."
"Hiermee kan de app verbinding maken met je Android TV-apparaat en je Android TV-apparaat loskoppelen van WiMAX-netwerken."
@@ -518,8 +518,8 @@
"Hiermee kun je zorgen dat de app informatie krijgt over de voorkeursservice voor NFC-betaling, zoals geregistreerde hulpmiddelen en routebestemmingen."
"Near Field Communication regelen"
"Hiermee kan de app communiceren met NFC-tags (Near Field Communication), kaarten en lezers."
- "je schermvergrendeling uitschakelen"
- "Hiermee kan de app de toetsenblokkering en bijbehorende wachtwoordbeveiliging uitschakelen. Zo kan de telefoon de toetsenblokkering uitschakelen wanneer je wordt gebeld en de toetsenblokkering weer inschakelen als het gesprek is beëindigd."
+ "je schermvergrendeling uitzetten"
+ "Hiermee kan de app de toetsenblokkering en bijbehorende wachtwoordbeveiliging uitzetten. Zo kan de telefoon de toetsenblokkering uitzetten als je wordt gebeld en de toetsenblokkering weer aanzetten als het gesprek is beëindigd."
"complexiteit van schermvergrendeling opvragen"
"Hiermee krijgt de app toestemming om het complexiteitsniveau van de schermvergrendeling te achterhalen (hoog, midden, laag of geen). Dat geeft een indicatie van het mogelijke lengtebereik en type van de schermvergrendeling. De app kan gebruikers ook voorstellen de schermvergrendeling naar een bepaald niveau te updaten, maar gebruikers kunnen dit altijd negeren en de app verlaten. De schermvergrendeling wordt niet opgeslagen als platte tekst, zodat de app het precieze wachtwoord niet weet."
"biometrische hardware gebruiken"
@@ -613,7 +613,7 @@
"Gezichtspictogram"
"synchronisatie-instellingen lezen"
"Hiermee kan de app de synchronisatie-instellingen voor een account lezen. Dit kan bijvoorbeeld bepalen of de app Personen wordt gesynchroniseerd met een account."
- "synchronisatie in- en uitschakelen"
+ "synchronisatie aan- of uitzetten"
"Hiermee kan een app de synchronisatie-instellingen aanpassen voor een account. Deze toestemming kan bijvoorbeeld worden gebruikt om synchronisatie van de app Personen in te schakelen voor een account."
"synchronisatiestatistieken lezen"
"Hiermee kan een app de synchronisatiestatistieken voor een account lezen, inclusief de geschiedenis van synchronisatie-activiteiten en hoeveel gegevens zijn gesynchroniseerd."
@@ -696,9 +696,9 @@
"Wijzigen hoe vaak het wachtwoord, de pincode of het patroon voor schermvergrendeling moet worden gewijzigd."
"Codering voor opslag instellen"
"Vereisen dat opgeslagen appgegevens kunnen worden gecodeerd."
- "Camera\'s uitschakelen"
+ "Camera\'s uitzetten"
"Het gebruik van alle apparaatcamera\'s voorkomen."
- "Bepaalde functies voor schermvergrendeling uitschakelen"
+ "Bepaalde functies voor schermvergrendeling uitzetten"
"Gebruik van bepaalde functies voor schermvergrendeling voorkomen."
- "Thuis"
@@ -988,8 +988,8 @@
"Zoekopdracht verzenden"
"Gesproken zoekopdrachten"
"\'Verkennen via aanraking\' aan?"
- "%1$s wil \'Verkennen via aanraking\' inschakelen. Wanneer \'Verkennen via aanraking\' is ingeschakeld, kunt u beschrijvingen beluisteren of bekijken van wat er onder je vinger staat of aanraakbewerkingen uitvoeren op de tablet."
- "%1$s wil \'Verkennen via aanraking\' inschakelen. Wanneer \'Verkennen via aanraking\' is ingeschakeld, kunt u beschrijvingen beluisteren of bekijken van wat er onder je vinger staat of aanraakbewerkingen uitvoeren op de telefoon."
+ "%1$s 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 tablet."
+ "%1$s 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."
"1 maand geleden"
"Meer dan 1 maand geleden"
@@ -1177,12 +1177,12 @@
"%1$s is nu actief."
"%1$s was het eerst gestart."
"Schaal"
- "Altijd weergeven"
- "U kunt dit opnieuw inschakelen via Systeeminstellingen > Apps > Gedownload."
+ "Altijd tonen"
+ "Je kunt dit opnieuw aanzetten via Systeeminstellingen > Apps > Gedownload."
"%1$s biedt geen ondersteuning voor de huidige instelling voor weergavegrootte en kan onverwacht gedrag vertonen."
- "Altijd weergeven"
+ "Altijd tonen"
"%1$s is gemaakt voor een niet-geschikte versie van het Android-besturingssysteem en kan onverwacht gedrag vertonen. Mogelijk is er een geüpdatete versie van de app beschikbaar."
- "Altijd weergeven"
+ "Altijd tonen"
"Controleren op update"
"De app %1$s (proces %2$s) heeft het zelf afgedwongen StrictMode-beleid geschonden."
"Het proces %1$s heeft het zelf afgedwongen StrictMode-beleid geschonden."
@@ -1297,10 +1297,10 @@
"OK"
"Dit apparaat wordt opgeladen via USB"
"Verbonden apparaat wordt opgeladen via USB"
- "USB-bestandsoverdracht ingeschakeld"
- "PTP via USB ingeschakeld"
- "USB-tethering ingeschakeld"
- "MIDI via USB ingeschakeld"
+ "USB-bestandsoverdracht staat aan"
+ "PTP via USB staat aan"
+ "USB-tethering staat aan"
+ "MIDI via USB staat aan"
"USB-accessoire verbonden"
"Tik voor meer opties."
"Verbonden apparaat wordt opgeladen. Tik voor meer opties."
@@ -1312,9 +1312,9 @@
"Draadloze foutopsporing verbonden"
"Tik om draadloze foutopsporing uit te schakelen"
"Selecteer deze optie om draadloze foutopsporing uit te schakelen."
- "Test harness-modus is ingeschakeld"
+ "Test harness-modus staat aan"
"Reset de fabrieksinstellingen om de test harness-modus uit te schakelen."
- "Seriële console ingeschakeld"
+ "Seriële console staat aan"
"Dit is van invloed op de prestaties. Controleer de bootloader om dit uit te schakelen."
"Vloeistof of vuil in USB-poort"
"USB-poort is automatisch uitgeschakeld. Tik voor meer informatie."
@@ -1327,17 +1327,17 @@
"DELEN"
"WEIGEREN"
"Invoermethode selecteren"
- "Dit op het scherm weergeven terwijl het fysieke toetsenbord actief is"
+ "Op het scherm tonen terwijl het fysieke toetsenbord actief is"
"Virtueel toetsenbord tonen"
- "Fysiek toetsenbord configureren"
+ "Fysiek toetsenbord instellen"
"Tik om een taal en indeling te selecteren"
" ABCDEFGHIJKLMNOPQRSTUVWXYZ"
" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"Weergeven vóór andere apps"
"%s wordt weergegeven over andere apps"
- "%s wordt weergegeven over apps"
+ "%s wordt weergegeven vóór andere apps"
"Als je niet wilt dat %s deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."
- "Uitschakelen"
+ "Uitzetten"
"%s controleren…"
"Huidige content controleren"
"Nieuwe %s"
@@ -1352,7 +1352,7 @@
"Je moet het apparaat misschien opnieuw formatteren. Tik om het uit te werpen."
"%s niet ondersteund"
"%s werkt niet"
- "Dit apparaat biedt geen ondersteuning voor deze %s. Tik om te configureren in een ondersteunde indeling."
+ "Dit apparaat biedt geen ondersteuning voor deze %s. Tik om in te stellen in een ondersteunde indeling."
"Dit apparaat biedt geen ondersteuning voor deze %s. Selecteer om in te stellen in een ondersteunde indeling."
"Je moet het apparaat misschien opnieuw formatteren"
"%s is onverwacht verwijderd"
@@ -1541,7 +1541,7 @@
"Vingerafdrukken:"
"SHA-256-vingerafdruk"
"SHA-1-vingerafdruk:"
- "Alles weergeven"
+ "Alles tonen"
"Een activiteit kiezen"
"Delen met"
"Verzenden..."
@@ -1621,14 +1621,14 @@
"Verwijderen"
"Volume verhogen tot boven het aanbevolen niveau?\n\nAls je langere tijd op hoog volume naar muziek luistert, raakt je gehoor mogelijk beschadigd."
"Snelkoppeling toegankelijkheid gebruiken?"
- "Als de snelkoppeling is ingeschakeld, kun je drie seconden op beide volumeknoppen drukken om een toegankelijkheidsfunctie te starten."
- "Toegankelijkheidsfuncties inschakelen?"
+ "Als de snelkoppeling aanstaat, houd je beide volumeknoppen 3 seconden ingedrukt om een toegankelijkheidsfunctie te starten."
+ "Toegankelijkheidsfuncties aanzetten?"
"Als je beide volumetoetsen een paar seconden ingedrukt houdt, schakel je de toegankelijkheidsfuncties in. Hierdoor kan de manier veranderen waarop je apparaat werkt.\n\nHuidige functies:\n%1$s\nJe kunt de geselecteerde functies wijzigen via Instellingen > Toegankelijkheid."
" • %1$s\n"
- "%1$s inschakelen?"
+ "%1$s aanzetten?"
"Als je beide volumetoetsen een paar seconden ingedrukt houdt, wordt de toegankelijkheidsfunctie %1$s ingeschakeld. Hierdoor kan de manier veranderen waarop je apparaat werkt.\n\nJe kunt deze sneltoets op een andere functie instellen via Instellingen > Toegankelijkheid."
- "Inschakelen"
- "Niet inschakelen"
+ "Aanzetten"
+ "Niet aanzetten"
"AAN"
"UIT"
"Toestaan dat %1$s volledige controle over je apparaat heeft?"
@@ -1646,11 +1646,11 @@
"%s is uitgeschakeld"
"Snelkoppelingen bewerken"
"Klaar"
- "Sneltoets uitschakelen"
+ "Sneltoets uitzetten"
"Sneltoets gebruiken"
"Kleurinversie"
"Kleurcorrectie"
- "Volumetoetsen ingedrukt gehouden. %1$s is ingeschakeld."
+ "Volumetoetsen ingedrukt gehouden. %1$s staat aan."
"Volumetoetsen ingedrukt gehouden. %1$s uitgeschakeld."
"Houd beide volumetoetsen drie seconden ingedrukt om %1$s te gebruiken"
"Kies een functie om te gebruiken als je op de knop Toegankelijkheid tikt:"
@@ -1771,7 +1771,7 @@
- Probeer het over 1 seconde opnieuw
"Probeer het later opnieuw"
- "Volledig scherm wordt weergegeven"
+ "Volledig scherm wordt getoond"
"Swipe omlaag vanaf de bovenkant van het scherm om af te sluiten."
"Ik snap het"
"Klaar"
@@ -1792,11 +1792,11 @@
"Geüpdatet door je beheerder"
"Verwijderd door je beheerder"
"OK"
- "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Het donkere thema inschakelen\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitschakelen of beperken\n\n""Meer informatie"
- "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Het donkere thema inschakelen.\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitschakelen of beperken."
- "Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens verzenden of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt."
+ "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Donkere thema aanzetten\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken\n\n""Meer informatie"
+ "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Donker thema aanzetten.\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken."
+ "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 weergegeven totdat je erop tikt."
"Databesparing aanzetten?"
- "Inschakelen"
+ "Aanzetten"
- %1$d minuten (tot %2$s)
- Eén minuut (tot %2$s)
@@ -1841,7 +1841,7 @@
"Weekend"
"Afspraken"
"Slapen"
- "%1$s dempt sommige geluiden"
+ "%1$s zet sommige geluiden uit"
"Er is een intern probleem met je apparaat. Het apparaat kan instabiel zijn totdat u het apparaat terugzet naar de fabrieksinstellingen."
"Er is een intern probleem met je apparaat. Neem contact op met de fabrikant voor meer informatie."
"USSD-verzoek gewijzigd in normaal gesprek"
@@ -1856,7 +1856,7 @@
"Gemeld"
"Uitvouwen"
"Samenvouwen"
- "uitvouwen in-/uitschakelen"
+ "uitvouwen aan- of uitzetten"
"Poort voor Android-USB-randapparatuur"
"Android"
"Poort voor USB-randapparatuur"
@@ -1886,9 +1886,9 @@
"%1$s is nu niet beschikbaar. Dit wordt beheerd door %2$s."
"Meer info"
"App niet meer onderbreken"
- "Werkprofiel inschakelen?"
+ "Werkprofiel aanzetten?"
"Je werk-apps, meldingen, gegevens en andere functies van je werkprofiel worden uitgeschakeld"
- "Inschakelen"
+ "Aanzetten"
"App is niet beschikbaar"
"%1$s is momenteel niet beschikbaar."
"Deze app is ontwikkeld voor een oudere versie van Android en werkt mogelijk niet op de juiste manier. Controleer op updates of neem contact op met de ontwikkelaar."
@@ -1909,7 +1909,7 @@
"Demo starten…"
"Apparaat resetten…"
"%1$s uitgeschakeld"
- "Conferencecall"
+ "Telefonische vergadering"
"Knopinfo"
"Games"
"Muziek en audio"
@@ -1982,10 +1982,10 @@
"VERWIJDEREN"
"TOCH OPENEN"
"Schadelijke app gevonden"
- "%1$s wil segmenten van %2$s weergeven"
+ "%1$s wil segmenten van %2$s tonen"
"Bewerken"
"Trillen bij gesprekken en meldingen"
- "Gesprekken en meldingen zijn gedempt"
+ "Telefoon- en meldingsgeluid wordt uitgezet"
"Systeemwijzigingen"
"Niet storen"
"Nieuw: \'Niet storen\' verbergt meldingen"
@@ -2063,7 +2063,7 @@
"Kan deze content niet openen met persoonlijke apps"
"Je IT-beheerder staat niet toe dat je deze content opent met apps in je persoonlijke profiel"
"Werkprofiel is onderbroken"
- "Inschakelen"
+ "Aanzetten"
"Er zijn geen werk-apps die deze content kunnen ondersteunen"
"Er zijn geen werk-apps die deze content kunnen openen"
"Er zijn geen persoonlijke apps die deze content kunnen ondersteunen"
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 72fbc1d31781..386d9e05124d 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -100,7 +100,7 @@
"ପୀଅର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ HCO ଅଟେ"
"ପୀଅର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ VCO ଅଟେ"
"ପୀଅର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ OFF ଅଛି"
- "ଭଏସ୍"
+ "Voice"
"ଡାଟା"
"ଫାକ୍ସ"
"SMS"
@@ -1113,9 +1113,9 @@
"%1$s ଚାଲୁଛି"
"ଅଧିକ ସୂଚନା ପାଇଁ କିମ୍ବା ଆପ୍ ବନ୍ଦ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"
"ଠିକ୍ ଅଛି"
- "କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"
+ "ବାତିଲ୍ କରନ୍ତୁ"
"ଠିକ୍ ଅଛି"
- "କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"
+ "ବାତିଲ୍ କରନ୍ତୁ"
"ଧ୍ୟାନଦିଅନ୍ତୁ"
"ଲୋଡ୍ କରାଯାଉଛି…"
"ଚାଲୁ"
@@ -1269,7 +1269,7 @@
"ଏହା ଦ୍ୱାରା "" ଆପଣଙ୍କ ମୋବାଇଲ୍ ଆକାଉଣ୍ଟରୁ ପଇସା କଟିପାରେ। "
" ଆପଣଙ୍କ ମୋବାଇଲ୍ ଆକାଉଣ୍ଟରୁ ପଇସା କଟିପାରେ। "
"ପଠାନ୍ତୁ"
- "କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"
+ "ବାତିଲ୍ କରନ୍ତୁ"
"ମୋ ପସନ୍ଦ ମନେରଖନ୍ତୁ"
"ଏହାକୁ ଆପଣ ସେଟିଙ୍ଗ ଓ ଆପ୍ରେ ପରବର୍ତ୍ତୀ ସମୟରେ ବଦଳାଇପାରିବେ"
"ସର୍ବଦା ଅନୁମତି ଦିଅନ୍ତୁ"
@@ -1490,7 +1490,7 @@
"ପୂର୍ବ ମାସ"
"ପରବର୍ତ୍ତୀ ମାସ"
"ALT"
- "କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"
+ "ବାତିଲ୍ କରନ୍ତୁ"
"ଡିଲିଟ୍ କରନ୍ତୁ"
"ହୋଇଗଲା"
"ମୋଡ୍ ପରିବର୍ତ୍ତନ"
@@ -1661,7 +1661,7 @@
"ଫିଚରଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବାକୁ, ତିନୋଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ।"
"ମ୍ୟାଗ୍ନିଫିକେସନ୍"
"ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି %1$s।"
- "%1$s ରେ ସୁଇଚ୍ କରନ୍ତୁ…"
+ "%1$sରେ ସ୍ୱିଚ୍ କରନ୍ତୁ…"
"%1$sଙ୍କୁ ଲଗଆଉଟ୍ କରାଯାଉଛି…"
"ମାଲିକ"
"ତ୍ରୁଟି"
@@ -1751,7 +1751,7 @@
"You4"
"ଅଜଣା ପୋର୍ଟ୍ରେଟ୍"
"ଅଜଣା ଲ୍ୟାଣ୍ଡସ୍କେପ୍"
- "କ୍ୟାନ୍ସଲ୍ କରାଗଲା"
+ "ବାତିଲ୍ କରାଗଲା"
"କଣ୍ଟେଣ୍ଟ ଲେଖିବାବେଳେ ତ୍ରୁଟି"
"ଅଜଣା"
"ପ୍ରିଣ୍ଟ ସେବାକୁ ସକ୍ଷମ କରାଯାଇନାହିଁ"
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 45d32f2aa0e4..77aceb7264f4 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -1306,7 +1306,7 @@
"ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ। ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।"
"ਐਨਾਲੌਗ ਆਡੀਓ ਉਪਸਾਧਨ ਦਾ ਪਤਾ ਲੱਗਿਆ"
"ਨੱਥੀ ਕੀਤਾ ਡੀਵਾਈਸ ਇਸ ਫ਼ੋਨ ਦੇ ਅਨੁਰੂਪ ਨਹੀਂ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"
- "USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ"
+ "USB ਡੀਬੱਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ"
"USB ਡੀਬੱਗਿੰਗ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"
"USB ਡੀਬੱਗਿੰਗ ਅਯੋਗ ਬਣਾਉਣ ਲਈ ਚੁਣੋ।"
"ਵਾਇਰਲੈੱਸ ਡੀਬੱਗਿੰਗ ਨੂੰ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"
@@ -1661,7 +1661,7 @@
"ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"
"ਵੱਡਦਰਸ਼ੀਕਰਨ"
"ਮੌਜੂਦਾ ਉਪਭੋਗਤਾ %1$s।"
- "%1$s ਤੇ ਸਵਿਚ ਕਰ ਰਿਹਾ ਹੈ…"
+ "%1$s \'ਤੇ ਸਵਿਚ ਕਰ ਰਿਹਾ ਹੈ…"
"%1$s ਨੂੰ ਲਾਗ-ਆਉਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ …"
"ਮਾਲਕ"
"ਅਸ਼ੁੱਧੀ"
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index c206b12b8514..9b6edd21b6ac 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -542,7 +542,7 @@
"Zezwala aplikacji na modyfikowanie kolekcji zdjęć."
"odczytywanie lokalizacji z kolekcji multimediów"
"Zezwala aplikacji na odczytywanie lokalizacji z kolekcji multimediów."
- "Potwierdź swoją tożsamość"
+ "Potwierdź, że to Ty"
"Sprzęt biometryczny niedostępny"
"Anulowano uwierzytelnianie"
"Nie rozpoznano"
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index fa5be924bf85..ec34e4e6f8c8 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -849,7 +849,7 @@
"Pausar"
"Reproduzir"
"Parar"
- "Retroceder"
+ "Voltar"
"Avançar"
"Só chamadas de emergência"
"Rede bloqueada"
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 1beb966c4421..6de3cdffefae 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -254,7 +254,7 @@
- A tirar uma captura de ecrã do relatório de erro dentro de %d segundo…
"Captura de ecrã tirada com o relatório de erro."
- "Falha ao tirar captura de ecrã com o relatório de erro."
+ "Falha ao fazer captura de ecrã com o relatório de erro."
"Modo silencioso"
"Som desativado"
"O som está ativado"
@@ -327,7 +327,7 @@
"É possível tocar, deslizar rapidamente, juntar os dedos e realizar outros gestos"
"Gestos de impressão digital"
"Pode capturar gestos realizados no sensor de impressões digitais do dispositivo."
- "Tirar captura de ecrã"
+ "Fazer captura de ecrã"
"É possível tirar uma captura de ecrã."
"desativar ou modificar barra de estado"
"Permite à app desativar a barra de estado ou adicionar e remover ícones do sistema."
@@ -2048,7 +2048,7 @@
"%1$s:"
"enviou uma imagem"
"Conversa"
- "Conversa de grupo"
+ "Conversa em grupo"
"> %1$d"
"Pessoal"
"Trabalho"
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index fa5be924bf85..ec34e4e6f8c8 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -849,7 +849,7 @@
"Pausar"
"Reproduzir"
"Parar"
- "Retroceder"
+ "Voltar"
"Avançar"
"Só chamadas de emergência"
"Rede bloqueada"
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index f7f80f2b73c9..20407b131907 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -224,7 +224,7 @@
"Подготовка обновлений…"
"Обработка обновлений…"
"Перезагрузка…"
- "Сбросить к заводским настройкам"
+ "Сбросить настройки"
"Перезагрузка…"
"Выключение..."
"Планшетный ПК будет отключен."
@@ -1168,10 +1168,10 @@
"Открыть с помощью приложения:"
"Открыть с помощью приложения \"%1$s\""
"Открыть"
- "Открывать ссылки вида %1$s с помощью:"
+ "Открывать ссылки %1$s с помощью:"
"Открывать ссылки с помощью:"
"Открывать ссылки в браузере %1$s"
- "Открывать ссылки вида %1$s в браузере %2$s"
+ "Открывать ссылки %1$s в браузере %2$s"
"Открыть доступ"
"Редактировать с помощью приложения:"
"Редактировать с помощью приложения \"%1$s\""
@@ -1705,7 +1705,7 @@
"Для переключения между функциями проведите по экрану снизу вверх тремя пальцами и задержите их."
"Увеличение"
"Выбран аккаунт пользователя %1$s."
- "Смена профиля на %1$s…"
+ "Смена профиля на \"%1$s\"…"
"Выход из аккаунта %1$s…"
"Владелец"
"Ошибка"
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 8742a670270e..0c2b143bc808 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1661,7 +1661,7 @@
"Për të kaluar mes veçorive, rrëshqit shpejt lart me tre gishta dhe mbaje prekur."
"Zmadhimi"
"Emri i përdoruesit aktual: %1$s"
- "Po kalon në %1$s…"
+ "Po kalon në \"%1$s\"…"
"%1$s po del…"
"Zotëruesi"
"Gabim"
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 279c619c65fc..66bf9c2d8030 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -242,19 +242,19 @@
"Nödsituation"
"Felrapport"
"Avsluta session"
- "Skärmdump"
+ "Skärmbild"
"Felrapport"
"Nu hämtas information om aktuell status för enheten, som sedan skickas i ett e-postmeddelade. Det tar en liten stund innan felrapporten är färdig och kan skickas, så vi ber dig ha tålamod."
"Interaktiv rapport"
- "Bör användas i de flesta fall. Då kan du spåra rapportförloppet, ange mer information om problemet och ta skärmdumpar. En del mindre använda avsnitt, som det tar lång tid att rapportera om, kan uteslutas."
+ "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."
"Fullständig rapport"
- "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ärmdumpar."
+ "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."
- - Tar en skärmdump till felrapporten om %d sekunder.
- - Tar en skärmdump till felrapporten om %d sekund.
+ - Tar en skärmbild till felrapporten om %d sekunder.
+ - Tar en skärmbild till felrapporten om %d sekund.
- "Skärmdump med felrapport har tagits"
- "Det gick inte att ta en skärmdump med felrapport"
+ "Skärmbild med felrapport har tagits"
+ "Det gick inte att ta en skärmbild med felrapport"
"Tyst läge"
"Ljudet är AV"
"Ljudet är PÅ"
@@ -327,8 +327,8 @@
"Kan trycka, svepa, nypa och göra andra rörelser."
"Fingeravtrycksrörelser"
"Kan registrera rörelser som utförs med hjälp av enhetens fingeravtryckssensor."
- "Ta skärmdump"
- "Du kan ta en skärmdump av skärmen."
+ "Ta skärmbild"
+ "Du kan ta en skärmbild av skärmen."
"inaktivera eller ändra statusfält"
"Tillåter att appen inaktiverar statusfältet eller lägger till och tar bort systemikoner."
"visas i statusfältet"
@@ -2039,7 +2039,7 @@
"Snabbinställningar"
"Dialogruta för ström"
"Låsskärm"
- "Skärmdump"
+ "Skärmbild"
"Tillgänglighetsgenväg på skärmen"
"Valfunktion för tillgänglighetsgenväg på skärmen"
"Aktivera tillgänglighet snabbt"
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 7066c0054ebf..8aca7d259c30 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -968,7 +968,7 @@
"Katu"
"Hauna idhini ya kufungua ukurasa huu."
"Maandishi yamenakiliwa kwenye ubao wa kunakili."
- "Imenakiliwa"
+ "Umenakili"
"Zaidi"
"Menyu+"
"Meta+"
@@ -1661,7 +1661,7 @@
"Ili ubadilishe kati ya vipengele, telezesha vidole vitatu juu na ushikilie."
"Ukuzaji"
"Mtumiaji wa sasa %1$s."
- "Inabadili kwenda %1$s…"
+ "Inaenda kwa %1$s…"
"Inamwondoa %1$s…"
"Mmiliki"
"Hitilafu"
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 0c5f964ee657..2eb628c7afb0 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -100,7 +100,7 @@
"TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது"
"TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது"
"TTY Mode OFFஐ இணைச் செயல்பாடு கோரியது"
- "குரல்"
+ "Voice"
"தரவு"
"தொலைநகல்"
"SMS"
@@ -268,7 +268,7 @@
"999+"
"புதிய அறிவிப்பு"
"விர்ச்சுவல் கீபோர்டு"
- "கைமுறை விசைப்பலகை"
+ "கைமுறை கீபோர்டு"
"பாதுகாப்பு"
"கார் பயன்முறை"
"கணக்கின் நிலை"
@@ -1327,9 +1327,9 @@
"பகிர்"
"வேண்டாம்"
"உள்ளீட்டு முறையைத் தேர்வுசெய்க"
- "கைமுறை விசைப்பலகை இயக்கத்தில் இருக்கும் போது IMEஐ திரையில் வைத்திரு"
+ "கைமுறை கீபோர்டு இயக்கத்தில் இருக்கும் போது IMEஐ திரையில் வைத்திரு"
"விர்ச்சுவல் கீபோர்டை காட்டு"
- "கைமுறை விசைப்பலகையை உள்ளமைக்கவும்"
+ "கைமுறை கீபோர்டை உள்ளமைக்கவும்"
"மொழியையும் தளவமைப்பையும் தேர்ந்தெடுக்க, தட்டவும்"
" ABCDEFGHIJKLMNOPQRSTUVWXYZ"
" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
@@ -2000,7 +2000,7 @@
"வழக்கமான பேட்டரி சேமிப்பானுக்கான விவர அறிவிப்பு"
"வழக்கமாகச் சார்ஜ் செய்வதற்கு முன்பே பேட்டரி தீர்ந்துபோகக்கூடும்"
"பேட்டரி நிலையை நீட்டிக்க பேட்டரி சேமிப்பான் இயக்கப்பட்டுள்ளது"
- "பேட்டரி சேமிப்பான்"
+ "பேட்டரி சேமிப்பு"
"பேட்டரி சேமிப்பான் ஆஃப் செய்யப்பட்டுள்ளது"
"மொபைலில் போதுமான சார்ஜ் உள்ளது. அம்சங்கள் இனி தடையின்றி இயங்கும்."
"டேப்லெட்டில் போதுமான சார்ஜ் உள்ளது. அம்சங்கள் இனி தடையின்றி இயங்கும்."
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 726fd6c6180a..f379214734c9 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -100,7 +100,7 @@
"అవతలి వారు HCO TTY మోడ్ని అభ్యర్థించారు"
"అవతలి వారు VCO TTY మోడ్ని అభ్యర్థించారు"
"అవతలి వారు OFF TTY మోడ్ని అభ్యర్థించారు"
- "వాయిస్"
+ "Voice"
"డేటా"
"ఫ్యాక్స్"
"SMS"
@@ -229,9 +229,9 @@
"మీ ఫోన్ షట్డౌన్ చేయబడుతుంది."
"మీరు షట్ డౌన్ చేయాలనుకుంటున్నారా?"
"సురక్షిత మోడ్కు రీబూట్ చేయండి"
- "మీరు సురక్షిత మోడ్లోకి రీబూట్ చేయాలనుకుంటున్నారా? దీని వలన మీరు ఇన్స్టాల్ చేసిన అన్ని మూడవ పక్షం అనువర్తనాలు నిలిపివేయబడతాయి. ఇవి మీరు మళ్లీ రీబూట్ చేసినప్పుడు పునరుద్ధరించబడతాయి."
+ "మీరు సురక్షిత మోడ్లోకి రీబూట్ చేయాలనుకుంటున్నారా? దీని వలన మీరు ఇన్స్టాల్ చేసిన అన్ని మూడవ పక్షం యాప్లు నిలిపివేయబడతాయి. ఇవి మీరు మళ్లీ రీబూట్ చేసినప్పుడు పునరుద్ధరించబడతాయి."
"ఇటీవలివి"
- "ఇటీవలి అనువర్తనాలు ఏవీ లేవు."
+ "ఇటీవలి యాప్లు ఏవీ లేవు."
"టాబ్లెట్ ఎంపికలు"
"Android TV ఎంపికలు"
"ఫోన్ ఎంపికలు"
@@ -336,13 +336,13 @@
"స్థితి పట్టీని విస్తరింపజేయడం/కుదించడం"
"స్థితి బార్ను విస్తరింపజేయడానికి లేదా కుదించడానికి యాప్ను అనుమతిస్తుంది."
"షార్ట్కట్లను ఇన్స్టాల్ చేయడం"
- "వినియోగదారు ప్రమేయం లేకుండానే హోమ్స్క్రీన్ సత్వరమార్గాలను జోడించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "వినియోగదారు ప్రమేయం లేకుండానే హోమ్స్క్రీన్ సత్వరమార్గాలను జోడించడానికి యాప్ను అనుమతిస్తుంది."
"సత్వరమార్గాలను అన్ఇన్స్టాల్ చేయడం"
- "వినియోగదారు ప్రమేయం లేకుండానే హోమ్స్క్రీన్ సత్వరమార్గాలను తీసివేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "వినియోగదారు ప్రమేయం లేకుండానే హోమ్స్క్రీన్ సత్వరమార్గాలను తీసివేయడానికి యాప్ను అనుమతిస్తుంది."
"అవుట్గోయింగ్ కాల్లను దారి మళ్లించడం"
- "కాల్ను వేరే నంబర్కు దారి మళ్లించే లేదా మొత్తంగా కాల్ను ఆపివేసే ఎంపిక సహాయంతో అవుట్గోయింగ్ కాల్ సమయంలో డయల్ చేయబడుతున్న నంబర్ను చూడటానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "కాల్ను వేరే నంబర్కు దారి మళ్లించే లేదా మొత్తంగా కాల్ను ఆపివేసే ఎంపిక సహాయంతో అవుట్గోయింగ్ కాల్ సమయంలో డయల్ చేయబడుతున్న నంబర్ను చూడటానికి యాప్ను అనుమతిస్తుంది."
"ఫోన్ కాల్లకు సమాధానమివ్వు"
- "ఇన్కమింగ్ ఫోన్ కాల్లకు సమాధానమివ్వడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "ఇన్కమింగ్ ఫోన్ కాల్లకు సమాధానమివ్వడానికి యాప్ను అనుమతిస్తుంది."
"వచన సందేశాలను (SMS) స్వీకరించడం"
"SMS సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి యాప్ను అనుమతిస్తుంది. యాప్ మీ డివైజ్కు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగలదని లేదా తొలగించగలదని దీని అర్థం."
"వచన సందేశాలను (MMS) స్వీకరించడం"
@@ -386,7 +386,7 @@
"యాప్ నిల్వ స్థలాన్ని అంచనా వేయడం"
"యాప్ కోడ్, డేటా మరియు కాష్ పరిమాణాలను తిరిగి పొందడానికి దాన్ని అనుమతిస్తుంది"
"సిస్టమ్ సెట్టింగ్లను మార్చడం"
- "సిస్టమ్ యొక్క సెట్టింగ్ల డేటాను సవరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. హానికరమైన యాప్లు మీ సిస్టమ్ యొక్క కాన్ఫిగరేషన్ను నాశనం చేయవచ్చు."
+ "సిస్టమ్ యొక్క సెట్టింగ్ల డేటాను సవరించడానికి యాప్ను అనుమతిస్తుంది. హానికరమైన యాప్లు మీ సిస్టమ్ యొక్క కాన్ఫిగరేషన్ను నాశనం చేయవచ్చు."
"ప్రారంభంలో అమలు చేయడం"
"సిస్టమ్ బూటింగ్ను పూర్తి చేసిన వెంటనే దానికదే ప్రారంభించబడటానికి యాప్ను అనుమతిస్తుంది. ఇది టాబ్లెట్ను ప్రారంభించడానికి ఎక్కువ సమయం పట్టేలా చేయవచ్చు మరియు ఎల్లప్పుడూ అమలు చేయడం ద్వారా మొత్తం టాబ్లెట్ను నెమ్మదిగా పని చేయడానికి యాప్ను అనుమతించేలా చేయవచ్చు."
"సిస్టమ్ బూటింగ్ను పూర్తి చేసిన వెంటనే యాప్ దానికదే ప్రారంభం కావడానికి అనుమతిస్తుంది. ఇది మీ Android TV పరికరం ప్రారంభం కావడానికి ఎక్కువ సమయం పట్టేలా చేయవచ్చు మరియు ఎల్లప్పుడూ అమలు కావడం ద్వారా మొత్తం పరికరం పనితీరును నెమ్మది చేయడానికి యాప్ను అనుమతించవచ్చు."
@@ -432,7 +432,7 @@
"ఆడియోను రికార్డ్ చేయడం"
"ఈ యాప్ మైక్రోఫోన్ని ఉపయోగించి ఎప్పుడైనా ఆడియోను రికార్డ్ చేయగలదు."
"SIMకి ఆదేశాలను పంపడం"
- "సిమ్కు ఆదేశాలను పంపడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది చాలా ప్రమాదకరం."
+ "సిమ్కు ఆదేశాలను పంపడానికి యాప్ను అనుమతిస్తుంది. ఇది చాలా ప్రమాదకరం."
"భౌతిక కార్యాకలాపాన్ని గుర్తించండి"
"ఈ యాప్ మీ భౌతిక కార్యాకలాపాన్ని గుర్తించగలదు."
"చిత్రాలు మరియు వీడియోలు తీయడం"
@@ -447,11 +447,11 @@
"నేరుగా కాల్ చేసే ఫోన్ నంబర్లు"
"మీ ప్రమేయం లేకుండా ఫోన్ నంబర్లకు కాల్ చేయడానికి యాప్ను అనుమతిస్తుంది. దీని వలన అనుకోని ఛార్జీలు విధించబడవచ్చు లేదా కాల్లు రావచ్చు. ఇది అత్యవసర నంబర్లకు కాల్ చేయడానికి యాప్ను అనుమతించదని గుర్తుంచుకోండి. హానికరమైన యాప్లు మీ నిర్ధారణ లేకుండానే కాల్లు చేయడం ద్వారా మీకు డబ్బు ఖర్చయ్యేలా చేయవచ్చు."
"IMS కాల్ సేవ యాక్సెస్ అనుమతి"
- "మీ ప్రమేయం లేకుండా కాల్లు చేయడం కోసం IMS సేవను ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "మీ ప్రమేయం లేకుండా కాల్లు చేయడం కోసం IMS సేవను ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది."
"ఫోన్ స్థితి మరియు గుర్తింపుని చదవడం"
"పరికరం యొక్క ఫోన్ ఫీచర్లను యాక్సెస్ చేయడానికి యాప్ను అనుమతిస్తుంది. ఈ అనుమతి ఫోన్ నంబర్ మరియు పరికరం IDలను, కాల్ సక్రియంగా ఉందా లేదా అనే విషయాన్ని మరియు కాల్ ద్వారా కనెక్ట్ చేయబడిన రిమోట్ నంబర్ను కనుగొనడానికి యాప్ను అనుమతిస్తుంది."
"కాల్లను సిస్టమ్ ద్వారా వెళ్లేలా చేయి"
- "కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్లను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్లను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి యాప్ను అనుమతిస్తుంది."
"సిస్టమ్ ద్వారా కాల్లను చూసి, నియంత్రించండి."
"పరికరంలో కొనసాగుతున్న కాల్లను చూడడానికి మరియు నియంత్రించడానికి యాప్ను అనుమతిస్తుంది. ఇందులో కాల్ కోసం కాల్ల నంబర్లు మరియు రాష్ట్ర కాల్ వంటి సమాచారం ఉంటుంది."
"ఆడియో రికార్డ్ పరిమితుల నుండి మినహాయింపు"
@@ -469,9 +469,9 @@
"మీ Android TV పరికరం స్లీప్ మోడ్లోకి వెళ్లకుండా నివారించడానికి యాప్ని అనుమతిస్తుంది."
"నిద్రావస్థకి వెళ్లకుండా ఫోన్ను నిరోధించడానికి యాప్ను అనుమతిస్తుంది."
"ఇన్ఫ్రారెడ్ ప్రసరణ"
- "టాబ్లెట్ యొక్క ఇన్ఫ్రారెడ్ ట్రాన్స్మిటర్ను ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "టాబ్లెట్ యొక్క ఇన్ఫ్రారెడ్ ట్రాన్స్మిటర్ను ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది."
"మీ Android TV పరికరం యొక్క ఇన్ఫ్రారెడ్ ట్రాన్స్మిటర్ని ఉపయోగించడానికి యాప్ని అనుమతిస్తుంది."
- "ఫోన్ యొక్క ఇన్ఫ్రారెడ్ ట్రాన్స్మిటర్ను ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "ఫోన్ యొక్క ఇన్ఫ్రారెడ్ ట్రాన్స్మిటర్ను ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది."
"వాల్పేపర్ను సెట్ చేయడం"
"సిస్టమ్ వాల్పేపర్ను సెట్ చేయడానికి యాప్ను అనుమతిస్తుంది."
"మీ వాల్పేపర్ పరిమాణాన్ని సర్దుబాటు చేయడం"
@@ -493,13 +493,13 @@
"టీథర్ చేయబడిన కనెక్టివిటీని మార్చడం"
"టీథర్ చేసిన నెట్వర్క్ కనెక్టివిటీ యొక్క స్థితిని మార్చడానికి యాప్ను అనుమతిస్తుంది."
"Wi-Fi కనెక్షన్లను వీక్షించడం"
- "Wi-Fi ప్రారంభించబడిందా, లేదా మరియు కనెక్ట్ చేయబడిన Wi-Fi పరికరాల పేరు వంటి Wi-Fi నెట్వర్కింగ్ గురించి సమాచారాన్ని వీక్షించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "Wi-Fi ప్రారంభించబడిందా, లేదా మరియు కనెక్ట్ చేయబడిన Wi-Fi పరికరాల పేరు వంటి Wi-Fi నెట్వర్కింగ్ గురించి సమాచారాన్ని వీక్షించడానికి యాప్ను అనుమతిస్తుంది."
"Wi-Fiకి కనెక్ట్ చేయడం మరియు దాని నుండి డిస్కనెక్ట్ చేయడం"
"Wi-Fi యాక్సెస్ స్థానాలకు కనెక్ట్ చేయడానికి మరియు వాటి నుండి డిస్కనెక్ట్ చేయడానికి మరియు Wi-Fi నెట్వర్క్ల కోసం పరికర కాన్ఫిగరేషన్కు మార్పులు చేయడానికి యాప్ను అనుమతిస్తుంది."
"Wi-Fi Multicast స్వీకరణను అనుమతించడం"
"మల్టీక్యాస్ట్ చిరునామాలను ఉపయోగించి మీ టాబ్లెట్కు మాత్రమే కాకుండా Wi-Fi నెట్వర్క్లోని అన్ని పరికరాలకు పంపబడిన ప్యాకెట్లను స్వీకరించడానికి యాప్ను అనుమతిస్తుంది. మల్టీక్యాస్ట్ యేతర మోడ్ కంటే ఇది ఎక్కువ పవర్ ఉపయోగిస్తుంది."
"మల్టీక్యాస్ట్ చిరునామాలను ఉపయోగించి మీ Android TV పరికరానికి మాత్రమే కాకుండా Wi-Fi నెట్వర్క్లోని అన్ని పరికరాలకు పంపిన ప్యాకెట్లను స్వీకరించడానికి యాప్ని అనుమతిస్తుంది. ఇది మల్టీక్యాస్ట్ యేతర మోడ్ కంటే ఎక్కువ పవర్ను ఉపయోగిస్తుంది."
- "మల్టీక్యాస్ట్ చిరునామాలను ఉపయోగించి మీ ఫోన్కు మాత్రమే కాకుండా Wi-Fi నెట్వర్క్లోని అన్ని పరికరాలకు పంపబడిన ప్యాకెట్లను స్వీకరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. మల్టీక్యాస్ట్ యేతర మోడ్ కంటే ఇది ఎక్కువ పవర్ ఉపయోగిస్తుంది."
+ "మల్టీక్యాస్ట్ చిరునామాలను ఉపయోగించి మీ ఫోన్కు మాత్రమే కాకుండా Wi-Fi నెట్వర్క్లోని అన్ని పరికరాలకు పంపబడిన ప్యాకెట్లను స్వీకరించడానికి యాప్ను అనుమతిస్తుంది. మల్టీక్యాస్ట్ యేతర మోడ్ కంటే ఇది ఎక్కువ పవర్ ఉపయోగిస్తుంది."
"బ్లూటూత్ సెట్టింగ్లను యాక్సెస్ చేయడం"
"స్థానిక బ్లూటూత్ టాబ్లెట్ను కాన్ఫిగర్ చేయడానికి మరియు రిమోట్ పరికరాలతో దాన్ని కనుగొనడానికి మరియు జత చేయడానికి యాప్ను అనుమతిస్తుంది."
"మీ Android TV పరికరంలో బ్లూటూత్ను కాన్ఫిగర్ చేయడానికి మరియు రిమోట్ పరికరాలతో దాన్ని కనుగొని, జత చేయడానికి యాప్ను అనుమతిస్తుంది."
@@ -507,7 +507,7 @@
"WiMAXకు కనెక్ట్ చేయడం మరియు దాని నుండి డిస్కనెక్ట్ చేయడం"
"Wi-Fi ప్రారంభించబడిందా, లేదా మరియు కనెక్ట్ చేయబడిన WiMAX నెట్వర్క్ల గురించి సమాచారాన్ని కనుగొనడానికి యాప్ను అనుమతిస్తుంది."
"WiMAX స్థితిని మార్చడం"
- "WiMAX నెట్వర్క్లకు టాబ్లెట్ను కనెక్ట్ చేయడానికి మరియు వాటి నుండి టాబ్లెట్ను డిస్కనెక్ట్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "WiMAX నెట్వర్క్లకు టాబ్లెట్ను కనెక్ట్ చేయడానికి మరియు వాటి నుండి టాబ్లెట్ను డిస్కనెక్ట్ చేయడానికి యాప్ను అనుమతిస్తుంది."
"మీ Android TV పరికరాన్ని WiMAX నెట్వర్క్లకు కనెక్ట్ చేయడానికి లేదా డిస్కనెక్ట్ చేయడానికి యాప్ని అనుమతిస్తుంది."
"WiMAX నెట్వర్క్లకు ఫోన్ను కనెక్ట్ చేయడానికి మరియు వాటి నుండి ఫోన్ను డిస్కనెక్ట్ చేయడానికి యాప్ను అనుమతిస్తుంది."
"బ్లూటూత్ పరికరాలతో జత చేయడం"
@@ -622,19 +622,19 @@
"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్లను సవరించండి లేదా తొలగించండి"
"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్లను రాయడానికి యాప్ను అనుమతిస్తుంది."
"SIP కాల్లను చేయడానికి/స్వీకరించడానికి"
- "SIP కాల్లను చేయడానికి మరియు స్వీకరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "SIP కాల్లను చేయడానికి మరియు స్వీకరించడానికి యాప్ను అనుమతిస్తుంది."
"కొత్త టెలికామ్ SIM కనెక్షన్లను నమోదు చేయడం"
- "కొత్త టెలికామ్ SIM కనెక్షన్లను నమోదు చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "కొత్త టెలికామ్ SIM కనెక్షన్లను నమోదు చేయడానికి యాప్ను అనుమతిస్తుంది."
"కొత్త టెలికామ్ కనెక్షన్లను నమోదు చేయడం"
- "కొత్త టెలికామ్ కనెక్షన్లను నమోదు చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "కొత్త టెలికామ్ కనెక్షన్లను నమోదు చేయడానికి యాప్ను అనుమతిస్తుంది."
"టెలికామ్ కనెక్షన్లను నిర్వహించడం"
- "టెలికామ్ కనెక్షన్లను నిర్వహించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "టెలికామ్ కనెక్షన్లను నిర్వహించడానికి యాప్ను అనుమతిస్తుంది."
"ఇన్-కాల్ స్క్రీన్తో పరస్పర చర్య చేయడం"
- "వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి యాప్ను అనుమతిస్తుంది."
"టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడం"
- "కాల్లు చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "కాల్లు చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి యాప్ను అనుమతిస్తుంది."
"ఇన్-కాల్ వినియోగదారు అనుభవాన్ని అందించడం"
- "ఇన్-కాల్ వినియోగదారుని అనుభవాన్ని అందించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "ఇన్-కాల్ వినియోగదారుని అనుభవాన్ని అందించడానికి యాప్ను అనుమతిస్తుంది."
"చారిత్రక నెట్వర్క్ వినియోగాన్ని చదవడం"
"నిర్దిష్ట నెట్వర్క్లు మరియు యాప్ల కోసం చారిత్రాత్మక నెట్వర్క్ వినియోగాన్ని చదవడానికి యాప్ను అనుమతిస్తుంది."
"నెట్వర్క్ విధానాన్ని నిర్వహించడం"
@@ -642,31 +642,31 @@
"నెట్వర్క్ వినియోగ అకౌంటింగ్ను సవరించడం"
"యాప్లలో నెట్వర్క్ వినియోగం ఎలా గణించాలనే దాన్ని సవరించడానికి యాప్ను అనుమతిస్తుంది. సాధారణ యాప్ల ద్వారా ఉపయోగించడానికి ఉద్దేశించినది కాదు."
"నోటిఫికేషన్లను యాక్సెస్ చేయడం"
- "నోటిఫికేషన్లను, ఇతర అనువర్తనాల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "నోటిఫికేషన్లను, ఇతర అనువర్తనాల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి యాప్ను అనుమతిస్తుంది."
"నోటిఫికేషన్ పరిశీలన సేవకు అనుబంధించడం"
"నోటిఫికేషన్ పరిశీలన సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు."
"షరతు ప్రదాత సేవకు అనుబంధించడం"
"షరతు ప్రదాత సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
"డ్రీమ్ సేవకి అనుబంధించడం"
"డ్రీమ్ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
- "క్యారియర్ అందించిన కాన్ఫిగరేషన్ అనువర్తనాన్ని అభ్యర్థించడం"
- "క్యారియర్ అందించిన కాన్ఫిగరేషన్ అనువర్తనాన్ని అభ్యర్థించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు."
+ "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్ను అభ్యర్థించడం"
+ "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్ను అభ్యర్థించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు."
"నెట్వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడం"
- "నెట్వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండకూడదు."
+ "నెట్వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి యాప్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండకూడదు."
"ఇన్పుట్ పరికరం క్రమాంకనాన్ని మార్చండి"
- "టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
+ "టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి యాప్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
"DRM ప్రమాణపత్రాలను యాక్సెస్ చేయడం"
- "DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
+ "DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
"Android Beam బదిలీ స్థితిని స్వీకరించడం"
- "ప్రస్తుత Android Beam బదిలీలకు సంబంధించిన సమాచారాన్ని స్వీకరించడానికి ఈ అనువర్తనాన్ని అనుమతిస్తుంది"
+ "ప్రస్తుత Android Beam బదిలీలకు సంబంధించిన సమాచారాన్ని స్వీకరించడానికి ఈ యాప్ను అనుమతిస్తుంది"
"DRM ప్రమాణపత్రాలను తీసివేయడం"
- "DRM ప్రమాణపత్రాలను తీసివేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
+ "DRM ప్రమాణపత్రాలను తీసివేయడానికి యాప్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
"క్యారియర్ సందేశ సేవకు అనుబంధించడం"
"క్యారియర్ సందేశ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
"క్యారియర్ సేవలకు అనుబంధించడం"
"క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."
"అంతరాయం కలిగించవద్దును యాక్సెస్ చేయడం"
- "అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి యాప్ను అనుమతిస్తుంది."
"వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి"
"యాప్నకు అనుమతి వినియోగాన్ని ప్రారంభించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ ఇటువంటి అనుమతి అవసరం ఉండదు."
"పాస్వర్డ్ నియమాలను సెట్ చేయండి"
@@ -1111,7 +1111,7 @@
"కొన్ని సిస్టమ్ కార్యాచరణలు పని చేయకపోవచ్చు"
"సిస్టమ్ కోసం తగినంత నిల్వ లేదు. మీకు 250MB ఖాళీ స్థలం ఉందని నిర్ధారించుకుని, పునఃప్రారంభించండి."
"%1$s అమలులో ఉంది"
- "మరింత సమాచారం కోసం లేదా అనువర్తనాన్ని ఆపివేయడం కోసం నొక్కండి."
+ "మరింత సమాచారం కోసం లేదా యాప్ను ఆపివేయడం కోసం నొక్కండి."
"సరే"
"రద్దు చేయి"
"సరే"
@@ -1142,28 +1142,28 @@
"దీన్ని ఉపయోగించి పంపండి"
"%1$sని ఉపయోగించి పంపండి"
"పంపు"
- "హోమ్ అనువర్తనాన్ని ఎంచుకోండి"
+ "హోమ్ యాప్ను ఎంచుకోండి"
"%1$sని హోమ్గా ఉపయోగించండి"
"చిత్రాన్ని క్యాప్చర్ చేయి"
"దీనితో చిత్రాన్ని క్యాప్చర్ చేయి"
"%1$sతో చిత్రాన్ని క్యాప్చర్ చేయండి"
"చిత్రాన్ని క్యాప్చర్ చేయి"
"ఈ చర్యకు డిఫాల్ట్గా ఉపయోగించండి."
- "వేరొక అనువర్తనాన్ని ఉపయోగించండి"
- "సిస్టమ్ సెట్టింగ్లు > అనువర్తనాలు > డౌన్లోడ్ చేయబడినవిలో డిఫాల్ట్ను క్లియర్ చేయి."
+ "వేరొక యాప్ను ఉపయోగించండి"
+ "సిస్టమ్ సెట్టింగ్లు > యాప్లు > డౌన్లోడ్ చేయబడినవిలో డిఫాల్ట్ను క్లియర్ చేయి."
"చర్యను ఎంచుకోండి"
"USB పరికరం కోసం యాప్ను ఎంచుకోండి"
- "ఈ చర్యను అమలు చేయగల అనువర్తనాలు ఏవీ లేవు."
+ "ఈ చర్యను అమలు చేయగల యాప్లు ఏవీ లేవు."
"%1$s ఆపివేయబడింది"
"%1$s ఆపివేయబడింది"
"%1$s పునరావృతంగా ఆపివేయబడుతోంది"
"%1$s పునరావృతంగా ఆపివేయబడుతోంది"
- "అనువర్తనాన్ని మళ్లీ తెరువు"
+ "యాప్ను మళ్లీ తెరువు"
"ఫీడ్బ్యాక్ను పంపు"
"మూసివేయి"
"పరికరం పునఃప్రారంభమయ్యే వరకు మ్యూట్ చేయి"
"వేచి ఉండండి"
- "అనువర్తనాన్ని మూసివేయి"
+ "యాప్ను మూసివేయి"
"%2$s ప్రతిస్పందించడం లేదు"
"%1$s ప్రతిస్పందించడం లేదు"
@@ -1178,7 +1178,7 @@
"%1$s వాస్తవంగా ప్రారంభించబడింది."
"ప్రమాణం"
"ఎల్లప్పుడూ చూపు"
- "సిస్టమ్ సెట్టింగ్లు > అనువర్తనాలు > డౌన్లోడ్ చేసినవిలో దీన్ని పునఃప్రారంభించండి."
+ "సిస్టమ్ సెట్టింగ్లు > యాప్లు > డౌన్లోడ్ చేసినవిలో దీన్ని పునఃప్రారంభించండి."
"%1$s ప్రస్తుత ప్రదర్శన పరిమాణ సెట్టింగ్కు మద్దతు ఇవ్వదు, దీని వలన ఊహించని సమస్యలు తలెత్తవచ్చు."
"ఎల్లప్పుడూ చూపు"
"Android OS యొక్క అననుకూల వెర్షన్ కోసం %1$s రూపొందించబడింది మరియు ఊహించని సమస్యలు తలెత్తవచ్చు. యాప్ యొక్క అప్డేట్ చేసిన వెర్షన్ అందుబాటులో ఉండవచ్చు."
@@ -1323,7 +1323,7 @@
"బగ్ నివేదికను తీస్తోంది…"
"బగ్ నివేదికను భాగస్వామ్యం చేయాలా?"
"బగ్ నివేదికను భాగస్వామ్యం చేస్తోంది..."
- "మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ నివేదికను అభ్యర్థించారు. అనువర్తనాలు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు."
+ "మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ నివేదికను అభ్యర్థించారు. యాప్లు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు."
"షేర్ చేయి"
"తిరస్కరిస్తున్నాను"
"ఇన్పుట్ పద్ధతిని ఎంచుకోండి"
@@ -1386,13 +1386,13 @@
"చొప్పించబడలేదు"
"సరిపోలే కార్యాచరణలు కనుగొనబడలేదు."
"మీడియా అవుట్పుట్ను మళ్లించడం"
- "మీడియా అవుట్పుట్ను ఇతర బాహ్య పరికరాలకు మళ్లించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "మీడియా అవుట్పుట్ను ఇతర బాహ్య పరికరాలకు మళ్లించడానికి యాప్ను అనుమతిస్తుంది."
"ఇన్స్టాల్ సెషన్లను చదవడం"
- "ఇన్స్టాల్ సెషన్లను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది సక్రియ ప్యాకేజీ ఇన్స్టాలేషన్ల గురించి వివరాలను చూడటానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "ఇన్స్టాల్ సెషన్లను చదవడానికి యాప్ను అనుమతిస్తుంది. ఇది సక్రియ ప్యాకేజీ ఇన్స్టాలేషన్ల గురించి వివరాలను చూడటానికి యాప్ను అనుమతిస్తుంది."
"ఇన్స్టాల్ ప్యాకేజీలను అభ్యర్థించడం"
- "ప్యాకేజీల ఇన్స్టాలేషన్ అభ్యర్థించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "ప్యాకేజీల ఇన్స్టాలేషన్ అభ్యర్థించడానికి యాప్ను అనుమతిస్తుంది."
"ప్యాకేజీలను తొలగించడానికి అభ్యర్థించు"
- "ప్యాకేజీల తొలగింపును అభ్యర్థించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."
+ "ప్యాకేజీల తొలగింపును అభ్యర్థించడానికి యాప్ను అనుమతిస్తుంది."
"బ్యాటరీ అనుకూలీకరణలను విస్మరించడానికి అడగాలి"
"ఆ యాప్ కోసం బ్యాటరీ అనుకూలీకరణలు విస్మరించేలా అనుమతి కోరడానికి యాప్ను అనుమతిస్తుంది."
"జూమ్ నియంత్రణ కోసం రెండుసార్లు నొక్కండి"
@@ -1413,8 +1413,8 @@
"తిరస్కరించండి"
"అనుమతి అభ్యర్థించబడింది"
"ఖాతా %s కోసం\nఅనుమతి అభ్యర్థించబడింది."
- "మీరు మీ కార్యాలయ ప్రొఫైల్కు వెలుపల ఈ అనువర్తనాన్ని ఉపయోగిస్తున్నారు"
- "మీరు మీ కార్యాలయ ప్రొఫైల్లో ఈ అనువర్తనాన్ని ఉపయోగిస్తున్నారు"
+ "మీరు మీ కార్యాలయ ప్రొఫైల్కు వెలుపల ఈ యాప్ను ఉపయోగిస్తున్నారు"
+ "మీరు మీ కార్యాలయ ప్రొఫైల్లో ఈ యాప్ను ఉపయోగిస్తున్నారు"
"ఇన్పుట్ పద్ధతి"
"సమకాలీకరణ"
"యాక్సెస్ సామర్థ్యం"
@@ -1661,9 +1661,9 @@
"ఫీచర్ల మధ్య మారడానికి, మూడు చేతి వేళ్ళతో పైకి స్వైప్ చేసి పట్టుకోండి."
"మాగ్నిఫికేషన్"
"ప్రస్తుత వినియోగదారు %1$s."
- "%1$sకి మారుస్తోంది…"
+ "%1$s యూజర్కు స్విచ్ అవుతోంది…"
"%1$sని లాగ్ అవుట్ చేస్తోంది…"
- "యజమాని"
+ "ఓనర్"
"ఎర్రర్"
"ఈ మార్పును మీ నిర్వాహకులు అనుమతించలేదు"
"ఈ చర్యను నిర్వహించడానికి యాప్ ఏదీ కనుగొనబడలేదు"
@@ -1894,7 +1894,7 @@
"ఈ యాప్ పాత వెర్షన్ Android కోసం రూపొందించబడింది మరియు అది సరిగ్గా పని చేయకపోవచ్చు. అప్డేట్ల కోసం తనిఖీ చేయడానికి ప్రయత్నించండి లేదా డెవలపర్ని సంప్రదించండి."
"అప్డేట్ కోసం తనిఖీ చేయండి"
"మీకు కొత్త సందేశాలు ఉన్నాయి"
- "వీక్షించడానికి SMS అనువర్తనాన్ని తెరవండి"
+ "వీక్షించడానికి SMS యాప్ను తెరవండి"
"కొంత ఫంక్షనాలిటీ పరిమితం కావచ్చు"
"కార్యాలయ ప్రొఫైల్ లాక్ అయింది"
"కార్యాలయ ప్రొఫైల్ అన్లాక్ చేయుటకు నొక్కండి"
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index f68ed31dabe1..0bd750f1aa33 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -220,7 +220,7 @@
"Naghahandang i-update…"
"Pinoproseso ang package ng update…"
"Nagre-restart…"
- "I-reset ang data ng factory"
+ "Pag-reset sa factory data"
"Nagre-restart…"
"Nagsa-shut down…"
"Mag-shut down ang iyong tablet."
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index c0266d6b3397..87d97599a9bb 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1663,7 +1663,7 @@
"Geçerli kullanıcı: %1$s."
"%1$s adlı kullanıcıya geçiliyor…"
"%1$s hesabından çıkış yapılıyor…"
- "Sahibi"
+ "Sahip"
"Hata"
"Yöneticiniz bu değişikliğe izin vermiyor"
"Bu eylemi gerçekleştirecek bir uygulama bulunamadı"
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index d69ac5499a3d..067045aa0860 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1705,7 +1705,7 @@
"Щоб переключитися між функціями, проведіть по екрану знизу вгору трьома пальцями й утримуйте їх."
"Збільшення"
"Поточний користувач: %1$s."
- "Перехід в обліковий запис \"%1$s\"…"
+ "Перехід у режим \"%1$s\"…"
"Вихід з облікового запису користувача %1$s…"
"Власник"
"Помилка"
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 2b83c8214bc7..e3ed7829f1ec 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1265,15 +1265,15 @@
"<b>%1$s</b> katta miqdordagi SMS xabarlarini jo‘natmoqda. Ushbu ilovaga xabarlar jo‘natishni davom ettirishga ruxsat berasizmi?"
"Ruxsat berish"
"Rad etish"
- "<b>%1$s</b> <b>%2$s</b>ga xabar jo‘natishni xohlaydi."
- "Bunda, mobil hisobingizdan ""to‘lov olinishi mumkin""."
- "Bunda, mobil hisobingizdan to‘lov olinishi mumkin."
+ "<b>%1$s</b> ilovasi <b>%2$s</b> raqamiga xabar yubormoqchi."
+ "Mobil aloqa hisobingizdan ""pul olinishi mumkin""."
+ "Mobil aloqa hisobingizdan pul olinishi mumkin."
"Yuborish"
"Bekor qilish"
"Tanlovim eslab qolinsin"
- "Siz buni keyinroq sozlamalar > ilovalar menusidan o‘zgartirishingiz mumkin"
- "Doimo ruxsat berilsin"
- "Hech qachon ruxsat berilmasin"
+ "Buni keyinroq Sozlamalar > Ilovalar menyusidan o‘zgartirishingiz mumkin"
+ "Doim ruxsat"
+ "Ruxsat berilmasin"
"SIM karta olib tashlandi"
"Ishlaydigan SIM kartani qo‘yib, qurilmangizni qaytadan ishga tushirmasangiz, mobayl tarmoq mavjud bo‘lmaydi."
"Tayyor"
@@ -1397,7 +1397,7 @@
"Ilovaga batareya quvvatidan xohlagancha foydalanish uchun ruxsat so‘rashga imkon beradi."
"Ko‘lamini o‘zgartirish uchun ikki marta bosing"
"Vidjet qo‘shilmadi."
- "O‘tish"
+ "Tanlash"
"Qidirish"
"Yuborish"
"Keyingisi"
@@ -1661,7 +1661,7 @@
"Funksiyalarni almashtirish uchun uchta barmoq bilan tepaga suring va ushlab turing."
"Kattalashtirish"
"Joriy foydalanuvchi %1$s."
- "Quyidagi foydalanuvchiga o‘tilmoqda: %1$s…"
+ "Bunga almashilmoqda: %1$s"
"%1$s hisobidan chiqilmoqda…"
"Egasi"
"Xato"
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index bf7fbca64581..8e0cc2ead613 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -967,7 +967,7 @@
"Nhớ"
"Chưa bao giờ"
"Bạn không được phép mở trang này."
- "Đã sao chép văn bản vào khay nhớ tạm thời."
+ "Đã sao chép văn bản vào bảng nhớ tạm thời."
"Đã sao chép"
"Thêm"
"Trình đơn+"
@@ -1092,7 +1092,7 @@
"Chọn tất cả"
"Cắt"
"Sao chép"
- "Không sao chép được vào khay nhớ tạm"
+ "Không sao chép được vào bảng nhớ tạm"
"Dán"
"Dán dưới dạng văn bản thuần túy"
"Thay thế..."
@@ -2029,7 +2029,7 @@
- %s + %d tệp
- %s + %d tệp
- "Không có gợi ý về người để chia sẻ"
+ "Không có gợi ý nào về người mà bạn có thể chia sẻ"
"Danh sách ứng dụng"
"Ứ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."
"Màn hình chính"
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index cb61121b64e0..9eef703670ef 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -423,8 +423,8 @@
"允許應用程式存取額外的位置提供者指令。這項設定可能會使應用程式干擾 GPS 或其他位置來源的運作。"
"只在前景存取精確位置"
"使用此應用程式時,應用程式可透過定位服務獲取您的精確位置。您的裝置必須開啟定位服務,才能讓應用程式獲取位置。這可能會增加電池用量。"
- "只在前景存取大概位置"
- "使用此應用程式時,應用程式可透過定位服務獲取您的大概位置。您的裝置必須開啟定位服務,才能讓應用程式獲取位置。"
+ "只在前景存取概略位置"
+ "使用此應用程式時,應用程式可透過定位服務獲取您的概略位置。您的裝置必須開啟定位服務,才能讓應用程式獲取位置。"
"在背景存取位置資訊"
"即使您不使用此應用程式,它仍可隨時存取位置。"
"更改音效設定"
@@ -1901,7 +1901,7 @@
"已連線至 %1$s"
"輕按即可查看檔案"
"固定"
- "將%1$s置頂"
+ "固定「%1$s」"
"取消固定"
"取消將%1$s置頂"
"應用程式資料"
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 4d2d86ad9856..c4f5dc8d3661 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -2000,7 +2000,7 @@
"日常安排模式資訊通知"
"電池電力可能會在你平常的充電時間前耗盡"
"已啟用省電模式以延長電池續航力"
- "省電模式"
+ "節約耗電量"
"省電模式已關閉"
"手機電力充足,各項功能不再受到限制。"
"平板電腦電力充足,各項功能不再受到限制。"
diff --git a/core/res/res/values/attrs_car.xml b/core/res/res/values/attrs_car.xml
new file mode 100644
index 000000000000..6bfea9728b69
--- /dev/null
+++ b/core/res/res/values/attrs_car.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp
index 3c990abaec87..dc892080417d 100644
--- a/data/etc/car/Android.bp
+++ b/data/etc/car/Android.bp
@@ -128,13 +128,6 @@ prebuilt_etc {
filename_from_src: true,
}
-prebuilt_etc {
- name: "privapp_whitelist_com.android.car.companiondevicesupport",
- sub_dir: "permissions",
- src: "com.android.car.companiondevicesupport.xml",
- filename_from_src: true,
-}
-
prebuilt_etc {
name: "privapp_whitelist_com.google.android.car.kitchensink",
sub_dir: "permissions",
@@ -151,22 +144,29 @@ prebuilt_etc {
}
prebuilt_etc {
- name: "privapp_whitelist_com.android.car.floatingcardslauncher",
+ name: "privapp_whitelist_com.android.car.ui.paintbooth",
sub_dir: "permissions",
- src: "com.android.car.floatingcardslauncher.xml",
+ src: "com.android.car.ui.paintbooth.xml",
filename_from_src: true,
}
prebuilt_etc {
- name: "privapp_whitelist_com.android.car.ui.paintbooth",
+ name: "allowed_privapp_com.android.carshell",
sub_dir: "permissions",
- src: "com.android.car.ui.paintbooth.xml",
+ src: "com.android.car.shell.xml",
filename_from_src: true,
}
prebuilt_etc {
- name: "allowed_privapp_com.android.carshell",
+ name: "allowed_privapp_com.android.car.activityresolver",
sub_dir: "permissions",
- src: "com.android.car.shell.xml",
+ src: "com.android.car.activityresolver.xml",
+ filename_from_src: true,
+}
+
+prebuilt_etc {
+ name: "allowed_privapp_com.android.car.rotary",
+ sub_dir: "permissions",
+ src: "com.android.car.rotary.xml",
filename_from_src: true,
}
diff --git a/data/etc/car/com.android.car.floatingcardslauncher.xml b/data/etc/car/com.android.car.activityresolver.xml
similarity index 59%
rename from data/etc/car/com.android.car.floatingcardslauncher.xml
rename to data/etc/car/com.android.car.activityresolver.xml
index 2755fee4eb55..63f83b4afb62 100644
--- a/data/etc/car/com.android.car.floatingcardslauncher.xml
+++ b/data/etc/car/com.android.car.activityresolver.xml
@@ -1,6 +1,6 @@
-
-
-
+
-
-
-
+
diff --git a/data/etc/car/com.android.car.companiondevicesupport.xml b/data/etc/car/com.android.car.rotary.xml
similarity index 59%
rename from data/etc/car/com.android.car.companiondevicesupport.xml
rename to data/etc/car/com.android.car.rotary.xml
index 2067bab20d3d..575275507ea5 100644
--- a/data/etc/car/com.android.car.companiondevicesupport.xml
+++ b/data/etc/car/com.android.car.rotary.xml
@@ -1,6 +1,6 @@
-
-
-
-
-
+
+
+
diff --git a/data/etc/car/com.android.car.shell.xml b/data/etc/car/com.android.car.shell.xml
index 32666c8d9f68..6132d53b4651 100644
--- a/data/etc/car/com.android.car.shell.xml
+++ b/data/etc/car/com.android.car.shell.xml
@@ -15,7 +15,9 @@
~ limitations under the License
-->
-
+
+
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
index d67cf8c9c73f..5ff8fbc05e95 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
@@ -301,7 +301,8 @@ void SkiaRecordingCanvas::drawNinePatch(Bitmap& bitmap, const Res_png_9patch& ch
}
sk_sp image = bitmap.makeImage();
- applyLooper(get_looper(paint), *filterBitmap(paint), [&](SkScalar x, SkScalar y, const SkPaint& p) {
+ applyLooper(get_looper(paint), *filterBitmap(*filteredPaint), [&](SkScalar x, SkScalar y,
+ const SkPaint& p) {
mRecorder.drawImageLattice(image, lattice, dst.makeOffset(x, y), &p, bitmap.palette());
});
diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
index 67a040dba3e7..a3765151a6f7 100644
--- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
+++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
@@ -51,9 +51,6 @@ public class GpsNetInitiatedHandler {
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- // NI verify activity for bringing up UI (not used yet)
- public static final String ACTION_NI_VERIFY = "android.intent.action.NETWORK_INITIATED_VERIFY";
-
// string constants for defining data fields in NI Intent
public static final String NI_INTENT_KEY_NOTIF_ID = "notif_id";
public static final String NI_INTENT_KEY_TITLE = "title";
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index 6fa378724240..cd68a1d8eb1a 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -361,7 +361,12 @@ public void setRouterGroupId(String groupId) {
}
public Display[] getAllPresentationDisplays() {
- return mDisplayService.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
+ try {
+ return mDisplayService.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
+ } catch (RuntimeException ex) {
+ Log.e(TAG, "Unable to get displays.", ex);
+ return null;
+ }
}
private void updatePresentationDisplays(int changedDisplayId) {
@@ -2075,6 +2080,9 @@ boolean updatePresentationDisplay() {
private Display choosePresentationDisplay() {
if ((mSupportedTypes & ROUTE_TYPE_LIVE_VIDEO) != 0) {
Display[] displays = sStatic.getAllPresentationDisplays();
+ if (displays == null || displays.length == 0) {
+ return null;
+ }
// Ensure that the specified display is valid for presentations.
// This check will normally disallow the default display unless it was
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java
index fcd2b9aa1919..60e7d0f91de9 100755
--- a/media/java/android/mtp/MtpDatabase.java
+++ b/media/java/android/mtp/MtpDatabase.java
@@ -19,8 +19,7 @@
import android.annotation.NonNull;
import android.content.BroadcastReceiver;
import android.content.ContentProviderClient;
-import android.content.ContentUris;
-import android.content.ContentValues;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -32,7 +31,6 @@
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.BatteryManager;
-import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.storage.StorageVolume;
import android.provider.MediaStore;
@@ -103,8 +101,6 @@ public class MtpDatabase implements AutoCloseable {
private MtpStorageManager mManager;
private static final String PATH_WHERE = Files.FileColumns.DATA + "=?";
- private static final String[] ID_PROJECTION = new String[] {Files.FileColumns._ID};
- private static final String[] PATH_PROJECTION = new String[] {Files.FileColumns.DATA};
private static final String NO_MEDIA = ".nomedia";
static {
@@ -433,7 +429,7 @@ private void endSendObject(int handle, boolean succeeded) {
}
// Add the new file to MediaProvider
if (succeeded) {
- MediaStore.scanFile(mContext.getContentResolver(), obj.getPath().toFile());
+ updateMediaStore(mContext, obj.getPath().toFile());
}
}
@@ -582,32 +578,8 @@ private int renameFile(int handle, String newName) {
return MtpConstants.RESPONSE_GENERAL_ERROR;
}
- // finally update MediaProvider
- ContentValues values = new ContentValues();
- values.put(Files.FileColumns.DATA, newPath.toString());
- String[] whereArgs = new String[]{oldPath.toString()};
- try {
- // note - we are relying on a special case in MediaProvider.update() to update
- // the paths for all children in the case where this is a directory.
- final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName());
- mMediaProvider.update(objectsUri, values, PATH_WHERE, whereArgs);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException in mMediaProvider.update", e);
- }
-
- // check if nomedia status changed
- if (obj.isDir()) {
- // for directories, check if renamed from something hidden to something non-hidden
- if (oldPath.getFileName().startsWith(".") && !newPath.startsWith(".")) {
- MediaStore.scanFile(mContext.getContentResolver(), newPath.toFile());
- }
- } else {
- // for files, check if renamed from .nomedia to something else
- if (oldPath.getFileName().toString().toLowerCase(Locale.US).equals(NO_MEDIA)
- && !newPath.getFileName().toString().toLowerCase(Locale.US).equals(NO_MEDIA)) {
- MediaStore.scanFile(mContext.getContentResolver(), newPath.getParent().toFile());
- }
- }
+ updateMediaStore(mContext, oldPath.toFile());
+ updateMediaStore(mContext, newPath.toFile());
return MtpConstants.RESPONSE_OK;
}
@@ -637,48 +609,15 @@ private void endMoveObject(int oldParent, int newParent, int oldStorage, int new
Log.e(TAG, "Failed to end move object");
return;
}
-
obj = mManager.getObject(objId);
if (!success || obj == null)
return;
- // Get parent info from MediaProvider, since the id is different from MTP's
- ContentValues values = new ContentValues();
+
Path path = newParentObj.getPath().resolve(name);
Path oldPath = oldParentObj.getPath().resolve(name);
- values.put(Files.FileColumns.DATA, path.toString());
- if (obj.getParent().isRoot()) {
- values.put(Files.FileColumns.PARENT, 0);
- } else {
- int parentId = findInMedia(newParentObj, path.getParent());
- if (parentId != -1) {
- values.put(Files.FileColumns.PARENT, parentId);
- } else {
- // The new parent isn't in MediaProvider, so delete the object instead
- deleteFromMedia(obj, oldPath, obj.isDir());
- return;
- }
- }
- // update MediaProvider
- Cursor c = null;
- String[] whereArgs = new String[]{oldPath.toString()};
- try {
- int parentId = -1;
- if (!oldParentObj.isRoot()) {
- parentId = findInMedia(oldParentObj, oldPath.getParent());
- }
- if (oldParentObj.isRoot() || parentId != -1) {
- // Old parent exists in MediaProvider - perform a move
- // note - we are relying on a special case in MediaProvider.update() to update
- // the paths for all children in the case where this is a directory.
- final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName());
- mMediaProvider.update(objectsUri, values, PATH_WHERE, whereArgs);
- } else {
- // Old parent doesn't exist - add the object
- MediaStore.scanFile(mContext.getContentResolver(), path.toFile());
- }
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException in mMediaProvider.update", e);
- }
+
+ updateMediaStore(mContext, oldPath.toFile());
+ updateMediaStore(mContext, path.toFile());
}
@VisibleForNative
@@ -701,7 +640,19 @@ private void endCopyObject(int handle, boolean success) {
if (!success) {
return;
}
- MediaStore.scanFile(mContext.getContentResolver(), obj.getPath().toFile());
+
+ updateMediaStore(mContext, obj.getPath().toFile());
+ }
+
+ private static void updateMediaStore(@NonNull Context context, @NonNull File file) {
+ final ContentResolver resolver = context.getContentResolver();
+ // For file, check whether the file name is .nomedia or not.
+ // If yes, scan the parent directory to update all files in the directory.
+ if (!file.isDirectory() && file.getName().toLowerCase(Locale.ROOT).endsWith(NO_MEDIA)) {
+ MediaStore.scanFile(resolver, file.getParentFile());
+ } else {
+ MediaStore.scanFile(resolver, file);
+ }
}
@VisibleForNative
@@ -930,26 +881,6 @@ private void endDeleteObject(int handle, boolean success) {
deleteFromMedia(obj, obj.getPath(), obj.isDir());
}
- private int findInMedia(MtpStorageManager.MtpObject obj, Path path) {
- final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName());
-
- int ret = -1;
- Cursor c = null;
- try {
- c = mMediaProvider.query(objectsUri, ID_PROJECTION, PATH_WHERE,
- new String[]{path.toString()}, null, null);
- if (c != null && c.moveToNext()) {
- ret = c.getInt(0);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Error finding " + path + " in MediaProvider");
- } finally {
- if (c != null)
- c.close();
- }
- return ret;
- }
-
private void deleteFromMedia(MtpStorageManager.MtpObject obj, Path path, boolean isDir) {
final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName());
try {
@@ -965,13 +896,10 @@ private void deleteFromMedia(MtpStorageManager.MtpObject obj, Path path, boolean
}
String[] whereArgs = new String[]{path.toString()};
- if (mMediaProvider.delete(objectsUri, PATH_WHERE, whereArgs) > 0) {
- if (!isDir && path.toString().toLowerCase(Locale.US).endsWith(NO_MEDIA)) {
- MediaStore.scanFile(mContext.getContentResolver(), path.getParent().toFile());
- }
- } else {
- Log.i(TAG, "Mediaprovider didn't delete " + path);
+ if (mMediaProvider.delete(objectsUri, PATH_WHERE, whereArgs) == 0) {
+ Log.i(TAG, "MediaProvider didn't delete " + path);
}
+ updateMediaStore(mContext, path.toFile());
} catch (Exception e) {
Log.d(TAG, "Failed to delete " + path + " from MediaProvider");
}
diff --git a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml
index 5746102f5f27..f82551b45abe 100644
--- a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml
+++ b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml
@@ -60,6 +60,7 @@
android:layout_width="@dimen/keyguard_security_width"
android:layout_height="@dimen/pin_entry_height"
android:gravity="center"
+ android:focusedByDefault="true"
app:scaledTextSize="@integer/password_text_view_scale"
android:contentDescription="@string/keyguard_accessibility_pin_area" />
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml
index 3e35df9d9b0c..f617ec06ae52 100644
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml
+++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml
@@ -14,10 +14,7 @@
~ limitations under the License.
-->
-
-
diff --git a/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml b/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml
index 8306cb4a708a..c5974e3c7167 100644
--- a/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml
+++ b/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml
@@ -66,7 +66,6 @@
android:src="@drawable/ic_backspace"
android:clickable="true"
android:tint="@android:color/white"
- android:background="@drawable/ripple_drawable"
android:contentDescription="@string/keyboardview_keycode_delete" />
diff --git a/packages/CarSystemUI/res-keyguard/values/dimens.xml b/packages/CarSystemUI/res-keyguard/values/dimens.xml
index 8dfe1716ef54..3c139586c2cc 100644
--- a/packages/CarSystemUI/res-keyguard/values/dimens.xml
+++ b/packages/CarSystemUI/res-keyguard/values/dimens.xml
@@ -17,10 +17,8 @@
112dp
144dp
- 80dp
+ 120dp
80dp
- @*android:dimen/car_padding_5
- @*android:dimen/car_padding_5
@dimen/num_pad_key_height
1dp
128dp
diff --git a/packages/CarSystemUI/res-keyguard/values/styles.xml b/packages/CarSystemUI/res-keyguard/values/styles.xml
index ecea30a13ced..ca37428a9fd9 100644
--- a/packages/CarSystemUI/res-keyguard/values/styles.xml
+++ b/packages/CarSystemUI/res-keyguard/values/styles.xml
@@ -23,12 +23,11 @@
- @dimen/num_pad_key_width
- @dimen/num_pad_key_height
- @dimen/num_pad_key_margin_bottom
+ - ?android:attr/selectableItemBackground
- @id/pinEntry
diff --git a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml
index 534c51e0febe..f987b5a650bc 100644
--- a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml
+++ b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml
@@ -14,18 +14,18 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
-
-
+
-
-
+
+
diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
index cdc29eec21cd..cb1aadaf7fe7 100644
--- a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
+++ b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
@@ -77,8 +77,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null"
- systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivities$QuickSettingActivity;launchFlags=0x24000000;end"
- />
+ android:focusedByDefault="true"
+ systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivities$QuickSettingActivity;launchFlags=0x24000000;end"/>
+ android:background="@null"
+ android:focusedByDefault="true"/>
+ app:layout_constraintTop_toTopOf="parent"
+ app:shouldRestoreFocus="false"/>
-
-
-
-
-
+ app:layout_constraintTop_toTopOf="parent"/>
diff --git a/packages/CarSystemUI/res/layout/notification_panel_container.xml b/packages/CarSystemUI/res/layout/notification_panel_container.xml
index 3b53c6aaeac3..de69769b2bb0 100644
--- a/packages/CarSystemUI/res/layout/notification_panel_container.xml
+++ b/packages/CarSystemUI/res/layout/notification_panel_container.xml
@@ -14,7 +14,7 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-
+
+
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/notification_panel_container"
+ android:layout_marginBottom="@dimen/car_bottom_navigation_bar_height"/>
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/keyguard_container" />
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/car_fullscreen_user_switcher"/>
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/car_user_switching_dialog"/>
\ No newline at end of file
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
index ec018f9bb62e..8fe59d07f9d2 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
@@ -147,6 +147,11 @@ public CarKeyguardViewController(
registerUserSwitchedListener();
}
+ @Override
+ protected int getFocusAreaViewId() {
+ return R.id.keyguard_container;
+ }
+
@Override
protected boolean shouldShowNavigationBarInsets() {
return true;
@@ -233,9 +238,6 @@ public void onFinishedGoingToSleep() {
public void setOccluded(boolean occluded, boolean animate) {
mIsOccluded = occluded;
getOverlayViewGlobalStateController().setOccluded(occluded);
- if (!occluded) {
- reset(/* hideBouncerWhenShowing= */ false);
- }
}
@Override
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
index fd804c71c9d0..3d79b06ca325 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
@@ -28,6 +28,7 @@
import android.os.RemoteException;
import android.util.Log;
import android.view.GestureDetector;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -165,6 +166,10 @@ public NotificationPanelViewController(
mEnableHeadsUpNotificationWhenNotificationShadeOpen = mResources.getBoolean(
com.android.car.notification.R.bool
.config_enableHeadsUpNotificationWhenNotificationShadeOpen);
+
+ // Inflate view on instantiation to properly initialize listeners even if panel has
+ // not been opened.
+ getOverlayViewGlobalStateController().inflateView(this);
}
// CommandQueue.Callbacks
@@ -217,6 +222,11 @@ protected void hideInternal() {
mNotificationVisibilityLogger.stop();
}
+ @Override
+ protected int getFocusAreaViewId() {
+ return R.id.notification_container;
+ }
+
@Override
protected boolean shouldShowNavigationBarInsets() {
return true;
@@ -239,12 +249,26 @@ protected boolean shouldShowHUN() {
/** Reinflates the view. */
public void reinflate() {
+ // Do not reinflate the view if it has not been inflated at all.
+ if (!isInflated()) return;
+
ViewGroup container = (ViewGroup) getLayout();
container.removeView(mNotificationView);
mNotificationView = (CarNotificationView) LayoutInflater.from(mContext).inflate(
R.layout.notification_center_activity, container,
/* attachToRoot= */ false);
+ mNotificationView.setKeyEventHandler(
+ event -> {
+ if (event.getKeyCode() != KeyEvent.KEYCODE_BACK) {
+ return false;
+ }
+
+ if (event.getAction() == KeyEvent.ACTION_UP && isPanelExpanded()) {
+ toggle();
+ }
+ return true;
+ });
container.addView(mNotificationView);
onNotificationViewInflated();
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
index aac4cfbf83c4..dd59efa7b0b2 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
@@ -22,6 +22,7 @@
import android.car.user.CarUserManager;
import android.content.Context;
import android.content.res.Resources;
+import android.view.KeyEvent;
import android.view.View;
import androidx.recyclerview.widget.GridLayoutManager;
@@ -67,6 +68,19 @@ public FullScreenUserSwitcherViewController(
@Override
protected void onFinishInflate() {
+ // Intercept back button.
+ UserSwitcherContainer container = getLayout().findViewById(R.id.container);
+ container.setKeyEventHandler(event -> {
+ if (event.getKeyCode() != KeyEvent.KEYCODE_BACK) {
+ return false;
+ }
+
+ if (event.getAction() == KeyEvent.ACTION_UP && getLayout().isVisibleToUser()) {
+ stop();
+ }
+ return true;
+ });
+
// Initialize user grid.
mUserGridView = getLayout().findViewById(R.id.user_grid);
GridLayoutManager layoutManager = new GridLayoutManager(mContext,
@@ -77,9 +91,14 @@ protected void onFinishInflate() {
registerCarUserManagerIfPossible();
}
+ @Override
+ protected int getFocusAreaViewId() {
+ return R.id.user_switcher_container;
+ }
+
@Override
protected boolean shouldFocusWindow() {
- return false;
+ return true;
}
@Override
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitcherContainer.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitcherContainer.java
new file mode 100644
index 000000000000..5b6271107380
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitcherContainer.java
@@ -0,0 +1,73 @@
+/*
+ * 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.car.userswitcher;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.widget.LinearLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/** Container for the user switcher which intercepts the key events. */
+public class UserSwitcherContainer extends LinearLayout {
+
+ private KeyEventHandler mKeyEventHandler;
+
+ public UserSwitcherContainer(@NonNull Context context) {
+ super(context);
+ }
+
+ public UserSwitcherContainer(@NonNull Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public UserSwitcherContainer(@NonNull Context context, @Nullable AttributeSet attrs,
+ int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public UserSwitcherContainer(@NonNull Context context, @Nullable AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ if (super.dispatchKeyEvent(event)) {
+ return true;
+ }
+
+ if (mKeyEventHandler != null) {
+ return mKeyEventHandler.dispatchKeyEvent(event);
+ }
+
+ return false;
+ }
+
+ /** Sets a {@link KeyEventHandler} to help interact with the notification panel. */
+ public void setKeyEventHandler(KeyEventHandler keyEventHandler) {
+ mKeyEventHandler = keyEventHandler;
+ }
+
+ /** An interface to help interact with the notification panel. */
+ public interface KeyEventHandler {
+ /** Allows handling of a {@link KeyEvent} if it wasn't already handled by the superclass. */
+ boolean dispatchKeyEvent(KeyEvent event);
+ }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
index 8adc1adcc41c..7bc17765d9fc 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
@@ -17,12 +17,17 @@
package com.android.systemui.car.window;
import static android.view.WindowInsets.Type.statusBars;
+import static android.view.accessibility.AccessibilityNodeInfo.ACTION_FOCUS;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.view.WindowInsets;
+import androidx.annotation.IdRes;
+
+import com.android.car.ui.FocusArea;
+
/**
* Owns a {@link View} that is present in SystemUIOverlayWindow.
*/
@@ -128,6 +133,66 @@ protected final OverlayViewGlobalStateController getOverlayViewGlobalStateContro
return mOverlayViewGlobalStateController;
}
+ /** Returns whether the view controlled by this controller is visible. */
+ public final boolean isVisible() {
+ return mLayout.getVisibility() == View.VISIBLE;
+ }
+
+ /**
+ * Returns the ID of the focus area that should receive focus when this view is the
+ * topmost view or {@link View#NO_ID} if there is no focus area.
+ */
+ @IdRes
+ protected int getFocusAreaViewId() {
+ return View.NO_ID;
+ }
+
+ /** Returns whether the view controlled by this controller has rotary focus. */
+ protected final boolean hasRotaryFocus() {
+ return !mLayout.isInTouchMode() && mLayout.hasFocus();
+ }
+
+ /**
+ * Sets whether this view allows rotary focus. This should be set to {@code true} for the
+ * topmost layer in the overlay window and {@code false} for the others.
+ */
+ public void setAllowRotaryFocus(boolean allowRotaryFocus) {
+ if (!isInflated()) {
+ return;
+ }
+
+ if (!(mLayout instanceof ViewGroup)) {
+ return;
+ }
+
+ ViewGroup viewGroup = (ViewGroup) mLayout;
+ viewGroup.setDescendantFocusability(allowRotaryFocus
+ ? ViewGroup.FOCUS_BEFORE_DESCENDANTS
+ : ViewGroup.FOCUS_BLOCK_DESCENDANTS);
+ }
+
+ /**
+ * Refreshes the rotary focus in this view if we are in rotary mode. If the view already has
+ * rotary focus, it leaves the focus alone. Returns {@code true} if a new view was focused.
+ */
+ public boolean refreshRotaryFocusIfNeeded() {
+ if (mLayout.isInTouchMode()) {
+ return false;
+ }
+
+ if (hasRotaryFocus()) {
+ return false;
+ }
+
+ View view = mLayout.findViewById(getFocusAreaViewId());
+ if (view == null || !(view instanceof FocusArea)) {
+ return mLayout.requestFocus();
+ }
+
+ FocusArea focusArea = (FocusArea) view;
+ return focusArea.performAccessibilityAction(ACTION_FOCUS, /* arguments= */ null);
+ }
+
/**
* Returns {@code true} if heads up notifications should be displayed over this view.
*/
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
index 55f0975aeccf..204dde7e87b7 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
@@ -29,6 +29,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
@@ -120,6 +121,7 @@ public void showView(OverlayViewController viewController, @Nullable Runnable sh
refreshWindowFocus();
refreshNavigationBarVisibility();
refreshStatusBarVisibility();
+ refreshRotaryFocusIfNeeded();
Log.d(TAG, "Content shown: " + viewController.getClass().getName());
debugLog();
@@ -193,6 +195,7 @@ public void hideView(OverlayViewController viewController, @Nullable Runnable hi
refreshWindowFocus();
refreshNavigationBarVisibility();
refreshStatusBarVisibility();
+ refreshRotaryFocusIfNeeded();
if (mZOrderVisibleSortedMap.isEmpty()) {
setWindowVisible(false);
@@ -254,6 +257,17 @@ private void refreshInsetTypesToFit() {
}
}
+ private void refreshRotaryFocusIfNeeded() {
+ for (OverlayViewController controller : mZOrderVisibleSortedMap.values()) {
+ boolean isTop = Objects.equals(controller, mHighestZOrder);
+ controller.setAllowRotaryFocus(isTop);
+ }
+
+ if (!mZOrderVisibleSortedMap.isEmpty()) {
+ mHighestZOrder.refreshRotaryFocusIfNeeded();
+ }
+ }
+
/** Returns {@code true} is the window is visible. */
public boolean isWindowVisible() {
return mSystemUIOverlayWindowController.isWindowVisible();
diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java
index c9ec34fd5f08..c0b5c50b288c 100644
--- a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java
@@ -16,14 +16,15 @@
package com.android.systemui.wm;
+import android.content.Context;
import android.os.Handler;
import android.os.RemoteException;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import android.view.IDisplayWindowInsetsController;
+import android.view.IWindowManager;
import android.view.InsetsController;
-import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.WindowInsets;
@@ -48,30 +49,32 @@ public class DisplaySystemBarsController extends DisplayImeController {
private static final String TAG = "DisplaySystemBarsController";
+ private final Context mContext;
+ private final Handler mHandler;
+
private SparseArray mPerDisplaySparseArray;
@Inject
public DisplaySystemBarsController(
- SystemWindows syswin,
+ Context context,
+ IWindowManager wmService,
DisplayController displayController,
@Main Handler mainHandler,
TransactionPool transactionPool) {
- super(syswin, displayController, mainHandler, transactionPool);
+ super(wmService, displayController, mainHandler::post, transactionPool);
+ mContext = context;
+ mHandler = mainHandler;
}
@Override
public void onDisplayAdded(int displayId) {
PerDisplay pd = new PerDisplay(displayId);
- try {
- mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, pd);
- } catch (RemoteException e) {
- Slog.w(TAG, "Unable to set insets controller on display " + displayId);
- }
+ pd.register();
// Lazy loading policy control filters instead of during boot.
if (mPerDisplaySparseArray == null) {
mPerDisplaySparseArray = new SparseArray<>();
- BarControlPolicy.reloadFromSetting(mSystemWindows.mContext);
- BarControlPolicy.registerContentObserver(mSystemWindows.mContext, mHandler, () -> {
+ BarControlPolicy.reloadFromSetting(mContext);
+ BarControlPolicy.registerContentObserver(mContext, mHandler, () -> {
int size = mPerDisplaySparseArray.size();
for (int i = 0; i < size; i++) {
mPerDisplaySparseArray.valueAt(i).modifyDisplayWindowInsets();
@@ -84,7 +87,7 @@ public void onDisplayAdded(int displayId) {
@Override
public void onDisplayRemoved(int displayId) {
try {
- mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, null);
+ mWmService.setDisplayWindowInsetsController(displayId, null);
} catch (RemoteException e) {
Slog.w(TAG, "Unable to remove insets controller on display " + displayId);
}
@@ -100,11 +103,10 @@ class PerDisplay extends DisplayImeController.PerDisplay {
String mPackageName;
PerDisplay(int displayId) {
- super(displayId,
- mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation());
+ super(displayId, mDisplayController.getDisplayLayout(displayId).rotation());
mDisplayId = displayId;
mInsetsController = new InsetsController(
- new DisplaySystemBarsInsetsControllerHost(mHandler, this));
+ new DisplaySystemBarsInsetsControllerHost(mHandler, mInsetsControllerImpl));
}
@Override
@@ -120,13 +122,6 @@ public void insetsChanged(InsetsState insetsState) {
}
}
- @Override
- public void insetsControlChanged(InsetsState insetsState,
- InsetsSourceControl[] activeControls) {
- super.insetsControlChanged(insetsState, activeControls);
- mInsetsController.onControlsChanged(activeControls);
- }
-
@Override
public void hideInsets(@WindowInsets.Type.InsetsType int types, boolean fromIme) {
if ((types & WindowInsets.Type.ime()) == 0) {
@@ -166,7 +161,7 @@ private void modifyDisplayWindowInsets() {
showInsets(barVisibilities[0], /* fromIme= */ false);
hideInsets(barVisibilities[1], /* fromIme= */ false);
try {
- mSystemWindows.mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState);
+ mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState);
} catch (RemoteException e) {
Slog.w(TAG, "Unable to update window manager service.");
}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
index 294aa0d3cf9b..d97b2329350f 100644
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
@@ -214,6 +214,16 @@ public void showView_nothingAlreadyShown_windowIsSetVisible() {
verify(mSystemUIOverlayWindowController).setWindowVisible(true);
}
+ @Test
+ public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() {
+ setupOverlayViewController1();
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
+
+ assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey(
+ OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue();
+ }
+
@Test
public void showView_nothingAlreadyShown_newHighestZOrder() {
setupOverlayViewController1();
@@ -225,13 +235,12 @@ public void showView_nothingAlreadyShown_newHighestZOrder() {
}
@Test
- public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() {
+ public void showView_nothingAlreadyShown_descendantsFocusable() {
setupOverlayViewController1();
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
- assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey(
- OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue();
+ verify(mOverlayViewController1).setAllowRotaryFocus(true);
}
@Test
@@ -331,6 +340,30 @@ public void showView_newHighestZOrder_correctViewsShown() {
OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray());
}
+ @Test
+ public void showView_newHighestZOrder_topDescendantsFocusable() {
+ setupOverlayViewController1();
+ setOverlayViewControllerAsShowing(mOverlayViewController1);
+ setupOverlayViewController2();
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
+
+ verify(mOverlayViewController1).setAllowRotaryFocus(false);
+ verify(mOverlayViewController2).setAllowRotaryFocus(true);
+ }
+
+ @Test
+ public void showView_newHighestZOrder_refreshTopFocus() {
+ setupOverlayViewController1();
+ setOverlayViewControllerAsShowing(mOverlayViewController1);
+ setupOverlayViewController2();
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
+
+ verify(mOverlayViewController1, never()).refreshRotaryFocusIfNeeded();
+ verify(mOverlayViewController2).refreshRotaryFocusIfNeeded();
+ }
+
@Test
public void showView_oldHighestZOrder() {
setupOverlayViewController2();
@@ -345,9 +378,9 @@ public void showView_oldHighestZOrder() {
@Test
public void showView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarsHidden() {
setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
- setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true);
when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -360,11 +393,12 @@ public void showView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarsHidden
@Test
public void showView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarsShown() {
setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
- setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false);
when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true);
+ reset(mWindowInsetsController);
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
@@ -374,9 +408,9 @@ public void showView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarsShown()
@Test
public void showView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarsHidden() {
setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
- setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true);
when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -389,11 +423,12 @@ public void showView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarsHidden(
@Test
public void showView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarsShown() {
setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
- setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false);
when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true);
+ reset(mWindowInsetsController);
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
@@ -425,6 +460,30 @@ public void showView_oldHighestZOrder_correctViewsShown() {
OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray());
}
+ @Test
+ public void showView_oldHighestZOrder_topDescendantsFocusable() {
+ setupOverlayViewController1();
+ setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
+
+ verify(mOverlayViewController1).setAllowRotaryFocus(false);
+ verify(mOverlayViewController2).setAllowRotaryFocus(true);
+ }
+
+ @Test
+ public void showView_oldHighestZOrder_refreshTopFocus() {
+ setupOverlayViewController1();
+ setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
+
+ verify(mOverlayViewController1, never()).refreshRotaryFocusIfNeeded();
+ verify(mOverlayViewController2).refreshRotaryFocusIfNeeded();
+ }
+
@Test
public void showView_somethingAlreadyShown_windowVisibleNotCalled() {
setupOverlayViewController1();
@@ -577,10 +636,10 @@ public void hideView_newHighestZOrder_threeViewsShown() {
public void hideView_newHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -593,10 +652,10 @@ public void hideView_newHighestZOrder_shouldShowNavBarFalse_navigationBarHidden(
public void hideView_newHighestZOrder_shouldShowNavBarTrue_navigationBarShown() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true);
reset(mWindowInsetsController);
@@ -609,10 +668,10 @@ public void hideView_newHighestZOrder_shouldShowNavBarTrue_navigationBarShown()
public void hideView_newHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -625,10 +684,10 @@ public void hideView_newHighestZOrder_shouldShowStatusBarFalse_statusBarHidden()
public void hideView_newHighestZOrder_shouldShowStatusBarTrue_statusBarShown() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true);
reset(mWindowInsetsController);
@@ -668,10 +727,10 @@ public void hideView_oldHighestZOrder() {
public void hideView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -684,11 +743,12 @@ public void hideView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarHidden(
public void hideView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarShown() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true);
+ reset(mWindowInsetsController);
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
@@ -699,10 +759,10 @@ public void hideView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarShown()
public void hideView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -715,11 +775,12 @@ public void hideView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarHidden()
public void hideView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarShown() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true);
+ reset(mWindowInsetsController);
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
@@ -917,7 +978,11 @@ private void setupOverlayViewController(OverlayViewController overlayViewControl
private void setOverlayViewControllerAsShowing(OverlayViewController overlayViewController) {
mOverlayViewGlobalStateController.showView(overlayViewController, /* show= */ null);
+ View layout = overlayViewController.getLayout();
reset(mSystemUIOverlayWindowController);
+ reset(overlayViewController);
when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout);
+ when(overlayViewController.getLayout()).thenReturn(layout);
+ when(overlayViewController.isInflated()).thenReturn(true);
}
}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java
index 29cc8eec4bc3..765a4e7900b5 100644
--- a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java
@@ -21,6 +21,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.car.settings.CarSettings;
import android.os.Handler;
@@ -29,6 +30,7 @@
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.IWindowManager;
+import android.view.Surface;
import androidx.test.filters.SmallTest;
@@ -60,15 +62,20 @@ public class DisplaySystemBarsControllerTest extends SysuiTestCase {
private Handler mHandler;
@Mock
private TransactionPool mTransactionPool;
+ @Mock
+ private DisplayLayout mDisplayLayout;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mSystemWindows.mContext = mContext;
mSystemWindows.mWmService = mIWindowManager;
+ when(mDisplayLayout.rotation()).thenReturn(Surface.ROTATION_0);
+ when(mDisplayController.getDisplayLayout(DISPLAY_ID)).thenReturn(mDisplayLayout);
mController = new DisplaySystemBarsController(
- mSystemWindows,
+ mContext,
+ mIWindowManager,
mDisplayController,
mHandler,
mTransactionPool
@@ -81,7 +88,8 @@ public void onDisplayAdded_setsDisplayWindowInsetsControllerOnWMService()
mController.onDisplayAdded(DISPLAY_ID);
verify(mIWindowManager).setDisplayWindowInsetsController(
- eq(DISPLAY_ID), any(DisplaySystemBarsController.PerDisplay.class));
+ eq(DISPLAY_ID),
+ any(DisplayImeController.PerDisplay.DisplayWindowInsetsControllerImpl.class));
}
@Test
diff --git a/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml b/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml
deleted file mode 100644
index d7ae1cee29fd..000000000000
--- a/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- "CarrierDefaultApp"
- "Mobile Carrier"
- "Mobile data has run out"
- "Your mobile data has been deactivated"
- "Tap to visit the %s website"
- "Please contact your service provider %s"
- "No mobile data connection"
- "Add data or roaming plan through %s"
- "Mobile data status"
- "Sign in to mobile network"
- "The network you’re trying to join has security issues."
- "For example, the login page may not belong to the organization shown."
- "Continue anyway via browser"
-
diff --git a/packages/CarrierDefaultApp/res/values-fa/strings.xml b/packages/CarrierDefaultApp/res/values-fa/strings.xml
index 37a3de87ba01..5328a03d9646 100644
--- a/packages/CarrierDefaultApp/res/values-fa/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-fa/strings.xml
@@ -6,9 +6,7 @@
"داده تلفن همراه تمام شده است"
"داده شبکه تلفن همراه شما غیرفعال شده است"
"برای رفتن به وبسایت %s، ضربه بزنید"
-
-
-
+ "لطفاً با ارائهدهنده خدمات %s خود تماس بگیرید"
"بدون اتصال داده دستگاه همراه"
"افزودن طرح داده یا فراگردی ازطریق %s"
"وضعیت داده تلفن همراه"
diff --git a/packages/CarrierDefaultApp/res/values-hu/strings.xml b/packages/CarrierDefaultApp/res/values-hu/strings.xml
index 4ae6ea67bb06..a492e47242af 100644
--- a/packages/CarrierDefaultApp/res/values-hu/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-hu/strings.xml
@@ -8,7 +8,7 @@
"Koppintson a(z) %s webhely meglátogatásához"
"Vegye fel a kapcsolatot szolgáltatójával (%s)"
"Nincs mobiladat-kapcsolat"
- "Adjon hozzá előfizetést vagy barangolási csomagot a következőn keresztül: %s"
+ "Adjon hozzá előfizetést vagy roamingcsomagot a következőn keresztül: %s"
"Mobiladat-állapot"
"Bejelentkezés a mobilhálózatra"
"Biztonsági problémák vannak azzal a hálózattal, amelyhez csatlakozni szeretne."
diff --git a/packages/CarrierDefaultApp/res/values-ky/strings.xml b/packages/CarrierDefaultApp/res/values-ky/strings.xml
index 199476f47be0..bf4c8c323827 100644
--- a/packages/CarrierDefaultApp/res/values-ky/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ky/strings.xml
@@ -8,7 +8,7 @@
"%s сайтына баш багуу үчүн басыңыз"
"%s Интернет провайдери менен байланышыңыз"
"Мобилдик Интернет жок"
- "%s аркылуу дайындарды же роуминг планын кошуу"
+ "%s аркылуу дайын-даректерди же роуминг планын кошуу"
"Мобилдик Интернеттин абалы"
"Мобилдик тармакка кирүү"
"Кошулайын деген тармагыңызда коопсуздук көйгөйлөрү бар."
diff --git a/packages/CarrierDefaultApp/res/values-mn/strings.xml b/packages/CarrierDefaultApp/res/values-mn/strings.xml
index 1a9b72ec3b94..4aa9fb55ff32 100644
--- a/packages/CarrierDefaultApp/res/values-mn/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-mn/strings.xml
@@ -5,7 +5,7 @@
"Мобайл оператор компани"
"Мобайл дата дууссан"
"Таны мобайл датаг идэвхгүй болгосон"
- "%s вэб хуудсанд зочлохын тулд товших"
+ "%s веб хуудсанд зочлохын тулд товших"
"%s үйлчилгээ үзүүлэгчтэйгээ холбогдоно уу"
"Мобайл дата холболт алга"
"Дата эсвэл роуминг төлөвлөгөөг %s-р нэмнэ үү"
diff --git a/packages/CarrierDefaultApp/res/values-ur/strings.xml b/packages/CarrierDefaultApp/res/values-ur/strings.xml
index fc286b8a53d3..65bd6ceba94b 100644
--- a/packages/CarrierDefaultApp/res/values-ur/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ur/strings.xml
@@ -6,7 +6,7 @@
"موبائل ڈیٹا ختم ہو چکا ہے"
"آپ کا موبائل ڈیٹا غیر فعال کر دیا گیا ہے"
"%s ویب سائٹ ملاحظہ کرنے کیلئے تھپتھپائیں"
- "براہ کرم اپنے خدمت کے فراہم کنندہ %s سے رابطہ کریں"
+ "براہ کرم اپنے سروس فراہم کنندہ %s سے رابطہ کریں"
"کوئی موبائل ڈیٹا کنکشن نہیں ہے"
"%s کے ذریعے ڈیٹا یا رومنگ پلان شامل کریں"
"موبائل ڈیٹا کی صورت حال"
diff --git a/packages/DynamicSystemInstallationService/res/values-eu/strings.xml b/packages/DynamicSystemInstallationService/res/values-eu/strings.xml
index 7c4a67d4e6c2..9fa88beeb020 100644
--- a/packages/DynamicSystemInstallationService/res/values-eu/strings.xml
+++ b/packages/DynamicSystemInstallationService/res/values-eu/strings.xml
@@ -5,7 +5,7 @@
"Prest dago sistema dinamikoa. Erabiltzen hasteko, berrabiarazi gailua."
"Instalatzen"
"Ezin izan da instalatu"
- "Ezin izan da balidatu irudia. Utzi bertan behera instalazioa."
+ "Ezin izan da baliozkotu irudia. Utzi bertan behera instalazioa."
"Sistema dinamiko bat abian da. Berrabiarazi Android-en jatorrizko bertsioa erabiltzeko."
"Utzi"
"Baztertu"
diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml
index 30a193f25f54..fe4110aa2614 100644
--- a/packages/InputDevices/res/values-eu/strings.xml
+++ b/packages/InputDevices/res/values-eu/strings.xml
@@ -38,10 +38,10 @@
"Arabiarra"
"Greziarra"
"Hebrearra"
- "Lituaniera"
- "Espainiera (Latinoamerika)"
- "Letoniera"
- "Pertsiera"
+ "Lituaniarra"
+ "Espainiarra (Latinoamerika)"
+ "Letoniarra"
+ "Persiarra"
"Azerbaijandarra"
"Poloniarra"
diff --git a/packages/InputDevices/res/values-ta/strings.xml b/packages/InputDevices/res/values-ta/strings.xml
index b614a5099226..53ac7b0720fe 100644
--- a/packages/InputDevices/res/values-ta/strings.xml
+++ b/packages/InputDevices/res/values-ta/strings.xml
@@ -2,7 +2,7 @@
"உள்ளீட்டுச் சாதனங்கள்"
- "Android விசைப்பலகை"
+ "Android கீபோர்டு"
"ஆங்கிலம் (யூகே)"
"ஆங்கிலம் (யூஎஸ்)"
"ஆங்கிலம் (யூஎஸ்), சர்வதேச நடை"
diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml
index 1833329a9e34..b25b37bec795 100644
--- a/packages/PackageInstaller/res/values-ca/strings.xml
+++ b/packages/PackageInstaller/res/values-ca/strings.xml
@@ -80,9 +80,9 @@
"Les accions d\'instal·lar o de desinstal·lar no s\'admeten a Wear."
"S\'està preparant la instal·lació de l\'aplicació…"
"Desconeguda"
- "Per seguretat, la tauleta no pot instal·lar aplicacions desconegudes d\'aquesta font."
- "Per seguretat, el televisor no pot instal·lar aplicacions desconegudes d\'aquesta font."
- "Per seguretat, el telèfon no pot instal·lar aplicacions desconegudes d\'aquesta font."
+ "Per la teva seguretat, la tauleta no pot instal·lar aplicacions desconegudes d\'aquesta font."
+ "Per la teva seguretat, el televisor no pot instal·lar aplicacions desconegudes d\'aquesta font."
+ "Per la teva seguretat, el telèfon no pot instal·lar aplicacions desconegudes d\'aquesta font."
"El telèfon i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al telèfon o de la pèrdua de dades que pugui resultar del seu ús."
"La tauleta i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi a la tauleta o de la pèrdua de dades que pugui resultar del seu ús."
"El televisor i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al televisor o de la pèrdua de dades que pugui resultar del seu ús."
diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml
index 7cabdd532ffb..e5e219559c62 100644
--- a/packages/PackageInstaller/res/values-iw/strings.xml
+++ b/packages/PackageInstaller/res/values-iw/strings.xml
@@ -21,29 +21,29 @@
"סיום"
"ביטול"
"מתקין…"
- "מתקין את %1$s…"
+ "מתבצעת התקנה של %1$s…"
"האפליקציה הותקנה."
- "האם ברצונך להתקין אפליקציה זו?"
- "האם ברצונך להתקין עדכון עבור אפליקציה קיימת זו? הנתונים הקיימים שלך לא יאבדו."
+ "להתקין את האפליקציה הזו?"
+ "להתקין עדכון עבור האפליקציה הזו? הנתונים הקיימים שלך לא יאבדו."
"האם ברצונך להתקין עדכון עבור אפליקציה מובנית זו? הנתונים הקיימים שלך לא יאבדו."
"האפליקציה לא הותקנה."
"החבילה נחסמה להתקנה."
"האפליקציה לא הותקנה כי החבילה מתנגשת עם חבילה קיימת."
"האפליקציה לא הותקנה כי האפליקציה אינה תואמת לטאבלט."
"האפליקציה הזו אינה תואמת לטלוויזיה שלך."
- "האפליקציה לא הותקנה כי האפליקציה אינה תואמת לטלפון."
+ "האפליקציה לא הותקנה כי היא לא תואמת לטלפון."
"האפליקציה לא הותקנה כי נראה שהחבילה לא תקפה."
"לא ניתן להתקין את %1$s בטאבלט שלך."
"לא ניתן להתקין את %1$s בטלוויזיה שלך."
"לא ניתן להתקין את %1$s בטלפון שלך."
"פתיחה"
"מנהל המערכת שלך לא מתיר התקנה של אפליקציות ממקורות לא ידועים"
- "למשתמש זה אין הרשאה להתקין אפליקציות שאינן מוכרות"
+ "למשתמש הזה אין הרשאה להתקין אפליקציות שאינן מוכרות"
"למשתמש הזה אין הרשאה להתקין אפליקציות"
"אישור"
"ניהול אפליקציות"
"אין מספיק שטח"
- "לא ניתן להתקין את %1$s. יש לפנות שטח ולנסות שוב."
+ "לא ניתן להתקין את %1$s. יש לפנות מקום אחסון ולנסות שוב."
"האפליקציה לא נמצאה"
"האפליקציה לא נמצאת ברשימת האפליקציות המותקנות."
"לא מורשה"
@@ -52,21 +52,21 @@
"לא ניתן היה להסיר את התקנת האפליקציה."
"הסרת התקנה של האפליקציה"
"הסרת התקנה של עדכון"
- "%1$s הוא חלק מהאפליקציה הבאה:"
+ "הפעילות %1$s היא חלק מהאפליקציה הבאה:"
"האם ברצונך להסיר את ההתקנה של אפליקציה זו?"
- "האם אתה רוצה להסיר את האפליקציה הזו עבור ""כל"" המשתמשים? האפליקציה והנתונים שלה יוסרו מ""כל"" המשתמשים במכשיר."
- "האם ברצונך להסיר את התקנתה של אפליקציה זו עבור המשתמש %1$s?"
+ "להסיר את האפליקציה הזו עבור ""כל"" המשתמשים? האפליקציה והנתונים שלה יוסרו עבור ""כל"" המשתמשים במכשיר."
+ "להסיר את ההתקנה של האפליקציה הזו עבור %1$s?"
"האם להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו."
"האם להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו. הפעולה תשפיע על כל משתמשי המכשיר, כולל משתמשים בעלי פרופיל עבודה."
"שמירת %1$s מנתוני האפליקציה."
"התקנות בתהליכי הסרה"
"הסרות התקנה שנכשלו"
- "מסיר התקנה..."
- "מסיר את ההתקנה של %1$s…"
+ "בתהליך הסרת התקנה..."
+ "המערכת מסירה את ההתקנה של %1$s…"
"הסרת ההתקנה הסתיימה."
"ההתקנה של %1$s הוסרה"
- "הסרת ההתקנה נכשלה."
- "נכשלה הסרת ההתקנה של %1$s."
+ "לא ניתן היה להסיר את ההתקנה."
+ "לא ניתן היה להסיר את ההתקנה של %1$s."
"לא ניתן להסיר את ההתקנה של אפליקציה פעילה של מנהל המכשיר"
"לא ניתן להסיר את ההתקנה של אפליקציה פעילה של מנהל המכשיר של %1$s"
"אפליקציה זו נדרשת לחלק מהמשתמשים או מהפרופילים והתקנתה הוסרה למשתמשים אחרים"
@@ -83,7 +83,7 @@
"לצורכי אבטחה, הטאבלט שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה."
"לצורכי אבטחה, מכשיר הטלוויזיה שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה."
"לצורכי אבטחה, הטלפון שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה."
- "נתוני הטלפון והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. אם תתקין אפליקציה זו, אתה מסכים לכך שאתה האחראי הבלעדי במקרה של אובדן נתונים או אם ייגרם נזק לטלפון שלך בעקבות השימוש באפליקציה."
+ "נתוני הטלפון והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. התקנת האפליקציה הזו מהווה את הסכמתך לכך שהאחריות הבלעדית היא שלך במקרה של אובדן נתונים או גרימת נזק לטלפון שלך בעקבות השימוש באפליקציה."
"נתוני הטאבלט והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. אם תתקין אפליקציה זו, אתה מסכים לכך שאתה האחראי הבלעדי במקרה של אובדן נתונים או אם ייגרם נזק לטאבלט שלך בעקבות השימוש באפליקציה."
"נתוני הטלוויזיה והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. אם תתקין אפליקציה זו, אתה מסכים לכך שאתה האחראי הבלעדי במקרה של אובדן נתונים או אם ייגרם נזק לטלוויזיה שלך בעקבות השימוש באפליקציה."
"המשך"
diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml
index d0902c34ccc9..28ad6aafd77d 100644
--- a/packages/PackageInstaller/res/values-sv/strings.xml
+++ b/packages/PackageInstaller/res/values-sv/strings.xml
@@ -24,8 +24,8 @@
"%1$s installeras …"
"Appen har installerats."
"Vill du installera det här programmet?"
- "Vill du installera en uppdatering till den här befintliga appen? Dina befintliga data försvinner inte."
- "Vill du installera en uppdatering av den inbyggda appen? Dina befintliga data försvinner inte."
+ "Vill du installera en uppdatering till den här befintliga appen? Din befintliga data försvinner inte."
+ "Vill du installera en uppdatering av den inbyggda appen? Din befintliga data försvinner inte."
"Appen har inte installerats."
"Paketet har blockerats för installation."
"Appen har inte installerats på grund av en konflikt mellan detta paket och ett befintligt paket."
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java
index 705d3f4bdf87..38c06dd48b85 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java
@@ -41,6 +41,15 @@
public class InstallSuccess extends AlertActivity {
private static final String LOG_TAG = InstallSuccess.class.getSimpleName();
+ @Nullable
+ private PackageUtil.AppSnippet mAppSnippet;
+
+ @Nullable
+ private String mAppPackageName;
+
+ @Nullable
+ private Intent mLaunchIntent;
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -55,59 +64,73 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
Intent intent = getIntent();
ApplicationInfo appInfo =
intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
+ mAppPackageName = appInfo.packageName;
Uri packageURI = intent.getData();
// Set header icon and title
- PackageUtil.AppSnippet as;
PackageManager pm = getPackageManager();
if ("package".equals(packageURI.getScheme())) {
- as = new PackageUtil.AppSnippet(pm.getApplicationLabel(appInfo),
+ mAppSnippet = new PackageUtil.AppSnippet(pm.getApplicationLabel(appInfo),
pm.getApplicationIcon(appInfo));
} else {
File sourceFile = new File(packageURI.getPath());
- as = PackageUtil.getAppSnippet(this, appInfo, sourceFile);
+ mAppSnippet = PackageUtil.getAppSnippet(this, appInfo, sourceFile);
}
- mAlert.setIcon(as.icon);
- mAlert.setTitle(as.label);
- mAlert.setView(R.layout.install_content_view);
- mAlert.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.launch), null,
- null);
- mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.done),
- (ignored, ignored2) -> {
- if (appInfo.packageName != null) {
- Log.i(LOG_TAG, "Finished installing " + appInfo.packageName);
- }
- finish();
- }, null);
- setupAlert();
- requireViewById(R.id.install_success).setVisibility(View.VISIBLE);
- // Enable or disable "launch" button
- Intent launchIntent = getPackageManager().getLaunchIntentForPackage(
- appInfo.packageName);
- boolean enabled = false;
- if (launchIntent != null) {
- List list = getPackageManager().queryIntentActivities(launchIntent,
- 0);
- if (list != null && list.size() > 0) {
- enabled = true;
- }
- }
+ mLaunchIntent = getPackageManager().getLaunchIntentForPackage(mAppPackageName);
+
+ bindUi();
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ bindUi();
+ }
- Button launchButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
- if (enabled) {
- launchButton.setOnClickListener(view -> {
- try {
- startActivity(launchIntent);
- } catch (ActivityNotFoundException | SecurityException e) {
- Log.e(LOG_TAG, "Could not start activity", e);
+ private void bindUi() {
+ if (mAppSnippet == null) {
+ return;
+ }
+
+ mAlert.setIcon(mAppSnippet.icon);
+ mAlert.setTitle(mAppSnippet.label);
+ mAlert.setView(R.layout.install_content_view);
+ mAlert.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.launch), null,
+ null);
+ mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.done),
+ (ignored, ignored2) -> {
+ if (mAppPackageName != null) {
+ Log.i(LOG_TAG, "Finished installing " + mAppPackageName);
}
finish();
- });
- } else {
- launchButton.setEnabled(false);
+ }, null);
+ setupAlert();
+ requireViewById(R.id.install_success).setVisibility(View.VISIBLE);
+ // Enable or disable "launch" button
+ boolean enabled = false;
+ if (mLaunchIntent != null) {
+ List list = getPackageManager().queryIntentActivities(mLaunchIntent,
+ 0);
+ if (list != null && list.size() > 0) {
+ enabled = true;
}
}
+
+ Button launchButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
+ if (enabled) {
+ launchButton.setOnClickListener(view -> {
+ try {
+ startActivity(mLaunchIntent);
+ } catch (ActivityNotFoundException | SecurityException e) {
+ Log.e(LOG_TAG, "Could not start activity", e);
+ }
+ finish();
+ });
+ } else {
+ launchButton.setEnabled(false);
+ }
}
}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
index 5675c9986ac9..665d262d8067 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -343,17 +343,19 @@ protected void onCreate(Bundle icicle) {
if (!wasSetUp) {
return;
}
-
- // load dummy layout with OK button disabled until we override this layout in
- // startInstallConfirm
- bindUi();
- checkIfAllowedAndInitiateInstall();
}
@Override
protected void onResume() {
super.onResume();
+ if (mAppSnippet != null) {
+ // load dummy layout with OK button disabled until we override this layout in
+ // startInstallConfirm
+ bindUi();
+ checkIfAllowedAndInitiateInstall();
+ }
+
if (mOk != null) {
mOk.setEnabled(mEnableOk);
}
diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml
index 719fc9219450..e69ca7664b53 100644
--- a/packages/PrintSpooler/res/values-fa/strings.xml
+++ b/packages/PrintSpooler/res/values-fa/strings.xml
@@ -50,8 +50,8 @@
"جستجو"
"همه چاپگرها"
"افزودن سرویس"
- "کادر جستجو نمایان شد"
- "کادر جستجو پنهان شد"
+ "چارگوش جستجو نمایان شد"
+ "چارگوش جستجو پنهان شد"
"افزودن چاپگر"
"انتخاب چاپگر"
"فراموش کردن چاپگر"
diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml
index 64db711def15..18502334610d 100644
--- a/packages/PrintSpooler/res/values-iw/strings.xml
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -27,24 +27,24 @@
"דו-צדדי"
"כיוון"
"עמודים"
- "בחר מדפסת"
+ "בחירת מדפסת"
"הכל %1$s"
"טווח של %1$s"
"למשל 1–5,8,11–13"
"תצוגה מקדימה של הדפסה"
- "התקן מציג PDF ליצירת תצוגה מקדימה"
+ "התקנה של PDF viewer ליצירת תצוגה מקדימה"
"אפליקציית ההדפסה קרסה"
"יוצר עבודת הדפסה"
- "שמור כ-PDF"
+ "שמירה כ-PDF"
"כל המדפסות…"
"תיבת דו שיח של מדפסת"
"%1$d/%2$d"
"עמוד %1$d מתוך %2$d"
"סיכום, עותקים %1$s, גודל נייר %2$s"
- "ידית הרחבה"
+ "נקודת אחיזה להרחבה"
"ידית כיווץ"
"הדפס"
- "שמור כ-PDF"
+ "שמירה כ-PDF"
"אפשרויות ההדפסה הורחבו"
"אפשרויות ההדפסה כווצו"
"חיפוש"
@@ -72,7 +72,7 @@
"לא נמצאו מדפסות"
"לא ניתן להוסיף מדפסות"
"בחר כדי להוסיף מדפסת"
- "בחר כדי להפעיל"
+ "צריך לבחור כדי להפעיל"
"שירותים מופעלים"
"שירותים מומלצים"
"שירותים מושבתים"
@@ -84,14 +84,14 @@
- התקן כדי לגלות מדפסת %1$s
"מדפיס את %1$s"
- "מבטל את %1$s"
+ "המערכת מבטלת את %1$s"
"שגיאת מדפסת ב-%1$s"
"המדפסת חסמה את %1$s"
"ביטול"
"הפעלה מחדש"
"אין חיבור למדפסת"
"לא ידוע"
- "האם להשתמש ב-%1$s?"
+ "האם להשתמש בשירות %1$s?"
"ייתכן שהמסמך שלך יעבור בשרת אחד או יותר בדרכו למדפסת."
- "שחור ולבן"
@@ -107,9 +107,9 @@
- "לרוחב"
"לא ניתן היה לכתוב לקובץ"
- "מצטערים, אך זה לא עבד. נסה שוב."
+ "מצטערים, הפעולה לא בוצעה. אפשר לנסות שוב."
"כדאי לנסות שוב"
"המדפסת הזו אינה זמינה כעת."
"לא ניתן להציג תצוגה מקדימה"
- "מכין תצוגה מקדימה…"
+ "בתהליך יצירת תצוגה מקדימה…"
diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml
index 6448acc36902..79cb1ae3d3de 100644
--- a/packages/PrintSpooler/res/values-nl/strings.xml
+++ b/packages/PrintSpooler/res/values-nl/strings.xml
@@ -50,7 +50,7 @@
"Zoeken"
"Alle printers"
"Service toevoegen"
- "Zoekvak weergegeven"
+ "Zoekvak wordt getoond"
"Zoekvak verborgen"
"Printer toevoegen"
"Printer selecteren"
@@ -64,9 +64,9 @@
"Actieve afdruktaken"
"Mislukte afdruktaken"
"Kan bestand niet maken"
- "Sommige afdrukservices zijn uitgeschakeld"
+ "Sommige afdrukservices zijn uitgezet"
"Printers zoeken"
- "Geen afdrukservices ingeschakeld"
+ "Geen afdrukservices aangezet"
"Geen printers gevonden"
"Kan geen printers toevoegen"
"Selecteer om printer toe te voegen"
diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml
index 7000b95b35d6..15cecd6f46cc 100644
--- a/packages/PrintSpooler/res/values-or/strings.xml
+++ b/packages/PrintSpooler/res/values-or/strings.xml
@@ -80,10 +80,10 @@
- %1$sଟି ପ୍ରିଣ୍ଟର୍ ଖୋଜିବା ପାଇଁ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ
"%1$s ପ୍ରିଣ୍ଟ କରାଯାଉଛି"
- "%1$s କ୍ୟାନ୍ସଲ୍ କରାଯାଉଛି"
+ "%1$s ବାତିଲ୍ କରାଯାଉଛି"
"%1$s ପ୍ରିଣ୍ଟର୍ ତ୍ରୁଟି"
"ପ୍ରିଣ୍ଟର୍ ଦ୍ୱାରା ରୋକାଯାଇଥିବା %1$s"
- "କ୍ୟାନ୍ସଲ୍"
+ "ବାତିଲ୍"
"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"
"ପ୍ରିଣ୍ଟର୍କୁ କୌଣସି ସଂଯୋଗ ନାହିଁ"
"ଅଜଣା"
diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml
index b5d426e56e60..fc02fa13035b 100644
--- a/packages/PrintSpooler/res/values-uk/strings.xml
+++ b/packages/PrintSpooler/res/values-uk/strings.xml
@@ -31,7 +31,7 @@
"Усі %1$s"
"Діапазон %1$s"
"напр.,1–5, 8, 11–13"
- "Версія для друку"
+ "Попередній перегляд друку"
"Установити засіб перегляду PDF"
"Програма друку аварійно завершила роботу"
"Створюється завдання друку"
diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-nl/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-nl/strings.xml
index ee1000f4fab5..a73deafbc70f 100644
--- a/packages/SettingsLib/RestrictedLockUtils/res/values-nl/strings.xml
+++ b/packages/SettingsLib/RestrictedLockUtils/res/values-nl/strings.xml
@@ -17,6 +17,6 @@
- "Ingeschakeld door beheerder"
- "Uitgeschakeld door beheerder"
+ "Aangezet door beheerder"
+ "Uitgezet door beheerder"
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 4887428246fe..8ee8fe953f98 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -210,7 +210,7 @@
"Wi-Fi ሲገናኝ የማረም ሁነታ"
"ስህተት"
"ገመድ-አልባ debugging"
- "የሚገኙ መሣሪያዎችን ለመመልከትና ለመጠቀም ገመድ-አልባ debuggingን ያብሩ"
+ "የሚገኙ መሣሪያዎችን ለመመልከትና ለመጠቀም ገመድ-አልባ ማረምን ያብሩ"
"የQR ኮድን በመጠቀም መሣሪያን ያጣምሩ"
"የQR ኮድ መቃኛን በመጠቀም አዲስ መሣሪያዎችን ያጣምሩ"
"የማጣመሪያ ኮድን በመጠቀም መሣሪያን ያጣምሩ"
@@ -302,7 +302,7 @@
"የUSB ማረሚያ ይፈቀድ?"
"የUSB አድስ ለግንባታ አላማ ብቻ የታሰበ ነው። ከኮምፒዩተርህ ወደ መሳሪያህ ውሂብ ለመገልበጥ፣ መሣሪያህ ላይ ያለ ማሳወቂያ መተግበሪያዎችን መጫን፣ እና ማስታወሻ ውሂብ ማንበብ ለመጠቀም ይቻላል።"
"ገመድ-አልባ debugging ይፈቀድ?"
- "ገመድ-አልባ debugging ለግንባታ አላማዎች ብቻ የታሰበ ነው። ውሂብን ከኮምፒዩተርዎ ወደ መሳሪያዎ ለመቅዳት፣ መሣሪያዎ ላይ ያለማሳወቂያ መተግበሪያዎችን ለመጫን እና የምዝግብ ማስታወሻ ውሂብን ለማንበብ ይጠቀሙበት።"
+ "ገመድ-አልባ ማረም ለግንባታ አላማዎች ብቻ የታሰበ ነው። ውሂብን ከኮምፒዩተርዎ ወደ መሳሪያዎ ለመቅዳት፣ መሣሪያዎ ላይ ያለማሳወቂያ መተግበሪያዎችን ለመጫን እና የምዝግብ ማስታወሻ ውሂብን ለማንበብ ይጠቀሙበት።"
"የዩ ኤስ ቢ ማረም መዳረሻ ከዚህ ቀደም ፍቃድ ከሰጧቸው ኮምፒውተሮች ላይ ይሻሩ?"
"የግንባታ ቅንብሮችን ፍቀድ?"
"እነዚህ ቅንብሮች የታሰቡት ለግንባታ አጠቃቀም ብቻ ናቸው። መሳሪያህን እና በሱ ላይ ያሉትን መተግበሪያዎች እንዲበለሹ ወይም በትክክል እንዳይሰሩ ሊያደርጉ ይችላሉ።"
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index d1c60113656e..ce0654a39e84 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"%1$s إلى أن يتم شحن الجهاز بالكامل"
"%1$s - %2$s إلى أن يتم شحن الجهاز بالكامل"
- "%1$s - التحسين لسلامة البطارية"
+ "%1$s - التحسين للحفاظ على سلامة البطارية"
"غير معروف"
"جارٍ الشحن"
"جارٍ الشحن سريعًا"
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 4f82eea6e66f..44a27ad67218 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -311,7 +311,7 @@
"Adsız Bluetooth cihazları (yalnız MAC ünvanları) göstəriləcək"
"Uzaqdan idarə olunan cihazlarda dözülməz yüksək səs həcmi və ya nəzarət çatışmazlığı kimi səs problemləri olduqda Bluetooth mütləq səs həcmi xüsusiyyətini deaktiv edir."
"Bluetooth Gabeldorsche funksiyasını aktiv edir."
- "Təkmilləşdirilmiş Bağlantı funksiyasını aktiv edir."
+ "Qabaqcıl məlumat mübadiləsini aktiv edir."
"Yerli terminal"
"Yerli örtük girişini təklif edən terminal tətbiqi aktiv edin"
"HDCP yoxlanılır"
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index f3106d5e58c6..a410b63481a2 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -446,7 +446,7 @@
"%1$s – %2$s"
"Napuniće se za %1$s"
"%1$s – napuniće se za %2$s"
- "%1$s – Optimizuje se radi stanja baterije"
+ "%1$s – Optimizuje se radi boljeg stanja baterije"
"Nepoznato"
"Puni se"
"Brzo se puni"
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 4b7e9a88da46..70ec30e70dea 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -446,7 +446,7 @@
"%1$s – %2$s"
"Оставащо време до пълно зареждане: %1$s"
"%1$s – %2$s до пълно зареждане"
- "%1$s – Оптимизиране за състоян. на батерията"
+ "%1$s – Оптимизиране с цел състоянието на батерията"
"Неизвестно"
"Зарежда се"
"Зарежда се бързо"
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index f1148dafca64..d2856e236a25 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -369,7 +369,7 @@
"Obustavlja se svaka aktivnost čim je korisnik napusti"
"Ograničenje procesa u pozadini"
"Prikaži ANR-e u pozadini"
- "Prikaz dijaloga \"Aplikacija ne reagira\" za aplikacije pokrenute u pozadini"
+ "Prikaz dijaloškog okvira \"Aplikacija ne reagira\" za aplikacije pokrenute u pozadini"
"Prikaži upozorenja kanala obavještenja"
"Prikaz upozorenja na ekranu kada aplikacija pošalje obavještenje bez važećeg kanala"
"Nametni aplikacije na vanjskoj pohrani"
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index 059f0449adec..4b608623d095 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -238,7 +238,7 @@
- "Cap"
- "Logcat"
- "Systrace (gràfics)"
- - "Pila de trucades a glGetError"
+ - "Pila de crides a glGetError"
- "Desactivat"
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index f8fc174883f6..3ad8b9da9a98 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -446,7 +446,7 @@
"%1$s: %2$s"
"%1$s per completar la càrrega"
"%1$s: %2$s per completar la càrrega"
- "%1$s: optimitzant per a l\'estat de la bateria"
+ "%1$s: s\'està optimitzant per preservar l\'estat de la bateria"
"Desconegut"
"S\'està carregant"
"Carregant ràpidament"
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index b1530a22e994..5372cedd282a 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -532,7 +532,7 @@
"Begrænset profil"
"Vil du tilføje en ny bruger?"
"Du kan dele denne enhed med andre ved at oprette ekstra brugere. Hver bruger har sit personlige område, som kan tilpasses med apps, baggrund osv. Brugerne kan også justere enhedsindstillinger, som for eksempel Wi-Fi, som påvirker alle.\n\nNår du tilføjer en ny bruger, skal vedkommende konfigurere sit område.\n\nAlle brugere kan opdatere apps for alle andre brugere. Indstillinger og tjenester for hjælpefunktioner overføres muligvis ikke til den nye bruger."
- "Når du tilføjer en ny bruger, skal personen konfigurere sit rum.\n\nEnhver bruger kan opdatere apps for alle andre brugere."
+ "Når du tilføjer en ny bruger, skal personen konfigurere sit rum.\n\nAlle brugere kan opdatere apps for alle de andre brugere."
"Vil du konfigurere brugeren nu?"
"Sørg for, at brugeren har mulighed for at tage enheden og konfigurere sit eget rum"
"Vil du oprette en profil nu?"
@@ -546,7 +546,7 @@
"Før du kan oprette en begrænset profil, skal du oprette en skærmlås for at beskytte dine apps og personlige data."
"Konfigurer låseskærmen"
"Skift til %s"
- "Tilføj gæsten"
+ "Tilføj gæst"
"Fjern gæsten"
"Gæst"
"Enhedens standardindstilling"
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index b7be0493e811..e7c4e3e0cdaa 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -285,7 +285,7 @@
"Verringert den Akkuverbrauch und verbessert die Netzwerkleistung"
"Wenn dieser Modus aktiviert ist, kann sich die MAC-Adresse dieses Geräts bei jeder Verbindung mit einem Netzwerk ändern, bei dem die MAC-Adressen randomisiert werden."
"Kostenpflichtig"
- "Kostenlos"
+ "Ohne Datenlimit"
"Logger-Puffergrößen"
"Größe pro Protokollpuffer wählen"
"Speicher der dauerhaften Protokollierung löschen?"
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 10b8c77b5619..c53f38a0c78c 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"Απομένουν %1$s για ολοκλήρωση της φόρτισης"
"%1$s - %2$s για την ολοκλήρωση της φόρτισης"
- "%1$s - Βελτιστοποίηση κατάστασης μπαταρίας"
+ "%1$s - Βελτιστοποίηση για τη διατήρηση της καλής κατάστασης της μπαταρίας"
"Άγνωστο"
"Φόρτιση"
"Ταχεία φόρτιση"
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 56efd5c8edc8..fd74d3267fc3 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -116,8 +116,8 @@
"SINCRONIZAR"
"Cancelar"
"La sincronización te permite acceder a los contactos y al historial de llamadas cuando el dispositivo está conectado."
- "No se pudo sincronizar con %1$s."
- "No se pudo sincronizar con %1$s debido a que el PIN o la clave de acceso son incorrectos."
+ "No se pudo vincular con %1$s."
+ "No se pudo vincular con %1$s debido a que el PIN o la clave de acceso son incorrectos."
"No se puede establecer la comunicación con %1$s."
"Vínculo rechazado por %1$s"
"Computadora"
@@ -219,7 +219,7 @@
"Conectado actualmente"
"Detalles del dispositivo"
"Olvidar"
- "Huellas digitales del dispositivo: %1$s"
+ "Huellas dactilares del dispositivo: %1$s"
"Error de conexión"
"Asegúrate de que %1$s esté conectado a la red correcta."
"Vincular con dispositivo"
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index af869d6cec96..3584975737f6 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"%1$s guztiz kargatu arte"
"%1$s - %2$s guztiz kargatu arte"
- "%1$s - Optimizatzen bateria egoera onean mantentzeko"
+ "%1$s - Optimizatzen, bateria egoera onean mantentzeko"
"Ezezaguna"
"Kargatzen"
"Bizkor kargatzen"
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 08932756ae96..323aa65113f3 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -37,7 +37,7 @@
"دسترسی به اینترنت ندارد"
"ذخیرهشده توسط %1$s"
"اتصال خودکار ازطریق %1$s"
- "اتصال خودکار ازطریق ارائهدهنده رتبهبندی شبکه"
+ "اتصال خودکار ازطریق ارائهدهنده ردهبندی شبکه"
"متصل از طریق %1$s"
"متصل شده ازطریق %1$s"
"در دسترس از طریق %1$s"
@@ -263,8 +263,8 @@
"انتخاب نسخه MAP بلوتوث"
"کدک بلوتوث صوتی"
"راهاندازی کدک صوتی بلوتوثی\nانتخاب"
- "سرعت نمونه بلوتوث صوتی"
- "راهاندازی کدک صوتی بلوتوثی\nانتخاب: سرعت نمونه"
+ "بسامد نمونه صوتی بلوتوث"
+ "راهاندازی کدک صوتی بلوتوثی\nانتخاب: بسامد نمونه"
"«خاکستری» به این معناست که تلفن یا هدست از آن پشتیبانی نمیکند"
"بیتهای بلوتوث صوتی در هر نمونه"
"راهاندازی کدک صوتی بلوتوثی\nانتخاب: تعداد بیت در نمونه"
@@ -465,7 +465,7 @@
- "۵۰٪"
- "۱۰۰٪"
- "%1$s قبل"
+ "%1$s پیش"
"%1$s باقی مانده است"
"کوچک"
"پیشفرض"
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index c42bcdefeb68..58db5a60b509 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -225,8 +225,8 @@
"Associer avec l\'appareil"
"Code d\'association Wi-Fi"
"Échec de l\'association"
- "Vérifier que l\'appareil est connecté au même réseau."
- "Associer un appareil par Wi-Fi en numérisant un code QR"
+ "Vérifiez que l\'appareil est connecté au même réseau."
+ "Associez l\'appareil par Wi-Fi en numérisant un code QR"
"Association de l\'appareil en cours…"
"Échec de l\'association de l\'appareil Soit le code QR est incorrect, soit l\'appareil n\'est pas connecté au même réseau."
"Adresse IP et port"
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index d9450ba1d54c..8f143e4d583a 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"%1$s para completar a carga"
"%1$s: %2$s para completar a carga"
- "%1$s: optimizando para manter a batería en bo estado"
+ "%1$s: optimizando a preservación da batería"
"Descoñecido"
"Cargando"
"Cargando rapidamente"
diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml
index b613cd971ae8..5c675783eae4 100644
--- a/packages/SettingsLib/res/values-gu/arrays.xml
+++ b/packages/SettingsLib/res/values-gu/arrays.xml
@@ -256,7 +256,7 @@
- "Deuteranomaly માટેના ક્ષેત્રો બતાવો"
- - "માનક સીમા"
+ - "સ્ટૅન્ડર્ડ સીમા"
- "કોઈ બૅકગ્રાઉન્ડ પ્રક્રિયાઓ નથી"
- "સૌથી વધુ 1 પ્રક્રિયા"
- "સૌથી વધુ 2 પ્રક્રિયા"
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 86e39d202b49..4f1e864f6c5b 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -282,7 +282,7 @@
"કનેક્ટ કરી શકાયું નથી"
"વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો"
"વાઇ-ફાઇ લોગિંગ સ્તર વધારો, વાઇ-ફાઇ પીકરમાં SSID RSSI દીઠ બતાવો"
- "બૅટરીનો ચાર્જ ઝડપથી ઓછો થવાનું ટાળે છે અને નેટવર્કની કાર્યક્ષમતામાં સુધારો કરે છે"
+ "બૅટરીનો ચાર્જ ઝડપથી ઓછો થવાનું ટાળે છે અને નેટવર્કના કાર્યપ્રદર્શનમાં સુધારો કરે છે"
"આ મોડ ચાલુ કરેલો હશે, ત્યારે MAC રેન્ડમાઇઝેશન ચાલુ કરેલું હોય તેવા નેટવર્ક સાથે આ ડિવાઇસ જોડાશે ત્યારે દર વખતે તેનું MAC ઍડ્રેસ બદલાય તેમ બની શકે છે."
"મીટર કરેલ"
"મીટર ન કરેલ"
@@ -388,7 +388,7 @@
- "વાઇબ્રન્ટ (ડિફોલ્ટ)"
- "કુદરતી"
- - "માનક"
+ - "સ્ટૅન્ડર્ડ"
- "વધારેલ રંગો"
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 14ee4c9a16dc..c9c4f25d9e5d 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"%1$s մինչև լիցքավորումը"
"%1$s – %2$s մինչև լիցքավորումը"
- "%1$s – Օպտիմալացվում է"
+ "%1$s – Օպտիմալացվում է մարտկոցի պահպանման համար"
"Անհայտ"
"Լիցքավորում"
"Արագ լիցքավորում"
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index c5bcfc0bbeab..f20f5117a755 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -226,12 +226,12 @@
"Wi-Fi pörunarkóði"
"Pörun mistókst"
"Gakktu úr skugga um að tækið sé tengt sama neti."
- "Tengja tæki með Wi-Fi með því að skanna QR-kóða"
+ "Para tæki gegnum Wi-Fi með því að skanna QR-kóða"
"Parar tæki…"
"Ekki tókst að para við tækið. Annað hvort var QR-kóðinn rangur eða tækið ekki tengt sama neti."
"IP-tala og gátt"
"Skanna QR-kóða"
- "Tengja tæki með Wi-Fi með því að skanna QR-kóða"
+ "Para tæki gegnum Wi-Fi með því að skanna QR-kóða"
"Tengstu Wi-Fi neti"
"adb, villuleit, dev"
"Flýtileið í villutilkynningu"
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index 86d8bdec7a4b..be8336b2a34c 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -22,13 +22,13 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- - "סורק..."
- - "מתחבר ..."
- - "מאמת…"
+ - "מתבצעת סריקה..."
+ - "מתבצעת התחברות..."
+ - "מתבצע אימות…"
- "משיג כתובת IP…"
- "מחובר"
- "בהשעיה"
- - "מתנתק..."
+ - "מתבצעת התנתקות..."
- "מנותק"
- "נכשל"
- "חסומה"
@@ -36,27 +36,27 @@
- - "סורק..."
- - "מתחבר אל %1$s…"
- - "מאמת עם %1$s..."
- - "משיג כתובת IP מ-%1$s…"
+ - "מתבצעת סריקה..."
+ - "מתבצעת התחברות אל %1$s…"
+ - "מתבצע אימות מול %1$s..."
+ - "המערכת משיגה כתובת IP מ-%1$s…"
- "מחובר אל %1$s"
- "בהשעיה"
- - "מתנתק מרשת %1$s..."
+ - "מתבצעת התנתקות מרשת %1$s…"
- "מנותק"
- "נכשל"
- "חסומה"
- - "נמנע זמנית מחיבור חלש"
+ - "המערכת נמנעת זמנית מחיבור חלש"
- "בלי לבדוק לעולם"
- - "בדוק אם יש תוכן DRM בלבד"
+ - "בדיקה אם יש תוכן DRM בלבד"
- "בדוק תמיד"
- - "לעולם אל תשתמש בבדיקת HDCP"
- - "השתמש בבדיקת HDCP עבור תוכן DRM בלבד"
- - "תמיד השתמש בבדיקת HDCP"
+ - "אני לעולם לא רוצה להשתמש בבדיקת HDCP"
+ - "שימוש בבדיקת HDCP עבור תוכן DRM בלבד"
+ - "אני רוצה להשתמש תמיד בבדיקת HDCP"
- "מושבת"
@@ -127,7 +127,7 @@
- "השתמש בבחירת המערכת (ברירת המחדל)"
- - "16 סיביות לדגימה"
+ - "16 ביטים לדגימה"
- "24 סיביות לדגימה"
- "32 סיביות לדגימה"
@@ -137,7 +137,7 @@
- "סטריאו"
- - "השתמש בבחירת המערכת (ברירת המחדל)"
+ - "שימוש בבחירת המערכת (ברירת המחדל)"
- "מונו"
- "סטריאו"
@@ -149,7 +149,7 @@
- "אופטימיזציה להשגת איכות אודיו מרבית"
- - "אזן בין איכות החיבור לאיכות אודיו"
+ - "איזון בין איכות החיבור לאיכות אודיו"
- "אופטימיזציה להשגת איכות חיבור מרבית"
- "האיכות הטובה ביותר (קצב העברת נתונים מותאם)"
@@ -242,8 +242,8 @@
- "כבוי"
- - "שרטט אזור חיתוך שאינו מלבני בצבע כחול"
- - "הדגש את פקודות האיור שנבדקות בצבע ירוק"
+ - "שרטוט אזור חיתוך שאינו מלבני בצבע כחול"
+ - "הדגשת פקודות האיור שנבדקות בצבע ירוק"
- "כבוי"
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index f55664a51853..aebd5bda70ee 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -31,7 +31,7 @@
"בעיית אימות"
"לא ניתן להתחבר"
"לא ניתן להתחבר אל %1$s"
- "בדוק את הסיסמה ונסה שוב"
+ "יש לבדוק את הסיסמה ולנסות שוב"
"מחוץ לטווח"
"לא יתבצע חיבור באופן אוטומטי"
"אין גישה לאינטרנט"
@@ -64,10 +64,10 @@
"התוקף פג"
"%1$s / %2$s"
"מנותק"
- "מתנתק..."
- "מתחבר ..."
+ "מתבצעת התנתקות..."
+ "מתבצעת התחברות…"
"%1$s מחובר"
- "מבצע התאמה..."
+ "ההתאמה מתבצעת..."
"מחובר (ללא טלפון)%1$s"
"מחובר (ללא מדיה)%1$s"
"מחובר (ללא גישה להודעות)%1$s"
@@ -87,7 +87,7 @@
"מכשיר קלט"
"גישה לאינטרנט"
"שיתוף אנשי קשר"
- "השתמש עבור שיתוף אנשי קשר"
+ "שימוש עבור שיתוף אנשי קשר"
"שיתוף חיבור לאינטרנט"
"הודעות טקסט"
"גישה ל-SIM"
@@ -104,7 +104,7 @@
"מחובר למכשיר קלט"
"יש חיבור למכשיר לצורך גישה לאינטרנט"
"המערכת משתפת חיבור אינטרנט מקומי עם המכשיר"
- "השתמש עבור גישה לאינטרנט"
+ "שימוש עבור גישה לאינטרנט"
"שימוש עבור מפה"
"השתמש לגישה של SIM"
"שימוש לאודיו של מדיה"
@@ -124,13 +124,13 @@
"אוזניות"
"טלפון"
"הדמיה"
- "אוזנייה"
+ "אוזניות"
"ציוד קלט היקפי"
"Bluetooth"
"מתבצעת התאמה של מכשיר שמיעה שמאלי…"
"מתבצעת התאמה של מכשיר שמיעה ימני…"
"שמאלי - טעינת הסוללה: %1$s"
- "ימני - טעינת הסוללה: %1$s"
+ "ימני – טעינת הסוללה: %1$s"
"Wi-Fi כבוי."
"Wi-Fi מנותק."
"פס אחד של Wi-Fi."
@@ -163,7 +163,7 @@
"שפה"
"שימוש בשפת המערכת"
"לא נבחרה שפה"
- "מגדיר קול ספציפי לשפה עבור הטקסט הנאמר"
+ "הגדרת קול ספציפי לשפה עבור הטקסט הנאמר"
"דוגמה"
"הפעלת הדגמה קצרה של סינתזת דיבור"
"התקנת נתוני קול"
@@ -175,9 +175,9 @@
"%1$s נתמכת באופן מלא"
"%1$s מצריכה חיבור לרשת"
"%1$s אינה נתמכת"
- "בודק…"
+ "מתבצעת בדיקה…"
"הגדרות עבור %s"
- "השק הגדרות מנוע"
+ "הפעלת הגדרות מנוע"
"מנוע מועדף"
"כללי"
"איפוס של גובה צליל הדיבור"
@@ -235,7 +235,7 @@
"יש להתחבר לרשת Wi-Fi"
"adb, ניפוי באגים, פיתוח"
"קיצור של דוח באגים"
- "כדי ליצור דוח באגים, הצג לחצן בתפריט לניהול צריכת החשמל"
+ "כדי ליצור דוח באגים, יש להציג לחצן בתפריט לניהול צריכת החשמל"
"שיישאר פועל"
"המסך לעולם לא יהיה במצב שינה במהלך טעינה"
"הפעלת Snoop Log של Bluetooth HCI"
@@ -244,7 +244,7 @@
"אפשר ביטול של נעילת מנהל האתחול"
"האם לאפשר ביטול נעילה של OEM (יצרן ציוד מקורי)?"
"אזהרה: תכונות הגנת מכשיר לא יפעלו במכשיר הזה כשההגדרה הזו פועלת."
- "בחר אפליקציה של מיקום מדומה"
+ "בחירת אפליקציה של מיקום מדומה"
"לא הוגדרה אפליקציה של מיקום מדומה"
"אפליקציה של מיקום מדומה: %1$s"
"תקשורת רשתות"
@@ -255,10 +255,10 @@
"חבילת הגלישה פעילה תמיד"
"שיפור מהירות באמצעות חומרה לצורך שיתוף אינטרנט בין ניידים"
"הצגת מכשירי Bluetooth ללא שמות"
- "השבת עוצמת קול מוחלטת"
+ "השבתת עוצמת קול מוחלטת"
"הפעלת Gabeldorsche"
"Bluetooth גרסה AVRCP"
- "בחר Bluetooth גרסה AVRCP"
+ "בחירת Bluetooth גרסה AVRCP"
"גרסת Bluetooth MAP"
"יש לבחור גרסה של Bluetooth MAP"
"Codec אודיו ל-Bluetooth"
@@ -267,7 +267,7 @@
"הפעלת Codec אודיו ל-Bluetooth\nבחירה: קצב דגימה"
"כשזה מופיע באפור, אין לזה תמיכה בטלפון או באוזניות"
"מספר סיביות לדגימה באודיו ל-Bluetooth"
- "הפעלת Codec אודיו ל-Bluetooth\nבחירה: סיביות לדגימה"
+ "הפעלת Codec אודיו ל-Bluetooth\nבחירה: ביטים לדגימה"
"מצב של ערוץ אודיו ל-Bluetooth"
"הפעלת Codec אודיו ל-Bluetooth\nבחירה: מצב ערוץ"
"Codec אודיו LDAC ל-Bluetooth: איכות נגינה"
@@ -280,49 +280,49 @@
"שם מארח של ספק DNS פרטי"
"צריך להזין את שם המארח של ספק DNS"
"לא ניתן היה להתחבר"
- "הצג אפשרויות עבור אישור של תצוגת WiFi"
- "העלה את רמת הרישום של Wi‑Fi ביומן, הצג לכל SSID RSSI ב-Wi‑Fi Picker"
- "מפחית את קצב התרוקנות הסוללה ומשפר את ביצועי הרשת"
+ "הצגת אפשרויות עבור אישור של תצוגת WiFi"
+ "העלאת רמת הרישום של Wi‑Fi ביומן, הצגה לכל SSID RSSI ב-Wi‑Fi Picker"
+ "אפשרות זו מפחיתה את קצב התרוקנות הסוללה ומשפרת את ביצועי הרשת"
"כשמצב זה מופעל, כתובת ה-MAC של המכשיר הזה עשויה להשתנות בכל פעם שהוא מתחבר לרשת שפועלת בה רנדומיזציה של כתובות MAC."
"נמדדת"
"לא נמדדת"
- "גדלי מאגר של יומן רישום"
- "בחר גדלים של יוצר יומן לכל מאגר יומן"
+ "גודלי מאגר של יומן רישום"
+ "יש לבחור גדלים של יוצר יומן לכל מאגר יומן"
"האם למחוק את אחסון המתעד המתמיד?"
"כשאנחנו כבר לא מבצעים מעקב באמצעות המתעד המתמיד, אנחנו נדרשים למחוק את נתוני המתעד המקומי במכשיר."
"אחסון מתמיד של נתוני תיעוד במכשיר"
- "בחר מאגר נתונים זמני ליומן לשם אחסון מתמיד במכשיר"
- "בחר תצורת USB"
- "בחר תצורת USB"
+ "בחירת מאגר נתונים זמני ליומן לשם אחסון מתמיד במכשיר"
+ "בחירה של תצורת USB"
+ "יש לבחור תצורת USB"
"אפשרות של מיקומים מדומים"
"אפשרות של מיקומים מדומים"
"אפשר בדיקת תכונת תצוגה"
- "השאר את חבילת הגלישה פעילה תמיד, גם כש-Wi‑Fi פעיל (למעבר מהיר בין רשתות)."
+ "השארת חבילת הגלישה פעילה תמיד, גם כש-Wi‑Fi פעיל (למעבר מהיר בין רשתות)."
"אם השירות זמין, יש להשתמש בשיפור מהירות באמצעות חומרה לצורך שיתוף אינטרנט בין ניידים"
"לאפשר ניפוי באגים של USB?"
- "ניפוי באגים באמצעות USB מיועד למטרות פיתוח בלבד. השתמש בו להעתקת נתונים בין המחשב והמכשיר שלך, להתקנת אפליקציות במכשיר ללא התראה ולקריאת נתוני יומן."
+ "ניפוי באגים באמצעות USB מיועד למטרות פיתוח בלבד. אפשר להשתמש בו להעתקת נתונים בין המחשב והמכשיר, להתקנת אפליקציות במכשיר ללא התראה ולקריאת נתוני יומן."
"האם לאפשר ניפוי באגים אלחוטי?"
"ניפוי באגים אלחוטי מיועד למטרות פיתוח בלבד. יש להשתמש בו להעתקת נתונים בין המחשב והמכשיר שלך, להתקנת אפליקציות במכשיר ללא התראה ולקריאת נתוני יומן."
"האם לבטל את הגישה לניפוי ב-USB מכל המחשבים שהענקת להם בעבר הרשאה?"
"האם להתיר הגדרות פיתוח?"
"הגדרות אלה מיועדות לשימוש בפיתוח בלבד. הן עלולות לגרום למכשיר או לאפליקציות המותקנות בו לקרוס או לפעול באופן לא תקין."
- "אמת אפליקציות באמצעות USB"
- "בדוק אפליקציות שהותקנו באמצעות ADB/ADT לאיתור התנהגות מזיקה."
+ "אימות אפליקציות באמצעות USB"
+ "יש לבדוק אפליקציות שהותקנו באמצעות ADB/ADT לאיתור התנהגות מזיקה."
"יוצגו מכשירי Bluetooth ללא שמות (כתובות MAC בלבד)"
- "משבית את תכונת עוצמת הקול המוחלטת ב-Bluetooth במקרה של בעיות בעוצמת הקול במכשירים מרוחקים, כגון עוצמת קול רמה מדי או חוסר שליטה ברמת העוצמה."
+ "השבתה של תכונת עוצמת הקול המוחלטת ב-Bluetooth במקרה של בעיות בעוצמת הקול במכשירים מרוחקים, כגון עוצמת קול רמה מדי או חוסר שליטה ברמת העוצמה."
"הפעלת מקבץ הפיצ\'רים של Bluetooth Gabeldorsche."
"הפעלה של תכונת הקישוריות המשופרת."
"מסוף מקומי"
- "הפעל אפליקציית מסוף המציעה גישה מקומית למעטפת"
+ "הפעלה של אפליקציית מסוף המציעה גישה מקומית למעטפת"
"בדיקת HDCP"
- "הגדר אופן בדיקת HDCP"
+ "הגדרת האופן של בדיקת HDCP"
"ניפוי באגים"
- "בחר אפליקציה לניפוי באגים"
+ "בחירת אפליקציה לניפוי באגים"
"לא הוגדרה אפליקציה לניפוי"
"אפליקציה לניפוי: %1$s"
- "בחר אפליקציה"
+ "בחירת אפליקציה"
"אף אחת"
- "המתן למנקה באגים"
+ "יש להמתין לכלי לניפוי באגים"
"אפליקציה שנוקו בה הבאגים ממתינה למנקה הבאגים לצירוף לפני ביצוע"
"קלט"
"שרטוט"
@@ -330,30 +330,30 @@
"מדיה"
"מעקב"
"מצב קפדני מופעל"
- "גרום למסך להבהב כאשר אפליקציות מבצעות פעולות ארוכות בשרשור הראשי"
+ "המסך יהבהב כאשר אפליקציות יבצעו פעולות ארוכות בשרשור הראשי"
"מיקום מצביע"
"שכבת-על של המסך המציגה את נתוני המגע הנוכחיים"
- "הצג הקשות"
- "הצג משוב ויזואלי להקשות"
- "הצג עדכונים על פני השטח"
- "הבזק את כל שטחי החלון כשהם מתעדכנים"
+ "הצגת הקשות"
+ "הצגת משוב ויזואלי להקשות"
+ "הצגת עדכונים על פני השטח"
+ "הבזקת כל שטחי החלון כשהם מתעדכנים"
"תצוגת \'הצגת עדכונים\'"
- "הבזק תצוגות בתוך חלונות בעת ציור"
- "הצג עדכוני שכבות חומרה"
- "הצג הבהוב ירוק לשכבות חומרה כשהן מתעדכנות"
+ "הבזקת תצוגות בתוך חלונות בעת ציור"
+ "הצגת עדכונים של שכבות חומרה"
+ "הצגת הבהוב ירוק לשכבות חומרה כשהן מתעדכנות"
"חריגה בניפוי באגים ב-GPU"
- "השבת שכבות על של HW"
- "השתמש תמיד ב-GPU להרכבת מסך"
+ "השבתת שכבות על של HW"
+ "שימוש תמיד ב-GPU להרכבת מסך"
"יצירת הדמיה של מרחב צבעים"
- "הפעל מעקבי OpenGL"
- "השבת ניתוב אודיו ב-USB"
- "השבת ניתוב אוטומטי אל התקני אודיו חיצוניים ב-USB"
- "הצג את גבולות הפריסה"
- "הצג גבולות אזור, שוליים וכדומה"
- "אלץ כיוון פריסה מימין לשמאל"
- "אלץ כיוון פריסת מסך מימין לשמאל עבור כל השפות בכל המקומות"
- "אלץ הפעלת 4x MSAA"
- "הפעל 4x MSAA ביישומי OpenGL ES 2.0"
+ "הפעלת מעקבי OpenGL"
+ "השבתת ניתוב אודיו ב-USB"
+ "השבתת ניתוב אוטומטי אל התקני אודיו חיצוניים ב-USB"
+ "הצגת גבולות הפריסה"
+ "הצגת גבולות אזור, שוליים וכדומה"
+ "אילוץ כיוון פריסה מימין לשמאל"
+ "אילוץ של כיוון פריסת מסך מימין לשמאל עבור כל השפות בכל המקומות"
+ "אילוץ הפעלת 4x MSAA"
+ "הפעלת 4x MSAA ביישומי OpenGL ES 2.0"
"ניפוי באגים בפעולות באזור שאינו מלבני"
"עיבוד פרופיל ב-HWUI"
"הפעלת שכבות לניפוי באגים ב-GPU"
@@ -363,10 +363,10 @@
"קנה מידה לאנימציה של חלון"
"קנה מידה לאנימציית מעבר"
"קנה מידה למשך זמן אנימציה"
- "צור הדמיית תצוגות משניות"
+ "יצירת הדמיה של תצוגות משניות"
"אפליקציות"
"ללא שמירת פעילויות"
- "השמד כל פעילות ברגע שהמשתמש עוזב אותה"
+ "השמדת כל פעילות ברגע שהמשתמש עוזב אותה"
"מגבלה של תהליכים ברקע"
"הצגת מקרי ANR ברקע"
"הצגת תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע"
@@ -374,13 +374,13 @@
"הצגת אזהרה כשאפליקציה שולחת התראה ללא ערוץ חוקי"
"אילוץ הרשאת אפליקציות באחסון חיצוני"
"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"
- "אלץ יכולת קביעת גודל של הפעילויות"
+ "אילוץ יכולת קביעת גודל של הפעילויות"
"אפשר יכולת קביעת גודל של כל הפעילויות לריבוי חלונות, ללא קשר לערך המניפסט."
- "הפעל את האפשרות לשנות את הגודל והמיקום של החלונות"
- "הפעל תמיכה בתכונה הניסיונית של שינוי הגודל והמיקום של החלונות."
+ "הפעלת האפשרות לשנות את הגודל והמיקום של החלונות"
+ "הפעלת תמיכה בתכונה הניסיונית של שינוי הגודל והמיקום של החלונות."
"סיסמת גיבוי שולחן העבודה"
"גיבויים מלאים בשולחן העבודה אינם מוגנים כעת"
- "הקש כדי לשנות או להסיר את הסיסמה לגיבויים מלאים בשולחן העבודה"
+ "יש להקיש כדי לשנות או להסיר את הסיסמה לגיבויים מלאים בשולחן העבודה"
"הוגדרה סיסמת גיבוי חדשה"
"הסיסמה החדשה והאישור אינם תואמים"
"הגדרת סיסמת גיבוי נכשלה"
@@ -396,19 +396,19 @@
- "צבעים מותאמים באופן אופטימלי לתוכן דיגיטלי"
"אפליקציות בהמתנה"
- "אפליקציה לא פעילה. הקש כדי להחליף מצב."
- "אפליקציה פעילה. הקש כדי להחליף מצב."
+ "אפליקציה לא פעילה. יש להקיש כדי להחליף מצב."
+ "אפליקציה פעילה. יש להקיש כדי להחליף מצב."
"אפליקציה במצב המתנה: %s"
"שירותים פועלים"
"הצגת השירותים הפועלים כעת ושליטה בהם"
"יישום WebView"
"הגדרת יישום WebView"
- "אפשרות זו כבר אינה תקפה. נסה שוב."
+ "אפשרות זו כבר אינה תקפה. אפשר לנסות שוב."
"המרה לצורך הצפנת קבצים"
- "המר..."
+ "להמרה..."
"הצפנת קבצים כבר מוגדרת"
"המרה להצפנה מבוססת קבצים"
- "המר את מחיצת הנתונים להצפנה מבוססת-קבצים.\n אזהרה!! פעולה זו תמחק את כל הנתונים.\n תכונה זו זמינה בגרסת אלפא וייתכן שלא תפעל כראוי.\n הקש על \'מחיקה והמרה…\' כדי להמשיך."
+ "המרת מחיצת הנתונים להצפנה מבוססת-קבצים.\n אזהרה!! פעולה זו תמחק את כל הנתונים.\n תכונה זו זמינה בגרסת אלפא וייתכן שלא תפעל כראוי.\n יש להקיש על \'מחיקה והמרה…\' כדי להמשיך."
"מחיקה והמרה…"
"מצב צבע התמונה"
"שימוש ב-sRGB"
@@ -420,7 +420,7 @@
"תיקון צבע"
"תיקון צבע מאפשר לשנות את האופן שבו צבעים מוצגים במכשיר שלך"
"נעקף על ידי %1$s"
- "%1$s - %2$s"
+ "%1$s – %2$s"
"הזמן הנותר: בערך %1$s"
"הזמן הנותר: בערך %1$s (%2$s)"
"הזמן הנותר על סמך השימוש שלך: בערך %1$s"
@@ -443,9 +443,9 @@
"הטלפון עלול להיכבות בקרוב (%1$s)"
"הטאבלט עלול להיכבות בקרוב (%1$s)"
"המכשיר עלול להיכבות בקרוב (%1$s)"
- "%1$s - %2$s"
+ "%1$s – %2$s"
"נשארו %1$s עד הטעינה"
- "%1$s - %2$s עד הטעינה"
+ "%1$s – %2$s עד הטעינה"
"%1$s ﹣ מופעל מיטוב לשמירה על תקינות הסוללה"
"לא ידוע"
"בטעינה"
@@ -474,14 +474,14 @@
"הכי גדול"
"מותאם אישית (%d)"
"תפריט"
- "הזן סיסמה כדי לבצע איפוס להגדרות היצרן במצב הדגמה"
+ "יש להזין סיסמה כדי לבצע איפוס להגדרות היצרן במצב הדגמה"
"הבא"
"דרושה סיסמה"
"שיטות קלט פעילות"
"שימוש בשפות מערכת"
"פתיחת הגדרות עבור %1$s נכשלה"
- "ייתכן ששיטת קלט זו תוכל לאסוף את כל הטקסט שאתה מקליד, כולל נתונים אישיים כגון סיסמאות ומספרי כרטיס אשראי. היא מגיעה מהאפליקציה %1$s. האם להשתמש בשיטת קלט זו?"
- "שים לב: לאחר הפעלה מחדש של המכשיר, ניתן להפעיל את האפליקציה רק לאחר שתבטל את נעילת הטלפון"
+ "ייתכן ששיטת קלט זו תוכל לאסוף את כל הטקסט המוקלד, כולל נתונים אישיים כגון סיסמאות ומספרי כרטיס אשראי. היא מגיעה מהאפליקציה %1$s. האם להשתמש בשיטת קלט זו?"
+ "לתשומת ליבך: לאחר הפעלה מחדש של המכשיר, ניתן להפעיל את האפליקציה רק לאחר שתבטל את נעילת הטלפון"
"סטטוס הרשמה ל-IMS"
"רשום"
"לא רשום"
@@ -507,7 +507,7 @@
"בשעה %1$s"
"ב-%1$s"
"משך"
- "שאל בכל פעם"
+ "יש לשאול בכל פעם"
"עד הכיבוי"
"הרגע"
"רמקול של טלפון"
@@ -545,7 +545,7 @@
"פרופיל חדש"
"פרטי משתמש"
"פרטי פרופיל"
- "לפני שתוכל ליצור פרופיל מוגבל, תצטרך להגדיר נעילת מסך כדי להגן על האפליקציות ועל הנתונים האישיים שלך."
+ "לפני שיתאפשר לך ליצור פרופיל מוגבל, יהיה עליך להגדיר נעילת מסך כדי להגן על האפליקציות ועל הנתונים האישיים שלך."
"הגדרת נעילה"
"מעבר אל %s"
"הוספת אורח"
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index bc12fee6a9eb..decf940f14b7 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -359,7 +359,7 @@
"GPU жөндеу қабаттарын қосу"
"GPU жөндеу қабаттарының жүктелуіне рұқсат ету"
"Жеткізушілерді журналға тіркеу"
- "Қате туралы есепте қызмет көрсетушінің құрылғыға қатысты қосымша ақпаратын қамту. Мұнда жеке ақпарат көрсетілуі, батарея шығыны артуы және/немесе қосымша жад пайдаланылуы мүмкін."
+ "Қате туралы есепте жеткізушінің құрылғыға қатысты қосымша ақпараты қамтылады. Мұнда жеке ақпарат көрсетілуі, батарея шығыны артуы және/немесе қосымша жад пайдаланылуы мүмкін."
"Терезе анимациясының өлшемі"
"Ауысу анимациясының өлшемі"
"Аниматор ұзақтығы"
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"Зарядталғанға дейін %1$s қалды"
"%1$s – зарядталғанға дейін %2$s"
- "%1$s - Батареяның жұмыс істеу қабілеті оңтайландырылуда"
+ "%1$s - Батарея жұмысын оңтайландыру"
"Белгісіз"
"Зарядталуда"
"Жылдам зарядталуда"
@@ -496,7 +496,7 @@
"Бас тарту"
"Жарайды"
"Қосу"
- "\"Мазаламау\" режимін қосу"
+ "Мазаламау режимін қосу"
"Ешқашан"
"Маңыздылары ғана"
"%1$s. %2$s"
@@ -546,8 +546,8 @@
"Шектелген профайл жасақтауға дейін қолданбалар мен жеке деректерді қорғау үшін экран бекітпесін тағайындау қажет."
"Бекітпе тағайындау"
"%s пайдаланушысына ауысу"
- "Қонақты енгізу"
- "Қонақты өшіру"
+ "Қонақ қосу"
+ "Қонақты жою"
"Қонақ"
"Құрылғыны әдепкісінше реттеу"
"Өшірулі"
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index ce5ee87cc692..800e273941c7 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -547,7 +547,7 @@
"កំណត់ការចាក់សោ"
"ប្ដូរទៅ %s"
"បញ្ចូលភ្ញៀវ"
- "លុបភ្ញៀវ"
+ "ដកភ្ញៀវចេញ"
"ភ្ញៀវ"
"លំនាំដើមរបស់ឧបករណ៍"
"បានបិទ"
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index df25363d0cbf..682f4d5f9ca4 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"ಚಾರ್ಜ್ ಆಗಲು %1$s ಸಮಯ ಬಾಕಿ ಇದೆ"
"%1$s - ಚಾರ್ಜ್ ಆಗಲು %2$s ಸಮಯ ಬೇಕು"
- "%1$s - ಬ್ಯಾಟರಿಯ ಆರೋಗ್ಯಕ್ಕಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
+ "%1$s - ಬ್ಯಾಟರಿಯ ಸುಸ್ಥಿತಿಗಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
"ಅಪರಿಚಿತ"
"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"
"ವೇಗದ ಚಾರ್ಜಿಂಗ್"
diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml
index fe0f9e6ca464..36ae1e497d6b 100644
--- a/packages/SettingsLib/res/values-ky/arrays.xml
+++ b/packages/SettingsLib/res/values-ky/arrays.xml
@@ -86,7 +86,7 @@
- "карта14"
- - "Тутум тандаганды колдонуу (демейки)"
+ - "Система тандаганды колдонуу (демейки)"
- "SBC"
- "AAC"
- "Qualcomm® aptX™ аудио"
@@ -96,7 +96,7 @@
- "Qualcomm® aptX™ TWS+ аудио"
- - "Тутум тандаганды колдонуу (демейки)"
+ - "Система тандаганды колдонуу (демейки)"
- "SBC"
- "AAC"
- "Qualcomm® aptX™ аудио"
@@ -106,38 +106,38 @@
- "Qualcomm® aptX™ TWS+ аудио"
- - "Тутум тандаганды колдонуу (демейки)"
+ - "Система тандаганды колдонуу (демейки)"
- "44,1 кГц"
- "48,0 кГц"
- "88,2 кГц"
- "96,0 кГц"
- - "Тутум тандаганды колдонуу (демейки)"
+ - "Система тандаганды колдонуу (демейки)"
- "44,1 кГц"
- "48,0 кГц"
- "88,2 кГц"
- "96,0 кГц"
- - "Тутум тандаганды колдонуу (демейки)"
+ - "Система тандаганды колдонуу (демейки)"
- "16 бит/үлгү"
- "24 бит/үлгү"
- "32 бит/үлгү"
- - "Тутум тандаганды колдонуу (демейки)"
+ - "Система тандаганды колдонуу (демейки)"
- "16 бит/үлгү"
- "24 бит/үлгү"
- "32 бит/үлгү"
- - "Тутум тандаганды колдонуу (демейки)"
+ - "Система тандаганды колдонуу (демейки)"
- "Моно"
- "Стерео"
- - "Тутум тандаганды колдонуу (демейки)"
+ - "Система тандаганды колдонуу (демейки)"
- "Моно"
- "Стерео"
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index ce5313061e2d..47dd2665a665 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -142,7 +142,7 @@
"Android OS"
"Алынып салынган колдонмолор"
"Өчүрүлгөн колдонмолор жана колдонуучулар"
- "Тутум жаңыртуулары"
+ "Системанын жаңыртуулары"
"USB модем"
"Wi-Fi байланыш түйүнү"
"Bluetooth модем"
@@ -161,7 +161,7 @@
"Негизги тон"
"Синтезделген кептин интонациясына таасирин тийгизет"
"Тил"
- "Тутум тилин колдонуу"
+ "Системанын тилин колдонуу"
"Тил тандалган жок"
"Текстти окуй турган тилди тандоо"
"Үлгүнү угуу"
@@ -254,7 +254,7 @@
"Wi‑Fi иштетилген MAC даректерин башаламан түзүү"
"Мобилдик Интернет иштей берет"
"Модем режиминде аппараттын иштешин тездетүү"
- "Аталышсыз Bluetooth түзмөктөрү көрсөтүлсүн"
+ "Аталышсыз Bluetooth түзмөктөрү көрүнсүн"
"Үндүн абсолюттук деңгээли өчүрүлсүн"
"Gabeldorsche функциясын иштетүү"
"Bluetooth AVRCP версиясы"
@@ -478,7 +478,7 @@
"Кийинки"
"Сырсөз талап кылынат"
"Жигердүү киргизүү ыкмалары"
- "Тутум тилдерин колдонуу"
+ "Системанын тилдерин колдонуу"
"%1$s тууралоолору ачылган жок"
"Бул киргизүү ыкмасы сиз терген бардык тексттер, сырсөздөр жана кредиттик карталар сыяктуу жеке маалыматтарды кошо чогултушу мүмкүн. Бул %1$s колдонмосу менен байланыштуу. Ушул киргизүү ыкма колдонулсунбу?"
"Эскертүү: Өчүрүп-күйгүзгөндөн кийин, бул колдонмо телефондун кулпусу ачылмайынча иштебейт"
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index b5894f6bdf51..e1345bff66d1 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -206,7 +206,7 @@
"USB perkrova"
"Derinimo režimas, kai prijungtas USB"
"Panaikinti USB derinimo prieigos teises"
- "Belaidžio ryšio derinimas"
+ "Belaidžio ryšio derin."
"Derinimo režimas, kai prisijungta prie „Wi‑Fi“"
"Klaida"
"Belaidžio ryšio derinimas"
diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml
index 497611d24919..c36744a87cfc 100644
--- a/packages/SettingsLib/res/values-mk/arrays.xml
+++ b/packages/SettingsLib/res/values-mk/arrays.xml
@@ -142,9 +142,9 @@
- "Стерео"
- - "Оптимизирано за квалитет на аудиото (990 кб/с - 909 кб/с)"
+ - "Оптимизирано за квалитет на аудиото (990 kbps - 909 kbps)"
- "Балансиран квалитет на звукот и врската (660 kb/s/606 kb/s)"
- - "Оптимизирано за квалитет на врската (330 кб/с - 303 кб/с)"
+ - "Оптимизирано за квалитет на врската (330 kbps - 303 kbps)"
- "Најдобар напор (приспособлива стапка на битови)"
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index e9f707003fc2..a5c32816a41e 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"പൂർണ്ണമായി ചാർജാവാൻ %1$s ശേഷിക്കുന്നു"
"%1$s - പൂർണ്ണമായി ചാർജാവാൻ %2$s"
- "%1$s - ബാറ്ററി നില ഒപ്റ്റിമൈസ് ചെയ്യുന്നു"
+ "%1$s - ബാറ്ററിയുടെ ആയുസിനായി ഒപ്റ്റിമൈസ് ചെയ്യുന്നു"
"അജ്ഞാതം"
"ചാർജ് ചെയ്യുന്നു"
"അതിവേഗ ചാർജിംഗ്"
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 6b628bdf02bf..d8ddefd33a3a 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -396,8 +396,8 @@
- "Дижитал агуулгад зориулан тааруулсан өнгө"
"Зогсолтын горимын апп"
- "Идэвхгүй байна. Унтраах/асаахын тулд дарна уу."
- "Идэвхтэй байна. Унтраах/асаахын тулд дарна уу."
+ "Идэвхгүй байна. Асаах/унтраахын тулд дарна уу."
+ "Идэвхтэй байна. Асаах/унтраахын тулд дарна уу."
"Апп зогсолтын горимын төлөв: %s"
"Ажиллаж байгаа үйлчилгээнүүд"
"Одоо ажиллаж байгаа үйлчилгээнүүдийг харах болон хянах"
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"Цэнэглэх хүртэл үлдсэн %1$s"
"%1$s - цэнэглэх хүртэл %2$s"
- "%1$s - Батарейн чанарыг оновчилж байна"
+ "%1$s - Батарейн барилтыг оновчилж байна"
"Тодорхойгүй"
"Цэнэглэж байна"
"Хурдан цэнэглэж байна"
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index c473a60adde2..4a8a6b241831 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -168,7 +168,7 @@
"उच्चार संश्लेषणाचे एक छोटेसे प्रात्यक्षिक प्ले करा"
"व्हॉइस डेटा इंस्टॉल करा"
"उच्चार संश्लेषणासाठी आवश्यक आवाज डेटा इंस्टॉल करा"
- "हे उच्चार संश्लेषण इंजिन पासवर्ड आणि क्रेडिट कार्ड नंबर यासारख्या वैयक्तिक मजकुरासह, बोलला जाणारा सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. हे %s इंजिनवरून येते. या उच्चार संश्लेषण इंजिनचा वापर सक्षम करायचा?"
+ "हे उच्चार संश्लेषण इंजीन पासवर्ड आणि क्रेडिट कार्ड नंबर यासारख्या वैयक्तिक मजकुरासह, बोलला जाणारा सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. हे %s इंजीनवरून येते. या उच्चार संश्लेषण इंजीनचा वापर सक्षम करायचा?"
"या भाषेस टेक्स्ट टू स्पीचसाठी एका नेटवर्क कनेक्शनची आवश्यकता आहे."
"हे उच्चार संश्लेषणाचे एक उदाहरण आहे"
"डीफॉल्ट भाषा स्थिती"
@@ -177,8 +177,8 @@
"%1$s समर्थित नाही"
"तपासत आहे..."
"%s साठी सेटिंग्ज"
- "इंजिन सेटिंग्ज लाँच करा"
- "प्राधान्य इंजिन"
+ "इंजीन सेटिंग्ज लाँच करा"
+ "प्राधान्य इंजीन"
"सामान्य"
"उच्चार पिच रीसेट करा"
"डीफॉल्टवर मजकूर ज्या पिचवर बोलला जातो तो रीसेट करा."
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 9262d5b7abe3..c9e46fce102d 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -67,7 +67,7 @@
"Memutuskan sambungan..."
"Menyambung..."
"%1$s disambungkan"
- "Memasangkan..."
+ "Menggandingkan..."
"Disambungkan (tiada telefon)%1$s"
"Disambungkan (tiada media)%1$s"
"Disambungkan (tiada akses mesej)%1$s"
@@ -112,7 +112,7 @@
"Gunakan untuk pemindahan fail"
"Gunakan untuk input"
"Gunakan untuk Alat Bantu Dengar"
- "Jadikan pasangan"
+ "Gandingkan"
"JADIKAN PASANGAN"
"Batal"
"Berpasangan memberi anda akses kepada kenalan dan sejarah panggilan apabila disambungkan."
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index f2ed8a28dbee..03903cb41e78 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -306,7 +306,7 @@
"သင် ယခင်က ခွင့်ပြုခဲ့သော ကွန်ပျူတာအားလုံးမှ ယူအက်စ်ဘီ အမှားစစ်ခွင့်ကို ရုတ်သိမ်းမည်လား ?"
"တည်ဆောက်ပြုပြင်ရန်ဆက်တင်များကို အသုံးပြုခွင့်ပေးမည်လား?"
"ဤဆက်တင်းများကို တည်ဆောက်ပြုပြင်ရာတွင် သုံးရန်အတွက်သာ ရည်ရွယ်သည်။ ၎င်းတို့သည် သင်၏စက်နှင့် အပလီကေးရှင်းများကို ရပ်စေခြင်း သို့ လုပ်ဆောင်ချက်မမှန်ကန်ခြင်းများ ဖြစ်ပေါ်စေနိုင်သည်။"
- "USB ဖြင့် အက်ပ်များကို အတည်ပြုစိစစ်ရန်"
+ "USB ဖြင့် အက်ပ်များစိစစ်ရန်"
"ADB/ADT မှတစ်ဆင့် ထည့်သွင်းသော အက်ပ်များ အန္တရာယ်ဖြစ်နိုင်ခြင်း ရှိမရှိ စစ်ဆေးသည်။"
"အမည်မရှိသော (MAC လိပ်စာများသာပါသော) ဘလူးတုသ်စက်ပစ္စည်းများကို ပြသပါမည်"
"ချိတ်ဆက်ထားသည့် ကိရိယာတွင် လက်မခံနိုင်လောက်အောင် ဆူညံ သို့မဟုတ် ထိန်းညှိမရနိုင်သော အသံပိုင်းပြဿနာ ရှိခဲ့လျှင် ဘလူးတုသ် ပကတိ အသံနှုန်းကို ပိတ်ပါ။"
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index b8a010a6ed7b..634bc1cc3d7e 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -117,7 +117,7 @@
"Avbryt"
"Med sammenkobling får den andre enheten tilgang til kontaktene og anropsloggen din når den er tilkoblet."
"Kan ikke koble til %1$s."
- "Kan ikke koble til %1$s på grunn av feil personlig kode eller passord."
+ "Kan ikke koble til %1$s på grunn av feil PIN-kode eller passord."
"Kan ikke kommunisere med %1$s."
"%1$s avslo paring."
"Datamaskin"
@@ -446,7 +446,7 @@
"%1$s – %2$s"
"%1$s til batteriet er fulladet"
"%1$s – %2$s til batteriet er fulladet"
- "%1$s – Optimaliserer batteritilstanden"
+ "%1$s – optimaliserer batteritilstanden"
"Ukjent"
"Lader"
"Lader raskt"
diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml
index cbb0270b25c4..f59b9dcb4469 100644
--- a/packages/SettingsLib/res/values-ne/arrays.xml
+++ b/packages/SettingsLib/res/values-ne/arrays.xml
@@ -256,7 +256,7 @@
- "Deuteranomaly का लागि क्षेत्रहरू देखाउनुहोस्"
- - "मानक सीमा"
+ - "डिफल्ट सीमा"
- "कुनै पृष्ठभूमि प्रक्रियाहरू छैनन्"
- "बढीमा १ प्रक्रिया"
- "बढीमा २ प्रक्रियाहरू"
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index aa759c82a87d..dd4823d3e1f3 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -388,7 +388,7 @@
- "जोसिलो (पूर्व निर्धारित)"
- "प्राकृतिक"
- - "मानक"
+ - "डिफल्ट"
- "परिष्कृत रङ्गहरू"
@@ -532,7 +532,7 @@
"प्रतिबन्धित प्रोफाइल"
"नयाँ प्रयोगकर्ता थप्ने हो?"
"तपाईं थप प्रयोगकर्ताहरू सिर्जना गरेर ती प्रयोगकर्तालाई यो यन्त्र प्रयोग गर्न दिन सक्नुहुन्छ। हरेक प्रयोगकर्ताको आफ्नै ठाउँ हुन्छ। उनीहरू यो ठाउँमा आफ्नै एप, वालपेपर आदिका लागि प्रयोग गर्न सक्छन्। उनीहरू सबैजनालाई असर पार्ने Wi-Fi जस्ता यन्त्रका सेटिङहरू पनि परिवर्तन गर्न सक्छन्।\n\nतपाईंले नयाँ प्रयोगकर्ता थप्दा उक्त व्यक्तिले आफ्नो ठाउँ सेटअप गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ता अन्य सबै प्रयोगकर्ताले प्रयोग गर्ने एपहरू अद्यावधिक गर्न सक्छन्। तर पहुँचसम्बन्धी सेटिङ तथा सेवाहरू नयाँ प्रयोगकर्तामा नसर्न सक्छ।"
- "जब तपाईंले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यो व्यक्तिले आफ्नो ठाउँ सेट गर्न आवश्यक छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि एपहरू अद्यावधिक गर्न सक्छन्।"
+ "तपाईंले नयाँ प्रयोगकर्ता थप्नुभयो भने ती प्रयोगकर्ताले आफ्नो स्पेस सेट गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ताले अरू प्रयोगकर्ताका एपहरू अपडेट गर्न सक्छन्।"
"अहिले प्रयोगकर्ता सेटअप गर्ने हो?"
"यी व्यक्ति यन्त्र यो यन्त्र चलाउन र आफ्नो ठाउँ सेट गर्न उपलब्ध छन् भन्ने कुरा सुनिश्चित गर्नुहोस्"
"अहिले प्रोफाइल सेटअप गर्ने हो?"
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index a48e50681ed0..dc14ff10d736 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -59,9 +59,9 @@
- "HDCP-controle altijd gebruiken"
- - "Uitgeschakeld"
- - "Gefilterd ingeschakeld"
- - "Ingeschakeld"
+ - "Uitgezet"
+ - "Gefilterd staat aan"
+ - "Aangezet"
- "AVRCP 1.5 (standaard)"
@@ -252,8 +252,8 @@
- "Uit"
- - "Gedeeltes met overbelasting weergeven"
- - "Gebieden voor deuteranomalie weergeven"
+ - "Gedeelten met overbelasting tonen"
+ - "Gebieden voor deuteranomalie tonen"
- "Standaardlimiet"
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 9c2cb983b96a..d029dbd8b1d1 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -24,7 +24,7 @@
"Geen"
"Opgeslagen"
"Verbinding verbroken"
- "Uitgeschakeld"
+ "Uitgezet"
"IP-configuratie mislukt"
"Niet verbonden wegens netwerk van lage kwaliteit"
"Wifi-verbinding mislukt"
@@ -131,7 +131,7 @@
"Rechter hoortoestel koppelen…"
"Links: batterijniveau %1$s"
"Rechts: batterijniveau %1$s"
- "Wifi: uitgeschakeld."
+ "Wifi staat uit."
"Wifi-verbinding verbroken."
"Wifi: één streepje."
"Wifi: twee streepjes."
@@ -168,7 +168,7 @@
"Een korte demonstratie van spraaksynthese afspelen"
"Spraakgegevens installeren"
"De spraakgegevens voor spraaksynthese installeren"
- "Deze engine voor spraaksynthese kan mogelijk alle tekst verzamelen die wordt gesproken, waaronder persoonsgegevens zoals wachtwoorden en creditcardnummers. Deze engine is afkomstig van de %s-engine. Het gebruik van deze engine voor spraaksynthese inschakelen?"
+ "Deze engine voor spraaksynthese kan mogelijk alle tekst verzamelen die wordt gesproken, waaronder persoonsgegevens zoals wachtwoorden en creditcardnummers. Deze engine is afkomstig van de %s-engine. Het gebruik van deze engine voor spraaksynthese aanzetten?"
"Deze taal heeft een werkende netwerkverbinding nodig voor tekst-naar-spraak-uitvoer."
"Dit is een voorbeeld van spraaksynthese"
"Status van standaardtaal"
@@ -197,7 +197,7 @@
"Persoonlijk"
"Werk"
"Ontwikkelaarsopties"
- "Opties voor ontwikkelaars inschakelen"
+ "Opties voor ontwikkelaars aanzetten"
"Opties instellen voor appontwikkeling"
"Ontwikkelaarsopties zijn niet beschikbaar voor deze gebruiker"
"Instellingen voor VPN zijn niet beschikbaar voor deze gebruiker"
@@ -210,7 +210,7 @@
"Foutopsporingsmodus als wifi is verbonden"
"Fout"
"Draadloze foutopsporing"
- "Schakel draadloze foutopsporing in om beschikbare apparaten te bekijken en te gebruiken"
+ "Zet draadloze foutopsporing aan om beschikbare apparaten te bekijken en te gebruiken"
"Apparaat koppelen met QR-code"
"Nieuwe apparaten koppelen via QR-codescanner"
"Apparaat koppelen met koppelingscode"
@@ -235,15 +235,15 @@
"Maak verbinding met een wifi-netwerk"
"adb, foutopsporing, ontwikkeling"
"Snelle link naar bugrapport"
- "Een knop in het aan/uit-menu weergeven om een bugrapport te maken"
+ "Een knop in het aan/uit-menu tonen om een bugrapport te maken"
"Stand-by"
"Scherm gaat nooit uit tijdens het opladen"
- "Snoop-logbestand voor Bluetooth-HCI inschakelen"
- "Bluetooth-pakketten opslaan. (Schakel Bluetooth in nadat je deze instelling hebt gewijzigd)."
+ "Snoop-logbestand voor bluetooth-HCI aanzetten"
+ "Bluetooth-pakketten opslaan. (Zet Bluetooth aan nadat je deze instelling hebt gewijzigd)."
"OEM-ontgrendeling"
"Toestaan dat de bootloader wordt ontgrendeld"
"OEM-ontgrendeling toestaan?"
- "WAARSCHUWING: De apparaatbeveiligingsfuncties werken niet op dit apparaat wanneer deze instelling is ingeschakeld."
+ "WAARSCHUWING: De apparaatbeveiligingsfuncties werken niet op dit apparaat als deze instelling aanstaat."
"App voor neplocatie selecteren"
"Geen app voor neplocatie ingesteld"
"App voor neplocatie: %1$s"
@@ -254,9 +254,9 @@
"Via wifi ondersteunde MAC-herschikking"
"Mobiele data altijd actief"
"Hardwareversnelling voor tethering"
- "Bluetooth-apparaten zonder namen weergeven"
- "Absoluut volume uitschakelen"
- "Gabeldorsche inschakelen"
+ "Bluetooth-apparaten zonder naam tonen"
+ "Absoluut volume uitzetten"
+ "Gabeldorsche aanzetten"
"Bluetooth-AVRCP-versie"
"Bluetooth-AVRCP-versie selecteren"
"MAP-versie voor bluetooth"
@@ -280,10 +280,10 @@
"Hostnaam van privé-DNS-provider"
"Geef hostnaam van DNS-provider op"
"Kan geen verbinding maken"
- "Opties weergeven voor certificering van draadloze weergave"
- "Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer"
+ "Opties tonen voor certificering van draadloze weergave"
+ "Logniveau voor wifi verhogen, tonen per SSID RSSI in wifi-kiezer"
"Verlaagt het batterijverbruik en verbetert de netwerkprestaties"
- "Als deze modus is ingeschakeld, kan het MAC-adres van dit apparaat elke keer wijzigen als het verbinding maakt met een netwerk waarvoor MAC-herschikking is ingeschakeld."
+ "Als deze modus aanstaat, kan het MAC-adres van dit apparaat wijzigen telkens als het apparaat verbinding maakt met een netwerk waarvoor MAC-herschikking aanstaat."
"Met datalimiet"
"Gratis"
"Logger-buffergrootten"
@@ -296,7 +296,7 @@
"USB-configuratie selecteren"
"Neplocaties toestaan"
"Neplocaties toestaan"
- "Inspectie van weergavekenmerk inschakelen"
+ "Inspectie van weergavekenmerk aanzetten"
"Mobiele data altijd actief houden, ook als wifi actief is (voor sneller schakelen tussen netwerken)."
"Hardwareversnelling voor tethering gebruiken indien beschikbaar"
"USB-foutopsporing toestaan?"
@@ -308,12 +308,12 @@
"Deze instellingen zijn uitsluitend bedoeld voor ontwikkelingsgebruik. Je apparaat en apps kunnen hierdoor vastlopen of anders reageren."
"Apps verifiëren via USB"
"Apps die zijn geïnstalleerd via ADB/ADT, controleren op schadelijk gedrag"
- "Bluetooth-apparaten zonder namen (alleen MAC-adressen) worden weergegeven"
- "Hiermee wordt de functie voor absoluut volume van Bluetooth uitgeschakeld in geval van volumeproblemen met externe apparaten, zoals een onacceptabel hoog volume of geen volumeregeling."
- "Hierdoor wordt de Gabeldorsche-functiestack voor bluetooth ingeschakeld."
- "Hiermee wordt de functie voor verbeterde connectiviteit ingeschakeld."
+ "Bluetooth-apparaten zonder naam (alleen MAC-adressen) worden weergegeven"
+ "Hiermee wordt de functie voor absoluut volume van Bluetooth uitgezet in geval van volumeproblemen met externe apparaten, zoals een onacceptabel hoog volume of geen volumeregeling."
+ "Hierdoor wordt de Gabeldorsche-functiestack voor bluetooth aangezet."
+ "Hiermee wordt de functie voor verbeterde connectiviteit aangezet."
"Lokale terminal"
- "Terminal-app inschakelen die lokale shell-toegang biedt"
+ "Terminal-app aanzetten die lokale shell-toegang biedt"
"HDCP-controle"
"HDCP-controlegedrag instellen"
"Foutopsporing"
@@ -329,36 +329,36 @@
"Rendering met hardwareversnelling"
"Media"
"Controle"
- "Strikte modus ingeschakeld"
+ "Strikte modus staat aan"
"Knipperend scherm bij lange bewerkingen door apps"
"Cursorlocatie"
"Schermoverlay met huidige aanraakgegevens"
- "Tikken weergeven"
- "Visuele feedback weergeven voor tikken"
- "Oppervlakupdates weergeven"
+ "Tikken tonen"
+ "Visuele feedback tonen voor tikken"
+ "Oppervlakupdates tonen"
"Volledige vensteroppervlakken flashen bij updates"
"Weergave-updates tonen"
- "Flash-weergave in vensters bij update"
+ "Flash-weergaven in vensters bij update"
"Hardwarelayer-upd. tonen"
"Hardwarelagen knipperen groen bij updates"
"Foutopsporing GPU-overbelasting"
- "HW-overlays uitschakelen"
+ "HW-overlays uitzetten"
"GPU altijd gebruiken voor schermcompositing"
"Kleurruimte simuleren"
- "OpenGL-sporen inschakelen"
+ "OpenGL-sporen aanzetten"
"USB-audiorouting uitsch."
"Autom. routing naar USB-randapparatuur uitsch."
- "Indelingsgrenzen weergeven"
- "Clipgrenzen, marges en meer weergeven"
+ "Indelingsgrenzen tonen"
+ "Clipgrenzen, marges en meer tonen"
"V.r.n.l.-indelingsrichting afdwingen"
"Schermindelingsrichting geforceerd instellen op v.r.n.l. voor alle talen"
"4x MSAA forceren"
- "4x MSAA inschakelen in OpenGL ES 2.0-apps"
+ "4x MSAA aanzetten in OpenGL ES 2.0-apps"
"Foutopsporing niet-rechthoekig bijsnijden"
"HWUI-weergave van profiel"
- "GPU-foutopsporingslagen inschakelen"
+ "GPU-foutopsporingslagen aanzetten"
"Laden van GPU-foutopsporingslagen toestaan voor foutopsporingsapps"
- "Uitgebreide leverancierslogboeken inschakelen"
+ "Uitgebreide leverancierslogboeken aanzetten"
"Aanvullende apparaatspecifieke leverancierslogboeken opnemen in bugrapporten. Deze kunnen privégegevens bevatten, meer batterijlading gebruiken en/of meer opslagruimte gebruiken."
"Vensteranimatieschaal"
"Overgangsanimatieschaal"
@@ -370,14 +370,14 @@
"Achtergrondproceslimiet"
"ANR\'s op de achtergrond"
"Dialoogvenster \'App reageert niet\' weergeven voor achtergrond-apps"
- "Kanaalwaarschuwingen voor meldingen weergeven"
+ "Kanaalwaarschuwingen voor meldingen tonen"
"Geeft een waarschuwing op het scherm weer wanneer een app een melding post zonder geldig kanaal"
"Toestaan van apps op externe opslag afdwingen"
"Hiermee komt elke app in aanmerking voor schrijven naar externe opslag, ongeacht de manifestwaarden"
"Formaat activiteiten geforceerd aanpasbaar maken"
"Het formaat van alle activiteiten aanpasbaar maken, ongeacht de manifestwaarden."
- "Vensters met vrije vorm inschakelen"
- "Ondersteuning voor vensters met experimentele vrije vorm inschakelen."
+ "Vensters met vrije vorm aanzetten"
+ "Ondersteuning voor vensters met experimentele vrije vorm aanzetten."
"Wachtwoord desktopback-up"
"Volledige back-ups naar desktops zijn momenteel niet beveiligd"
"Tik om het wachtwoord voor volledige back-ups naar desktops te wijzigen of te verwijderen"
@@ -400,7 +400,7 @@
"Actief. Tik om te schakelen."
"Stand-bystatus app: %s"
"Actieve services"
- "Services die momenteel actief zijn, weergeven en beheren"
+ "Services die momenteel actief zijn, bekijken en beheren"
"WebView-implementatie"
"WebView-implementatie instellen"
"Deze keuze is niet meer geldig. Probeer het opnieuw."
@@ -412,7 +412,7 @@
"Wissen en converteren…"
"Kleurenmodus voor afbeeldingen"
"sRGB gebruiken"
- "Uitgeschakeld"
+ "Uitgezet"
"Totale kleurenblindheid"
"Deuteranomalie (rood-groen)"
"Protanomalie (rood-groen)"
@@ -437,12 +437,12 @@
"Nog minder dan %1$s (%2$s)"
"Nog meer dan %1$s (%2$s)"
"Meer dan %1$s"
- "Telefoon wordt binnenkort mogelijk uitgeschakeld"
- "Tablet wordt binnenkort mogelijk uitgeschakeld"
- "Apparaat wordt binnenkort mogelijk uitgeschakeld"
- "Telefoon wordt binnenkort mogelijk uitgeschakeld (%1$s)"
- "Tablet wordt binnenkort mogelijk uitgeschakeld (%1$s)"
- "Apparaat wordt binnenkort mogelijk uitgeschakeld (%1$s)"
+ "Telefoon wordt binnenkort mogelijk uitgezet"
+ "Tablet wordt binnenkort mogelijk uitgezet"
+ "Apparaat wordt binnenkort mogelijk uitgezet"
+ "Telefoon wordt binnenkort mogelijk uitgezet (%1$s)"
+ "Tablet wordt binnenkort mogelijk uitgezet (%1$s)"
+ "Apparaat wordt binnenkort mogelijk uitgezet (%1$s)"
"%1$s - %2$s"
"Nog %1$s tot opgeladen"
"%1$s - %2$s tot opgeladen"
@@ -455,7 +455,7 @@
"Aangesloten, kan nu niet opladen"
"Volledig"
"Ingesteld door beheerder"
- "Uitgeschakeld"
+ "Uitgezet"
"Toegestaan"
"Niet toegestaan"
"Onbekende apps installeren"
@@ -480,7 +480,7 @@
"Actieve invoermethoden"
"Systeemtalen gebruiken"
"Instellingen openen voor %1$s mislukt"
- "Deze invoermethode verzamelt mogelijk alle tekst die je typt, inclusief persoonsgegevens zoals wachtwoorden en creditcardnummers. De methode is afkomstig uit de app %1$s. Deze invoermethode inschakelen?"
+ "Deze invoermethode verzamelt mogelijk alle tekst die je typt, inclusief persoonsgegevens zoals wachtwoorden en creditcardnummers. De methode is afkomstig uit de app %1$s. Deze invoermethode aanzetten?"
"Opmerking: Wanneer je telefoon opnieuw is opgestart, kan deze app pas worden gestart nadat je je telefoon hebt ontgrendeld"
"IMS-registratiestatus"
"Geregistreerd"
@@ -495,21 +495,21 @@
"Minder tijd."
"Annuleren"
"OK"
- "Inschakelen"
- "Schakel Niet storen in."
+ "Aanzetten"
+ "Zet Niet storen aan."
"Nooit"
"Alleen prioriteit"
"%1$s. %2$s"
- "Je hoort je volgende wekker niet %1$s tenzij je dit vóór die tijd uitschakelt"
+ "Je hoort je volgende wekker niet %1$s tenzij je dit vóór die tijd uitzet"
"Je hoort je volgende wekker niet %1$s"
"om %1$s"
"op %1$s"
"Duur"
"Altijd vragen"
- "Totdat je uitschakelt"
+ "Totdat je uitzet"
"Zojuist"
"Telefoonspeaker"
- "Probleem bij verbinding maken. Schakel het apparaat uit en weer in."
+ "Probleem bij verbinding maken. Zet het apparaat uit en weer aan."
"Bedraad audioapparaat"
"Hulp en feedback"
"Opslag"
@@ -550,8 +550,8 @@
"Gast verwijderen"
"Gast"
"Apparaatstandaard"
- "Uitgeschakeld"
- "Ingeschakeld"
+ "Uitgezet"
+ "Aangezet"
"Je apparaat moet opnieuw worden opgestart om deze wijziging toe te passen. Start nu opnieuw op of annuleer de wijziging."
"Bedrade hoofdtelefoon"
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 173ae1ccceff..aec99fd3ab84 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -114,7 +114,7 @@
"ଶ୍ରବଣ ଯନ୍ତ୍ର ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"
"ପେୟାର୍"
"ପେୟାର୍"
- "କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"
+ "ବାତିଲ୍ କରନ୍ତୁ"
"ପେୟାରିଂ ଫଳରେ ସଂଯୁକ୍ତ ଥିବା ବେଳେ ଆପଣଙ୍କ ସମ୍ପର୍କଗୁଡ଼ିକୁ ଏବଂ କଲ୍ର ଇତିବୃତିକୁ ଆକସେସ୍ ମଞ୍ଜୁର ହୁଏ।"
"%1$s ସହ ପେୟାର୍ କରିହେଲା ନାହିଁ।"
"ଏକ ଭୁଲ୍ PIN କିମ୍ବା ପାସକୀ କାରଣରୁ %1$s ସହ ପେୟାର୍ କରିପାରିଲା ନାହିଁ।"
@@ -493,7 +493,7 @@
"ଅଧିକ ସମୟ।"
"କମ୍ ସମୟ।"
- "କ୍ୟାନ୍ସଲ୍"
+ "ବାତିଲ୍"
"ଠିକ୍ ଅଛି"
"ଚାଲୁ କରନ୍ତୁ"
"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରନ୍ତୁ"
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 177e29377ee3..84dc9fe9a38b 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"ਚਾਰਜ ਹੋਣ ਵਿੱਚ %1$s ਬਾਕੀ"
"%1$s - %2$s ਤੱਕ ਚਾਰਜ ਹੋ ਜਾਵੇਗੀ"
- "%1$s - ਬੈਟਰੀ ਸਥਿਤੀ ਲਈ ਅਨੁਕੂਲ ਬਣਾਇਆ ਜਾ ਰਿਹਾ"
+ "%1$s - ਬੈਟਰੀ ਦੀ ਸਥਿਤੀ ਲਈ ਅਨੁਕੂਲ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
"ਅਗਿਆਤ"
"ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"
"ਤੇਜ਼ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ"
@@ -468,7 +468,7 @@
"%1$s ਪਹਿਲਾਂ"
"%1$s ਬਾਕੀ"
"ਛੋਟਾ"
- "ਪੂਰਵ-ਨਿਰਧਾਰਤ"
+ "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ"
"ਵੱਡੀ"
"ਥੋੜ੍ਹਾ ਵੱਡੀ"
"ਸਭ ਤੋਂ ਵੱਡੀ"
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 00cc98728729..38bc6e1c3547 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -446,7 +446,7 @@
"%1$s – %2$s"
"Do naładowania %1$s"
"%1$s – do naładowania %2$s"
- "%1$s – Optymalizuję, by utrzymać baterię w dobrym stanie"
+ "%1$s – Optymalizuję, aby utrzymać baterię w dobrym stanie"
"Nieznane"
"Ładowanie"
"Szybkie ładowanie"
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 21cacc82b178..ebe7c455a3f9 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -548,7 +548,7 @@
"Чтобы создать профиль с ограниченным доступом, необходимо предварительно настроить блокировку экрана для защиты приложений и личных данных"
"Включить блокировку"
"Переключиться на этот аккаунт: %s"
- "Добавить аккаунт гостя"
+ "Добавить гостя"
"Удалить аккаунт гостя"
"Гость"
"Вариант по умолчанию"
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 9cc7a20819ba..24b7710ce1b1 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"ආරෝපණය වන තෙක් %1$s ඇත"
"%1$s - ආරෝපණය වන තෙක් %2$s"
- "%1$s - බැටරි සෞඛ්යය සඳහා ප්රශස්ත කරමින්"
+ "%1$s - බැටරි ආයු කාලය වැඩි දියුණු කරමින්"
"නොදනී"
"ආරෝපණය වෙමින්"
"ශීඝ්ර ආරෝපණය"
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index be2e1a8778e8..68e1e5deaf19 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -446,7 +446,7 @@
"%1$s – %2$s"
"Še %1$s do polne napolnjenosti"
"%1$s – %2$s do polne napolnjenosti"
- "%1$s – Optimizacija za ohran. zmog. baterije"
+ "%1$s – Optimizacija za ohranjanje zmogljivosti baterije"
"Neznano"
"Polnjenje"
"Hitro polnjenje"
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 2b59a92c6c3a..947eb4351655 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -446,7 +446,7 @@
"%1$s – %2$s"
"Напуниће се за %1$s"
"%1$s – напуниће се за %2$s"
- "%1$s – Оптимизује се ради стања батерије"
+ "%1$s – Оптимизује се ради бољег стања батерије"
"Непознато"
"Пуни се"
"Брзо се пуни"
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index b15105298933..def4238780b5 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -546,7 +546,7 @@
"Kabla uunde wasifu uliowekekwa vikwazo, utahitajika kuweka skrini iliyofungwa ili kulinda programu zako na data binafsi."
"Weka ufunguo"
"Badili utumie %s"
- "Weka mgeni"
+ "Ongeza mgeni"
"Ondoa mgeni"
"Mgeni"
"Hali chaguomsingi ya kifaa"
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 58758bfc3ec9..f6d4a3d3150c 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -388,7 +388,7 @@
- "வைபிரன்ட் (இயல்பு)"
- "இயற்கை வண்ணம்"
- - "வழக்கமான வண்ணம்"
+ - "இயல்புநிலை"
- "மேம்படுத்தப்பட்ட வண்ணங்கள்"
diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml
index 1363a4021bc6..d8da71443404 100644
--- a/packages/SettingsLib/res/values-te/arrays.xml
+++ b/packages/SettingsLib/res/values-te/arrays.xml
@@ -256,7 +256,7 @@
- "డ్యూటెరానోమలీ కోసం ప్రాంతాలను చూపండి"
- - "ప్రామాణిక పరిమితి"
+ - "స్టాండర్డ్ పరిమితి"
- "నేపథ్య ప్రాసెస్లు లేవు"
- "గరిష్టంగా 1 ప్రాసెస్"
- "గరిష్టంగా 2 ప్రాసెస్లు"
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 05dbd43f2daa..cb6461fe45c3 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -140,15 +140,15 @@
"ఓపెన్ నెట్వర్క్"
"సురక్షిత నెట్వర్క్"
"Android OS"
- "తీసివేయబడిన అనువర్తనాలు"
- "తీసివేయబడిన అనువర్తనాలు మరియు వినియోగదారులు"
+ "తీసివేయబడిన యాప్లు"
+ "తీసివేయబడిన యాప్లు మరియు వినియోగదారులు"
"సిస్టమ్ అప్డేట్లు"
"USB టీథరింగ్"
"పోర్టబుల్ హాట్స్పాట్"
"బ్లూటూత్ టెథెరింగ్"
"టీథరింగ్"
"టీథరింగ్ & పోర్టబుల్ హాట్స్పాట్"
- "అన్ని కార్యాలయ అనువర్తనాలు"
+ "అన్ని కార్యాలయ యాప్లు"
"అతిథి"
"తెలియదు"
"వినియోగదారు: %1$s"
@@ -313,14 +313,14 @@
"బ్లూటూత్ Gabeldorsche ఫీచర్ స్ట్యాక్ను ఎనేబుల్ చేస్తుంది."
"మెరుగైన కనెక్టివిటీ ఫీచర్ను ఎనేబుల్ చేస్తుంది."
"స్థానిక టెర్మినల్"
- "స్థానిక షెల్ ప్రాప్యతను అందించే టెర్మినల్ అనువర్తనాన్ని ప్రారంభించు"
+ "స్థానిక షెల్ ప్రాప్యతను అందించే టెర్మినల్ యాప్ను ప్రారంభించు"
"HDCP తనిఖీ"
"HDCP తనిఖీ ప్రవర్తనను సెట్ చేయండి"
"డీబగ్గింగ్"
"డీబగ్ యాప్ను ఎంచుకోండి"
"డీబగ్ యాప్ సెట్ చేయబడలేదు"
"డీబగ్గింగ్ యాప్: %1$s"
- "అనువర్తనాన్ని ఎంచుకోండి"
+ "యాప్ను ఎంచుకోండి"
"ఏదీ వద్దు"
"డీబగ్గర్ కోసం వేచి ఉండండి"
"డీబగ్ చేయబడిన యాప్ అమలు కావడానికి ముందు జోడించాల్సిన డీబగ్గర్ కోసం వేచి ఉంటుంది"
@@ -388,7 +388,7 @@
- "సచేతనం (డిఫాల్ట్)"
- "సహజం"
- - "ప్రామాణికం"
+ - "స్టాండర్డ్"
- "మెరుగైన రంగులు"
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"ఛార్జ్ అవ్వడానికి %1$s సమయం మిగిలి ఉంది"
"%1$s - ఛార్జ్ అవ్వడానికి %2$s పడుతుంది"
- "%1$s - బ్యాటరీ స్థితిని ఆప్టిమైజ్ చేయడం కోసం"
+ "%1$s - బ్యాటరీ జీవితకాలాన్ని పెంచడం కోసం ఆప్టిమైజ్ చేస్తోంది"
"తెలియదు"
"ఛార్జ్ అవుతోంది"
"వేగవంతమైన ఛార్జింగ్"
@@ -543,10 +543,10 @@
"కొత్త ప్రొఫైల్"
"వినియోగదారు సమాచారం"
"ప్రొఫైల్ సమాచారం"
- "మీరు పరిమితం చేయబడిన ప్రొఫైల్ను సృష్టించడానికి ముందు, మీ అనువర్తనాలు మరియు వ్యక్తిగత డేటాను రక్షించడానికి స్క్రీన్ లాక్ను సెటప్ చేయాల్సి ఉంటుంది."
+ "మీరు పరిమితం చేయబడిన ప్రొఫైల్ను సృష్టించడానికి ముందు, మీ యాప్లు మరియు వ్యక్తిగత డేటాను రక్షించడానికి స్క్రీన్ లాక్ను సెటప్ చేయాల్సి ఉంటుంది."
"లాక్ను సెట్ చేయి"
"%sకు మార్చు"
- "అతిథిని జోడించండి"
+ "గెస్ట్ను జోడించండి"
"అతిథిని తీసివేయండి"
"అతిథి"
"పరికర ఆటోమేటిక్ సెట్టింగ్"
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index d0b4a9a90c82..d34455c1a6d7 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -284,7 +284,7 @@
"เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi"
"ลดการเปลืองแบตเตอรี่และเพิ่มประสิทธิภาพเครือข่าย"
"เมื่อเปิดใช้โหมดนี้ ที่อยู่ MAC ของอุปกรณ์นี้อาจเปลี่ยนทุกครั้งที่เชื่อมต่อกับเครือข่ายที่มีการเปิดใช้การสุ่ม MAC"
- "แบบจำกัดปริมาณอินเทอร์เน็ต"
+ "แบบจำกัดปริมาณ"
"ไม่มีการวัดปริมาณอินเทอร์เน็ต"
"ขนาดบัฟเฟอร์ของตัวบันทึก"
"เลือกขนาด Logger ต่อบัฟเฟอร์ไฟล์บันทึก"
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index ad83aa549606..b1d5d43b1b0c 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -446,7 +446,7 @@
"%1$s – %2$s"
"%1$s до повного заряду"
"%1$s – %2$s до повного заряду"
- "%1$s – стан акумулятора оптимізується"
+ "%1$s – Оптимізація для збереження заряду акумулятора"
"Невідомо"
"Заряджається"
"Швидке заряджання"
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 4ddb19fcfb17..2591e3aad578 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -154,7 +154,7 @@
"Foydalanuvchi: %1$s"
"Ba’zi birlamchi sozlamalar o‘rnatilgan"
"Birlamchi sozlamalar belgilanmagan"
- "Nutq sintezi sozlamalari"
+ "Matnni nutqqa aylantirish sozlamalari"
"Nutq sintezi"
"Nutq tezligi"
"Matnni o‘qish tezligi"
@@ -446,7 +446,7 @@
"%1$s – %2$s"
"%1$s ichida toʻladi"
"%1$s – %2$s ichida toʻladi"
- "%1$s – Batareya quvvati muvozanatlanmoqda"
+ "%1$s – Batareya uchun optimizatsiya"
"Noma’lum"
"Quvvat olmoqda"
"Tezkor quvvat olmoqda"
@@ -547,7 +547,7 @@
"Qulf o‘rnatish"
"Bunga almashish: %s"
"Mehmon kiritish"
- "Mehmon rejimini olib tashlash"
+ "Mehmonni olib tashlash"
"Mehmon"
"Qurilma standarti"
"Yoqilmagan"
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 5db88183c8e6..a3e1532ac889 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -214,7 +214,7 @@
"使用二维码配对设备"
"使用二维码扫描器配对新设备"
"使用配对码配对设备"
- "使用六位数验证码配对新设备"
+ "使用六位数的配对码配对新设备"
"已配对的设备"
"当前已连接"
"设备详细信息"
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 556df308c143..937439e25706 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"還需 %1$s才能充滿電"
"%1$s - 還需 %2$s才能充滿電"
- "%1$s - 正在優化電池狀態"
+ "%1$s - 優化電池效能"
"未知"
"充電中"
"正在快速充電"
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index efe13bd34892..5f342ec48843 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -429,9 +429,9 @@
"根據你的使用情形,目前電量為 %2$s,預估可持續使用到%1$s"
"根據你的使用情形,預估可持續使用到%1$s"
- "目前電量 %2$s,預估還能持續使用到%1$s"
+ "目前電量 %2$s,預估可用到%1$s"
"預估電力大約可使用到%1$s"
- "還能持續使用到%1$s"
+ "可用到%1$s"
"電池電力可能於%1$s 前耗盡"
"電池可用時間不到 %1$s"
"電池可用時間不到 %1$s (%2$s)"
@@ -446,7 +446,7 @@
"%1$s - %2$s"
"%1$s後充飽電"
"%1$s - %2$s後充飽電"
- "%1$s - 針對電池狀態進行最佳化調整"
+ "%1$s - 最佳化調整電池狀態"
"不明"
"充電中"
"快速充電中"
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java
index 6fb66a754f7a..7d8d883dc77d 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java
@@ -548,12 +548,13 @@ synchronized void updateProfiles(ParcelUuid[] uuids, ParcelUuid[] localUuids,
mPbapProfile.setEnabled(device, true);
}
- if (mMapClientProfile != null) {
+ if ((mMapClientProfile != null)
+ && BluetoothUuid.containsAnyUuid(uuids, MapClientProfile.UUIDS)) {
profiles.add(mMapClientProfile);
removedProfiles.remove(mMapClientProfile);
}
- if ((mPbapClientProfile != null) && ArrayUtils.contains(localUuids, BluetoothUuid.PBAP_PCE)
+ if ((mPbapClientProfile != null)
&& BluetoothUuid.containsAnyUuid(uuids, PbapClientProfile.SRC_UUIDS)) {
profiles.add(mPbapClientProfile);
removedProfiles.remove(mPbapClientProfile);
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
index 19cb2f59f321..4881a86b398a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
@@ -47,8 +47,6 @@ public final class MapClientProfile implements LocalBluetoothProfile {
private final LocalBluetoothProfileManager mProfileManager;
static final ParcelUuid[] UUIDS = {
- BluetoothUuid.MAP,
- BluetoothUuid.MNS,
BluetoothUuid.MAS,
};
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java
index 6fabf9cc65d4..793c2c5d13d7 100644
--- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java
@@ -26,6 +26,7 @@
import static android.os.BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE;
import static android.os.BatteryManager.EXTRA_TEMPERATURE;
import static android.os.BatteryManager.EXTRA_PLUGGED;
+import static android.os.BatteryManager.EXTRA_PRESENT;
import static android.os.BatteryManager.EXTRA_STATUS;
//dev-harsh1998 Port vooc charging status to Android R
@@ -64,9 +65,11 @@ public class BatteryStatus {
// dev-harsh1998 port vooc charging to Android R fuel gauge
public final boolean voocChargeStatus;
+ public final boolean present;
+
public BatteryStatus(int status, int level, int plugged, int health,
int maxChargingCurrent, int maxChargingVoltage,
- int maxChargingWattage, int temperature, boolean voocChargeStatus) {
+ int maxChargingWattage, boolean present, int temperature, boolean voocChargeStatus) {
this.status = status;
this.level = level;
this.plugged = plugged;
@@ -76,6 +79,7 @@ public BatteryStatus(int status, int level, int plugged, int health,
this.maxChargingWattage = maxChargingWattage;
this.temperature = temperature;
this.voocChargeStatus = voocChargeStatus;
+ this.present = present;
}
public BatteryStatus(Intent batteryChangedIntent) {
@@ -86,6 +90,8 @@ public BatteryStatus(Intent batteryChangedIntent) {
temperature = batteryChangedIntent.getIntExtra(EXTRA_TEMPERATURE, -1);
voocChargeStatus = batteryChangedIntent.getBooleanExtra(EXTRA_VOOC_CHARGER, false);
+ present = batteryChangedIntent.getBooleanExtra(EXTRA_PRESENT, true);
+
final int maxChargingMicroAmp = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT,
-1);
int maxChargingMicroVolt = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_VOLTAGE, -1);
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
index 72a6074ff89c..9d477251c2e3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
@@ -205,7 +205,6 @@ public void startScan() {
void dispatchDeviceListUpdate() {
final List mediaDevices = new ArrayList<>(mMediaDevices);
- Collections.sort(mediaDevices, COMPARATOR);
for (DeviceCallback callback : getCallbacks()) {
callback.onDeviceListUpdate(mediaDevices);
}
@@ -465,6 +464,7 @@ public void onDeviceListAdded(List devices) {
synchronized (mMediaDevicesLock) {
mMediaDevices.clear();
mMediaDevices.addAll(devices);
+ Collections.sort(devices, COMPARATOR);
// Add disconnected bluetooth devices only when phone output device is available.
for (MediaDevice device : devices) {
final int type = device.getDeviceType();
diff --git a/packages/Shell/Android.bp b/packages/Shell/Android.bp
index aaaf0448fc31..c51fb56464b0 100644
--- a/packages/Shell/Android.bp
+++ b/packages/Shell/Android.bp
@@ -1,10 +1,14 @@
+// used both for the android_app and android_library
+shell_srcs = ["src/**/*.java",":dumpstate_aidl"]
+shell_static_libs = ["androidx.legacy_legacy-support-v4"]
+
android_app {
name: "Shell",
- srcs: ["src/**/*.java",":dumpstate_aidl"],
+ srcs: shell_srcs,
aidl: {
include_dirs: ["frameworks/native/cmds/dumpstate/binder"],
},
- static_libs: ["androidx.legacy_legacy-support-v4"],
+ static_libs: shell_static_libs,
platform_apis: true,
certificate: "platform",
privileged: true,
@@ -12,3 +16,17 @@ android_app {
include_filter: ["com.android.shell.*"],
},
}
+
+// A library for product type like auto to create a new shell package
+// with product specific permissions.
+android_library {
+ name: "Shell-package-library",
+ srcs: shell_srcs,
+ aidl: {
+ include_dirs: ["frameworks/native/cmds/dumpstate/binder"],
+ },
+ resource_dirs: ["res"],
+ static_libs: shell_static_libs,
+ platform_apis: true,
+ manifest: "AndroidManifest.xml",
+}
diff --git a/packages/Shell/res/values-iw/strings.xml b/packages/Shell/res/values-iw/strings.xml
index c99e69e7f481..ade92dbdd545 100644
--- a/packages/Shell/res/values-iw/strings.xml
+++ b/packages/Shell/res/values-iw/strings.xml
@@ -18,18 +18,18 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
"מעטפת"
"דוחות על באגים"
- "יצירת הדוח על הבאג #%d מתבצעת"
+ "בתהליך יצירה של דוח על באג (#%d)"
"הדוח על הבאג #%d צולם"
- "מוסיף פרטים לדוח על הבאג"
+ "בתהליך הוספת פרטים לדוח על הבאג"
"המתן…"
"הדוח על הבאג יופיע בטלפון בקרוב"
- "הקש כדי לשתף את הדוח על הבאג"
+ "יש להקיש כדי לשתף את הדוח על הבאג"
"הקש כדי לשתף את הדוח על הבאג"
"החלק ימינה כדי לשתף את הדוח על הבאג ללא צילום מסך או המתן להשלמת צילום המסך"
- "הקש כדי לשתף את הדוח על הבאג ללא צילום מסך, או המתן להשלמת צילום המסך"
- "הקש כדי לשתף את הדוח על הבאג ללא צילום מסך, או המתן להשלמת צילום המסך"
- "דוחות על באגים כוללים נתונים מקובצי היומן השונים במערכת, שעשויים לכלול נתונים הנחשבים רגישים (כגון שימוש באפליקציות ונתוני מיקום). שתף דוחות על באגים רק עם אפליקציות ואנשים שאתה סומך עליהם."
- "אל תציג שוב"
+ "יש להקיש כדי לשתף את הדוח על הבאג ללא צילום מסך, או להמתין להשלמת צילום המסך"
+ "יש להקיש כדי לשתף את הדוח על הבאג ללא צילום מסך, או להמתין להשלמת צילום המסך"
+ "דוחות על באגים כוללים נתונים מקובצי היומן השונים במערכת, שעשויים לכלול נתונים הנחשבים רגישים (כגון שימוש באפליקציות ונתוני מיקום). כדאי לשתף דוחות על באגים רק עם אפליקציות ואנשים מהימנים."
+ "אל תציגו זאת שוב"
"דוחות באגים"
"לא ניתן היה לקרוא את קובץ הדוח על הבאג"
"לא ניתן היה להוסיף את פרטי הדוח על הבאג לקובץ ה-zip"
@@ -38,7 +38,7 @@
"צילום מסך"
"צילום המסך בוצע בהצלחה."
"לא ניתן היה לצלם מסך."
- "פרטי הדוח על הבאג #%d"
+ "פרטי הדוח על הבאג (#%d)"
"שם קובץ"
"כותרת הבאג"
"סיכום הבאג"
diff --git a/packages/Shell/res/values-ky/strings.xml b/packages/Shell/res/values-ky/strings.xml
index 3567ac276e63..d73ee2fdb4e9 100644
--- a/packages/Shell/res/values-ky/strings.xml
+++ b/packages/Shell/res/values-ky/strings.xml
@@ -25,7 +25,7 @@
"Мүчүлүштүктөр жөнүндө кабар жакында телефонго чыгат"
"Мүчүлүштүк тууралуу кабарды жөнөтүү үчүн таптап коюңуз"
"Мүчүлүштүк тууралуу билдирүүңүздү бөлүшүү үчүн таптап коюңуз"
- "Мүчүлүштүк тууралуу кабарды скриншотсуз жөнөтүү үчүн солго серпиңиз же скриншот даяр болгуча күтүңүз"
+ "Мүчүлүштүк тууралуу кабарды скриншотсуз жөнөтүү үчүн солго сүрүңүз же скриншот даяр болгуча күтүңүз"
"Мүчүлүштүк тууралуу билдирүүңүздү скриншотсуз бөлүшүү үчүн таптап коюңуз же скриншот даяр болгуча күтө туруңуз"
"Мүчүлүштүк тууралуу билдирүүңүздү скриншотсуз бөлүшүү үчүн таптап коюңуз же скриншот даяр болгуча күтө туруңуз"
"Мүчүлүштүктөр тууралуу билдирүүлөрдө тутумдун ар кандай таржымалдарынан алынган дайындар, ошондой эле купуя маалымат камтылышы мүмкүн (мисалы, жайгашкан жер сыяктуу). Мындай билдирүүлөрдү бир гана ишеничтүү адамдар жана колдонмолор менен бөлүшүңүз."
diff --git a/packages/Shell/res/values-nl/strings.xml b/packages/Shell/res/values-nl/strings.xml
index 3868f4a27021..dadf9fa4b327 100644
--- a/packages/Shell/res/values-nl/strings.xml
+++ b/packages/Shell/res/values-nl/strings.xml
@@ -22,14 +22,14 @@
"Bugrapport #%d is vastgelegd"
"Details toevoegen aan het bugrapport"
"Even geduld…"
- "Het bugrapport wordt over enkele ogenblikken op de telefoon weergegeven"
+ "Het bugrapport zie je over enkele ogenblikken op de telefoon"
"Selecteer dit om je bugrapport te delen"
"Tik om je bugrapport te delen"
"Selecteer dit om je bugrapport te delen zonder screenshot of wacht tot het screenshot is voltooid"
"Tik om je bugrapport te delen zonder screenshot of wacht tot het screenshot is voltooid"
"Tik om je bugrapport te delen zonder screenshot of wacht tot het screenshot is voltooid"
"Bugrapporten bevatten gegevens uit de verschillende logbestanden van het systeem, die gegevens kunnen bevatten die je als gevoelig beschouwt (zoals gegevens met betrekking tot app-gebruik en locatie). Deel bugrapporten alleen met mensen en apps die je vertrouwt."
- "Niet opnieuw weergeven"
+ "Niet opnieuw tonen"
"Bugrapporten"
"Bestand met bugrapport kan niet worden gelezen"
"Kan details van bugrapport niet toevoegen aan zip-bestand"
diff --git a/packages/Shell/res/values-sv/strings.xml b/packages/Shell/res/values-sv/strings.xml
index d9080a82a2f5..d8877771fa73 100644
--- a/packages/Shell/res/values-sv/strings.xml
+++ b/packages/Shell/res/values-sv/strings.xml
@@ -25,9 +25,9 @@
"Felrapporten visas på mobilen inom kort"
"Tryck för att dela felrapporten"
"Tryck om du vill dela felrapporten"
- "Svep för att dela felrapporten utan en skärmdump eller vänta tills skärmdumpen är klar"
- "Tryck om du vill dela felrapporten utan en skärmdump eller vänta tills skärmdumpen är klar"
- "Tryck om du vill dela felrapporten utan en skärmdump eller vänta tills skärmdumpen är klar"
+ "Svep för att dela felrapporten utan en skärmbild eller vänta tills skärmbilden är klar"
+ "Tryck om du vill dela felrapporten utan en skärmbild eller vänta tills skärmbilden är klar"
+ "Tryck om du vill dela felrapporten utan en skärmbild eller vänta tills skärmbilden är klar"
"Felrapporter innehåller data från systemets olika loggfiler, vilka kan innehålla data som är känslig för dig (som appanvändning och platsdata). Dela bara felrapporter med personer du litar på."
"Visa inte igen"
"Felrapporter"
@@ -35,8 +35,8 @@
"Det gick inte att lägga till information om felrapporten i ZIP-filen"
"namnlös"
"Information"
- "Skärmdump"
- "Skärmdump har tagits."
+ "Skärmbild"
+ "Skärmbild har tagits."
"Det gick inte att ta skrämdump."
"Information för felrapporten #%d"
"Filnamn"
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index f6c2ee264cb5..6b4c239f2b5a 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -784,7 +784,7 @@ private static PendingIntent newCancelIntent(Context context, BugreportInfo info
intent.setClass(context, BugreportProgressService.class);
intent.putExtra(EXTRA_ID, info.id);
return PendingIntent.getService(context, info.id, intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
/**
@@ -1244,7 +1244,7 @@ private void sendBugreportNotification(BugreportInfo info, boolean takingScreens
.setTicker(title)
.setContentText(content)
.setContentIntent(PendingIntent.getService(mContext, info.id, shareIntent,
- PendingIntent.FLAG_UPDATE_CURRENT))
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))
.setDeleteIntent(newCancelIntent(mContext, info));
if (!TextUtils.isEmpty(info.getName())) {
diff --git a/packages/SimAppDialog/res/values-mn/strings.xml b/packages/SimAppDialog/res/values-mn/strings.xml
index f21b80bc759b..51298bbda34b 100644
--- a/packages/SimAppDialog/res/values-mn/strings.xml
+++ b/packages/SimAppDialog/res/values-mn/strings.xml
@@ -19,8 +19,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
"Sim аппын харилцах цонх"
"Мобайл үйлчилгээг идэвхжүүлэх"
- "Та шинэ СИМ-ээ зөв ажиллуулахын тулд %1$s аппыг суулгах хэрэгтэй болно"
- "Та шинэ СИМ-ээ зөв ажиллуулахын тулд оператор компанийхаа аппыг суулгах хэрэгтэй болно"
+ "Та шинэ SIM-ээ зөв ажиллуулахын тулд %1$s аппыг суулгах хэрэгтэй болно"
+ "Та шинэ SIM-ээ зөв ажиллуулахын тулд оператор компанийхаа аппыг суулгах хэрэгтэй болно"
"Одоо биш"
"Апп татах"
diff --git a/packages/SoundPicker/res/values-pa/strings.xml b/packages/SoundPicker/res/values-pa/strings.xml
index 2653c6442ae7..eb630c900244 100644
--- a/packages/SoundPicker/res/values-pa/strings.xml
+++ b/packages/SoundPicker/res/values-pa/strings.xml
@@ -17,7 +17,7 @@
"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰਿੰਗਟੋਨ"
- "ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੂਚਨਾ ਧੁਨੀ"
+ "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਸੂਚਨਾ ਧੁਨੀ"
"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਅਲਾਰਮ ਧੁਨੀ"
"ਰਿੰਗਟੋਨ ਸ਼ਾਮਲ ਕਰੋ"
"ਅਲਾਰਮ ਸ਼ਾਮਲ ਕਰੋ"
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
index 9d52098f37d5..63f8b1f5dbb8 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
@@ -30,7 +30,7 @@
*/
@ProvidesInterface(version = FalsingManager.VERSION)
public interface FalsingManager {
- int VERSION = 4;
+ int VERSION = 5;
void onSuccessfulUnlock();
@@ -42,7 +42,8 @@ public interface FalsingManager {
boolean isUnlockingDisabled();
- boolean isFalseTouch();
+ /** Returns true if the gesture should be rejected. */
+ boolean isFalseTouch(int interactionType);
void onNotificatonStopDraggingDown();
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
index 02c4c5eff26e..4b6efa91a7c8 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
@@ -14,16 +14,16 @@
package com.android.systemui.plugins.statusbar;
-import com.android.systemui.plugins.annotations.DependsOn;
-import com.android.systemui.plugins.annotations.ProvidesInterface;
-import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;
-
import android.service.notification.SnoozeCriterion;
import android.service.notification.StatusBarNotification;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+import com.android.systemui.plugins.annotations.DependsOn;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
+import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;
+
@ProvidesInterface(version = NotificationSwipeActionHelper.VERSION)
@DependsOn(target = SnoozeOption.class)
public interface NotificationSwipeActionHelper {
@@ -52,7 +52,8 @@ public interface NotificationSwipeActionHelper {
public boolean isDismissGesture(MotionEvent ev);
- public boolean isFalseGesture(MotionEvent ev);
+ /** Returns true if the gesture should be rejected. */
+ boolean isFalseGesture();
public boolean swipedFarEnough(float translation, float viewSize);
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index 459d162c65db..c027f8df1f66 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -38,7 +38,7 @@
"%s • جارٍ الشحن"
"%s • جارٍ الشحن سريعًا"
"%s • جارٍ الشحن ببطء"
- "%s • التحسين لسلامة البطارية"
+ "%s • التحسين للحفاظ على سلامة البطارية"
"توصيل جهاز الشحن."
"اضغط على \"القائمة\" لإلغاء التأمين."
"الشبكة مؤمّنة"
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 346874060759..4220526635f7 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -38,7 +38,7 @@
"%s • Puni se"
"%s • Brzo se puni"
"%s • Sporo se puni"
- "%s • Optimizuje se radi dobrog stanja baterije"
+ "%s • Optimizuje se radi boljeg stanja baterije"
"Priključite punjač."
"Pritisnite Meni da biste otključali."
"Mreža je zaključana"
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 0911efade706..dc4ee693d89c 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -38,7 +38,7 @@
"%s • Зарежда се"
"%s • Зарежда се бързо"
"%s • Зарежда се бавно"
- "%s • Оптимизиране за състоянието на батерията"
+ "%s • Оптимизиране с цел състоянието на батерията"
"Свържете зарядното си устройство."
"Натиснете „Меню“, за да отключите."
"Мрежата е заключена"
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 421ddb6d31e6..2e3b4af4a68f 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -38,7 +38,7 @@
"%s • S\'està carregant"
"%s • S\'està carregant ràpidament"
"%s • S\'està carregant lentament"
- "%s • S\'està optimitzant per mantenir el bon estat de la bateria"
+ "%s • S\'està optimitzant per preservar l\'estat de la bateria"
"Connecta el carregador."
"Prem Menú per desbloquejar."
"La xarxa està bloquejada"
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index ce8ef202a038..93fe516a8aa6 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -38,7 +38,7 @@
"%s • Kargatzen"
"%s • Bizkor kargatzen"
"%s • Mantso kargatzen"
- "%s • Optimizatzen bateria egoera onean mantentzeko"
+ "%s • Optimizatzen, bateria egoera onean mantentzeko"
"Konektatu kargagailua."
"Desblokeatzeko, sakatu Menua."
"Sarea blokeatuta dago"
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 01a0fac58016..f8c5ebac9517 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -38,7 +38,7 @@
"%s • Cargando"
"%s • Cargando rapidamente"
"%s • Cargando lentamente"
- "%s • Optimizando para manter a batería en bo estado"
+ "%s • Optimizando a preservación da batería"
"Conecta o cargador."
"Preme Menú para desbloquear."
"Bloqueada pola rede"
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index c8ed16d10327..43c6f2e88d0e 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -38,7 +38,7 @@
"%s • Լիցքավորում"
"%s • Արագ լիցքավորում"
"%s • Դանդաղ լիցքավորում"
- "%s • Օպտիմալացվում է մարտկոցի աշխատանքային հզորության համար"
+ "%s • Օպտիմալացվում է մարտկոցի պահպանման համար"
"Միացրեք լիցքավորիչը:"
"Ապակողպելու համար սեղմեք Ընտրացանկը:"
"Ցանցը կողպված է"
@@ -88,12 +88,12 @@
"Դուք սխալ եք մուտքագրել ձեր ապակողպման նախշը %1$d անգամ: \n\nՓորձեք կրկին %2$d վայրկյանից։"
"SIM PIN կոդը սխալ է։ Այժմ պետք է դիմեք ձեր օպերատորին՝ սարքն արգելահանելու համար:"
- - Incorrect SIM PIN code, you have %d remaining attempts.
+ - SIM PIN կոդը սխալ է: Մնաց %d փորձ, որից հետո պետք է դիմեք ձեր օպերատորին՝ սարքն արգելահանելու համար:
- SIM PIN կոդը սխալ է: Մնաց %d փորձ:
"SIM-ը հնարավոր չէ օգտագործել: Դիմեք ձեր օպերատորին:"
- - Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable.
+ - SIM PUK կոդը սխալ է: Մնաց %d փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել:
- SIM PUK կոդը սխալ է: Մնաց %d փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել:
"SIM PIN կոդի գործողությունը ձախողվեց:"
@@ -114,15 +114,15 @@
"Սարքը կողպված է ադմինիստրատորի կողմից"
"Սարքը կողպվել է ձեռքով"
- - Device hasn\'t been unlocked for %d hours. Confirm pattern.
+ - Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք նախշը:
- Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք նախշը:
- - Device hasn\'t been unlocked for %d hours. Confirm PIN.
+ - Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք PIN կոդը:
- Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք PIN կոդը:
- - Device hasn\'t been unlocked for %d hours. Confirm password.
+ - Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք գաղտնաբառը:
- Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք գաղտնաբառը:
"Չհաջողվեց ճանաչել"
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index 3f3bec9b8c8c..bb8a908d20f7 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -38,7 +38,7 @@
"%s • Í hleðslu"
"%s • Hröð hleðsla"
"%s • Hæg hleðsla"
- "%s • Fínstillir til að bæta rafhlöðuendingu"
+ "%s • Fínstillir fyrir rafhlöðuendingu"
"Tengdu hleðslutækið."
"Ýttu á valmyndarhnappinn til að taka úr lás."
"Net læst"
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index 47d17ce57892..c1baadf47de0 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -38,7 +38,7 @@
"%s • In carica"
"%s • Ricarica veloce"
"%s • Ricarica lenta"
- "%s • È in corso l\'ottimizzazione per l\'integrità della batteria"
+ "%s • Ottimizzazione per integrità batteria"
"Collega il caricabatterie."
"Premi Menu per sbloccare."
"Rete bloccata"
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 8780dc5e3c01..773e4efae2e4 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -21,17 +21,17 @@
"מגן מקלדת"
- "הזן את קוד הגישה"
+ "יש להזין את קוד האימות"
"הזן את קוד ה-PUK של כרטיס ה-SIM ולאחר מכן הזן קוד גישה חדש"
"קוד PUK של כרטיס SIM"
- "קוד גישה חדש לכרטיס ה-SIM"
+ "קוד אימות חדש לכרטיס ה-SIM"
"גע כדי להזין את הסיסמה"
"הזן סיסמה לביטול הנעילה"
"הזן את קוד הגישה לביטול הנעילה"
- "הזנת קוד גישה"
+ "צריך להזין קוד אימות"
"יש להזין קו ביטול נעילה"
"יש להזין סיסמה"
- "קוד הגישה שגוי"
+ "קוד האימות שגוי"
"כרטיס לא חוקי."
"הסוללה טעונה"
"%s • בטעינה אלחוטית"
@@ -43,14 +43,14 @@
"לחץ על \'תפריט\' כדי לבטל את הנעילה."
"הרשת נעולה"
"אין כרטיס SIM"
- "הכנס כרטיס SIM."
+ "יש להכניס כרטיס SIM."
"כרטיס ה-SIM חסר או שלא ניתן לקרוא אותו. הכנס כרטיס SIM."
"לא ניתן להשתמש בכרטיס SIM זה."
"כרטיס ה-SIM שלך הושבת לצמיתות.\nפנה לספק השירות האלחוטי שלך לקבלת כרטיס SIM אחר."
"כרטיס ה-SIM נעול."
"כרטיס ה-SIM נעול באמצעות PUK."
"מבטל את הנעילה של כרטיס ה-SIM…"
- "אזור לקוד הגישה"
+ "אזור של קוד האימות"
"סיסמת מכשיר"
"אזור לקוד הגישה של כרטיס ה-SIM"
"אזור לקוד הגישה של כרטיס ה-SIM"
@@ -63,7 +63,7 @@
"שכחתי את קו ביטול הנעילה"
"קו ביטול נעילה שגוי"
"סיסמה שגויה"
- "קוד הגישה שגוי"
+ "קוד האימות שגוי"
- אפשר יהיה לנסות שוב בעוד %d שניות.
- אפשר יהיה לנסות שוב בעוד %d שניות.
@@ -72,30 +72,30 @@
"שרטט את קו ביטול הנעילה"
"הזן את קוד הגישה של כרטיס ה-SIM."
- "הזן את קוד הגישה של כרטיס ה-SIM של %1$s."
+ "יש להזין את קוד האימות של כרטיס ה-SIM של %1$s."
"%1$s יש להשבית את כרטיס ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי."
- "הזן קוד גישה"
- "הזן את הסיסמה"
- "כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים."
- "ה-SIM של \"%1$s\" מושבת כעת. הזן קוד PUK כדי להמשיך. לפרטים, פנה אל הספק."
+ "יש להזין קוד אימות"
+ "צריך להזין את הסיסמה"
+ "כרטיס ה-SIM מושבת עכשיו. צריך להזין קוד PUK כדי להמשיך. יש לפנות אל הספק לקבלת פרטים."
+ "ה-SIM של \"%1$s\" מושבת עכשיו. צריך להזין קוד PUK כדי להמשיך. לפרטים, יש לפנות אל הספק."
"הזן את קוד הגישה הרצוי"
- "אשר את קוד הגישה הרצוי"
- "מבטל את הנעילה של כרטיס ה-SIM…"
+ "צריך לאשר את קוד האימות הרצוי"
+ "מתבצע ביטול נעילה של כרטיס ה-SIM…"
"הקלד קוד גישה שאורכו 4 עד 8 ספרות."
"קוד PUK צריך להיות בן 8 ספרות או יותר."
- "הזן את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM לצמיתות."
+ "יש להזין את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM באופן סופי."
"ניסית לשרטט את קו ביטול הנעילה יותר מדי פעמים"
- "הקלדת קוד גישה שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות."
+ "הקלדת קוד גישה שגוי %1$d פעמים. \n\nיש לנסות שוב בעוד %2$d שניות."
"הקלדת סיסמה שגויה %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות."
"שרטטת קו ביטול נעילה שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות."
"קוד הגישה של כרטיס ה-SIM שגוי. צור קשר עם הספק כדי לבטל את נעילת המכשיר."
- - קוד הגישה של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות.
- - קוד הגישה של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות.
- - קוד הגישה של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות.
- - קוד הגישה של כרטיס ה-SIM שגוי. נותר לך עוד ניסיון %d לפני שיהיה עליך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר.
+ - קוד האימות של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות.
+ - קוד האימות של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות.
+ - קוד האימות של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות.
+ - קוד האימות של כרטיס ה-SIM שגוי. נותר לך עוד ניסיון %d לפני שיהיה עליך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר.
- "לא ניתן להשתמש בכרטיס ה-SIM. צור קשר עם הספק."
+ "לא ניתן להשתמש בכרטיס ה-SIM. יש ליצור קשר עם הספק."
- קוד ה-PUK של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות לפני שכרטיס ה-SIM יינעל לצמיתות.
- קוד ה-PUK של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות לפני שכרטיס ה-SIM יינעל לצמיתות.
@@ -103,27 +103,27 @@
- קוד ה-PUK של כרטיס ה-SIM שגוי. נותר לך ניסיון %d נוסף לפני שכרטיס ה-SIM יינעל לצמיתות.
"פעולת קוד הגישה של כרטיס ה-SIM נכשלה!"
- "פעולת קוד ה-PUK של כרטיס ה-SIM נכשלה!"
+ "הניסיון לביטול הנעילה של כרטיס ה-SIM באמצעות קוד PUK נכשל!"
"הקוד התקבל!"
"אין שירות."
"החלפת שיטת קלט"
"מצב טיסה"
"יש להזין את קו ביטול הנעילה לאחר הפעלה מחדש של המכשיר"
- "יש להזין קוד גישה לאחר הפעלה מחדש של המכשיר"
+ "צריך להזין קוד אימות לאחר הפעלה מחדש של המכשיר"
"יש להזין סיסמה לאחר הפעלה מחדש של המכשיר"
"יש להזין את קו ביטול הנעילה כדי להגביר את רמת האבטחה"
"יש להזין קוד גישה כדי להגביר את רמת האבטחה"
"יש להזין סיסמה כדי להגביר את רמת האבטחה"
- "יש להזין את קו ביטול הנעילה בזמן מעבר בין פרופילים"
- "יש להזין את קוד הגישה בזמן מעבר בין פרופילים"
+ "יש להזין את קו ביטול הנעילה כשמחליפים בין פרופילים"
+ "צריך להזין את קוד האימות כשמחליפים פרופיל"
"יש להזין את הסיסמה בזמן מעבר בין פרופילים"
"מנהל המכשיר נעל את המכשיר"
"המכשיר ננעל באופן ידני"
- - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את קו ביטול הנעילה.
- - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את קו ביטול הנעילה.
- - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את קו ביטול הנעילה.
- - נעילת המכשיר לא בוטלה במשך %d שעה. הזן את קו ביטול הנעילה.
+ - נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את קו ביטול הנעילה.
+ - נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את קו ביטול הנעילה.
+ - נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את קו ביטול הנעילה.
+ - נעילת המכשיר לא בוטלה במשך שעה אחת (%d). יש להזין את קו ביטול הנעילה.
- נעילת המכשיר לא בוטלה במשך %d שעות. הזן את קוד הגישה.
@@ -132,24 +132,24 @@
- נעילת המכשיר לא בוטלה במשך %d שעה. הזן את קוד הגישה.
- - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את הסיסמה.
- - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את הסיסמה.
- - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את הסיסמה.
- - נעילת המכשיר לא בוטלה במשך %d שעה. הזן את הסיסמה.
+ - נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את הסיסמה.
+ - נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את הסיסמה.
+ - נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את הסיסמה.
+ - נעילת המכשיר לא בוטלה במשך %d שעה. יש להזין את הסיסמה.
"לא זוהתה"
"לא זוהתה"
- - יש להזין קוד גישה לכרטיס SIM. נותרו לך %d ניסונות נוספים.
- - יש להזין קוד גישה לכרטיס SIM. נותרו לך %d ניסונות נוספים.
- - יש להזין קוד גישה לכרטיס SIM. נותרו לך %d ניסונות נוספים.
- - יש להזין קוד גישה לכרטיס SIM. נותר לך %d ניסיון נוסף לפני שיהיה צורך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר.
+ - יש להזין קוד אימות של כרטיס SIM. נותרו לך %d ניסיונות נוספים.
+ - יש להזין קוד אימות של כרטיס SIM. נותרו לך %d ניסיונות נוספים.
+ - יש להזין קוד אימות של כרטיס SIM. נותרו לך %d ניסיונות נוספים.
+ - יש להזין קוד אימות של כרטיס SIM. נותר לך ניסיון נוסף (%d) לפני שיהיה צורך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר.
- - כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.
- - כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.
- - כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.
- - כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך %d ניסיון נוסף לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.
+ - כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM יינעל באופן סופי. למידע נוסף, ניתן לפנות לספק שלך.
+ - כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM יינעל באופן סופי. למידע נוסף, ניתן לפנות לספק שלך.
+ - כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM יינעל באופן סופי. למידע נוסף, ניתן לפנות לספק שלך.
+ - כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך ניסיון אחד (%d) נוסף לפני שכרטיס ה-SIM יינעל באופן סופי. למידע נוסף, ניתן לפנות לספק שלך.
"ברירת מחדל"
"בועה"
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index b20cb05ea86f..8e701fe86430 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -38,7 +38,7 @@
"%s • Зарядталуда"
"%s • Жылдам зарядталуда"
"%s • Баяу зарядталуда"
- "%s • Батареяның жұмыс істеу қабілеті оңтайландырылуда"
+ "%s • Батарея жұмысын оңтайландыру"
"Зарядтағышты қосыңыз."
"Ашу үшін \"Мәзір\" пернесін басыңыз."
"Желі құлыптаулы"
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index a52712379776..96865419cbf7 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -38,7 +38,7 @@
"%s • ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
"%s • ವೇಗವಾಗಿ ಚಾರ್ಜ್ಮಾಡಲಾಗುತ್ತಿದೆ"
"%s • ನಿಧಾನವಾಗಿ ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
- "%s • ಬ್ಯಾಟರಿಯ ಆರೋಗ್ಯಕ್ಕಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
+ "%s • ಬ್ಯಾಟರಿಯ ಸುಸ್ಥಿತಿಗಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
"ನಿಮ್ಮ ಚಾರ್ಜರ್ ಸಂಪರ್ಕಗೊಳಿಸಿ."
"ಅನ್ಲಾಕ್ ಮಾಡಲು ಮೆನು ಒತ್ತಿರಿ."
"ನೆಟ್ವರ್ಕ್ ಲಾಕ್ ಆಗಿದೆ"
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 66d0ac756bf5..80761591e0bf 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -38,7 +38,7 @@
"%s • ചാർജ് ചെയ്യുന്നു"
"%s • വേഗത്തിൽ ചാർജ് ചെയ്യുന്നു"
"%s • പതുക്കെ ചാർജ് ചെയ്യുന്നു"
- "%s • ബാറ്ററി നില ഒപ്റ്റിമൈസ് ചെയ്യുന്നു"
+ "%s • ബാറ്ററിയുടെ ആയുസിനായി ഒപ്റ്റിമൈസ് ചെയ്യുന്നു"
"നിങ്ങളുടെ ചാർജർ കണക്റ്റുചെയ്യുക."
"അൺലോക്കുചെയ്യാൻ മെനു അമർത്തുക."
"നെറ്റ്വർക്ക് ലോക്കുചെയ്തു"
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 2ff4a22d6737..13c152f8f38b 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -38,7 +38,7 @@
"%s • Цэнэглэж байна"
"%s • Хурдан цэнэглэж байна"
"%s • Удаан цэнэглэж байна"
- "%s • Батарейн чанарыг оновчилж байна"
+ "%s • Батарейн барилтыг оновчилж байна"
"Цэнэглэгчээ холбоно уу."
"Түгжээг тайлах бол цэсийг дарна уу."
"Сүлжээ түгжигдсэн"
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index a9fd827442e6..32759215483a 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -56,9 +56,9 @@
"Gebied voor pukcode van simkaart"
"Volgende wekker ingesteld voor %1$s"
"Delete"
- "Simkaart uitschakelen"
- "E-simkaart kan niet worden uitgeschakeld"
- "De e-simkaart kan niet worden uitgeschakeld vanwege een fout."
+ "E-simkaart uitzetten"
+ "E-simkaart kan niet worden uitgezet"
+ "De e-simkaart kan niet worden uitgezet vanwege een fout."
"Enter"
"Patroon vergeten"
"Onjuist patroon"
@@ -81,7 +81,7 @@
"Simkaart ontgrendelen…"
"Geef een pincode van vier tot acht cijfers op."
"De pukcode is minimaal acht cijfers lang."
- "Geef de juiste pukcode opnieuw op. Bij herhaalde pogingen wordt de simkaart definitief uitgeschakeld."
+ "Geef de juiste pukcode opnieuw op. Bij herhaalde pogingen wordt de simkaart definitief uitgezet."
"Te veel patroonpogingen"
"Je hebt je pincode %1$d keer onjuist getypt. \n\nProbeer het over %2$d seconden opnieuw."
"Je hebt je wachtwoord %1$d keer onjuist getypt. \n\nProbeer het over %2$d seconden opnieuw."
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 43d549c92e6b..47b2881e11f6 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -38,7 +38,7 @@
"%s • ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"
"%s • ਤੇਜ਼ੀ ਨਾਲ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"
"%s • ਹੌਲੀ-ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"
- "%s • ਬੈਟਰੀ ਸਥਿਤੀ ਲਈ ਅਨੁਕੂਲ ਬਣਾਇਆ ਜਾ ਰਿਹਾ"
+ "%s • ਬੈਟਰੀ ਦੀ ਸਥਿਤੀ ਲਈ ਅਨੁਕੂਲ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
"ਆਪਣਾ ਚਾਰਜਰ ਕਨੈਕਟ ਕਰੋ।"
"ਅਣਲਾਕ ਕਰਨ ਲਈ \"ਮੀਨੂ\" ਦਬਾਓ।"
"ਨੈੱਟਵਰਕ ਲਾਕ ਕੀਤਾ ਗਿਆ"
@@ -135,7 +135,7 @@
- ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ %d ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।
- ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ %d ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।
- "ਪੂਰਵ-ਨਿਰਧਾਰਤ"
+ "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ"
"ਬੁਲਬੁਲਾ"
"ਐਨਾਲੌਗ"
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 76f755c2b96a..01427be041ad 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -38,7 +38,7 @@
"%s • Ładowanie"
"%s • Szybkie ładowanie"
"%s • Wolne ładowanie"
- "%s • Optymalizuję, by utrzymać baterię w dobrym stanie"
+ "%s • Optymalizuję, aby utrzymać baterię w dobrym stanie"
"Podłącz ładowarkę."
"Naciśnij Menu, aby odblokować."
"Sieć zablokowana"
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index 3a6078224be2..64609b302069 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -38,7 +38,7 @@
"%s • ආරෝපණය වෙමින්"
"%s • වේගයෙන් ආරෝපණය වෙමින්"
"%s • සෙමින් ආරෝපණය වෙමින්"
- "%s • බැටරි සෞඛ්යය සඳහා ප්රශස්ත කරමින්"
+ "%s • බැටරි ආයු කාලය වැඩි දියුණු කරමින්"
"ඔබගේ ආරෝපකයට සම්බන්ධ කරන්න."
"අගුලු හැරීමට මෙනුව ඔබන්න."
"ජාලය අගුළු දමා ඇත"
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index 90b8a3e362fd..7ca04ce8198a 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -38,7 +38,7 @@
"%s • Пуни се"
"%s • Брзо се пуни"
"%s • Споро се пуни"
- "%s • Оптимизује се ради доброг стања батерије"
+ "%s • Оптимизује се ради бољег стања батерије"
"Прикључите пуњач."
"Притисните Мени да бисте откључали."
"Мрежа је закључана"
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index c69a8f56b933..990253a7862f 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -38,7 +38,7 @@
"%s • ఛార్జ్ అవుతోంది"
"%s • వేగంగా ఛార్జ్ అవుతోంది"
"%s • నెమ్మదిగా ఛార్జ్ అవుతోంది"
- "%s • బ్యాటరీ జీవితకాలాన్ని ఆప్టిమైజ్ చేయడం కోసం"
+ "%s • బ్యాటరీ జీవితకాలాన్ని పెంచడం కోసం ఆప్టిమైజ్ చేస్తోంది"
"మీ ఛార్జర్ను కనెక్ట్ చేయండి."
"అన్లాక్ చేయడానికి మెనుని నొక్కండి."
"నెట్వర్క్ లాక్ చేయబడింది"
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index a16576d37e9c..62950e29c70e 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -38,7 +38,7 @@
"%s • Заряджання"
"%s • Швидке заряджання"
"%s • Повільне заряджання"
- "%s • Стан акумулятора оптимізується"
+ "%s • Оптимізація для збереження заряду акумулятора"
"Підключіть зарядний пристрій."
"Натисніть меню, щоб розблокувати."
"Мережу заблоковано"
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 44e419180f6a..f2ca159bff0d 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -38,7 +38,7 @@
"%s • Quvvat olmoqda"
"%s • Tezkor quvvat olmoqda"
"%s • Sekin quvvat olmoqda"
- "%s • Batareya quvvati muvozanatlanmoqda"
+ "%s • Batareya uchun optimizatsiya"
"Quvvatlash moslamasini ulang."
"Qulfdan chiqarish uchun Menyu tugmasini bosing."
"Tarmoq qulflangan"
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index 1054e36fc048..b4006e8b7341 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -38,7 +38,7 @@
"%s • 正在充電"
"%s • 正在快速充電"
"%s •正在慢速充電"
- "%s • 正在優化電池狀態"
+ "%s • 優化電池效能"
"請連接充電器。"
"按下 [選單] 即可解鎖。"
"網絡已鎖定"
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index 7efa2f934d95..757bf56f3050 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -38,7 +38,7 @@
"%s • 充電中"
"%s • 快速充電中"
"%s • 慢速充電中"
- "%s • 針對電池狀態進行最佳化調整"
+ "%s • 最佳化調整電池狀態"
"請連接充電器。"
"按選單鍵解鎖。"
"網路已鎖定"
diff --git a/packages/SystemUI/res-product/values-az/strings.xml b/packages/SystemUI/res-product/values-az/strings.xml
index ee86ae23d48f..c0668dbcea07 100644
--- a/packages/SystemUI/res-product/values-az/strings.xml
+++ b/packages/SystemUI/res-product/values-az/strings.xml
@@ -38,8 +38,8 @@
"Telefonun kilidini açmaq üçün %1$d dəfə yanlış cəhd etmisiniz. Daha %2$d uğursuz cəhddən sonra iş profili silinəcək və bütün profil datası ləğv ediləcək."
"Planşetin kilidini açmaq üçün %d dəfə yanlış cəhd etmisiniz. İş profili silinəcək və bütün data ləğv ediləcək."
"Telefonun kilidini açmaq üçün %d dəfə yanlış cəhd etmisiniz. İş profili silinəcək və bütün data ləğv ediləcək."
- "Kilid açma modelini %1$d dəfə yanlış çəkmisiniz. Daha %2$d uğursuz cəhddən sonra planşet kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə sonra yenidən cəhd edin."
- "Kilid açma modelini artıq %1$d dəfə yanlış çəkmisiniz. Daha %2$d uğursuz cəhddən sonra telefon kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə sonra yenidən cəhd edin."
+ "Kilid açma modelini %1$d dəfə yanlış çəkmisiniz. Daha %2$d uğursuz cəhddən sonra planşet kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə sonra cəhd edin."
+ "Kilid açma modelini artıq %1$d dəfə yanlış çəkmisiniz. Daha %2$d uğursuz cəhddən sonra telefon kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə sonra cəhd edin."
"Daha çox seçim üçün telefonu kiliddən çıxarın"
"Daha çox seçim üçün planşeti kiliddən çıxarın"
"Daha çox seçim üçün cihazı kiliddən çıxarın"
diff --git a/packages/SystemUI/res-product/values-iw/strings.xml b/packages/SystemUI/res-product/values-iw/strings.xml
index 4ba8657a77e3..4026dac78d2d 100644
--- a/packages/SystemUI/res-product/values-iw/strings.xml
+++ b/packages/SystemUI/res-product/values-iw/strings.xml
@@ -26,20 +26,20 @@
"אין כרטיס SIM בטאבלט."
"אין כרטיס SIM בטלפון."
"קודי האימות אינם תואמים"
- "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, טאבלט זה יאופס וכל הנתונים שבו יימחקו."
+ "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, הטאבלט הזה יאופס וכל הנתונים שבו יימחקו."
"ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, טלפון זה יאופס וכל הנתונים שבו יימחקו."
"ניסית לבטל את נעילת הטאבלט %d פעמים. הטאבלט יאופס וכל הנתונים שלו יימחקו."
"ניסית לבטל את נעילת הטלפון %d פעמים. הטלפון יאופס וכל הנתונים שבו יימחקו."
- "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, משתמש זה יוסר וכל נתוני המשתמש יימחקו."
- "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, משתמש זה יוסר וכל נתוני המשתמש יימחקו."
+ "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, המשתמש הזה יוסר וכל נתוני המשתמש יימחקו."
+ "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, המשתמש הזה יוסר וכל נתוני המשתמש יימחקו."
"ניסית לבטל את נעילת הטאבלט %d פעמים באופן שגוי. משתמש זה יוסר וכל נתוני המשתמש יימחקו."
- "ניסית לבטל את נעילת הטלפון %d פעמים. משתמש זה יוסר וכל נתוני המשתמש יימחקו."
+ "ניסית לבטל את נעילת הטלפון %d פעמים. המשתמש הזה יוסר וכל נתוני המשתמש יימחקו."
"ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו."
"ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו."
"ניסית לבטל את נעילת הטאבלט %d פעמים. פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו."
"ניסית לבטל את נעילת הטלפון %d פעמים. פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו."
"שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, ,תישלח אליך בקשה לבטל את נעילת הטאבלט באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד %3$d שניות."
- "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תשילח אליך בקשה לבטל את נעילת הטלפון באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד %3$d שניות."
+ "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תישלח אליך בקשה לבטל את נעילת הטלפון באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד %3$d שניות."
"לאפשרויות נוספות, יש לבטל את נעילת הטלפון"
"לאפשרויות נוספות, יש לבטל את נעילת הטאבלט"
"לאפשרויות נוספות, יש לבטל את נעילת המכשיר"
diff --git a/packages/SystemUI/res-product/values-nl/strings.xml b/packages/SystemUI/res-product/values-nl/strings.xml
index 76f66b790690..015ff3eaed95 100644
--- a/packages/SystemUI/res-product/values-nl/strings.xml
+++ b/packages/SystemUI/res-product/values-nl/strings.xml
@@ -21,8 +21,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
"Lijn de telefoon opnieuw uit om sneller op te laden"
"Lijn de telefoon opnieuw uit om draadloos op te laden"
- "Het Android TV-apparaat wordt binnenkort uitgeschakeld. Druk op een knop om het ingeschakeld te houden."
- "Het apparaat wordt binnenkort uitgeschakeld. Druk om het ingeschakeld te houden."
+ "Het Android TV-apparaat wordt binnenkort uitgezet. Druk op een knop om het aan te laten."
+ "Het apparaat wordt binnenkort uitgezet. Druk om het aan te laten."
"Geen simkaart in tablet."
"Geen simkaart in telefoon."
"Pincodes komen niet overeen"
diff --git a/packages/SystemUI/res/drawable/ic_battery_unknown.xml b/packages/SystemUI/res/drawable/ic_battery_unknown.xml
new file mode 100644
index 000000000000..8b2ba12fe0be
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_battery_unknown.xml
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 9de89960c763..ad70a67421b9 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -181,6 +181,7 @@
"Battery, twee stawe."
"Battery, drie stawe."
"Battery vol."
+ "Batterypersentasie is onbekend."
"Geen foon nie."
"Foon, een staaf."
"Foon, twee stawe."
@@ -1097,4 +1098,6 @@
"%1$s (ontkoppel)"
"Kon nie koppel nie. Probeer weer."
"Bind nuwe toestel saam"
+ "Kon nie jou batterymeter lees nie"
+ "Tik vir meer inligting"
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index e29ba4f4d33d..2900060b84b6 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -68,7 +68,7 @@
"ሁልጊዜ በዚህ አውታረ መረብ ላይ ፍቀድ"
"ፍቀድ"
"ገመድ-አልባ debugging አይፈቀድም"
- "በአሁኑ ጊዜ በመለያ ወደዚህ መሣሪያ የገባው ተጠቃሚ የገመድ-አልባ debuggingን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።"
+ "በአሁኑ ጊዜ በመለያ ወደዚህ መሣሪያ የገባው ተጠቃሚ የገመድ-አልባ ማረምን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።"
"የዩኤስቢ ወደብ ተሰናክሏል"
"መሣሪያዎን ከፈሳሽ ወይም ፍርስራሽ ለመጠበቅ ሲባል የዩኤስቢ ወደቡ ተሰናክሏል፣ እና ማናቸውም ተቀጥላዎችን አያገኝም።\n\nየዩኤስቢ ወደቡን እንደገና መጠቀም ችግር በማይኖረው ጊዜ ማሳወቂያ ይደርሰዎታል።"
"ኃይል መሙያዎችን እና ተጨማሪ መሣሪያዎችን ፈልጎ ለማግኘት የነቃ የዩኤስቢ ወደብ"
@@ -181,6 +181,7 @@
"ባትሪ ሁለት አሞሌዎች።"
"ባትሪ ሦስት አሞሌዎች።"
"ባትሪ ሙሉ ነው።"
+ "የባትሪ መቶኛ አይታወቅም።"
"ምንም ስልክ የለም።"
"የስልክ አንድ አሞሌ"
"የስልክ ሁለት አሞሌ"
@@ -1097,4 +1098,6 @@
"%1$s (ግንኙነት ተቋርጧል)"
"ማገናኘት አልተቻለም። እንደገና ይሞክሩ።"
"አዲስ መሣሪያ ያጣምሩ"
+ "የባትሪ መለኪያዎን የማንበብ ችግር"
+ "ለበለጠ መረጃ መታ ያድርጉ"
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 7690c92add1a..3d38d5ed088c 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -181,6 +181,7 @@
"إشارة البطارية تتكون من شريطين."
"إشارة البطارية تتكون من ثلاثة أشرطة."
"إشارة البطارية كاملة."
+ "نسبة شحن البطارية غير معروفة."
"ليست هناك إشارة بالهاتف."
"إشارة الهاتف تتكون من شريط واحد."
"إشارة الهاتف تتكون من شريطين."
@@ -488,7 +489,7 @@
"مرحبًا بك مجددًا في جلسة الضيف"
"هل تريد متابعة جلستك؟"
"البدء من جديد"
- "نعم، متابعة."
+ "نعم، متابعة"
"مستخدم ضيف"
"لحذف التطبيقات والبيانات، عليك إزالة حساب الضيف"
"إزالة الضيف"
@@ -1121,4 +1122,6 @@
"%1$s (غير متّصل)"
"تعذّر الاتصال. يُرجى إعادة المحاولة."
"إقران جهاز جديد"
+ "حدثت مشكلة أثناء قراءة مقياس مستوى شحن البطارية."
+ "انقر للحصول على مزيد من المعلومات."
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 610b03cfab22..c8e5e3675489 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -181,6 +181,7 @@
"বেটাৰিৰ দুডাল দণ্ড।"
"বেটাৰিৰ তিনিডাল দণ্ড।"
"বেটাৰি পূৰাকৈ চ্চাৰ্জ হৈছে।"
+ "বেটাৰীৰ চাৰ্জৰ শতাংশ অজ্ঞাত।"
"ফ\'নত ছিগনেল নাই৷"
"ফ\'ন ছিগনেলৰ এডাল দণ্ড।"
"ফ\'ন ছিগনেলৰ দুডাল দণ্ড।"
@@ -477,7 +478,7 @@
"অতিথি আঁতৰাবনে?"
"এই ছেশ্বনৰ সকলো এপ্ আৰু ডেটা মচা হ\'ব।"
"আঁতৰাওক"
- "আপোনাক পুনৰাই স্বাগতম জনাইছোঁ!"
+ "অতিথি, আপোনাক পুনৰ স্বাগতম!"
"আপুনি আপোনাৰ ছেশ্বন অব্যাহত ৰাখিব বিচাৰেনে?"
"আকৌ আৰম্ভ কৰক"
"হয়, অব্যাহত ৰাখক"
@@ -766,7 +767,7 @@
"বেটাৰিৰ ব্যৱহাৰ"
"চ্চাৰ্জ কৰি থকাৰ সময়ত বেটাৰি সঞ্চয়কাৰী উপলব্ধ নহয়।"
- "বেটাৰি সঞ্চয়কাৰী"
+ "বেটাৰী সঞ্চয়কাৰী"
"কাৰ্যদক্ষতা আৰু নেপথ্য ডেটা হ্ৰাস কৰে"
"%1$s বুটাম"
"হ\'ম"
@@ -1097,4 +1098,6 @@
"%1$s (সংযোগ বিচ্ছিন্ন হৈছে)"
"সংযোগ কৰিব পৰা নগ’ল। পুনৰ চেষ্টা কৰক।"
"নতুন ডিভাইচ পেয়াৰ কৰক"
+ "আপোনাৰ বেটাৰী মিটাৰ পঢ়োঁতে সমস্যা হৈছে"
+ "অধিক তথ্যৰ বাবে টিপক"
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index b5e925549162..701927f32714 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -181,6 +181,7 @@
"Batareya iki xətdir."
"Batareya üç xətdir."
"Batareya doludur"
+ "Batareyanın faizi naməlumdur."
"Telefon yoxdur."
"Şəbəkə bir xətdir."
"Şəbəkə iki xətdir."
@@ -1097,4 +1098,6 @@
"%1$s (bağlantı kəsilib)"
"Qoşulmaq alınmadı. Yenə cəhd edin."
"Yeni cihazı qoşalaşdırın"
+ "Batareya ölçüsünü oxuyarkən problem yarandı"
+ "Ətraflı məlumat üçün toxunun"
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 7f0ea04d0f46..6c01ceed9fff 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -181,6 +181,7 @@
"Baterija od dve crte."
"Baterija od tri crte."
"Baterija je puna."
+ "Procenat napunjenosti baterije nije poznat."
"Nema telefona."
"Signal telefona ima jednu crtu."
"Signal telefona od dve crte."
@@ -1103,4 +1104,6 @@
"%1$s (veza je prekinuta)"
"Povezivanje nije uspelo. Probajte ponovo."
"Upari novi uređaj"
+ "Problem sa očitavanjem merača baterije"
+ "Dodirnite za više informacija"
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 216880003e23..bcc534790ed4 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -28,7 +28,7 @@
"Засталося %s"
"Засталося %1$s, у вас ёсць каля %2$s на аснове даных аб выкарыстанні вашай прылады"
"Засталося %1$s, у вас ёсць каля %2$s"
- "Засталося %s. Уключана эканомія зараду."
+ "Засталося %s. Уключаны рэжым эканоміі зараду."
"Не ўдалося выканаць зарадку праз USB. Выкарыстоўвайце зараднае прыстасаванне з камплекта прылады."
"Не ўдалося выканаць зарадку праз USB"
"Выкарыстоўвайце зараднае прыстасаванне з камплекта прылады"
@@ -181,6 +181,7 @@
"2 планкі акумулятара."
"Тры планкі акумулятара."
"Акумулятар поўны."
+ "Працэнт зараду акумулятара невядомы."
"Няма тэлефона."
"Адна планка на тэлефоне."
"2 планкі тэлефона."
@@ -492,7 +493,7 @@
"Выканаць выхад бягучага карыстальніка"
"ВЫКАНАЦЬ ВЫХАД КАРЫСТАЛЬНІКА"
"Дадаць новага карыстальніка?"
- "Пасля стварэння профіля яго трэба наладзіць.\n\nЛюбы карыстальнік прылады можа абнаўляць праграмы ўсіх іншых карыстальнікаў."
+ "Пасля стварэння профілю яго трэба наладзіць.\n\nЛюбы карыстальнік прылады можа абнаўляць праграмы ўсіх іншых карыстальнікаў."
"Дасягнуты ліміт карыстальнікаў"
- Можна дадаць %d карыстальніка.
@@ -775,7 +776,7 @@
- %d хвіліны
"Выкарыстанне зараду"
- "Эканомія зараду акумулятара недаступная падчас зарадкі"
+ "Рэжым эканоміі зараду акумулятара недаступны падчас зарадкі"
"Эканомія зараду"
"Памяншае прадукцыйнасць і фонавую перадачу даных"
"Кнопка %1$s"
@@ -995,7 +996,7 @@
"Уключыце, калі зарад акумулятара заканчваецца"
"Не, дзякуй"
"Уключаны рэжым эканоміі зараду"
- "Калі ўзровень зараду акумулятара знізіцца да %d%%, аўтаматычна ўключыцца рэжым эканоміі энергіі."
+ "Калі ўзровень зараду акумулятара знізіцца да %d%%, аўтаматычна ўключыцца рэжым эканоміі зараду."
"Налады"
"Зразумела"
"Dump SysUI Heap"
@@ -1109,4 +1110,6 @@
"%1$s (адключана)"
"Не ўдалося падключыцца. Паўтарыце спробу."
"Спалучыць з новай прыладай"
+ "Праблема з чытаннем індыкатара зараду акумулятара"
+ "Націсніце, каб убачыць больш"
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index ec02f2a6f3f5..6b8844d67d01 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -181,6 +181,7 @@
"Батерията е с две чертички."
"Батерията е с три чертички."
"Батерията е пълна."
+ "Процентът на батерията е неизвестен."
"Няма телефон."
"Телефонът е с една чертичка."
"Телефонът е с две чертички."
@@ -487,7 +488,7 @@
"Излизане на потребителя"
"Излезте от профила на текущия потребител"
"ИЗЛИЗАНЕ НА ПОТРЕБИТЕЛЯ"
- "Да се добави ли нов потреб.?"
+ "Да се добави ли нов потребител?"
"Когато добавите нов потребител, той трябва да настрои работното си пространство.\n\nВсеки потребител може да актуализира приложенията за всички останали потребители."
"Достигнахте огранич. за потребители"
@@ -1097,4 +1098,6 @@
"%1$s (връзката е прекратена)"
"Неуспешно свързване. Опитайте отново."
"Сдвояване на ново устройство"
+ "Възникна проблем при четенето на данните за нивото на батерията"
+ "Докоснете за още информация"
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 9e6bb6eb492d..d68f46337f2b 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -181,6 +181,7 @@
"দুই দন্ড ব্যাটারি রয়েছে৷"
"তিন দন্ড ব্যাটারি রয়েছে৷"
"ব্যাটারি পূর্ণ রয়েছে৷"
+ "ব্যাটারি কত শতাংশ আছে তা জানা যায়নি।"
"কোনো ফোনের সংকেত নেই৷"
"এক দন্ড ফোনের সংকেত রয়েছে৷"
"দুই দন্ড ফোনের সংকেত রয়েছে৷"
@@ -475,12 +476,12 @@
"ব্যবহারকারী জুড়ুন"
"নতুন ব্যবহারকারী"
"অতিথি সরাবেন?"
- "এই সেশনের সব অ্যাপ্লিকেশান ও ডেটা মুছে ফেলা হবে।"
+ "এই সেশনের সব অ্যাপ ও ডেটা মুছে ফেলা হবে।"
"সরান"
"অতিথি, আপনি ফিরে আসায় আপনাকে স্বাগত!"
- "আপনি কি আপনার সেশনটি অবিরত রাখতে চান?"
+ "আপনি কি আপনার সেশনটি চালিয়ে যেতে চান?"
"আবার শুরু করুন"
- "হ্যাঁ, অবিরত থাকুন"
+ "হ্যাঁ, চালিয়ে যান"
"অতিথি ব্যবহারকারী"
"অ্যাপ্লিকেশান এবং ডেটা মুছে ফেলার জন্য অতিথি ব্যবহারকারী সরান।"
"অতিথি সরান"
@@ -488,7 +489,7 @@
"বর্তমান ব্যবহারকারীকে লগ-আউট করুন"
"ব্যবহারকারীকে লগ-আউট করুন"
"নতুন ব্যবহারকারীকে যোগ করবেন?"
- "আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট-আপ করে নিতে হবে৷\n\nযেকোনো ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ্লিকেশান আপডেট করতে পারবেন৷"
+ "আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট-আপ করে নিতে হবে৷\n\nযেকোনও ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ আপডেট করতে পারবেন৷"
"আর কোনও প্রোফাইল যোগ করা যাবে না"
- আপনি %d জন পর্যন্ত ব্যবহারকারীর প্রোফাইল যোগ করতে পারেন।
@@ -1097,4 +1098,6 @@
"%1$s (কানেক্ট করা নেই)"
"কানেক্ট করা যায়নি। আবার চেষ্টা করুন।"
"নতুন ডিভাইস পেয়ার করুন"
+ "ব্যাটারির মিটারের রিডিং নেওয়ার সময় সমস্যা হয়েছে"
+ "আরও তথ্যের জন্য ট্যাপ করুন"
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index ef2d50480e54..d3ef3ba9eff6 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -181,6 +181,7 @@
"Baterija na dvije crtice."
"Baterija na tri crtice."
"Baterija je puna."
+ "Postotak napunjenosti baterije nije poznat"
"Nema telefonskog signala."
"Telefonski signal na jednoj crtici."
"Telefonski signal na dvije crtice."
@@ -476,8 +477,8 @@
"Pokaži profil"
"Dodaj korisnika"
"Novi korisnik"
- "Želite li ukloniti gosta?"
- "Sve aplikacije i svi podaci iz ove sesije bit će izbrisani."
+ "Ukloniti gosta?"
+ "Sve aplikacije i podaci iz ove sesije će se izbrisati."
"Ukloni"
"Zdravo! Lijepo je opet vidjeti goste."
"Želite li nastaviti sesiju?"
@@ -489,7 +490,7 @@
"Odjavi korisnika"
"Odjavi trenutnog korisnika"
"ODJAVI KORISNIKA"
- "Želite dodati novog korisnika?"
+ "Dodati novog korisnika?"
"Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor.\n\nSvaki korisnik može ažurirati aplikacije za sve ostale korisnike."
"Dostignut limit za broj korisnika"
@@ -501,7 +502,7 @@
"Sve aplikacije i podaci ovog korisnika bit će izbrisani."
"Ukloni"
"Uključena je Ušteda baterije"
- "Minimizira rad i prijenos podataka u pozadini"
+ "Smanjuje performanse i prijenos podataka u pozadini"
"Isključi Uštedu baterije"
"Aplikacija %s će imati pristup svim informacijama koje se prikazuju na ekranu ili koje se reproduciraju s vašeg uređaja za vrijeme snimanja ili emitiranja. To obuhvata informacije kao što su lozinke, detalji o plaćanju, fotografije, poruke i zvuk koji reproducirate."
"Usluga koja pruža ovu funkciju će imati pristup svim informacijama koje se prikazuju na ekranu ili koje se reproduciraju s vašeg uređaja za vrijeme snimanja ili emitiranja. To obuhvata informacije kao što su lozinke, detalji o plaćanju, fotografije, poruke i zvuk koji reproducirate."
@@ -772,7 +773,7 @@
"Potrošnja baterije"
"Ušteda baterije je isključena prilikom punjenja"
"Ušteda baterije"
- "Ograničava rad i prijenos podataka u pozadini"
+ "Smanjuje performanse i prijenos podataka u pozadini"
"Dugme %1$s"
"Tipka za početak"
"Nazad"
@@ -1103,4 +1104,6 @@
"%1$s (veza je prekinuta)"
"Povezivanje nije uspjelo. Pokušajte ponovo."
"Uparite novi uređaj"
+ "Došlo je do problema prilikom očitavanja mjerača stanja baterije"
+ "Dodirnite za više informacija"
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index b6b4f050313c..251464d3cee8 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -181,6 +181,7 @@
"Bateria: dues barres."
"Bateria: tres barres."
"Bateria carregada."
+ "Es desconeix el percentatge de bateria."
"No hi ha senyal de telèfon."
"Senyal de telèfon: una barra"
"Senyal de telèfon: dues barres."
@@ -714,7 +715,7 @@
"Pot sonar o vibrar en funció de la configuració del telèfon"
"Pot sonar o vibrar en funció de la configuració del telèfon. Les converses de l\'aplicació %1$s es mostren com a bombolles de manera predeterminada."
"Atrau la teva atenció amb una drecera flotant a aquest contingut."
- "Es mostra com a bombolla flotant a la part superior de la secció de converses i mostra la foto de perfil a la pantalla de bloqueig"
+ "Es mostra com a bombolla flotant a la part superior de la secció de converses i la foto de perfil apareix a la pantalla de bloqueig"
"Configuració"
"Prioritat"
"%1$s no admet les funcions de converses"
@@ -1097,4 +1098,6 @@
"%1$s (desconnectat)"
"No s\'ha pogut connectar. Torna-ho a provar."
"Vincula un dispositiu nou"
+ "Hi ha hagut un problema en llegir el mesurador de la bateria"
+ "Toca per obtenir més informació"
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 4cab09fd3df1..e4b32f9fe1a0 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -181,6 +181,7 @@
"Dvě čárky baterie."
"Tři čárky baterie."
"Baterie je nabitá."
+ "Procento baterie není známé."
"Žádná telefonní síť."
"Jedna čárka signálu telefonní sítě."
"Dvě čárky signálu telefonní sítě."
@@ -720,7 +721,7 @@
"Může vyzvánět nebo vibrovat v závislosti na nastavení telefonu"
"Může vyzvánět nebo vibrovat v závislosti na nastavení telefonu. Konverzace z aplikace %1$s ve výchozím nastavení bublají."
"Přitahuje pozornost pomocí plovoucí zkratky k tomuto obsahu."
- "Zobrazuje se v horní části sekce konverzací a má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení"
+ "Zobrazuje se v horní části sekce konverzací, má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení"
"Nastavení"
"Priorita"
"Aplikace %1$s funkce konverzace nepodporuje"
@@ -1109,4 +1110,6 @@
"%1$s (odpojeno)"
"Spojení se nezdařilo. Zkuste to znovu."
"Spárovat nové zařízení"
+ "Problém s načtením měřiče baterie"
+ "Klepnutím zobrazíte další informace"
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index c34b498cdbb2..66885745b479 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -181,6 +181,7 @@
"Batteri to bjælker."
"Batteri tre bjælker."
"Batteri fuldt."
+ "Batteriniveauet er ukendt."
"Ingen telefon."
"Telefon en bjælke."
"Telefon to bjælker."
@@ -487,8 +488,8 @@
"Log brugeren ud"
"Log den aktuelle bruger ud"
"LOG BRUGEREN UD"
- "Vil du tilføje den nye bruger?"
- "Når du tilføjer en ny bruger, skal personen konfigurere sit område.\n\nEnhver bruger kan opdatere apps for alle andre brugere."
+ "Vil du tilføje en ny bruger?"
+ "Når du tilføjer en ny bruger, skal personen konfigurere sit område.\n\nAlle brugere kan opdatere apps for alle de andre brugere."
"Grænsen for antal brugere er nået"
- Du kan tilføje op til %d bruger.
@@ -779,7 +780,7 @@
"Tab"
"Mellemrumstast"
"Enter"
- "Tilbagetast"
+ "Backspace"
"Afspil/pause"
"Stop"
"Næste"
@@ -1039,8 +1040,8 @@
"Hold afbryderknappen nede for at få adgang til dine betjeningselementer"
"Vælg en app for at tilføje styring"
- - %s styringselement er tilføjet.
- - %s styringselementer er tilføjet.
+ - %s styring er tilføjet.
+ - %s styring er tilføjet.
"Fjernet"
"Angivet som favorit"
@@ -1051,7 +1052,7 @@
"Flyt til position %d"
"Betjeningselementer"
"Vælg de indstillinger, der skal vises i menuen for afbryderknappen"
- "Flyt rundt på styringselementer ved at holde dem nede og trække"
+ "Flyt et felt ved at holde det nede og trække"
"Alle styringselementerne blev fjernet"
"Ændringerne blev ikke gemt"
"Se andre apps"
@@ -1097,4 +1098,6 @@
"%1$s (ingen forbindelse)"
"Der kunne ikke oprettes forbindelse. Prøv igen."
"Par ny enhed"
+ "Der er problemer med at aflæse dit batteriniveau"
+ "Tryk for at få flere oplysninger"
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 38b57be632ae..3b37ca3c4add 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -181,6 +181,7 @@
"Akku - zwei Balken"
"Akku - drei Balken"
"Akku voll"
+ "Akkustand unbekannt."
"Kein Telefon"
"Telefonsignal - ein Balken"
"Telefonsignal - zwei Balken"
@@ -714,7 +715,7 @@
"Kann klingeln oder vibrieren, abhängig von den Telefoneinstellungen"
"Kann klingeln oder vibrieren, je nach Telefoneinstellungen. Unterhaltungen von %1$s werden standardmäßig als Bubble angezeigt."
"Du wirst mit einer unverankerten Verknüpfung darauf aufmerksam gemacht."
- "Wird oben im Bereich \"Unterhaltungen\" als unverankerte Bubble mit einem Profilbild auf dem Sperrbildschirm angezeigt"
+ "Wird oben im Bereich „Unterhaltungen“ als unverankerte Bubble angezeigt und erscheint mit einem Profilbild auf dem Sperrbildschirm"
"Einstellungen"
"Priorität"
"%1$s unterstützt keine Funktionen für Unterhaltungen"
@@ -962,7 +963,7 @@
"%1$s, %2$s"
"WLAN ist deaktiviert"
"Bluetooth ist deaktiviert"
- "\"Bitte nicht stören\" ist deaktiviert"
+ "„Bitte nicht stören“ ist deaktiviert"
"\"Bitte nicht stören\" wurde von einer automatischen Regel aktiviert (%s)."
"\"Bitte nicht stören\" wurde von einer App aktiviert (%s)."
"\"Bitte nicht stören\" wurde von einer automatischen Regel oder einer App aktiviert."
@@ -1097,4 +1098,6 @@
"%1$s (nicht verbunden)"
"Verbindung nicht möglich. Versuch es noch einmal."
"Neues Gerät koppeln"
+ "Problem beim Lesen des Akkustands"
+ "Für weitere Informationen tippen"
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index e95bad0c01a7..89331973c532 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -181,6 +181,7 @@
"Δύο γραμμές μπαταρίας."
"Τρεις γραμμές μπαταρίας."
"Πλήρης μπαταρία."
+ "Άγνωστο ποσοστό μπαταρίας."
"Δεν υπάρχει τηλέφωνο."
"Μία γραμμή τηλεφώνου."
"Δύο γραμμές τηλεφώνου."
@@ -477,7 +478,7 @@
"Κατάργηση επισκέπτη;"
"Όλες οι εφαρμογές και τα δεδομένα αυτής της περιόδου σύνδεσης θα διαγραφούν."
"Κατάργηση"
- "Επισκέπτη , καλώς όρισες ξανά!"
+ "Kαλώς ορίσατε ξανά!"
"Θέλετε να συνεχίσετε την περίοδο σύνδεσής σας;"
"Έναρξη από την αρχή"
"Ναι, συνέχεια"
@@ -488,7 +489,7 @@
"Αποσύνδεση τρέχοντα χρήστη"
"ΑΠΟΣΥΝΔΕΣΗ ΧΡΗΣΤΗ"
"Προσθήκη νέου χρήστη;"
- "Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει το χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."
+ "Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει τον χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."
"Συμπληρώθηκε το όριο χρηστών"
- Μπορείτε να προσθέσετε έως %d χρήστες.
@@ -1097,4 +1098,6 @@
"%1$s (αποσυνδέθηκε)"
"Δεν ήταν δυνατή η σύνδεση. Δοκιμάστε ξανά."
"Σύζευξη νέας συσκευής"
+ "Υπάρχει κάποιο πρόβλημα με την ανάγνωση του μετρητή μπαταρίας"
+ "Πατήστε για περισσότερες πληροφορίες."
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 58af3dff1654..0adf19447e8c 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -181,6 +181,7 @@
"Battery two bars."
"Battery three bars."
"Battery full."
+ "Battery percentage unknown."
"No phone."
"Phone one bar."
"Phone two bars."
@@ -1097,4 +1098,6 @@
"%1$s (disconnected)"
"Couldn\'t connect. Try again."
"Pair new device"
+ "Problem reading your battery meter"
+ "Tap for more information"
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index c0378edc2a99..9265f7141050 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -181,6 +181,7 @@
"Battery two bars."
"Battery three bars."
"Battery full."
+ "Battery percentage unknown."
"No phone."
"Phone one bar."
"Phone two bars."
@@ -1097,4 +1098,6 @@
"%1$s (disconnected)"
"Couldn\'t connect. Try again."
"Pair new device"
+ "Problem reading your battery meter"
+ "Tap for more information"
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 58af3dff1654..0adf19447e8c 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -181,6 +181,7 @@
"Battery two bars."
"Battery three bars."
"Battery full."
+ "Battery percentage unknown."
"No phone."
"Phone one bar."
"Phone two bars."
@@ -1097,4 +1098,6 @@
"%1$s (disconnected)"
"Couldn\'t connect. Try again."
"Pair new device"
+ "Problem reading your battery meter"
+ "Tap for more information"
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 58af3dff1654..0adf19447e8c 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -181,6 +181,7 @@
"Battery two bars."
"Battery three bars."
"Battery full."
+ "Battery percentage unknown."
"No phone."
"Phone one bar."
"Phone two bars."
@@ -1097,4 +1098,6 @@
"%1$s (disconnected)"
"Couldn\'t connect. Try again."
"Pair new device"
+ "Problem reading your battery meter"
+ "Tap for more information"
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 808ce2bf7cf7..2120e835c308 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -181,6 +181,7 @@
"Battery two bars."
"Battery three bars."
"Battery full."
+ "Battery percentage unknown."
"No phone."
"Phone one bar."
"Phone two bars."
@@ -1097,4 +1098,6 @@
"%1$s (disconnected)"
"Couldn\'t connect. Try again."
"Pair new device"
+ "Problem reading your battery meter"
+ "Tap for more information"
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 7e67ab5031a2..0a3df72bba05 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -110,7 +110,7 @@
"Compartir"
"Se canceló la grabación de pantalla"
"Se guardó la grabación de pantalla; presiona para verla"
- "Error al borrar la grabación de pantalla"
+ "No se pudo borrar la grabación de pantalla"
"Error al obtener permisos"
"Error al iniciar la grabación de pantalla"
"Opciones de transferencia de archivos por USB"
@@ -128,8 +128,8 @@
"Teléfono"
"Asistente voz"
"Desbloquear"
- "Esperando huella digital"
- "Desbloquear sin utilizar la huella digital"
+ "Esperando huella dactilar"
+ "Desbloquear sin utilizar la huella dactilar"
"Escaneando rostro"
"Enviar"
"Administrar notificaciones"
@@ -168,8 +168,8 @@
"Hubo demasiados intentos incorrectos. Se borrará este usuario."
"Hubo demasiados intentos incorrectos. Se borrarán este perfil de trabajo y sus datos."
"Descartar"
- "Toca el sensor de huellas digitales"
- "Ícono de huella digital"
+ "Toca el sensor de huellas dactilares"
+ "Ícono de huella dactilar"
"Autenticando tu rostro…"
"Ícono de rostro"
"Botón de zoom de compatibilidad"
@@ -181,6 +181,7 @@
"Dos barras de batería"
"Tres barras de batería"
"Batería completa"
+ "Se desconoce el porcentaje de la batería."
"Sin teléfono"
"Una barra de teléfono"
"Dos barras de teléfono"
@@ -477,7 +478,7 @@
"¿Eliminar invitado?"
"Se eliminarán las aplicaciones y los datos de esta sesión."
"Eliminar"
- "Bienvenido nuevamente, invitado."
+ "¡Hola de nuevo, invitado!"
"¿Quieres retomar la sesión?"
"Volver a empezar"
"Sí, continuar"
@@ -1097,4 +1098,6 @@
"%1$s (desconectado)"
"No se pudo establecer la conexión. Vuelve a intentarlo."
"Vincular dispositivo nuevo"
+ "Problema al leer el medidor de batería"
+ "Presiona para obtener más información"
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index d4ec4e5f63cd..8eb5bf50758b 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -181,6 +181,7 @@
"Dos barras de batería"
"Tres barras de batería"
"Batería completa"
+ "Porcentaje de batería desconocido."
"Sin teléfono"
"Una barra de cobertura"
"Dos barras de cobertura"
@@ -1097,4 +1098,6 @@
"%1$s (desconectado)"
"No se ha podido conectar. Inténtalo de nuevo."
"Vincular nuevo dispositivo"
+ "No se ha podido leer el indicador de batería"
+ "Toca la pantalla para consultar más información"
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 319630cdbfa8..a41e69e9f91e 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -181,6 +181,7 @@
"Aku: kaks pulka."
"Aku: kolm pulka."
"Aku täis."
+ "Aku laetuse protsent on teadmata."
"Telefonisignaal puudub"
"Telefonisignaal: üks pulk."
"Telefonisignaal: kaks pulka."
@@ -1097,4 +1098,6 @@
"%1$s (pole ühendatud)"
"Ühenduse loomine ebaõnnestus. Proovige uuesti."
"Uue seadme sidumine"
+ "Probleem akumõõdiku lugemisel"
+ "Puudutage lisateabe saamiseks"
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 092e331963a8..8922c85fdbca 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -181,6 +181,7 @@
"Bateriak bi barra ditu."
"Bateriak hiru barra ditu."
"Bateria beteta dago."
+ "Bateriaren ehunekoa ezezaguna da."
"Ez dago telefono-zenbakirik."
"Telefono-seinaleak barra bat du."
"Telefono-seinaleak bi barra ditu."
@@ -469,8 +470,8 @@
"%2$s • Bizkor kargatzen (%1$s guztiz kargatu arte)"
"%2$s • Mantso kargatzen (%1$s guztiz kargatu arte)"
"Aldatu erabiltzailea"
- "Aldatu erabiltzailez. %s da saioa hasita duena."
- "Uneko erabiltzailea: %s"
+ "Aldatu erabiltzailea. %s da saioa hasita daukana."
+ "Erabiltzailea: %s"
"Erakutsi profila"
"Gehitu erabiltzailea"
"Erabiltzaile berria"
@@ -485,10 +486,10 @@
"Aplikazioak eta datuak ezabatzeko, kendu gonbidatua"
"KENDU GONBIDATUA"
"Amaitu erabiltzailearen saioa"
- "Amaitu uneko erabiltzailearen saioa"
+ "Amaitu erabiltzailearen saioa"
"AMAITU ERABILTZAILEAREN SAIOA"
"Beste erabiltzaile bat gehitu?"
- "Erabiltzaile bat gehitzen duzunean, horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."
+ "Erabiltzaile bat gehitzen duzunean, erabiltzaile horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."
"Erabiltzaile-mugara iritsi zara"
- Gehienez, %d erabiltzaile gehi ditzakezu.
@@ -917,8 +918,8 @@
"Ez baduzu nahi %s zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."
"Erreproduzitu"
"Pausatu"
- "Saltatu hurrengora"
- "Saltatu aurrekora"
+ "Joan hurrengora"
+ "Joan aurrekora"
"Aldatu tamaina"
"Beroegi egoteagatik itzali da"
"Ohi bezala ari da funtzionatzen telefonoa orain.\nInformazio gehiago lortzeko, sakatu hau."
@@ -973,7 +974,7 @@
"Sakatu bateria eta datuen erabilerari buruzko xehetasunak ikusteko"
"Datu-konexioa desaktibatu nahi duzu?"
"%s erabilita ezingo dituzu erabili datuak edo Internet. Wifi-sare baten bidez soilik konektatu ahal izango zara Internetera."
- "Uneko operadorea"
+ "Zure operadorea"
"Aplikazio bat baimen-eskaera oztopatzen ari denez, ezarpenek ezin dute egiaztatu erantzuna."
"%2$s aplikazioaren zatiak erakusteko baimena eman nahi diozu %1$s aplikazioari?"
"- %1$s aplikazioaren informazioa irakur dezake."
@@ -1073,8 +1074,8 @@
"Pasatu hatza aukera gehiago ikusteko"
"Gomendioak kargatzen"
"Multimedia-edukia"
- "Ezkutatu uneko saioa."
- "Ezin da ezkutatu uneko saioa."
+ "Ezkutatu saioa."
+ "Ezin da ezkutatu saioa."
"Baztertu"
"Berrekin"
"Ezarpenak"
@@ -1097,4 +1098,6 @@
"%1$s (deskonektatuta)"
"Ezin izan da konektatu. Saiatu berriro."
"Parekatu beste gailu batekin"
+ "Arazo bat gertatu da bateria-neurgailua irakurtzean"
+ "Informazio gehiago lortzeko, sakatu hau"
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 769aa19d03a2..c2872a8da59e 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -181,6 +181,7 @@
"دو نوار برای باتری."
"سه نوار برای باتری."
"باتری پر است."
+ "درصد شارژ باتری مشخص نیست."
"بدون تلفن."
"یک نوار برای تلفن."
"دو نوار برای تلفن."
@@ -714,7 +715,7 @@
"بسته به تنظیمات ممکن است تلفن زنگ بزند یا لرزش داشته باشد"
"بسته به تنظیمات ممکن است تلفن زنگ بزند یا لرزش داشته باشد. مکالمههای %1$s بهطور پیشفرض در حبابک نشان داده میشوند."
"با میانبری شناور به این محتوا، توجهتان را جلب میکند."
- "در بالای بخش مکالمه بهصورت حبابک شناور نشان داده میشود و تصویر نمایه را در صفحه قفل نمایش میدهد"
+ "در بالای بخش مکالمه بهصورت حبابک شناور نشان داده میشود و عکس نمایه را در صفحه قفل نمایش میدهد"
"تنظیمات"
"اولویت"
"%1$s از ویژگیهای مکالمه پشتیبانی نمیکند"
@@ -1025,7 +1026,7 @@
"مکالمه روی اولویت تنظیم شده است"
"مکالمههای اولویتدار:"
"نمایش در بالای بخش مکالمه"
- "تصویر نمایه را در صفحه قفل نمایش میدهد"
+ "عکس نمایه را در صفحه قفل نمایش میدهد"
"بهشکل حبابک شناور روی برنامهها ظاهر میشود"
"وقفه در «مزاحم نشوید»"
"متوجهام"
@@ -1097,4 +1098,6 @@
"%1$s (اتصال قطع شد)"
"متصل نشد. دوباره امتحان کنید."
"مرتبط کردن دستگاه جدید"
+ "مشکلی در خواندن میزان باتری وجود دارد"
+ "برای اطلاعات بیشتر ضربه بزنید"
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 4debb6477d0e..19794e0a4199 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -118,7 +118,7 @@
"Käytä kamerana (PTP)"
"Asenna Android File Transfer -sovellus Macille"
"Takaisin"
- "Aloituspainike"
+ "Aloitus"
"Valikko"
"Esteettömyys"
"Näytön kääntäminen"
@@ -181,6 +181,7 @@
"Akun virta - kaksi palkkia."
"Akun virta - kolme palkkia."
"Akku täynnä."
+ "Akun varaustaso ei tiedossa."
"Ei puhelinverkkoyhteyttä."
"Puhelinverkkosignaali - yksi palkki."
"Puhelinverkkosignaali - kaksi palkkia."
@@ -1097,4 +1098,6 @@
"%1$s (yhteys katkaistu)"
"Ei yhteyttä. Yritä uudelleen."
"Muodosta uusi laitepari"
+ "Ongelma akkumittarin lukemisessa"
+ "Saat lisätietoja napauttamalla"
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index d2b2e5f411b7..0459ca945702 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -181,6 +181,7 @@
"Niveau de batterie : moyen"
"Niveau de batterie : bon"
"Batterie pleine"
+ "Pourcentage de la pile inconnu."
"Aucun signal"
"Signal : faible"
"Signal : moyen"
@@ -1097,4 +1098,6 @@
"%1$s (déconnecté)"
"Impossible de se connecter. Réessayez."
"Associer un autre appareil"
+ "Un problème est survenu lors de la lecture du niveau de charge de la pile"
+ "Touchez pour en savoir plus"
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 63a3ead8e4e7..7b6ad6bd7b52 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -181,6 +181,7 @@
"Niveau de batterie : moyen"
"Niveau de batterie : bon"
"Batterie pleine"
+ "Pourcentage de la batterie inconnu."
"Aucun signal"
"Signal : faible"
"Signal : moyen"
@@ -256,7 +257,7 @@
"Notification masquée"
"Bulle fermée."
"Volet des notifications"
- "Paramètres rapides"
+ "Réglages rapides"
"Écran de verrouillage"
"Paramètres"
"Aperçu"
@@ -643,7 +644,7 @@
"System UI Tuner"
"Afficher le pourcentage intégré de la batterie"
"Affichez le pourcentage correspondant au niveau de la batterie dans l\'icône de la barre d\'état lorsque l\'appareil n\'est pas en charge."
- "Configuration rapide"
+ "Réglages rapides"
"Barre d\'état"
"Aperçu"
"Mode de démonstration de l\'interface du système"
@@ -653,13 +654,13 @@
"Alarme"
"Profil professionnel"
"Mode Avion"
- "Ajouter une tuile"
- "Tuile de diffusion"
+ "Ajouter un bloc"
+ "Bloc de diffusion"
"Vous n\'entendrez pas votre prochaine alarme %1$s, sauf si vous désactivez cette option avant."
"Vous n\'entendrez pas votre prochaine alarme %1$s."
"à %1$s"
"le %1$s"
- "Configuration rapide – %s"
+ "Réglages rapides – %s"
"Point d\'accès"
"Profil professionnel"
"Divertissant pour certains, mais pas pour tous"
@@ -672,8 +673,8 @@
"L\'application n\'est pas installée sur votre appareil."
"Afficher les secondes sur l\'horloge"
"Afficher les secondes dans la barre d\'état. Cela risque de réduire l\'autonomie de la batterie."
- "Réorganiser la fenêtre de configuration rapide"
- "Afficher la luminosité dans fenêtre de configuration rapide"
+ "Réorganiser les Réglages rapides"
+ "Afficher la luminosité dans les Réglages rapides"
"Paramètres expérimentaux"
"Activer le Bluetooth ?"
"Pour connecter un clavier à votre tablette, vous devez avoir activé le Bluetooth."
@@ -882,22 +883,22 @@
"Écran du haut à 50 %"
"Écran du haut à 30 %"
"Écran du bas en plein écran"
- "supprimer la carte"
- "ajouter la carte à la fin"
- "Déplacer la carte"
- "Ajouter une carte"
+ "supprimer le bloc"
+ "ajouter le bloc à la fin"
+ "Déplacer le bloc"
+ "Ajouter un bloc"
"Déplacer vers %1$d"
"Ajouter à la position %1$d"
"Position %1$d"
- "Éditeur de configuration rapide."
+ "Éditeur Réglages rapides"
"Notification %1$s : %2$s"
"Il est possible que l\'application ne fonctionne pas en mode Écran partagé."
"Application incompatible avec l\'écran partagé."
"Il est possible que l\'application ne fonctionne pas sur un écran secondaire."
"L\'application ne peut pas être lancée sur des écrans secondaires."
"Ouvrir les paramètres."
- "Ouvrir la fenêtre de configuration rapide."
- "Fermer la fenêtre de configuration rapide."
+ "Ouvrir les Réglages rapides."
+ "Fermer les Réglages rapides."
"Alarme définie."
"Connecté en tant que %s"
"Aucun accès à Internet"
@@ -1097,4 +1098,6 @@
"%1$s (déconnecté)"
"Impossible de se connecter. Réessayez."
"Associer un nouvel appareil"
+ "Un problème est survenu au niveau de la lecture de votre outil de mesure de batterie"
+ "Appuyer pour en savoir plus"
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index abb831595da8..a210c33297d9 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -181,6 +181,7 @@
"Dúas barras de batería"
"Tres barras de batería"
"Batería cargada"
+ "Descoñécese a porcentaxe da batería."
"Sen teléfono"
"Unha barra de cobertura"
"Dúas barras de cobertura"
@@ -474,10 +475,10 @@
"Mostrar perfil"
"Engadir usuario"
"Novo usuario"
- "Queres eliminar o invitado?"
+ "Queres quitar o convidado?"
"Eliminaranse todas as aplicacións e datos desta sesión."
- "Eliminar"
- "Benvido de novo, convidado."
+ "Quitar"
+ "Benvido de novo, convidado"
"Queres continuar coa túa sesión?"
"Comezar de novo"
"Si, continuar"
@@ -488,7 +489,7 @@
"Pechar sesión do usuario actual"
"PECHAR SESIÓN DO USUARIO"
"Engadir un usuario novo?"
- "Cando engadas un usuario novo, este deberá configurar o seu espazo\n\nCalquera usuario pode actualizar as aplicacións para todos os demais usuarios."
+ "Cando engadas un usuario novo, este deberá configurar o seu espazo.\n\nCalquera usuario pode actualizar as aplicacións para todos os demais usuarios."
"Alcanzouse o límite de usuarios"
- Podes engadir ata %d usuarios.
@@ -765,7 +766,7 @@
- %d minuto
"Uso de batería"
- "A función de aforro da batería non está dispoñible durante a carga"
+ "A función de aforro de batería non está dispoñible durante a carga"
"Aforro de batería"
"Reduce o rendemento e os datos en segundo plano"
"Botón %1$s"
@@ -1097,4 +1098,6 @@
"%1$s (dispositivo desconectado)"
"Non se puido establecer a conexión. Téntao de novo."
"Vincular dispositivo novo"
+ "Produciuse un problema ao ler o medidor da batería"
+ "Toca para obter máis información"
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 5eb8db7a73ca..db782167c7a4 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -181,6 +181,7 @@
"બૅટરી બે બાર."
"બૅટરી ત્રણ બાર."
"બૅટરી પૂર્ણ."
+ "બૅટરીની ટકાવારી અજાણ છે."
"કોઈ ફોન નથી."
"ફોન એક બાર."
"ફોન બે બાર."
@@ -389,7 +390,7 @@
"સ્વતઃ"
"રંગોને ઉલટાવો"
"રંગ સુધારણા મોડ"
- "વધુ સેટિંગ્સ"
+ "વધુ સેટિંગ"
"થઈ ગયું"
"કનેક્ટ થયેલ"
"કનેક્ટ કરેલ, %1$s બૅટરી"
@@ -475,10 +476,10 @@
"વપરાશકર્તા ઉમેરો"
"નવો વપરાશકર્તા"
"અતિથિ દૂર કરીએ?"
- "આ સત્રમાંની તમામ ઍપ્લિકેશનો અને ડેટા કાઢી નાખવામાં આવશે."
+ "આ સત્રમાંની તમામ ઍપ અને ડેટા કાઢી નાખવામાં આવશે."
"દૂર કરો"
"ફરી સ્વાગત છે, અતિથિ!"
- "શું તમે તમારું સત્ર ચાલુ કરવા માંગો છો?"
+ "શું તમે તમારું સત્ર ચાલુ રાખવા માંગો છો?"
"શરૂ કરો"
"હા, ચાલુ રાખો"
"અતિથિ વપરાશકર્તા"
@@ -488,7 +489,7 @@
"વર્તમાન વપરાશકર્તાને લૉગઆઉટ કરો"
"વપરાશકર્તાને લૉગઆઉટ કરો"
"નવા વપરાશકર્તાને ઉમેરીએ?"
- "જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમનું સ્થાન સેટ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે એપ્લિકેશન્સને અપડેટ કરી શકે છે."
+ "જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમનું સ્થાન સેટ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે."
"વપરાશકર્તા સંખ્યાની મર્યાદા"
- તમે %d વપરાશકર્તા સુધી ઉમેરી શકો છો.
@@ -498,7 +499,7 @@
"આ વપરાશકર્તાની તમામ ઍપ્લિકેશનો અને ડેટા કાઢી નાખવામાં આવશે."
"દૂર કરો"
"બૅટરી સેવર ચાલુ છે"
- "પ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે"
+ "કાર્યપ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે"
"બૅટરી સેવર બંધ કરો"
"રેકૉર્ડ અથવા કાસ્ટ કરતી વખતે, %sને તમારી સ્ક્રીન પર દેખાતી હોય અથવા તમારા ડિવાઇસ પર ચલાવવામાં આવતી હોય તેવી બધી માહિતીનો ઍક્સેસ હશે. આમાં પાસવર્ડ, ચુકવણીની વિગતો, ફોટા, સંદેશા અને તમે ચલાવો છો તે ઑડિયો જેવી માહિતીનો સમાવેશ થાય છે."
"રેકૉર્ડ અથવા કાસ્ટ કરતી વખતે, આ સુવિધા આપતી સેવાને તમારી સ્ક્રીન પર દેખાતી હોય અથવા તમારા ડિવાઇસ પર ચલાવવામાં આવતી હોય તેવી બધી માહિતીનો ઍક્સેસ હશે. આમાં પાસવર્ડ, ચુકવણીની વિગતો, ફોટા, સંદેશા અને તમે ચલાવો છો તે ઑડિયો જેવી માહિતીનો સમાવેશ થાય છે."
@@ -542,7 +543,7 @@
"CA પ્રમાણપત્રો"
"VPN અક્ષમ કરો"
"VPN ડિસ્કનેક્ટ કરો"
- "નીતિઓ જુઓ"
+ "પૉલિસીઓ જુઓ"
"આ ડિવાઇસ %1$sની માલિકીનું છે.\n\nતમારા IT વ્યવસ્થાપક સેટિંગ, કૉર્પોરેટ ઍક્સેસ, ઍપ, તમારા ડિવાઇસ સાથે સંકળાયેલો ડેટા અને તમારા ડિવાઇસની સ્થાન માહિતીનું નિરીક્ષણ તેમજ તેને મેનેજ કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા IT વ્યવસ્થાપકનો સંપર્ક કરો."
"આ ડિવાઇસ તમારી સંસ્થાની માલિકીનું છે.\n\nતમારા IT વ્યવસ્થાપક સેટિંગ, કૉર્પોરેટ ઍક્સેસ, ઍપ, તમારા ડિવાઇસ સાથે સંકળાયેલો ડેટા અને તમારા ડિવાઇસની સ્થાન માહિતીનું નિરીક્ષણ તેમજ તેને મેનેજ કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા IT વ્યવસ્થાપકનો સંપર્ક કરો."
"તમારી સંસ્થાએ આ ઉપકરણ પર પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યું છે. તમારા સુરક્ષિત નેટવર્ક ટ્રાફિકનું નિયમન થઈ શકે છે અથવા તેમાં ફેરફાર કરવામાં આવી શકે છે."
@@ -737,7 +738,7 @@
"%1$s માટે સૂચના નિયંત્રણો ચાલુ છે"
"%1$s માટે સૂચના નિયંત્રણો બંધ છે"
"આ ચૅનલની સૂચનાઓને મંજૂરી આપો"
- "વધુ સેટિંગ્સ"
+ "વધુ સેટિંગ"
"કસ્ટમાઇઝ કરો"
"થઈ ગયું"
"રદ કરો"
@@ -767,7 +768,7 @@
"બૅટરી વપરાશ"
"ચાર્જિંગ દરમિયાન બૅટરી સેવર ઉપલબ્ધ નથી"
"બૅટરી સેવર"
- "પ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે"
+ "કાર્યપ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે"
"બટન %1$s"
"Home"
"Back"
@@ -1097,4 +1098,6 @@
"%1$s (ડિસ્કનેક્ટ થયેલું)"
"કનેક્ટ કરી શકાયું નહીં. ફરી પ્રયાસ કરો."
"નવા ડિવાઇસ સાથે જોડાણ કરો"
+ "તમારું બૅટરી મીટર વાંચવામાં સમસ્યા આવી"
+ "વધુ માહિતી માટે ટૅપ કરો"
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index f1c9cc9bd5b8..766a45cff538 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -181,6 +181,7 @@
"बैटरी दो बार."
"बैटरी तीन बार."
"बैटरी पूरी है."
+ "इस बारे में जानकारी नहीं है कि अभी बैटरी कितने प्रतिशत चार्ज है."
"कोई फ़ोन नहीं."
"फ़ोन एक बार."
"फ़ोन दो बार."
@@ -239,9 +240,7 @@
"बैटरी का विवरण खोलें"
"%d प्रतिशत बैटरी."
"%1$s प्रतिशत बैटरी बची है और आपके इस्तेमाल के हिसाब से यह %2$s में खत्म हो जाएगी"
-
-
-
+ "बैटरी चार्ज हो रही है, %d प्रतिशत."
"सिस्टम सेटिंग."
"सूचनाएं."
"पूरी सूचनाएं देखें"
@@ -476,10 +475,10 @@
"प्रोफ़ाइल दिखाएं"
"उपयोगकर्ता जोड़ें"
"नया उपयोगकर्ता"
- "अतिथि को निकालें?"
- "इस सत्र के सभी ऐप्स और डेटा को हटा दिया जाएगा."
+ "क्या आप मेहमान को हटाना चाहते हैं?"
+ "इस सत्र के सभी ऐप्लिकेशन और डेटा को हटा दिया जाएगा."
"निकालें"
- "अतिथि, आपका फिर से स्वागत है!"
+ "मेहमान, आपका फिर से स्वागत है!"
"क्या आप अपना सत्र जारी रखना चाहते हैं?"
"फिर से शुरू करें"
"हां, जारी रखें"
@@ -498,9 +497,9 @@
"उपयोगकर्ता निकालें?"
"इस उपयोगकर्ता के सभी ऐप और डेटा को हटा दिया जाएगा."
- "निकालें"
+ "हटाएं"
"बैटरी सेवर चालू है"
- "निष्पादन और पृष्ठभूमि डेटा को कम करता है"
+ "परफ़ॉर्मेंस और बैकग्राउंड डेटा को कम करता है"
"बैटरी सेवर बंद करें"
"रिकॉर्ड या कास्ट करते समय, %s आपकी स्क्रीन पर दिख रही या आपके डिवाइस पर चलाई जा रही जानकारी ऐक्सेस कर सकता है. इसमें पासवर्ड, पैसे चुकाने का ब्यौरा, फ़ोटो, मैसेज, और चलाए गए ऑडियो जैसी जानकारी शामिल है."
"रिकॉर्ड या कास्ट करते समय, वह सेवा जो यह फ़ंक्शन उपलब्ध कराती है, आपके डिवाइस पर चलाई जा रही या स्क्रीन पर दिख रही जानकारी को ऐक्सेस कर सकती है. इसमें पासवर्ड, पैसे चुकाने का ब्यौरा, फ़ोटो, मैसेज, और चलाए गए ऑडियो जैसी जानकारी शामिल है."
@@ -716,7 +715,7 @@
"फ़ोन की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है"
"फ़ोन की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है. %1$s में होने वाली बातचीत, डिफ़ॉल्ट रूप से बबल के तौर पर दिखती है."
"फ़्लोट करने वाले शॉर्टकट की मदद से इस सामग्री पर आपका ध्यान बना रहता है."
- "इससे बातचीत, सेक्शन में सबसे ऊपर और फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है"
+ "इससे चैट, बातचीत सेक्शन में सबसे ऊपर फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है"
"सेटिंग"
"प्राथमिकता"
"%1$s पर बातचीत की सुविधाएं काम नहीं करतीं"
@@ -769,7 +768,7 @@
"बैटरी उपयोग"
"चार्ज किए जाने के दौरान बैटरी सेवर उपलब्ध नहीं है"
"बैटरी सेवर"
- "निष्पादन और पृष्ठभूमि डेटा को कम करता है"
+ "परफ़ॉर्मेंस और बैकग्राउंड डेटा को कम करता है"
"बटन %1$s"
"Home"
"Back"
@@ -981,8 +980,8 @@
"- यह %1$s से सूचना पढ़ सकता है"
"- यह %1$s में कार्रवाई कर सकता है"
"%1$s को किसी भी ऐप्लिकेशन के हिस्से (स्लाइस) दिखाने की मंज़ूरी दें"
- "मंज़ूरी दें"
- "नामंज़ूर करें"
+ "अनुमति दें"
+ "अनुमति न दें"
"बैटरी सेवर शेड्यूल करने के लिए टैप करें"
"जब बैटरी खत्म होने वाली हो तब \'बैटरी सेवर\' चालू करें"
"जी नहीं, शुक्रिया"
@@ -1099,4 +1098,6 @@
"%1$s (डिसकनेक्ट किया गया)"
"कनेक्ट नहीं किया जा सका. फिर से कोशिश करें."
"नया डिवाइस जोड़ें"
+ "आपके डिवाइस के बैटरी मीटर की रीडिंग लेने में समस्या आ रही है"
+ "ज़्यादा जानकारी के लिए टैप करें"
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 9a659ccad10d..d22c319cc0e5 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -181,6 +181,7 @@
"Baterija dva stupca."
"Baterija tri stupca."
"Baterija je puna."
+ "Postotak baterije nije poznat."
"Nema telefona."
"Telefonski signal jedan stupac."
"Telefonski signal dva stupca."
@@ -967,10 +968,10 @@
"%1$s, %2$s"
"Wi-Fi je isključen"
"Bluetooth je isključen"
- "Način Ne ometaj isključen"
- "Način Ne ometaj uključilo je automatsko pravilo (%s)."
- "Način Ne ometaj uključila je aplikacija (%s)."
- "Način Ne ometaj uključilo je automatsko pravilo ili aplikacija."
+ "Način Ne uznemiravaj isključen"
+ "Način Ne uznemiravaj uključilo je automatsko pravilo (%s)."
+ "Način Ne uznemiravaj uključila je aplikacija (%s)."
+ "Način Ne uznemiravaj uključilo je automatsko pravilo ili aplikacija."
"Do %s"
"Zadrži"
"Zamijeni"
@@ -1103,4 +1104,6 @@
"%1$s (nije povezano)"
"Povezivanje nije bilo moguće. Pokušajte ponovo."
"Upari novi uređaj"
+ "Problem s očitavanjem mjerača baterije"
+ "Dodirnite za više informacija"
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 98c520bce3d8..0a37bf8f75c5 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -181,6 +181,7 @@
"Akkumulátor két sáv."
"Akkumulátor három sáv."
"Akkumulátor feltöltve."
+ "Az akkumulátor töltöttségi szintje ismeretlen."
"Nincs telefon."
"Telefon egy sáv."
"Telefon két sáv."
@@ -419,7 +420,7 @@
"Bekapcsolás: %s"
"Eddig: %s"
"Sötét téma"
- "Akkumulátorkímélő"
+ "Akkumulátorkímélő mód"
"Be: napnyugta"
"Napfelkeltéig"
"Be: %s"
@@ -1097,4 +1098,6 @@
"%1$s (leválasztva)"
"Sikertelen csatlakozás. Próbálja újra."
"Új eszköz párosítása"
+ "Probléma merült fel az akkumulátor-töltésmérő olvasásakor"
+ "Koppintással további információkat érhet el."
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index d3f0791c08fa..cfd0c0bec4d1 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -181,6 +181,7 @@
"Մարտկոցի երկու գիծ:"
"Մարտկոցի երեք գիծ:"
"Մարտկոցը լիքն է:"
+ "Մարտկոցի լիցքի մակարդակն անհայտ է։"
"Հեռախոս չկա:"
"Հեռախոսի մեկ գիծ:"
"Հեռախոսի երկու գիծ:"
@@ -474,12 +475,12 @@
"Ցույց տալ դիտարկումը"
"Ավելացնել օգտատեր"
"Նոր օգտատեր"
- "Հեռացնե՞լ հյուրին:"
+ "Հեռացնե՞լ հյուրին"
"Այս աշխատաշրջանի բոլոր ծրագրերն ու տվյալները կջնջվեն:"
"Հեռացնել"
- "Բարի վերադարձ, հյուր:"
- "Դուք ցանկանու՞մ եք շարունակել ձեր գործողությունը:"
- "Սկսել"
+ "Բարի վերադարձ, հյուր"
+ "Շարունակե՞լ աշխատաշրջանը։"
+ "Վերսկսել"
"Այո, շարունակել"
"Հյուր"
"Հավելվածները և տվյալները ջնջելու համար հեռացրեք հյուրին"
@@ -487,7 +488,7 @@
"Ընթացիկ օգտատիրոջ դուրս գրում"
"Ընթացիկ օգտատիրոջ դուրս գրում"
"ԸՆԹԱՑԻԿ ՕԳՏՎՈՂԻ ԴՈՒՐՍ ԳՐՈՒՄ"
- "Ավելացնե՞լ նոր պրոֆիլ:"
+ "Ավելացնե՞լ նոր օգտատեր"
"Երբ նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:\n\nՑանկացած օգտատեր կարող է թարմացնել հավելվածները մյուս բոլոր հաշիվների համար:"
"Սահմանաչափը սպառված է"
@@ -757,11 +758,11 @@
"ՀԵՏԱՐԿԵԼ"
"Հետաձգվել է %1$sով"
- - %d hours
+ - %d ժամ
- %d ժամ
- - %d minutes
+ - %d րոպե
- %d րոպե
"Մարտկոցի օգտագործում"
@@ -996,7 +997,7 @@
"տեսախցիկը"
"վայրը"
"խոսափողը"
- "Տվիչներն անջատած են"
+ "Տվիչներն անջատված են"
"Սարքի ծառայություններ"
"Անանուն"
"Հպեք՝ հավելվածը վերագործարկելու և լիաէկրան ռեժիմին անցնելու համար։"
@@ -1097,4 +1098,6 @@
"%1$s (անջատված է)"
"Չհաջողվեց միանալ։ Նորից փորձեք։"
"Նոր սարքի զուգակցում"
+ "Մարտկոցի ցուցիչի ցուցմունքը կարդալու հետ կապված խնդիր կա"
+ "Հպեք՝ ավելին իմանալու համար"
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 954562764ee0..85e58f387c7e 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -181,6 +181,7 @@
"Baterai dua batang."
"Baterai tiga batang."
"Baterai penuh."
+ "Persentase baterai tidak diketahui."
"Tidak dapat melakukan panggilan."
"Ponsel satu batang."
"Ponsel dua batang."
@@ -590,20 +591,20 @@
"aktifkan"
"nonaktifkan"
"Ganti perangkat keluaran"
- "Aplikasi dipasangi pin"
- "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Kembali dan Ringkasan untuk melepas pin."
- "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Kembali dan Beranda untuk melepas pin."
- "Aplikasi akan terus ditampilkan sampai pin dilepas. Geser ke atas dan tahan untuk lepas pin."
- "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Ringkasan untuk melepas pin."
- "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Beranda untuk melepas pin."
+ "Aplikasi disematkan"
+ "Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Kembali dan Ringkasan untuk melepas sematan."
+ "Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Kembali dan Beranda untuk melepas sematan."
+ "Aplikasi akan terus ditampilkan sampai sematan dilepaskan. Geser ke atas dan tahan agar sematan lepas."
+ "Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Ringkasan untuk melepas sematan."
+ "Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Beranda untuk melepas sematan."
"Data pribadi dapat diakses (seperti kontak dan konten email)."
"Aplikasi yang disematkan dapat membuka aplikasi lain."
- "Untuk melepas pin aplikasi ini, sentuh & lama tombol Kembali dan Ringkasan"
- "Untuk melepas pin aplikasi ini, sentuh & lama tombol Kembali dan Layar utama"
- "Untuk melepas pin aplikasi ini, geser ke atas & tahan"
+ "Untuk melepas sematan aplikasi ini, sentuh lama tombol Kembali dan Ringkasan"
+ "Untuk melepas sematan aplikasi ini, sentuh lama tombol Kembali dan Layar utama"
+ "Untuk melepas sematan aplikasi ini, geser ke atas & tahan"
"Mengerti"
"Lain kali"
- "Aplikasi dipasangi pin"
+ "Aplikasi disematkan"
"Aplikasi dilepas pinnya"
"Sembunyikan %1$s?"
"Ini akan muncul kembali saat Anda mengaktifkannya dalam setelan."
@@ -1097,4 +1098,6 @@
"%1$s (terputus)"
"Tidak dapat terhubung. Coba lagi."
"Sambungkan perangkat baru"
+ "Terjadi masalah saat membaca indikator baterai"
+ "Ketuk untuk informasi selengkapnya"
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 9a380757dd5b..324abb508490 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -181,6 +181,7 @@
"Tvö strik á rafhlöðu."
"Þrjú strik á rafhlöðu."
"Rafhlaða fullhlaðin."
+ "Staða rafhlöðu óþekkt."
"Ekkert símasamband."
"Styrkur símasambands er eitt strik."
"Styrkur símasambands er tvö strik."
@@ -1097,4 +1098,6 @@
"%1$s (aftengt)"
"Tenging mistókst. Reyndu aftur."
"Para nýtt tæki"
+ "Vandamál við að lesa stöðu rafhlöðu"
+ "Ýttu til að fá frekari upplýsingar"
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 6e4daae0a08d..8dcb5bc20303 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -63,7 +63,7 @@
"Consenti"
"Debug USB non consentito"
"L\'utente che ha eseguito l\'accesso a questo dispositivo non può attivare il debug USB. Per utilizzare questa funzione, passa all\'utente principale."
- "Consentire debug wireless su questa rete?"
+ "Consentire il debug wireless su questa rete?"
"Nome della rete (SSID)\n%1$s\n\nIndirizzo Wi‑Fi (BSSID)\n%2$s"
"Consenti sempre su questa rete"
"Consenti"
@@ -181,6 +181,7 @@
"Batteria: due barre."
"Batteria: tre barre."
"Batteria carica."
+ "Percentuale della batteria sconosciuta."
"Nessun telefono."
"Telefono: una barra."
"Telefono: due barre."
@@ -477,7 +478,7 @@
"Rimuovere l\'ospite?"
"Tutte le app e i dati di questa sessione verranno eliminati."
"Rimuovi"
- "Bentornato, ospite."
+ "Ti ridiamo il benvenuto alla sessione Ospite."
"Vuoi continuare la sessione?"
"Ricomincia"
"Sì, continua"
@@ -1097,4 +1098,6 @@
"%1$s (disconnesso)"
"Impossibile connettersi. Riprova."
"Accoppia nuovo dispositivo"
+ "Problema durante la lettura dell\'indicatore di livello della batteria"
+ "Tocca per ulteriori informazioni"
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index b81129924cd8..33a7621853db 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -28,35 +28,35 @@
"נותרו %s"
"נותרו %1$s, נשארו בערך %2$s על סמך השימוש במכשיר"
"נותרו %1$s, נשארו בערך %2$s"
- "נותרו %s. הופעלה תכונת החיסכון בסוללה."
+ "נותרו %s. התכונה \'חיסכון בסוללה\' הופעלה."
"לא ניתן לטעון באמצעות USB. ניתן להשתמש במטען שצורף למכשיר שלך."
"לא ניתן לטעון באמצעות USB"
"שימוש במטען שסופק עם המכשיר"
"הגדרות"
"להפעיל את תכונת החיסכון בסוללה?"
- "מידע על מצב החיסכון בסוללה"
+ "מידע על מצב \'חיסכון בסוללה\'"
"הפעלה"
"הפעלת תכונת החיסכון בסוללה"
"הגדרות"
"Wi-Fi"
"סיבוב אוטומטי של המסך"
- "השתק"
+ "השתקה"
"אוטומטי"
"התראות"
- "Bluetooth קשור"
+ "ה-Bluetooth שותף"
"הגדר שיטות קלט"
"מקלדת פיזית"
"האם לתת לאפליקציה %1$s גישה אל %2$s?"
"האם לאפשר לאפליקציה %1$s גישה אל %2$s?\nאפליקציה זו לא קיבלה הרשאה להקליט אך יכולה לתעד אודיו באמצעות מכשיר USB זה."
"האם לתת לאפליקציה %1$s גישה אל %2$s?"
"האם לפתוח את %1$s כדי לעבוד עם %2$s?"
- "לפתוח את %1$s לטיפול במכשיר %2$s?\nאפליקציה זו לא קיבלה הרשאה להקליט אך יכולה לתעד אודיו באמצעות מכשיר USB זה."
+ "לפתוח את %1$s לטיפול בהתקן %2$s?\nהאפליקציה הזו לא קיבלה הרשאה להקליט אך היא יכולה לתעד אודיו באמצעות התקן ה-USB הזה."
"האם לפתוח את %1$s כדי לעבוד עם %2$s?"
"אין אפליקציות מותקנות הפועלות עם אביזר ה-USB. למידע נוסף על אביזר זה היכנס לכתובת %1$s"
"אביזר USB"
"הצג"
"האפליקציה %1$s תמיד תיפתח כשהאביזר %2$s יחובר"
- "האפליקציה %1$s תמיד תיפתח כשהאביזר %2$s יחובר"
+ "האפליקציה %1$s תמיד תיפתח כשההתקן %2$s יחובר"
"האם לאפשר ניפוי באגים ב-USB?"
"טביעת האצבע של מפתח ה-RSA של המחשב היא:\n%1$s"
"אפשר תמיד ממחשב זה"
@@ -75,7 +75,7 @@
"הפעלת USB"
"מידע נוסף"
"הגדל תצוגה כדי למלא את המסך"
- "מתח כדי למלא את המסך"
+ "מתיחה למילוי של המסך"
"צילום מסך"
"נשלחה תמונה"
"שומר צילום מסך..."
@@ -109,14 +109,14 @@
"ביטול"
"שיתוף"
"הקלטת המסך בוטלה"
- "הקלטת המסך נשמרה, יש להקיש כדי להציג"
+ "הקלטת המסך נשמרה, אפשר להקיש כדי לצפות בה"
"שגיאה במחיקת הקלטת המסך"
"קבלת ההרשאות נכשלה"
"שגיאה בהפעלה של הקלטת המסך"
"אפשרויות העברת קבצים ב-USB"
- "טען כנגן מדיה (MTP)"
- "טען כמצלמה (PTP)"
- "התקן את אפליקציית העברת הקבצים של Android עבור Mac"
+ "טעינה כנגן מדיה (MTP)"
+ "טעינה כמצלמה (PTP)"
+ "התקנת האפליקציה \'העברת קבצים ב-Android\' עבור Mac"
"הקודם"
"בית"
"תפריט"
@@ -126,7 +126,7 @@
"חיפוש"
"מצלמה"
"טלפון"
- "מסייע קולי"
+ "האסיסטנט"
"ביטול נעילה"
"ממתין לטביעת אצבע"
"בטל את הנעילה בלי להשתמש בטביעת האצבע"
@@ -134,7 +134,7 @@
"שליחה"
"ניהול התראות"
"פתח את הטלפון"
- "פתח את המסייע הקולי"
+ "פתיחת האסיסטנט"
"פתח את המצלמה"
"ביטול"
"אישור"
@@ -144,7 +144,7 @@
"המערכת מחפשת את הפנים שלך"
"זיהוי הפנים בוצע"
"מאושר"
- "יש להקיש על \'אישור\' לסיום"
+ "יש להקיש על \'אישור\' לסיום התהליך"
"מאומת"
"שימוש בקוד אימות"
"שימוש בקו ביטול נעילה"
@@ -156,13 +156,13 @@
"יש לנסות שוב. ניסיון %1$d מתוך %2$d."
"הנתונים שלך יימחקו"
"הזנת קו ביטול נעילה שגוי בניסיון הבא תגרום למחיקת הנתונים במכשיר."
- "הזנת קוד גישה שגוי בניסיון הבא תגרום למחיקת הנתונים במכשיר."
+ "הזנת קוד אימות שגוי בניסיון הבא תגרום למחיקת הנתונים במכשיר."
"הזנת סיסמה שגויה בניסיון הבא תגרום למחיקת הנתונים במכשיר."
"הזנת קו ביטול נעילה שגוי בניסיון הבא תגרום למחיקת המשתמש הזה."
"הזנת קוד גישה שגוי בניסיון הבא תגרום למחיקת המשתמש הזה."
"הזנת סיסמה שגויה בניסיון הבא תגרום למחיקת המשתמש הזה."
"הזנת קו ביטול נעילה שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."
- "הזנת קוד גישה שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."
+ "הזנה של קוד אימות שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."
"הזנת סיסמה שגויה בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."
"נעשו יותר מדי ניסיונות שגויים. הנתונים במכשיר יימחקו."
"נעשו יותר מדי ניסיונות שגויים. המשתמש הזה יימחק."
@@ -173,7 +173,7 @@
"מחפש אותך…"
"סמל הפנים"
"לחצן מרחק מתצוגה של תאימות."
- "שנה מרחק מתצוגה של מסך קטן לגדול יותר."
+ "שינוי מרחק מתצוגה של מסך קטן לגדול יותר."
"Bluetooth מחובר."
"Bluetooth מנותק."
"אין סוללה."
@@ -181,6 +181,7 @@
"שני פסים של סוללה."
"שלושה פסים של סוללה."
"סוללה מלאה."
+ "אחוז טעינת הסוללה לא ידוע."
"אין טלפון."
"פס אחד של טלפון."
"שני פסים של טלפון."
@@ -191,7 +192,7 @@
"שני פסים של נתונים."
"שלושה פסים של נתונים."
"אות הנתונים מלא."
- "מחובר אל %s."
+ "התבצע חיבור אל %s."
"מחובר אל %s."
"מחובר אל %s."
"ללא WiMAX."
@@ -211,7 +212,7 @@
"פועל."
"כבוי."
"מחובר."
- "מתחבר."
+ "מתבצע חיבור."
"GPRS"
"HSPA"
"3G"
@@ -235,7 +236,7 @@
"מצב טיסה"
"VPN פועל."
"אין כרטיס SIM."
- "רשת ספק משתנה"
+ "רשת הספק משתנה"
"פתיחת פרטי סוללה"
"%d אחוזים של סוללה."
"רמת הטעינה בסוללה: %1$s אחוזים, הזמן הנותר המשוער על סמך השימוש שלך:%2$s"
@@ -284,11 +285,11 @@
"Bluetooth נכבה."
"Bluetooth הופעל."
"דיווח מיקום כבוי."
- "דיווח מיקום מופעל."
+ "התכונה \'דיווח מיקום\' מופעלת."
"דיווח מיקום נכבה."
"דיווח מיקום הופעל."
"ההתראה נקבעה ל-%s."
- "סגור לוח."
+ "סגירת הלוח."
"יותר זמן."
"פחות זמן."
"הפנס כבוי."
@@ -318,7 +319,7 @@
"הגעת למגבלת הנתונים שהגדרת. אתה כבר לא משתמש בחבילת גלישה.\n\nאם תמשיך, ייתכנו חיובים על שימוש בנתונים."
"המשך"
"מחפש GPS"
- "מיקום מוגדר על ידי GPS"
+ "המיקום מוגדר על ידי GPS"
"בקשות מיקום פעילות"
"ההגדרה \'חיישנים כבויים\' פעילה"
"הסרת כל ההתראות."
@@ -333,9 +334,9 @@
"הגדרת התראות"
"הגדרות %s"
"המסך יסתובב באופן אוטומטי."
- "המסך נעול כעת לרוחב."
+ "המסך נעול עכשיו לרוחב."
"המסך נעול כעת לאורך."
- "המסך יסתובב כעת באופן אוטומטי."
+ "המסך יסתובב עכשיו באופן אוטומטי."
"המסך נעול כעת לרוחב."
"המסך נעול כעת לאורך."
"מזנון קינוחים"
@@ -360,12 +361,12 @@
"סיבוב אוטומטי"
"סיבוב אוטומטי של המסך"
"מצב %s"
- "סיבוב נעול"
+ "סיבוב המסך נעול"
"לאורך"
"לרוחב"
"שיטת קלט"
"מיקום"
- "מיקום כבוי"
+ "המיקום מושבת"
"מכשיר מדיה"
"RSSI"
"שיחות חירום בלבד"
@@ -380,7 +381,7 @@
"Wi-Fi כבוי"
"Wi-Fi פועל"
"אין רשתות Wi-Fi זמינות"
- "ההפעלה מתבצעת…"
+ "בתהליך הפעלה…"
"העברת מסך"
"מעביר"
"מכשיר ללא שם"
@@ -408,19 +409,19 @@
"התראות"
"פנס"
- "מצלמה בשימוש"
+ "המצלמה בשימוש"
"חבילת גלישה"
"שימוש בנתונים"
"מכסת נתונים נותרת"
- "חריגה מההגבלה"
+ "חריגה מהמגבלה"
"%s בשימוש"
"הגבלה של %s"
"אזהרה - %s"
"פרופיל עבודה"
"תאורת לילה"
- "מופעל בשקיעה"
+ "התכונה מופעלת בשקיעה"
"עד הזריחה"
- "מופעל בשעה %s"
+ "תופעל בשעה %s"
"עד %s"
"עיצוב כהה"
"חיסכון בסוללה"
@@ -439,28 +440,28 @@
"יש לגרור ימינה כדי לעבור במהירות בין אפליקציות"
"החלפת מצב של מסכים אחרונים"
"טעון"
- "טוען"
+ "בטעינה"
"%s עד למילוי"
"לא בטעינה"
"ייתכן שהרשת\nמנוטרת"
"חיפוש"
- "הסט למעלה כדי להציג %s."
- "הסט שמאלה כדי להציג %s."
+ "אפשר להסיט למעלה כדי לבצע %s."
+ "הסטה שמאלה כדי לבצע %s."
"כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות, תזכורות, אירועים ושיחות ממתקשרים מסוימים לבחירתך. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים."
"כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים."
"התאמה אישית"
"פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. בכל מקרה, עדיין אפשר להתקשר."
- "פעולה זו מבטלת את כל הצלילים והרטט, כולל בהתראות, מוזיקה, סרטונים ומשחקים."
+ "הפעולה הזו מבטלת את כל הצלילים והרטט, כולל בהתראות, מוזיקה, סרטונים ומשחקים."
"+%d"
- "התראות בדחיפות נמוכה יותר בהמשך"
- "הקש שוב כדי לפתוח"
+ "התראות בדחיפות נמוכה יותר מופיעות בהמשך"
+ "יש להקיש שוב כדי לפתוח את ההתראה"
"צריך להחליק כדי לפתוח"
"יש להחליק למעלה כדי לנסות שוב"
"המכשיר הזה שייך לארגון שלך"
"המכשיר הזה שייך לארגון %s"
"החלק מהסמל כדי להפעיל את הטלפון"
- "החלק מהסמל כדי להפעיל את המסייע הקולי"
- "החלק מהסמל כדי להפעיל את המצלמה"
+ "יש להחליק מהסמל כדי להפעיל את האסיסטנט"
+ "צריך להחליק מהסמל כדי להפעיל את המצלמה"
"שקט מוחלט. הגדרה זו תשתיק גם קוראי מסך."
"שקט מוחלט"
"עדיפות בלבד"
@@ -480,7 +481,7 @@
"משתמש חדש"
"להסיר אורח?"
"כל האפליקציות והנתונים בפעילות זו באתר יימחקו."
- "הסר"
+ "הסרה"
"שמחים לראותך שוב!"
"האם ברצונך להמשיך בפעילות באתר?"
"ברצוני להתחיל מחדש"
@@ -491,7 +492,7 @@
"ניתוק משתמש"
"צא מהמשתמש הנוכחי"
"נתק משתמש"
- "האם להוסיף משתמש חדש?"
+ "להוסיף משתמש חדש?"
"בעת הוספת משתמש חדש, על משתמש זה להגדיר את השטח שלו.\n\nכל משתמש יכול לעדכן אפליקציות עבור כל המשתמשים האחרים."
"הגעת למגבלת המשתמשים שניתן להוסיף"
@@ -502,16 +503,16 @@
"האם להסיר את המשתמש?"
"כל האפליקציות והנתונים של המשתמש הזה יימחקו."
- "הסר"
+ "הסרה"
"תכונת החיסכון בסוללה פועלת"
"מפחית את הביצועים ונתונים ברקע"
- "כיבוי תכונת החיסכון בסוללה"
+ "השבתת התכונה \'חיסכון בסוללה\'"
"לאפליקציית %s תהיה גישה לכל המידע הגלוי במסך שלך ולכל תוכן שמופעל במכשיר שלך בזמן הקלטה או העברה (casting). המידע הזה כולל פרטים כמו סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו שמושמע מהמכשיר."
"לשירות שמספק את הפונקציה הזו תהיה גישה לכל הפרטים שגלויים במסך שלך או מופעלים מהמכשיר שלך בזמן הקלטה או העברה (cast). זה כולל פרטים כמו סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו שמושמע מהמכשיר."
"להתחיל להקליט או להעביר (cast)?"
"להתחיל להקליט או להעביר (cast) באמצעות %s?"
"אל תציג שוב"
- "ניקוי הכל"
+ "ניקוי הכול"
"ניהול"
"היסטוריה"
"התראות חדשות"
@@ -526,7 +527,7 @@
"ייתכן שהרשת נמצאת במעקב"
"ייתכן שהרשת מנוטרת"
"הארגון שלך הוא הבעלים של מכשיר זה והוא עשוי לנטר את התנועה ברשת"
- "הארגון %1$s הוא הבעלים של מכשיר זה והוא עשוי לנטר את התנועה ברשת"
+ "הארגון %1$s הוא הבעלים של המכשיר הזה והוא עשוי לנטר את התנועה ברשת"
"המכשיר הזה שייך לארגון שלך, והוא מחובר ל-%1$s"
"המכשיר הזה שייך לארגון %1$s והוא מחובר ל-%2$s"
"המכשיר הזה שייך לארגון שלך"
@@ -546,16 +547,16 @@
"VPN"
"רישום התנועה ברשת"
"אישורי CA"
- "השבת VPN"
- "נתק את ה-VPN"
- "הצג מדיניות"
+ "השבתת VPN"
+ "ניתוק ה-VPN"
+ "הצגת מדיניות"
"המכשיר הזה שייך לארגון %1$s.\n\nמנהל ה-IT יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, יש לפנות למנהל ה-IT."
"המכשיר הזה שייך לארגון שלך.\n\nמנהל ה-IT יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, יש לפנות למנהל ה-IT."
"הארגון שלך התקין רשות אישורים במכשיר. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה."
"הארגון שלך התקין רשות אישורים בפרופיל העבודה. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה."
"במכשיר זה מותקנת רשות אישורים. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה."
"מנהל המערכת הפעיל את התכונה \'רישום התנועה ברשת\', שמנטרת את תנועת הנתונים במכשיר."
- "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."
+ "התחברת לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."
"אתה מחובר לאפליקציות %1$s ו-%2$s, שיכולות לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."
"פרופיל העבודה שלך מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."
"הפרופיל האישי שלך מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."
@@ -564,22 +565,22 @@
"מנהל המערכת יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר."
" "
"למידע נוסף"
- "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."
+ "התחברת לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."
" "
"להגדרות ה-VPN"
" "
- "פתח את פרטי הכניסה המהימנים"
+ "פתיחה של פרטי הכניסה המהימנים"
"מנהל המערכת הפעיל את תכונת רישום התנועה ברשת, שמנטרת את תנועת הנתונים במכשיר.\n\nלמידע נוסף, צור קשר עם מנהל המערכת."
"נתת לאפליקציה כלשהי הרשאה להגדיר חיבור VPN.\n\nהאפליקציה הזו יכולה לעקוב אחר הפעילות שלך ברשת ובמכשיר, כולל הודעות אימייל, אפליקציות ואתרים."
"פרופיל העבודה שלך מנוהל על-ידי %1$s.\n\n מנהל המערכת שלך יכול לעקוב אחרי הפעילות שלך ברשת, כולל פעילות באימייל, באפליקציות ובאתרים.\n\n למידע נוסף, צור קשר עם מנהל המערכת.\n\nבנוסף, אתה מחובר ל-VPN, שגם באמצעותו ניתן לעקוב אחרי הפעילות שלך ברשת."
"VPN"
"אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."
- "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים."
+ "התחברת לאפליקציית %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."
"אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים."
"פרופיל העבודה שלך מנוהל על ידי %1$s. הפרופיל מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת."
"פרופיל העבודה שלך מנוהל על ידי %1$s. הפרופיל מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nהפרופיל מחובר גם לאפליקציה %3$s, שיכולה לעקוב אחר הפעילות שלך ברשת."
"הנעילה נמנעת על ידי סביבה אמינה"
- "המכשיר יישאר נעול עד שתבטל את נעילתו באופן ידני"
+ "המכשיר יישאר נעול עד שהנעילה שלו תבוטל באופן ידני"
"%1$s\n%2$s"
"קבלה מהירה של התראות"
"צפה בהן לפני שתבטל נעילה"
@@ -588,9 +589,9 @@
"%1$s. %2$s"
"כבה עכשיו"
"הגדרות צליל"
- "הרחב"
- "כווץ"
- "הוספת כתוביות אוטומטית למדיה"
+ "הרחבה"
+ "כיווץ"
+ "הוספת כתוביות באופן אוטומטי למדיה"
"סגירת הטיפ לגבי כתוביות"
"שכבת-על לכיתוב"
"הפעלה"
@@ -611,8 +612,8 @@
"לא, תודה"
"האפליקציה הוצמדה"
"הצמדת האפליקציה בוטלה"
- "להסתיר%1$s?"
- "יופיע מחדש בפעם הבאה שתפעיל את האפשרות בהגדרות."
+ "להסתיר את %1$s?"
+ "יופיע מחדש בפעם הבאה שהאפשרות הזו תופעל בהגדרות."
"הסתר"
"שיחה"
"מערכת"
@@ -630,14 +631,14 @@
"הטלפון במצב רטט"
"הטלפון מושתק"
"%1$s. הקש כדי לבטל את ההשתקה."
- "%1$s. הקש כדי להגדיר רטט. ייתכן ששירותי הנגישות מושתקים."
+ "%1$s. צריך להקיש כדי להגדיר רטט. ייתכן ששירותי הנגישות מושתקים."
"%1$s. הקש כדי להשתיק. ייתכן ששירותי הנגישות מושתקים."
- "%1$s. הקש כדי להעביר למצב רטט."
- "%1$s. הקש כדי להשתיק."
+ "%1$s. יש להקיש כדי להעביר למצב רטט."
+ "%1$s. יש להקיש כדי להשתיק."
"השתקה"
"ביטול ההשתקה"
"רטט"
- "בקרי עוצמת שמע של %s"
+ "בקרי עוצמת קול של %s"
"הטלפון יצלצל כשמתקבלות שיחות והתראות (%1$s)"
"פלט מדיה"
"פלט שיחת טלפון"
@@ -653,16 +654,16 @@
"שורת סטטוס"
"סקירה"
"מצב הדגמה בממשק המשתמש של המערכת"
- "הפעל מצב הדגמה"
- "הצג מצב הדגמה"
+ "הפעלת מצב הדגמה"
+ "הצגת מצב הדגמה"
"אתרנט"
"התראה"
"פרופיל עבודה"
"מצב טיסה"
- "הוסף אריח"
+ "הוספת אריח"
"אריח שידור"
- "לא תשמע את ההתראה הבאה שלך %1$s, אלא אם תשבית קודם את ההגדרה הזו"
- "לא תשמע את ההתראה הבאה שלך %1$s"
+ "כדי לשמוע את ההתראה הבאה שלך %1$s, עליך להשבית את התכונה הזו"
+ "לא ניתן יהיה לשמוע את ההתראה הבאה שלך %1$s"
"בשעה %1$s"
"ב-%1$s"
"הגדרות מהירות, %s."
@@ -676,11 +677,11 @@
"הסר מההגדרות"
"האם להסיר את System UI Tuner ולהפסיק להשתמש בכל התכונות שלו?"
"האפליקציה אינה מותקנת במכשיר"
- "הצג שניות בשעון"
- "הצג שניות בשעון בשורת הסטטוס. פעולה זו עשויה להשפיע על אורך חיי הסוללה."
+ "הצגת שניות בשעון"
+ "הצגת שניות בשעון בשורת הסטטוס. פעולה זו עשויה להשפיע על זמן חיי הסוללה."
"סידור מחדש של הגדרות מהירות"
- "הצג בהירות בהגדרות מהירות"
- "ניסיוני"
+ "הצגת בהירות בהגדרות המהירות"
+ "ניסיוניות"
"האם להפעיל את ה-Bluetooth?"
"כדי לחבר את המקלדת לטאבלט, תחילה עליך להפעיל את ה-Bluetooth."
"הפעלה"
@@ -777,7 +778,7 @@
"שימוש בסוללה"
"תכונת החיסכון בסוללה אינה זמינה בעת טעינת המכשיר"
"חיסכון בסוללה"
- "מפחית את רמת הביצועים ואת נתוני הרקע"
+ "מפחיתה את רמת הביצועים ואת נתוני הרקע"
"לחצן %1$s"
"דף הבית"
"הקודם"
@@ -795,13 +796,13 @@
"הבא"
"הקודם"
"הרץ אחורה"
- "הרץ קדימה"
+ "הרצה קדימה"
"דפדוף למעלה"
"דפדוף למטה"
"מחיקה"
"דף הבית"
"סיום"
- "הזן"
+ "הוספה"
"מקש Num Lock"
"מקלדת נומרית %1$s"
"מערכת"
@@ -812,7 +813,7 @@
"מקשי קיצור במקלדת"
"החלפה של פריסת מקלדת"
"אפליקציות"
- "מסייע"
+ "אסיסטנט"
"דפדפן"
"אנשי קשר"
"אימייל"
@@ -822,8 +823,8 @@
"יומן"
"הצג עם פקדי עוצמת הקול"
"נא לא להפריע"
- "מקש קיצור ללחצני עוצמת קול"
- "יציאה מ\'נא לא להפריע\' בלחיצה על הלחצן להגברת עוצמת הקול"
+ "קיצור דרך ללחצני עוצמת קול"
+ "יציאה ממצב \'נא לא להפריע\' בלחיצה על הלחצן להגברת עוצמת הקול"
"סוללה"
"שעון"
"אוזניות"
@@ -870,13 +871,13 @@
"עריכה"
"שעה"
- - "הצג שעות, דקות ושניות"
+ - "הצגת שעות, דקות ושניות"
- "הצג שעות ודקות (ברירת מחדל)"
- - "אל תציג את הסמל הזה"
+ - "לא להציג את הסמל הזה"
- "הצג תמיד באחוזים"
- - "הצג באחוזים בזמן טעינה (ברירת מחדל)"
+ - "הצגת אחוזים בזמן הטעינה (ברירת מחדל)"
- "אל תציג את הסמל הזה"
"הצגת סמלי התראות בעדיפות נמוכה"
@@ -909,7 +910,7 @@
"פתיחה של \'הגדרות מהירות\'."
"סגירה של \'הגדרות מהירות\'."
"הגדרת התראה."
- "מחובר בתור %s"
+ "בוצעה כניסה בתור %s"
"אין אינטרנט"
"פתיחת פרטים."
"לא זמין כי %s"
@@ -917,22 +918,22 @@
"עריכת סדר ההגדרות."
"דף %1$d מתוך %2$d"
"מסך נעילה"
- "הרחב"
+ "הרחבה"
"מזער"
"סגירה"
"הגדרות"
- "גרור למטה כדי לסגור"
+ "יש לגרור למטה כדי לסגור"
"תפריט"
"%s במצב תמונה בתוך תמונה"
- "אם אינך רוצה שהתכונה הזו תשמש את %s, יש להקיש כדי לפתוח את ההגדרות ולכבות את התכונה."
- "הפעל"
- "השהה"
+ "אם אינך רוצה שהתכונה הזו תשמש את %s, יש להקיש כדי לפתוח את ההגדרות ולהשבית את התכונה."
+ "הפעלה"
+ "השהיה"
"אפשר לדלג אל הבא"
"אפשר לדלג אל הקודם"
"שינוי גודל"
"הטלפון כבה עקב התחממות"
"הטלפון פועל כרגיל עכשיו.\nיש להקיש כדי להציג מידע נוסף"
- "הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • תשתמש באפליקציות עתירות משאבים (כגון משחקים, אפליקציות וידאו או אפליקציות ניווט)\n • תוריד או תעלה קבצים גדולים\n • תשתמש בטלפון בטמפרטורות גבוהות"
+ "הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • משתמשים באפליקציות עתירות משאבים (כגון משחקים, אפליקציות וידאו או אפליקציות ניווט)\n • מורידים או מעלים קבצים גדולים\n • משתמשים בטלפון בסביבה עם טמפרטורות גבוהות"
"לצפייה בשלבי הטיפול"
"הטלפון מתחמם"
"חלק מהתכונות מוגבלות כל עוד הטלפון מתקרר.\nיש להקיש כדי להציג מידע נוסף"
@@ -986,9 +987,9 @@
"הספק שלך"
"יש אפליקציה שמסתירה את בקשת ההרשאה, ולכן להגדרות אין אפשרות לאמת את התשובה."
"האם לאפשר ל-%1$s להציג חלקים מ-%2$s?"
- "- תהיה לה אפשרות לקרוא מידע מ-%1$s"
+ "- תהיה לה אפשרות לקרוא מידע מאפליקציית %1$s"
"- תהיה לה יכולת לנקוט פעולה בתוך %1$s"
- "יש לאשר ל-%1$s להראות חלקים מכל אפליציה שהיא"
+ "יש לאשר לאפליקציית %1$s להראות חלקים מכל אפליציה שהיא"
"אני רוצה לאשר"
"אני לא מרשה"
"יש להקיש כדי לתזמן את מצב החיסכון בסוללה"
@@ -1010,8 +1011,8 @@
"שירותים למכשיר"
"ללא שם"
"צריך להקיש כדי להפעיל מחדש את האפליקציה הזו ולעבור למסך מלא."
- "הגדרות בשביל בועות של %1$s"
- "גלישה"
+ "הגדרות לבועות של %1$s"
+ "אפשרויות נוספות"
"הוספה בחזרה לערימה"
"ניהול"
"%1$s מהאפליקציה %2$s"
@@ -1046,7 +1047,7 @@
"פקדי מכשירים"
"יש להוסיף פקדים למכשירים המחוברים"
"הגדרה של פקדי מכשירים"
- "יש ללחוץ לחיצה ארוכה על לחצן ההפעלה כדי לגשת לבקרים"
+ "יש ללחוץ לחיצה ארוכה על לחצן ההפעלה כדי לגשת לפקדי המכשיר"
"יש לבחור אפליקציה כדי להוסיף פקדים"
- נוספו %s פקדים.
@@ -1059,7 +1060,7 @@
"סומן כהעדפה, במיקום %d"
"הוסר מהמועדפים"
"להוסיף למועדפים"
- "להוסיף למועדפים"
+ "להסיר מהמועדפים"
"העברה למיקום %d"
"פקדים"
"יש לבחור פקדים לגישה מתפריט ההפעלה"
@@ -1076,7 +1077,7 @@
"הפקדים עודכנו"
"קוד האימות מכיל אותיות או סמלים"
"אימות %s"
- "קוד גישה שגוי"
+ "קוד אימות שגוי"
"בתהליך אימות…"
"יש להזין קוד אימות"
"יש לנסות קוד אימות אחר"
@@ -1109,4 +1110,6 @@
"%1$s (מנותק)"
"לא ניתן היה להתחבר. יש לנסות שוב."
"התאמה של מכשיר חדש"
+ "בעיה בקריאת מדדי הסוללה"
+ "יש להקיש כדי להציג מידע נוסף"
diff --git a/packages/SystemUI/res/values-iw/strings_tv.xml b/packages/SystemUI/res/values-iw/strings_tv.xml
index 1e5fc91ecff1..67a78378b5f5 100644
--- a/packages/SystemUI/res/values-iw/strings_tv.xml
+++ b/packages/SystemUI/res/values-iw/strings_tv.xml
@@ -21,8 +21,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
"תמונה בתוך תמונה"
"(תוכנית ללא כותרת)"
- "סגור PIP"
+ "סגירת PIP"
"מסך מלא"
"המיקרופון פעיל"
- "%1$s קיבלה גישה למיקרופון שלך"
+ "לאפליקציה %1$s יש גישה למיקרופון שלך"
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 2c71a21081e1..91488fa7094f 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -181,6 +181,7 @@
"電池残量:レベル2"
"電池残量:レベル3"
"電池残量:満"
+ "電池残量は不明です。"
"電波状態:なし"
"電波状態:レベル1"
"電波状態:レベル2"
@@ -1097,4 +1098,6 @@
"%1$s(未接続)"
"接続できませんでした。もう一度お試しください。"
"新しいデバイスとのペア設定"
+ "電池残量の読み込み中に問題が発生しました"
+ "タップすると詳細が表示されます"
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 4e7493cb2738..a2e1b7f25198 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -181,6 +181,7 @@
"ბატარეა ორ ზოლზე."
"ბატარეა სამ ზოლზე."
"ბატარეა სავსეა."
+ "ბატარეის პროცენტული მაჩვენებელი უცნობია."
"ტელეფონი არ არის."
"ტელეფონის სიგნალი ერთ ზოლზეა."
"ტელეფონის სიგნალი ორ ზოლზეა."
@@ -1097,4 +1098,6 @@
"%1$s (კავშირი გაწყვეტილია)"
"დაკავშირება ვერ მოხერხდა. ცადეთ ხელახლა."
"ახალი მოწყობილობის დაწყვილება"
+ "თქვენი ბატარეის მზომის წაკითხვასთან დაკავშირებით პრობლემა დაფიქსირდა"
+ "შეეხეთ მეტი ინფორმაციისთვის"
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index db520088c48b..331f25e1a616 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -36,7 +36,7 @@
"Батареяны үнемдеу режимін қосу керек пе?"
"Батареяны үнемдеу режимі туралы ақпарат"
"Қосу"
- "Battery saver функциясын қосу"
+ "Батареяны үнемдеу режимін қосу"
"Параметрлер"
"Wi-Fi"
"Авто айналатын экран"
@@ -181,6 +181,7 @@
"Батарея екі баған."
"Батарея үш баған."
"Батарея толы."
+ "Батарея зарядының мөлшері белгісіз."
"Телефон жоқ."
"Телефон бір баған."
"Телефон екі баған."
@@ -274,8 +275,8 @@
"үнсіз"
"оятқыштар ғана"
"Мазаламау."
- "\"Мазаламау\" режимі өшірілді."
- "\"Мазаламау\" режимі қосылды."
+ "Мазаламау режимі өшірілді."
+ "Мазаламау режимі қосылды."
"Bluetooth."
"Bluetooth өшірулі."
"Bluetooth қосулы."
@@ -305,8 +306,8 @@
"Жұмыс режимі қосулы."
"Жұмыс режимі өшірілді."
"Жұмыс режимі қосылды."
- "Data Saver өшірілді."
- "Data Saver қосылды."
+ "Трафикті үнемдеу режимі өшірілді."
+ "Трафикті үнемдеу режимі қосылды."
"Sensor Privacy функциясы өшірулі."
"Sensor Privacy функциясы қосулы."
"Дисплей жарықтығы"
@@ -397,7 +398,7 @@
"Тетеринг"
"Хотспот"
"Қосылуда…"
- "Data Saver қосулы"
+ "Трафикті үнемдеу режимі қосулы"
- %d құрылғы
- %d құрылғы
@@ -477,7 +478,7 @@
"Қонақты жою керек пе?"
"Осы сеанстағы барлық қолданбалар мен деректер жойылады."
"Алып тастау"
- "Қош келдіңіз, қонақ"
+ "Қош келдіңіз, қонақ!"
"Сеансты жалғастыру керек пе?"
"Қайта бастау"
"Иә, жалғастыру"
@@ -499,7 +500,7 @@
"Жою"
"Батареяны үнемдеу режимі қосулы"
"Өнімділікті және фондық деректерді азайтады"
- "Battery saver функциясын өшіру"
+ "Батареяны үнемдеу режимін өшіру"
"%s жазу не трансляциялау кезінде экранда көрсетілетін немесе дыбысталатын барлық ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және аудиоматериалдар кіреді."
"Осы функцияны ұсынатын қызмет жазу не трансляциялау кезінде экранда көрсетілетін немесе құрылғыда дыбысталатын ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және аудиоматериалдар кіреді."
"Жазу немесе трансляциялау басталсын ба?"
@@ -513,7 +514,7 @@
"Хабарландырулар"
"Әңгімелер"
"Барлық дыбыссыз хабарландыруларды өшіру"
- "Хабарландырулар \"Мазаламау\" режимінде кідіртілді"
+ "Хабарландырулар Мазаламау режимінде кідіртілді"
"Қазір бастау"
"Хабарландырулар жоқ"
"Профиль бақылануы мүмкін"
@@ -813,16 +814,16 @@
"Дыбыс деңгейін басқару элементтерімен бірге көрсету"
"Мазаламау"
"Дыбыс деңгейі түймелерінің төте жолы"
- "Дыбысы арттырылған кезде, \"Мазаламау\" режимінен шығу"
+ "Дыбысы арттырылған кезде, Мазаламау режимінен шығу"
"Батарея"
"Сағат"
"Құлақаспап жинағы"
"Параметрлерді ашу"
"Құлақаспап қосылды"
"Құлақаспап жинағы қосылды"
- "Data Saver"
- "Дерек сақтағыш қосулы"
- "Дерек сақтағышы өшірулі"
+ "Трафикті үнемдеу"
+ "Трафикті үнемдеу режимі қосулы"
+ "Трафикті үнемдеу режимі өшірулі"
"Қосулы"
"Өшірулі"
"Қолжетімді емес"
@@ -962,10 +963,10 @@
"%1$s, %2$s"
"Wi-Fi өшірулі"
"Bluetooth өшірулі"
- "\"Мазаламау\" режимі өшірулі"
- "\"Мазаламау\" режимі (%s) автоматты ережесі арқылы қосылды."
- "\"Мазаламау\" режимі (%s) қолданбасы арқылы қосылды."
- "\"Мазаламау\" режимі автоматты ереже немесе қолданба арқылы қосылды."
+ "Мазаламау режимі өшірулі"
+ "Мазаламау режимі (%s) автоматты ережесі арқылы қосылды."
+ "Мазаламау режимі (%s) қолданбасы арқылы қосылды."
+ "Мазаламау режимі автоматты ереже немесе қолданба арқылы қосылды."
"%s дейін"
"Қалсын"
"Ауыстыру"
@@ -984,8 +985,8 @@
"Түймені түртіп, Батареяны үнемдеу режимін реттеңіз"
"Батареяның заряды бітуге жақындағанда қосыңыз."
"Жоқ, рақмет"
- "Battery Saver кестесі қосылды"
- "Батарея заряды %d%% деңгейінен төмендегенде, Battery Saver автоматты түрде қосылады."
+ "Батареяны үнемдеу кестесі қосылды"
+ "Батарея заряды %d%% деңгейінен төмендегенде, Батареяны үнемдеу режимі автоматты түрде қосылады."
"Параметрлер"
"Түсінікті"
"Dump SysUI Heap"
@@ -1027,7 +1028,7 @@
"Әңгімелер бөлімінің жоғарғы жағында көрсетіледі."
"Профиль суреті құлыптаулы экранда көрсетіледі."
"Қолданбалар терезесінің бергі жағынан қалқыма хабарлар түрінде көрсетіледі."
- "\"Мазаламау\" режимінде көрсетіледі."
+ "Мазаламау режимінде көрсетіледі."
"Түсінікті"
"Параметрлер"
"Ұлғайту терезесін қабаттастыру"
@@ -1097,4 +1098,6 @@
"%1$s (ажыратылған)"
"Қосылмады. Қайта қосылып көріңіз."
"Жаңа құрылғымен жұптау"
+ "Батарея зарядының дерегі алынбай жатыр"
+ "Толығырақ ақпарат алу үшін түртіңіз."
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 4d88cfd5cd2e..1020948bf631 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -181,6 +181,7 @@
"ថ្មពីរកាំ។"
"ថ្មទាំងបីកាំ។"
"ថ្មពេញហើយ។"
+ "មិនដឹងអំពីភាគរយថ្មទេ។"
"គ្មានទូរស័ព្ទ។"
"សេវាទូរស័ព្ទមួយកាំ។"
"សេវាទូរស័ព្ទពីរកាំ។"
@@ -472,23 +473,23 @@
"ប្ដូរអ្នកប្រើ អ្នកប្រើបច្ចុប្បន្ន %s"
"អ្នកប្រើបច្ចុប្បន្ន %s"
"បង្ហាញប្រវត្តិរូប"
- "បន្ថែមអ្នកប្រើ"
+ "បញ្ចូលអ្នកប្រើ"
"អ្នកប្រើថ្មី"
- "លុបភ្ញៀវ?"
- "ទិន្នន័យ និងកម្មវិធីទាំងអស់ក្នុងសម័យនេះនឹងត្រូវបានលុប។"
- "លុបចេញ"
+ "ដកភ្ញៀវចេញឬ?"
+ "កម្មវិធី និងទិន្នន័យទាំងអស់ក្នុងវគ្គនេះនឹងត្រូវលុប។"
+ "ដកចេញ"
"សូមស្វាគមន៍ការត្រឡប់មកវិញ, ភ្ញៀវ!"
- "តើអ្នកចង់បន្តសម័យរបស់អ្នក?"
- "ចាប់ផ្ដើម"
+ "តើអ្នកចង់បន្តវគ្គរបស់អ្នកទេ?"
+ "ចាប់ផ្ដើមសាជាថ្មី"
"បាទ/ចាស បន្ត"
"អ្នកប្រើភ្ញៀវ"
"ដើម្បីលុបកម្មវិធី និងទិន្នន័យ សូមយកអ្នកប្រើជាភ្ញៀវចេញ"
- "យកភ្ញៀវចេញ"
+ "ដកភ្ញៀវចេញ"
"ចុះឈ្មោះអ្នកប្រើចេញ"
"ចុះឈ្មោះអ្នកប្រើបច្ចុប្បន្នចេញ"
"ចុះឈ្មោះអ្នកប្រើចេញ"
- "បន្ថែមអ្នកប្រើថ្មី?"
- "ពេលអ្នកបន្ថែមអ្នកប្រើថ្មី អ្នកប្រើនោះត្រូវកំណត់ទំហំផ្ទាល់របស់គេ។\n\nអ្នកប្រើណាមួយក៏អាចធ្វើបច្ចុប្បន្នភាពកម្មវិធីសម្រាប់អ្នកប្រើផ្សេងបានដែរ។"
+ "បញ្ចូលអ្នកប្រើថ្មីឬ?"
+ "នៅពេលអ្នកបញ្ចូលអ្នកប្រើថ្មី អ្នកប្រើនោះត្រូវរៀបចំកន្លែងរបស់គេ។\n\nអ្នកប្រើណាក៏អាចដំឡើងកំណែកម្មវិធីសម្រាប់អ្នកប្រើទាំងអស់ផ្សេងទៀតបានដែរ។"
"បានឈានដល់ចំនួនកំណត់អ្នកប្រើប្រាស់"
- អ្នកអាចបញ្ចូលអ្នកប្រើប្រាស់បានរហូតដល់ %d នាក់។
@@ -496,7 +497,7 @@
"យកអ្នកប្រើចេញ?"
"កម្មវិធី និងទិន្នន័យទាំងអស់របស់អ្នកប្រើនេះនឹងត្រូវបានលុប។"
- "យកចេញ"
+ "ដកចេញ"
"មុខងារសន្សំថ្មបានបើក"
"ការបន្ថយការប្រតិបត្តិ និងទិន្នន័យផ្ទៃខាងក្រោយ"
"បិទមុខងារសន្សំថ្ម"
@@ -1097,4 +1098,6 @@
"%1$s (បានផ្ដាច់)"
"មិនអាចភ្ជាប់បានទេ។ សូមព្យាយាមម្ដងទៀត។"
"ផ្គូផ្គងឧបករណ៍ថ្មី"
+ "មានបញ្ហាក្នុងការអានឧបករណ៍រង្វាស់កម្រិតថ្មរបស់អ្នក"
+ "ចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index ffa1ede2e58c..b9fc90576391 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -181,6 +181,7 @@
"ಬ್ಯಾಟರಿ ಎರಡು ಪಟ್ಟಿಗಳು."
"ಬ್ಯಾಟರಿ ಮೂರು ಪಟ್ಟಿಗಳು."
"ಬ್ಯಾಟರಿ ಭರ್ತಿಯಾಗಿದೆ."
+ "ಬ್ಯಾಟರಿ ಶೇಕಡಾವಾರು ತಿಳಿದಿಲ್ಲ."
"ಯಾವುದೇ ಫೋನ್ ಇಲ್ಲ."
"ಪೋನ್ ಒಂದು ಪಟ್ಟಿ."
"ಫೋನ್ ಎರಡು ಪಟ್ಟಿಗಳು."
@@ -480,7 +481,7 @@
"ಮತ್ತೆ ಸುಸ್ವಾಗತ, ಅತಿಥಿ!"
"ನಿಮ್ಮ ಸೆಷನ್ ಮುಂದುವರಿಸಲು ಇಚ್ಚಿಸುವಿರಾ?"
"ಪ್ರಾರಂಭಿಸಿ"
- "ಹೌದು, ಮುಂದುವರಿ"
+ "ಹೌದು, ಮುಂದುವರಿಸಿ"
"ಅತಿಥಿ ಬಳಕೆದಾರ"
"ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾ ಅಳಿಸಲು, ಅತಿಥಿ ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಿ"
"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"
@@ -1097,4 +1098,6 @@
"%1$s (ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ)"
"ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."
"ಹೊಸ ಸಾಧನವನ್ನು ಜೋಡಿಸಿ"
+ "ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ"
+ "ಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 03114e0a3b24..f5aadc85eab4 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -181,6 +181,7 @@
"배터리 막대가 두 개입니다."
"배터리 막대가 세 개입니다."
"배터리 충전이 완료되었습니다."
+ "배터리 잔량을 알 수 없습니다."
"휴대전화의 신호가 없습니다."
"휴대전화 신호 막대가 하나입니다."
"휴대전화 신호 막대가 두 개입니다."
@@ -477,10 +478,10 @@
"게스트를 삭제하시겠습니까?"
"이 세션에 있는 모든 앱과 데이터가 삭제됩니다."
"삭제"
- "게스트 세션 다시 시작"
+ "게스트 세션 진행"
"세션을 계속 진행하시겠습니까?"
"다시 시작"
- "예, 계속합니다."
+ "계속 진행"
"게스트 사용자"
"앱 및 데이터를 삭제하려면 게스트 사용자를 삭제하세요."
"게스트 삭제"
@@ -488,7 +489,7 @@
"현재 사용자 로그아웃"
"사용자 로그아웃"
"신규 사용자를 추가할까요?"
- "추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."
+ "추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n사용자라면 누구든 다른 사용자를 위해 앱을 업데이트할 수 있습니다."
"사용자 제한 도달"
- 사용자를 %d명까지 추가할 수 있습니다.
@@ -714,7 +715,7 @@
"휴대전화 설정에 따라 벨소리나 진동이 울릴 수 있음"
"휴대전화 설정에 따라 벨소리나 진동이 울릴 수 있습니다. 기본적으로 %1$s의 대화는 대화창으로 표시됩니다."
"이 콘텐츠로 연결되는 플로팅 바로가기로 사용자의 주의를 끕니다."
- "대화 섹션 상단에 표시, 플로팅 대화창으로 표시, 그리고 잠금 화면에 프로필 사진이 표시됨"
+ "대화 섹션 상단에 표시, 플로팅 대화창으로 표시, 잠금 화면에 프로필 사진이 표시됨"
"설정"
"우선순위"
"%1$s 앱은 대화 기능을 지원하지 않습니다."
@@ -1097,4 +1098,6 @@
"%1$s(연결 끊김)"
"연결할 수 없습니다. 다시 시도하세요."
"새 기기와 페어링"
+ "배터리 수준을 읽는 중에 문제가 발생함"
+ "탭하여 자세한 정보를 확인하세요."
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 42d63a8024f3..d1b6a09b4d67 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -92,7 +92,7 @@
"Экрандан жаздырылып алынган видео иштетилүүдө"
"Экранды жаздыруу сеансы боюнча учурдагы билдирме"
"Жаздырып баштайсызбы?"
- "Жаздыруу учурунда Android тутуму экраныңызда көрүнүп турган жана түзмөктө ойноп жаткан бардык купуя маалыматты жаздырып алат. Буга сырсөздөр, төлөм маалыматы, сүрөттөр, билдирүүлөр жана аудио файлдар кирет."
+ "Жаздыруу учурунда Android системасы экраныңызда көрүнүп турган жана түзмөктө ойноп жаткан бардык купуя маалыматты жаздырып алат. Буга сырсөздөр, төлөм маалыматы, сүрөттөр, билдирүүлөр жана аудио файлдар кирет."
"Аудио жаздыруу"
"Түзмөктүн аудиосу"
"Музыка, чалуулар жана шыңгырлар сыяктуу түзмөгүңүздөгү добуштар"
@@ -181,6 +181,7 @@
"Эки таякча батарея."
"Үч таякча батарея."
"Батарея толук."
+ "Батарея кубатынын деңгээли белгисиз."
"Телефон сигналы жок."
"Телефон сигналы бир таякча."
"Телефон сигналы эки таякча."
@@ -431,7 +432,7 @@
"Баштадык"
"Токтотуу"
"Түзмөк"
- "Башка колдонмого которулуу үчүн,, өйдө сүрүңүз"
+ "Башка колдонмого которулуу үчүн өйдө сүрүңүз"
"Колдонмолорду тез которуштуруу үчүн, оңго сүйрөңүз"
"Сереп салууну өчүрүү/күйгүзүү"
"Кубатталды"
@@ -454,9 +455,9 @@
"Кайталоо үчүн экранды өйдө сүрүңүз"
"Бул түзмөк уюмуңузга таандык"
"Бул түзмөк төмөнкүгө таандык: %s"
- "Сүрөтчөнү серпип телефонго өтүңүз"
- "Сүрөтчөнү серпип үн жардамчысына өтүңүз"
- "Сүрөтчөнү серпип камерага өтүңүз"
+ "Сүрөтчөнү сүрүп телефонго өтүңүз"
+ "Сүрөтчөнү сүрүп үн жардамчысына өтүңүз"
+ "Сүрөтчөнү сүрүп камерага өтүңүз"
"Толук жымжырттык талап кылынат. Бул экрандагыны окугучтарды да тынчтандырат."
"Тымтырс"
"Шашылыш билдирүүлөр гана"
@@ -475,9 +476,9 @@
"Колдонуучу кошуу"
"Жаңы колдонуучу"
"Конокту алып саласызбы?"
- "Бул сеанстагы бардык колдонмолор жана дайындар өчүрүлөт."
+ "Бул сеанстагы бардык колдонмолор жана маалыматтар өчүрүлөт."
"Алып салуу"
- "Кайтып келишиңиз менен, конок!"
+ "Кайтып келишиңиз менен!"
"Сеансыңызды улантасызбы?"
"Кайра баштоо"
"Ооба, уланта берели"
@@ -670,8 +671,8 @@
"Жөндөөлөрдөн алып салуу"
"System UI Tuner Жөндөөлөрдөн өчүрүлүп, анын бардык функциялары токтотулсунбу?"
"Колдонмо сиздин түзмөгүңүздө орнотулган эмес"
- "Сааттын секунддары көрсөтүлсүн"
- "Абал тилкесинен сааттын секунддары көрсөтүлсүн. Батареянын кубаты көбүрөөк сарпталышы мүмкүн."
+ "Сааттын секунддары көрүнсүн"
+ "Абал тилкесинен сааттын секунддары көрүнсүн. Батареянын кубаты көбүрөөк сарпталышы мүмкүн."
"Ыкчам жөндөөлөрдү кайра коюу"
"Ыкчам жөндөөлөрдөн жарык деңгээлин көрсөтүү"
"Сынамык"
@@ -680,7 +681,7 @@
"Күйгүзүү"
"Үнсүз көрүнөт"
"Бардык билдирмелерди бөгөттөө"
- "Үнү менен көрсөтүлсүн"
+ "Үнү менен көрүнсүн"
"Үнү менен көрсөтүлүп бөгөттөлбөсүн"
"Эскертмелерди башкаруу каражаттары"
"Күйүк"
@@ -714,7 +715,7 @@
"Телефондун жөндөөлөрүнө жараша шыңгырап же дирилдеши мүмкүн"
"Телефондун жөндөөлөрүнө жараша шыңгырап же дирилдеши мүмкүн. %1$s колдонмосундагы жазышуулар демейки жөндөө боюнча калкып чыкма билдирмелер түрүндө көрүнөт."
"Калкыма ыкчам баскыч менен көңүлүңүздү бул мазмунга буруп турат."
- "Жазышуулар тизмесинин өйдө жагында калкып чыкма билдирме түрүндө көрүнүп, профиль сүрөтү кулпуланган экрандан чагылдырылат"
+ "Жазышуулар тизмесинин өйдө жагында калкып чыкма билдирме түрүндө көрүнсө, профиль сүрөтү кулпуланган экранда көрүнөт"
"Жөндөөлөр"
"Маанилүүлүгү"
"%1$s жазышуу функцияларын колдоого албайт"
@@ -810,7 +811,7 @@
"Музыка"
"YouTube"
"Жылнаама"
- "Үн көзөмөлдөгүчтөрү менен көрсөтүлсүн"
+ "Үн көзөмөлдөгүчтөрү менен көрүнсүн"
"Тынчымды алба"
"Үндү көзөмөлдөөчү баскычтардын кыска жолдору"
"Үн катуулатылганда \"Тынчымды алба\" режиминен чыгуу"
@@ -865,8 +866,8 @@
- "Бул сүрөтчө көрүнбөсүн"
- - "Ар дайым пайызы көрсөтүлсүн"
- - "Кубаттоо учурунда пайызы көрсөтүлсүн (демейки)"
+ - "Ар дайым пайызы көрүнсүн"
+ - "Кубаттоо учурунда пайызы көрүнсүн (демейки)"
- "Бул сүрөтчө көрүнбөсүн"
"Анча маанилүү эмес билдирменин сүрөтчөлөрүн көрсөтүү"
@@ -1097,4 +1098,6 @@
"%1$s (ажыратылды)"
"Байланышпай койду. Кайталоо."
"Жаңы түзмөктү жупташтыруу"
+ "Батареяңыздын кубаты аныкталбай жатат"
+ "Кеңири маалымат алуу үчүн таптап коюңуз"
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 5ee3d00f2664..daae298d0317 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -181,6 +181,7 @@
"ແບັດເຕີຣີສອງຂີດ."
"ແບັດເຕີຣີສາມຂີດ."
"ແບັດເຕີຣີເຕັມ."
+ "ບໍ່ຮູ້ເປີເຊັນແບັດເຕີຣີ."
"ບໍ່ມີໂທລະສັບ."
"ສັນຍານນຶ່ງຂີດ."
"ສັນຍານສອງຂີດ."
@@ -477,7 +478,7 @@
"ລຶບແຂກບໍ?"
"ແອັບຯແລະຂໍ້ມູນທັງໝົດໃນເຊດຊັນນີ້ຈະຖືກລຶບອອກ."
"ລຶບ"
- "ຍິນດີຕ້ອນຮັບກັບມາ, ຜູ່ຢ້ຽມຢາມ!"
+ "ຍິນດີຕ້ອນຮັບກັບມາ, ຜູ້ຢ້ຽມຢາມ!"
"ທ່ານຕ້ອງການສືບຕໍ່ເຊດຊັນຂອງທ່ານບໍ່?"
"ເລີ່ມຕົ້ນໃຫມ່"
"ຕົກລົງ, ດຳເນີນການຕໍ່"
@@ -488,7 +489,7 @@
"ອອກຈາກຜູ້ໃຊ້ປະຈຸບັນ"
"ເອົາຜູ້ໃຊ້ອອກຈາກລະບົບ"
"ເພີ່ມຜູ້ໃຊ້ໃໝ່ບໍ?"
- "ເມື່ອທ່ານເພີ່ມຜູ້ໃຊ້ໃໝ່, ຜູ້ໃຊ້ນັ້ນຈະຕ້ອງຕັ້ງຄ່າພື້ນທີ່ບ່ອນຈັດເກັບຂໍ້ມູນຂອງລາວ.\n\nຜູ້ໃຊ້ທຸກຄົນສາມາດອັບເດດແອັບຯຂອງຜູ້ໃຊ້ຄົນອື່ນທັງໝົດໄດ້."
+ "ເມື່ອທ່ານເພີ່ມຜູ້ໃຊ້ໃໝ່, ຜູ້ໃຊ້ນັ້ນຈະຕ້ອງຕັ້ງຄ່າພື້ນທີ່ບ່ອນຈັດເກັບຂໍ້ມູນຂອງລາວ.\n\nຜູ້ໃຊ້ທຸກຄົນສາມາດອັບເດດແອັບຂອງຜູ້ໃຊ້ຄົນອື່ນທັງໝົດໄດ້."
"ຮອດຂີດຈຳກັດຜູ້ໃຊ້ແລ້ວ"
- ທ່ານສາມາດເພີ່ມໄດ້ສູງສຸດ %d ຄົນ.
@@ -1097,4 +1098,6 @@
"%1$s (ຕັດການເຊື່ອມຕໍ່ແລ້ວ)"
"ບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້. ລອງໃໝ່."
"ຈັບຄູ່ອຸປະກອນໃໝ່"
+ "ເກີດບັນຫາໃນການອ່ານຕົວວັດແທກແບັດເຕີຣີຂອງທ່ານ"
+ "ແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 56df8d6e75b7..5607584e7351 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -181,6 +181,7 @@
"Dvi akumuliatoriaus juostos."
"Trys akumuliatoriaus juostos."
"Akumuliatorius įkrautas."
+ "Akumuliatoriaus energija procentais nežinoma."
"Nėra telefono."
"Viena telefono juosta."
"Dvi telefono juostos."
@@ -515,7 +516,7 @@
"Tvarkyti"
"Istorija"
"Nauja"
- "Tylūs"
+ "Tylus"
"Pranešimai"
"Pokalbiai"
"Išvalyti visus tylius pranešimus"
@@ -1109,4 +1110,6 @@
"„%1$s“ (atjungta)"
"Nepavyko prijungti. Bandykite dar kartą."
"Naujo įrenginio susiejimas"
+ "Nuskaitant akumuliatoriaus skaitiklį iškilo problema"
+ "Palieskite, kad sužinotumėte daugiau informacijos"
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index fde18e50c1d1..7c64e26136bb 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -181,6 +181,7 @@
"Akumulators: divas joslas."
"Akumulators: trīs joslas."
"Akumulators ir pilnīgi uzlādēts."
+ "Akumulatora uzlādes līmenis procentos nav zināms."
"Nav tālruņa."
"Tālrunis: viena josla."
"Tālrunis: divas joslas."
@@ -717,7 +718,7 @@
"Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt"
"Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt. Sarunas no lietotnes %1$s pēc noklusējuma tiek parādītas burbulī."
"Piesaista jūsu uzmanību, rādot peldošu saīsni uz šo saturu."
- "Parādās sarunu sadaļas augšdaļā un kā peldošs burbulis, kā arī bloķēšanas ekrānā tiek rādīts profila attēls"
+ "Parādās sarunu sadaļas augšdaļā, arī kā peldošs burbulis, profila attēls parādās bloķēšanas ekrānā"
"Iestatījumi"
"Prioritārs"
"Lietotnē %1$s netiek atbalstītas sarunu funkcijas."
@@ -1103,4 +1104,6 @@
"%1$s (savienojums pārtraukts)"
"Nevarēja izveidot savienojumu. Mēģiniet vēlreiz."
"Savienošana pārī ar jaunu ierīci"
+ "Nevar iegūt informāciju par akumulatora uzlādes līmeni."
+ "Pieskarieties, lai iegūtu plašāku informāciju."
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 56a63c5f4863..4e7c06370b0f 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -181,6 +181,7 @@
"Батерија две цртички."
"Батерија три цртички."
"Батеријата е полна."
+ "Процентот на батеријата е непознат."
"Нема сигнал."
"Телефон една цртичка.."
"Телефон две цртички."
@@ -512,7 +513,7 @@
"Безгласно"
"Известувања"
"Разговори"
- "Избриши ги сите тивки известувања"
+ "Избриши ги сите бесчујни известувања"
"Известувањата се паузирани од „Не вознемирувај“"
"Започни сега"
"Нема известувања"
@@ -1097,4 +1098,6 @@
"%1$s (исклучен)"
"Не може да се поврзе. Обидете се повторно."
"Спарете нов уред"
+ "Проблем при читањето на мерачот на батеријата"
+ "Допрете за повеќе информации"
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index f0f6982ac3d6..dc07b609756d 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -181,6 +181,7 @@
"ബാറ്ററി രണ്ട് ബാർ."
"ബാറ്ററി മൂന്ന് ബാർ."
"ബാറ്ററി നിറഞ്ഞു."
+ "ബാറ്ററി ശതമാനം അജ്ഞാതമാണ്."
"ഫോൺ സിഗ്നൽ ഒന്നുമില്ല."
"ഫോണിൽ ഒരു ബാർ."
"ഫോണിൽ രണ്ട് ബാർ."
@@ -475,9 +476,9 @@
"ഉപയോക്താവിനെ ചേര്ക്കുക"
"പുതിയ ഉപയോക്താവ്"
"അതിഥിയെ നീക്കംചെയ്യണോ?"
- "ഈ സെഷനിലെ എല്ലാ അപ്ലിക്കേഷനുകളും ഡാറ്റയും ഇല്ലാതാക്കും."
+ "ഈ സെഷനിലെ എല്ലാ ആപ്പുകളും ഡാറ്റയും ഇല്ലാതാക്കും."
"നീക്കംചെയ്യുക"
- "അതിഥിയ്ക്ക് വീണ്ടും സ്വാഗതം!"
+ "അതിഥി, വീണ്ടും സ്വാഗതം!"
"നിങ്ങളുടെ സെഷൻ തുടരണോ?"
"പുനരാംരംഭിക്കുക"
"അതെ, തുടരുക"
@@ -488,7 +489,7 @@
"നിലവിലെ ഉപയോക്താവിനെ ലോഗൗട്ട് ചെയ്യുക"
"ഉപയോക്താവിനെ ലോഗൗട്ട് ചെയ്യുക"
"പുതിയ ഉപയോക്താവിനെ ചേർക്കണോ?"
- "നിങ്ങൾ ഒരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിക്ക് അവരുടെ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\nമറ്റ് എല്ലാ ഉപയോക്താക്കൾക്കുമായി ഏതൊരു ഉപയോക്താവിനും അപ്ലിക്കേഷനുകൾ അപ്ഡേറ്റ് ചെയ്യാനാവും."
+ "നിങ്ങൾ പുതിയൊരു ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിക്ക് അവരുടെ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\nമറ്റ് എല്ലാ ഉപയോക്താക്കൾക്കുമായി ഏതൊരു ഉപയോക്താവിനും ആപ്പുകൾ അപ്ഡേറ്റ് ചെയ്യാനാവും."
"ഉപയോക്തൃ പരിധി എത്തി"
- നിങ്ങൾക്ക് %d ഉപയോക്താക്കളെ വരെ ചേർക്കാനാവും.
@@ -711,7 +712,7 @@
"ബബ്ൾ"
"ശബ്ദമോ വൈബ്രേഷനോ ഇല്ല"
"ശബ്ദമോ വൈബ്രേഷനോ ഇല്ല, സംഭാഷണ വിഭാഗത്തിന് താഴെയായി ദൃശ്യമാകും"
- "ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ് ചെയ്തേക്കാം അല്ലെങ്കിൽ വൈബ്രേറ്റ് ചെയ്തേക്കാം"
+ "ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ്/വൈബ്രേറ്റ് ചെയ്യും"
"ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ് ചെയ്തേക്കാം അല്ലെങ്കിൽ വൈബ്രേറ്റ് ചെയ്തേക്കാം. %1$s-ൽ നിന്നുള്ള സംഭാഷണങ്ങൾ ഡിഫോൾട്ടായി ബബ്ൾ ആവുന്നു."
"ഈ ഉള്ളടക്കത്തിലേക്ക് ഒരു ഫ്ലോട്ടിംഗ് കുറുക്കുവഴി ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ നിലനിർത്തുന്നു."
"സംഭാഷണ വിഭാഗത്തിന് മുകളിലായി കാണിക്കുന്നു, ഫ്ലോട്ടിംഗ് ബബിളായി ദൃശ്യമാകുന്നു, ലോക്ക് സ്ക്രീനിൽ പ്രൊഫൈൽ ചിത്രം പ്രദർശിപ്പിക്കുന്നു"
@@ -1097,4 +1098,6 @@
"%1$s (വിച്ഛേദിച്ചു)"
"കണക്റ്റ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."
"പുതിയ ഉപകരണവുമായി ജോടിയാക്കുക"
+ "നിങ്ങളുടെ ബാറ്ററി മീറ്റർ വായിക്കുന്നതിൽ പ്രശ്നമുണ്ട്"
+ "കൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 95624983b0cd..4f85c057fd7b 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -28,7 +28,7 @@
"%s үлдсэн"
"%1$s үлдсэн байна. Таны хэрэглээнд тулгуурлан ойролцоогоор %2$s-н хугацаа үлдсэн"
"%1$s үлдсэн байна. Ойролцоогоор %2$s-н хугацаа үлдсэн"
- "%s үлдсэн. Тэжээл хэмнэгч асаалттай байна."
+ "%s үлдсэн. Батарей хэмнэгч асаалттай байна."
"USB-р цэнэглэх боломжгүй байна. Төхөөрөмждөө дагалдаж ирсэн цэнэглэгчийг ашиглана уу."
"USB-р цэнэглэх боломжгүй байна"
"Төхөөрөмждөө дагалдаж ирсэн цэнэглэгчийг ашиглах"
@@ -181,6 +181,7 @@
"Батерей хоёр баганатай."
"Батерей гурван баганатай."
"Батерей дүүрэн."
+ "Батарейн хувь тодорхойгүй байна."
"Утас байхгүй."
"Утас нэг баганатай."
"Утас хоёр баганатай."
@@ -389,7 +390,7 @@
"АВТОМАТ"
"Өнгийг урвуулах"
"Өнгө залруулах горим"
- "Өөр тохиргоо"
+ "Бусад тохиргоо"
"Дууссан"
"Холбогдсон"
"Холбогдсон, батерей %1$s"
@@ -433,7 +434,7 @@
"Төхөөрөмж"
"Апп сэлгэхийн тулд дээш шударна уу"
"Аппуудыг хурдан сэлгэхийн тулд баруун тийш чирнэ үү"
- "Тоймыг унтраах/асаах"
+ "Тоймыг асаах/унтраах"
"Цэнэглэгдсэн"
"Цэнэглэж байна"
"дүүргэхэд %s"
@@ -475,9 +476,9 @@
"Хэрэглэгч нэмэх"
"Шинэ хэрэглэгч"
"Зочныг хасах уу?"
- "Энэ сешний бүх апп болон дата устах болно."
+ "Энэ харилцан үйлдлийн бүх апп болон дата устах болно."
"Хасах"
- "Тавтай морилно уу!"
+ "Эргэн тавтай морилно уу!"
"Та үргэлжлүүлэхийг хүсэж байна уу?"
"Дахин эхлүүлэх"
"Тийм, үргэлжлүүлэх"
@@ -488,7 +489,7 @@
"Одоогийн хэрэглэгчийг гаргах"
"ХЭРЭГЛЭГЧЭЭС ГАРАХ"
"Шинэ хэрэглэгч нэмэх үү?"
- "Та шинэ хэрэглэгч нэмбэл тухайн хүн өөрийн профайлыг тохируулах шаардлагатай.\n\nАль ч хэрэглэгч бүх хэрэглэгчийн апп-уудыг шинэчлэх боломжтой."
+ "Та шинэ хэрэглэгч нэмбэл тухайн хүн өөрийн профайлыг тохируулах шаардлагатай.\n\nАль ч хэрэглэгч бүх хэрэглэгчийн аппуудыг шинэчлэх боломжтой."
"Хэрэглэгчийн хязгаарт хүрсэн"
- Та %d хүртэлх хэрэглэгч нэмэх боломжтой.
@@ -497,9 +498,9 @@
"Хэрэглэгчийг устгах уу?"
"Энэ хэрэглэгчийн бүх апп болон мэдээлэл устах болно."
"Арилгах"
- "Тэжээл хэмнэгч асаалттай байна"
+ "Батарей хэмнэгч асаалттай байна"
"Ажиллагаа болон далд датаг бууруулна"
- "Тэжээл хэмнэгчийг унтраах"
+ "Батарей хэмнэгчийг унтраах"
"%s нь бичлэг хийх эсвэл дамжуулах үед таны дэлгэц дээр харагдах эсвэл таны төхөөрөмжөөс тоглуулах бүх мэдээлэлд хандах боломжтой байна. Үүнд нууц үг, төлбөрийн дэлгэрэнгүй, зураг болон таны тоглуулдаг аудио зэрэг мэдээлэл багтана."
"Энэ функцийг ажиллуулж байгаа үйлчилгээ нь бичлэг хийх эсвэл дамжуулах үед таны дэлгэц дээр харагдах эсвэл таны төхөөрөмжөөс тоглуулах бүх мэдээлэлд хандах боломжтой байна. Үүнд нууц үг, төлбөрийн дэлгэрэнгүй, зураг болон таны тоглуулдаг аудио зэрэг мэдээлэл багтана."
"Бичлэг хийх эсвэл дамжуулахыг эхлүүлэх үү?"
@@ -765,7 +766,7 @@
- %d минут
"Батарей ашиглалт"
- "Цэнэглэх үед тэжээл хэмнэгч ажиллахгүй"
+ "Цэнэглэх үед батарей хэмнэгч ажиллахгүй"
"Батарей хэмнэгч"
"Гүйцэтгэл болон дэвсгэрийн датаг багасгадаг"
"%1$s товчлуур"
@@ -981,11 +982,11 @@
"%1$s-д дурын аппаас хэсэг харуулахыг зөвшөөрөх"
"Зөвшөөрөх"
"Татгалзах"
- "Тэжээл хэмнэгч онцлогийг хуваарилахын тулд товших"
+ "Батарей хэмнэгч онцлогийг хуваарилахын тулд товших"
"Батарей дуусах гэж байгаа үед асаана уу"
"Үгүй, баярлалаа"
- "Тэжээл хэмнэгч онцлогийн хуваарийг асаасан"
- "Батарей %d%%-с бага болсон үед Тэжээл хэмнэгч автоматаар асна."
+ "Батарей хэмнэгч онцлогийн хуваарийг асаасан"
+ "Батарей %d%%-с бага болсон үед Батарей хэмнэгч автоматаар асна."
"Тохиргоо"
"Ойлголоо"
"Dump SysUI Heap"
@@ -1097,4 +1098,6 @@
"%1$s (салсан)"
"Холбогдож чадсангүй. Дахин оролдоно уу."
"Шинэ төхөөрөмж хослуулах"
+ "Таны батарей хэмжигчийг уншихад асуудал гарлаа"
+ "Нэмэлт мэдээлэл авахын тулд товшино уу"
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 61f2b67dcca4..1a608dae038f 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -181,6 +181,7 @@
"बॅटरी दोन बार."
"बॅटरी तीन बार."
"बॅटरी पूर्ण भरली."
+ "बॅटरीच्या चार्जिंगची टक्केवारी माहित नाही."
"कोणताही फोन नाही."
"फोन एक बार."
"फोन दोन बार."
@@ -1097,4 +1098,6 @@
"%1$s (डिस्कनेक्ट केले)"
"कनेक्ट करू शकलो नाही. पुन्हा प्रयत्न करा."
"नवीन डिव्हाइससोबत पेअर करा"
+ "तुमचे बॅटरी मीटर वाचताना समस्या आली"
+ "अधिक माहितीसाठी टॅप करा"
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index d8878c8ce20b..de2fcd817b7b 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -181,6 +181,7 @@
"Bateri dua bar."
"Bateri tiga bar."
"Bateri penuh."
+ "Peratusan kuasa bateri tidak diketahui."
"Tiada telefon."
"Telefon satu bar."
"Telefon dua bar."
@@ -714,7 +715,7 @@
"Mungkin berbunyi atau bergetar berdasarkan tetapan telefon"
"Mungkin berbunyi atau bergetar berdasarkan tetapan telefon. Perbualan daripada gelembung %1$s secara lalai."
"Memastikan anda memberikan perhatian dengan pintasan terapung ke kandungan ini."
- "Ditunjukkan di sebelah atas bahagian perbualan, muncul sebagai gelembung terapung, memaparkan gambar profil pada skrin kunci"
+ "Ditunjukkan di sebelah atas bahagian perbualan, terpapar sebagai gelembung terapung, gambar profil dipaparkan pada skrin kunci"
"Tetapan"
"Keutamaan"
"%1$s tidak menyokong ciri perbualan"
@@ -1097,4 +1098,6 @@
"%1$s (diputuskan sambungan)"
"Tidak boleh menyambung. Cuba lagi."
"Gandingkan peranti baharu"
+ "Masalah membaca meter bateri anda"
+ "Ketik untuk mendapatkan maklumat lanjut"
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 90eca8912ed0..07400bb4f180 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -181,6 +181,7 @@
"ဘတ္တရီနှစ်ဘား။"
"ဘတ္တရီသုံးဘား။"
"ဘတ္တရီအပြည့်။"
+ "ဘက်ထရီရာခိုင်နှုန်းကို မသိပါ။"
"ဖုန်းလိုင်းမရှိပါ။"
"ဖုန်းလိုင်းတစ်ဘား။"
"ဖုန်းလိုင်းနှစ်ဘား။"
@@ -222,7 +223,7 @@
"LTE"
"LTE+"
"1X"
- "ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်ခြင်း"
+ "ပြင်ပကွန်ရက်သုံးခြင်း"
"EDGE"
"Wi-Fi"
"ဆင်းကဒ်မရှိပါ။"
@@ -474,12 +475,12 @@
"ပရိုဖိုင်ကို ပြရန်"
"အသုံးပြုသူ ထည့်ရန်"
"အသုံးပြုသူ အသစ်"
- "ဧည့်သည်ကို ဖယ်ထုတ်လိုက်ရမလား?"
+ "ဧည့်သည်ကို ဖယ်မလား။"
"ဒီချိတ်ဆက်မှု ထဲက အက်ပ်များ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။"
"ဖယ်ထုတ်ပါ"
- "ပြန်လာတာ ကြိုဆိုပါသည်၊ ဧည့်သည်!"
- "သင်သည် သင်၏ ချိတ်ဆက်မှုကို ဆက်ပြုလုပ် လိုပါသလား?"
- "အစမှ ပြန်စပါ"
+ "ဧည့်သည်ကို ပြန်လည် ကြိုဆိုပါသည်။"
+ "သင်၏ စက်ရှင်ကို ဆက်လုပ်လိုပါသလား။"
+ "ပြန်စပါ"
"ဆက်လုပ်ပါ"
"ဧည့်သည် အသုံးပြုသူ"
"အက်ပ်များနှင့် ဒေတာအား ဖျက်ရန်၊ တခဏသုံးစွဲသူအား ဖယ်ရှားပါ"
@@ -1097,4 +1098,6 @@
"%1$s (ချိတ်ဆက်မထားပါ)"
"ချိတ်ဆက်၍ မရပါ။ ထပ်စမ်းကြည့်ပါ။"
"စက်အသစ် တွဲချိတ်ရန်"
+ "သင်၏ ဘက်ထရီမီတာကို ဖတ်ရာတွင် ပြဿနာရှိနေသည်"
+ "နောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index dc004ddd399a..ead1fd5ab488 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -181,6 +181,7 @@
"Batteri – to stolper."
"Batteri – tre stolper."
"Batteriet er fullt."
+ "Batteriprosenten er ukjent."
"Ingen telefon."
"Telefon – én stolpe."
"Telefon – to stolper."
@@ -1097,4 +1098,6 @@
"%1$s (frakoblet)"
"Kunne ikke koble til. Prøv på nytt."
"Koble til en ny enhet"
+ "Kunne ikke lese batterimåleren"
+ "Trykk for å få mer informasjon"
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 075f6737087b..4af7294beecf 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -181,6 +181,7 @@
"ब्याट्रिका दुईवटा पट्टिहरू"
"ब्याट्रिका तिनवटा पट्टिहरू"
"ब्याट्री पूर्ण छ।"
+ "ब्याट्रीमा कति प्रतिशत चार्ज छ भन्ने कुराको जानाकरी छैन।"
"फोन छैन्।"
"फोन एउटा पट्टि।"
"फोन दुई पट्टि।"
@@ -475,9 +476,9 @@
"प्रयोगकर्ता थप्नुहोस्"
"नयाँ प्रयोगकर्ता"
"अतिथि हटाउने हो?"
- "यस सत्रमा सबै एपहरू र डेटा मेटाइनेछ।"
+ "यो सत्रमा भएका सबै एपहरू र डेटा मेटाइने छ।"
"हटाउनुहोस्"
- "पुनः स्वागत, अतिथि!"
+ "तपाईंलाई फेरि स्वागत छ, अतिथि"
"तपाईं आफ्नो सत्र जारी गर्न चाहनुहुन्छ?"
"सुरु गर्नुहोस्"
"हो, जारी राख्नुहोस्"
@@ -488,7 +489,7 @@
"वर्तमान प्रयोगकर्ता लगआउट गर्नुहोस्"
"प्रयोगकर्ता लगआउट गर्नुहोस्"
"नयाँ प्रयोगकर्ता थप्ने हो?"
- "जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि एपहरू अद्यावधिक गर्न सक्छन्।"
+ "जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nसबै प्रयोगकर्ताले अरू प्रयोगकर्ताका एपहरू अपडेट गर्न सक्छन्।"
"प्रयोगकर्ताको सीमा पुग्यो"
- तपाईं अधिकतम %d प्रयोगहरू मात्र थप्न सक्नुहुन्छ।
@@ -509,7 +510,7 @@
"व्यवस्थित गर्नुहोस्"
"इतिहास"
"नयाँ"
- "मौन"
+ "साइलेन्ट"
"सूचनाहरू"
"वार्तालापहरू"
"सबै मौन सूचनाहरू हटाउनुहोस्"
@@ -700,21 +701,21 @@
"रोक लगाउनुहोस्"
"देखाउने क्रम जारी राख्नुहोस्"
"सानो बनाउनुहोस्"
- "मौन"
+ "साइलेन्ट"
"मौन रहनुहोस्"
"सतर्क गराउने"
"सर्तक गराइरहनुहोस्"
"सूचनाहरू निष्क्रिय पार्नुहोस्"
"यो एपका सूचनाहरू देखाउने क्रम जारी राख्ने हो?"
- "मौन"
+ "साइलेन्ट"
"पूर्वनिर्धारित"
"बबल"
"न घन्टी बज्छ न त कम्पन नै हुन्छ"
"न घन्टी बज्छ न त कम्पन नै हुन्छ र वार्तालाप खण्डको तलतिर देखा पर्छ"
- "फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ"
- "फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ। %1$s का वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखाइन्छन्।"
+ "फोनको सेटिङका आधारमा घन्टी बज्न वा भाइब्रेट हुन सक्छ"
+ "फोनको सेटिङका आधारमा घन्टी बज्न वा भाइब्रेट हुन सक्छ। %1$s का वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखाइन्छन्।"
"फ्लोटिङ सर्टकटमार्फत यो सामग्रीतर्फ तपाईंको ध्यान आकर्षित गर्दछ।"
- "वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल फोटो देखाइन्छ"
+ "वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल फोटो देखिन्छ"
"सेटिङ"
"प्राथमिकता"
"%1$s मा वार्तालापसम्बन्धी सुविधा प्रयोग गर्न मिल्दैन"
@@ -1097,4 +1098,6 @@
"%1$s (डिस्कनेक्ट गरिएको)"
"कनेक्ट गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"
"नयाँ यन्त्रको जोडा बनाउनुहोस्"
+ "यन्त्रको ब्याट्रीको मिटर रिडिङ क्रममा समस्या भयो"
+ "थप जानकारी प्राप्त गर्न ट्याप गर्नुहोस्"
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index d8331bfd8206..bf2d757dd697 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -28,15 +28,15 @@
"Nog %s"
"Nog %1$s, dat is ongeveer %2$s op basis van je gebruik"
"Nog %1$s, dat is ongeveer %2$s"
- "Nog %s. Batterijbesparing is ingeschakeld."
+ "Nog %s. Batterijbesparing staat aan."
"Kan niet opladen via USB. Gebruik de oplader die bij je apparaat is geleverd."
"Kan niet opladen via USB"
"Gebruik de oplader die bij je apparaat is geleverd"
"Instellingen"
"Batterijbesparing aanzetten?"
"Over Batterijbesparing"
- "Inschakelen"
- "Batterijbesparing inschakelen"
+ "Aanzetten"
+ "Batterijbesparing aanzetten"
"Instellingen"
"Wifi"
"Scherm automatisch draaien"
@@ -54,7 +54,7 @@
"%1$s openen om %2$s te verwerken?"
"Er werken geen geïnstalleerde apps met dit USB-accessoire. Meer informatie op: %1$s"
"USB-accessoire"
- "Weergeven"
+ "Bekijken"
"%1$s altijd openen wanneer %2$s is verbonden"
"%1$s altijd openen wanneer %2$s is verbonden"
"USB-foutopsporing toestaan?"
@@ -62,17 +62,17 @@
"Altijd toestaan vanaf deze computer"
"Toestaan"
"USB-foutopsporing niet toegestaan"
- "De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker."
+ "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."
"Draadloze foutopsporing toestaan in dit netwerk?"
"Netwerknaam (SSID)\n%1$s\n\nWifi-adres (BSSID)\n%2$s"
"Altijd toestaan in dit netwerk"
"Toestaan"
"Draadloze foutopsporing niet toegestaan"
- "De gebruiker die momenteel is ingelogd op dit apparaat, kan draadloze foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je over naar de primaire gebruiker."
- "USB-poort uitgeschakeld"
- "De USB-poort is uitgeschakeld en detecteert geen accessoires, zodat je apparaat wordt beschermd tegen vloeistof en vuil.\n\nJe ontvangt een melding wanneer je de USB-poort weer kunt gebruiken."
+ "De gebruiker die momenteel is ingelogd op dit apparaat, kan draadloze foutopsporing niet aanzetten. Als je deze functie wilt gebruiken, schakel je over naar de primaire gebruiker."
+ "USB-poort staat uit"
+ "De USB-poort staat uit en detecteert geen accessoires, zodat je apparaat wordt beschermd tegen vloeistof en vuil.\n\nJe ontvangt een melding wanneer je de USB-poort weer kunt gebruiken."
"USB-poort kan opladers en accessoires detecteren"
- "USB inschakelen"
+ "USB aanzetten"
"Meer informatie"
"Zoom om scherm te vullen"
"Rek uit v. schermvulling"
@@ -101,7 +101,7 @@
"Starten"
"Scherm opnemen"
"Scherm en audio opnemen"
- "Tikken op het scherm weergeven"
+ "Tikken op het scherm tonen"
"Tik om te stoppen"
"Stoppen"
"Pauzeren"
@@ -181,6 +181,7 @@
"Batterij: twee streepjes."
"Batterij: drie streepjes."
"Batterij is vol."
+ "Batterijpercentage onbekend."
"Geen telefoonsignaal."
"Telefoon: één streepje."
"Telefoon: twee streepjes."
@@ -208,8 +209,8 @@
"Twee streepjes."
"Drie streepjes."
"Signaal is op volledige sterkte."
- "Ingeschakeld."
- "Uitgeschakeld."
+ "Aan."
+ "Uit."
"Verbonden."
"Verbinden."
"GPRS"
@@ -233,7 +234,7 @@
"Uit"
"Bluetooth-tethering."
"Vliegtuigmodus."
- "VPN ingeschakeld."
+ "VPN staat aan."
"Geen simkaart."
"Netwerk van provider wordt gewijzigd"
"Accudetails openen"
@@ -244,9 +245,9 @@
"Meldingen."
"Alle meldingen bekijken"
"Melding wissen"
- "gps ingeschakeld."
+ "Gps staat aan."
"Verbinding maken met gps."
- "TeleTypewriter ingeschakeld."
+ "TeleTypewriter staat aan."
"Belsoftware trilt."
"Belsoftware stil."
@@ -263,30 +264,30 @@
"Vergrendelscherm voor werk"
"Sluiten"
"%1$s."
- "Wifi uitgeschakeld."
- "Wifi ingeschakeld."
+ "Wifi staat uit."
+ "Wifi staat aan."
"Mobiel %1$s. %2$s. %3$s."
"Batterij: %s."
"Vliegtuigmodus uit."
"Vliegtuigmodus aan."
- "Vliegtuigmodus uitgeschakeld."
- "Vliegtuigmodus ingeschakeld."
+ "Vliegtuigmodus staat uit."
+ "Vliegtuigmodus staat aan."
"totale stilte"
"alleen wekkers"
"Niet storen."
- "\'Niet storen\' is uitgeschakeld."
- "\'Niet storen\' is ingeschakeld."
+ "Niet storen staat uit."
+ "Niet storen staat aan."
"Bluetooth."
"Bluetooth uit."
"Bluetooth aan."
"Bluetooth-verbinding wordt gemaakt."
"Bluetooth-verbinding gemaakt."
- "Bluetooth uitgeschakeld."
- "Bluetooth ingeschakeld."
+ "Bluetooth staat uit."
+ "Bluetooth staat aan."
"Locatiemelding uit."
"Locatiemelding aan."
- "Locatiemelding uitgeschakeld."
- "Locatiemelding ingeschakeld."
+ "Locatiemelding staat uit."
+ "Locatiemelding staat aan."
"Wekker is ingesteld op %s."
"Paneel sluiten."
"Meer tijd."
@@ -294,21 +295,21 @@
"Zaklamp uit."
"Zaklamp niet beschikbaar."
"Zaklamp aan."
- "Zaklamp uitgeschakeld."
- "Zaklamp ingeschakeld."
- "Kleurinversie uitgeschakeld."
- "Kleurinversie ingeschakeld."
- "Mobiele hotspot uitgeschakeld."
- "Mobiele hotspot ingeschakeld."
+ "Zaklamp staat uit."
+ "Zaklamp staat aan."
+ "Kleurinversie staat uit."
+ "Kleurinversie staat aan."
+ "Mobiele hotspot staat uit."
+ "Mobiele hotspot staat aan."
"Casten van scherm gestopt."
"Werkmodus uit."
"Werkmodus aan."
- "Werkmodus uitgeschakeld."
- "Werkmodus ingeschakeld."
- "Databesparing is uitgeschakeld."
- "Databesparing is ingeschakeld."
- "Sensorprivacy uitgeschakeld."
- "Sensorprivacy ingeschakeld."
+ "Werkmodus staat uit."
+ "Werkmodus staat aan."
+ "Databesparing staat uit."
+ "Databesparing staat aan."
+ "Sensorprivacy staat uit."
+ "Sensorprivacy staat aan."
"Helderheid van het scherm"
"Opladen"
"2G/3G-data zijn onderbroken"
@@ -353,7 +354,7 @@
"Headset"
"Invoer"
"Hoortoestellen"
- "Inschakelen..."
+ "Aanzetten…"
"Helderheid"
"Automatisch draaien"
"Scherm automatisch draaien"
@@ -378,7 +379,7 @@
"Wifi uit"
"Wifi aan"
"Geen wifi-netwerken beschikbaar"
- "Inschakelen..."
+ "Aanzetten…"
"Screencast"
"Casten"
"Naamloos apparaat"
@@ -396,8 +397,8 @@
"Verbinding maken…"
"Tethering"
"Hotspot"
- "Inschakelen..."
- "Databesparing is ingeschakeld"
+ "Aanzetten…"
+ "Databesparing staat aan"
- %d apparaten
- %d apparaat
@@ -425,15 +426,15 @@
"Aan om %s"
"Tot %s"
"NFC"
- "NFC is uitgeschakeld"
- "NFC is ingeschakeld"
+ "NFC staat uit"
+ "NFC staat aan"
"Schermopname"
"Starten"
"Stoppen"
"Apparaat"
"Swipe omhoog om te schakelen tussen apps"
"Sleep naar rechts om snel tussen apps te schakelen"
- "Overzicht in-/uitschakelen"
+ "Overzicht aan- of uitzetten"
"Opgeladen"
"Opladen"
"%s tot volledig opgeladen"
@@ -471,7 +472,7 @@
"Gebruiker wijzigen"
"Schakelen tussen gebruikers, huidige gebruiker %s"
"Huidige gebruiker %s"
- "Profiel weergeven"
+ "Profiel tonen"
"Gebruiker toevoegen"
"Nieuwe gebruiker"
"Gast verwijderen?"
@@ -488,7 +489,7 @@
"Huidige gebruiker uitloggen"
"GEBRUIKER UITLOGGEN"
"Nieuwe gebruiker toevoegen?"
- "Wanneer u een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers."
+ "Als je een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers."
"Gebruikerslimiet bereikt"
- Je kunt maximaal %d gebruikers toevoegen.
@@ -499,12 +500,12 @@
"Verwijderen"
"Batterijbesparing aan"
"Vermindert de prestaties en achtergrondgegevens"
- "Batterijbesparing uitschakelen"
+ "Batterijbesparing uitzetten"
"%s krijgt toegang tot alle informatie die zichtbaar is op je scherm of die wordt afgespeeld vanaf je apparaat tijdens het opnemen of casten. Dit omvat informatie zoals wachtwoorden, betalingsgegevens, foto\'s, berichten en audio die je afspeelt."
"De service die deze functie levert, krijgt toegang tot alle informatie die zichtbaar is op je scherm of die wordt afgespeeld vanaf je apparaat tijdens het opnemen of casten. Dit omvat informatie zoals wachtwoorden, betalingsgegevens, foto\'s, berichten en audio die je afspeelt."
"Beginnen met opnemen of casten?"
"Beginnen met opnemen of casten met %s?"
- "Niet opnieuw weergeven"
+ "Niet opnieuw tonen"
"Alles wissen"
"Beheren"
"Geschiedenis"
@@ -540,7 +541,7 @@
"VPN"
"Netwerkregistratie"
"CA-certificaten"
- "VPN uitschakelen"
+ "VPN uitzetten"
"Verbinding met VPN verbreken"
"Beleid bekijken"
"Dit apparaat is eigendom van %1$s.\n\nJe IT-beheerder kan instellingen, zakelijke toegang, apps, aan je apparaat gekoppelde gegevens en de locatiegegevens van je apparaat bekijken en beheren.\n\nNeem contact op met je IT-beheerder voor meer informatie."
@@ -548,7 +549,7 @@
"Je organisatie heeft een certificeringsinstantie geïnstalleerd op dit apparaat. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast."
"Je organisatie heeft een certificeringsinstantie geïnstalleerd in je werkprofiel. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast."
"Er is een certificeringsinstantie geïnstalleerd op dit apparaat. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast."
- "Je beheerder heeft netwerkregistratie ingeschakeld, waarmee het verkeer op je apparaat wordt bijgehouden."
+ "Je beheerder heeft de netwerkregistratie aangezet, waarmee het verkeer op je apparaat wordt gecontroleerd."
"Je bent verbonden met %1$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden gecontroleerd."
"Je bent verbonden met %1$s en %2$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden."
"Je werkprofiel is verbonden met %1$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden."
@@ -563,7 +564,7 @@
"VPN-instellingen openen"
" "
"Vertrouwde gegevens openen"
- "Je beheerder heeft netwerkregistratie ingeschakeld, waarmee verkeer op je apparaat wordt bijgehouden.\n\nNeem contact op met je beheerder voor meer informatie."
+ "Je beheerder heeft de netwerkregistratie aangezet, waarmee verkeer op je apparaat wordt gecontroleerd.\n\nNeem contact op met je beheerder voor meer informatie."
"Je hebt een app rechten gegeven voor het instellen van een VPN-verbinding.\n\nMet deze app kan je apparaat- en netwerkactiviteit worden gecontroleerd, inclusief e-mails, apps en websites."
"Je werkprofiel wordt beheerd door %1$s.\n\nJe beheerder kan je netwerkactiviteit controleren, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie.\n\nJe bent ook verbonden met een VPN, waarmee je netwerkactiviteit kan worden gecontroleerd."
"VPN"
@@ -580,15 +581,15 @@
"Nee, bedankt"
"Instellen"
"%1$s. %2$s"
- "Nu uitschakelen"
+ "Nu uitzetten"
"Geluidsinstellingen"
"Uitvouwen"
"Samenvouwen"
"Automatisch ondertitelen"
"Ondertitelingstip sluiten"
"Ondertitelingsoverlay"
- "inschakelen"
- "uitschakelen"
+ "aanzetten"
+ "uitzetten"
"Naar een ander uitvoerapparaat schakelen"
"App is vastgezet"
"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Overzicht en houd deze vast om het scherm los te maken."
@@ -606,7 +607,7 @@
"App vastgezet"
"App losgemaakt"
"%1$s verbergen?"
- "Deze wordt opnieuw weergegeven zodra u de instelling weer inschakelt."
+ "Deze zie je opnieuw zodra je de instelling weer aanzet."
"Verbergen"
"Bellen"
"Systeem"
@@ -620,16 +621,16 @@
"Gesprekken"
"Bellen"
"Trillen"
- "Dempen"
+ "Geluid staat uit"
"Telefoon op trillen"
- "Telefoon gedempt"
+ "Telefoongeluid staat uit"
"%1$s. Tik om dempen op te heffen."
- "%1$s. Tik om in te stellen op trillen. Toegankelijkheidsservices kunnen zijn gedempt."
- "%1$s. Tik om te dempen. Toegankelijkheidsservices kunnen zijn gedempt."
+ "%1$s. Tik om in te stellen op trillen. Het geluid van toegankelijkheidsservices kan hierdoor uitgaan."
+ "%1$s. Tik om te dempen. Het geluid van toegankelijkheidsservices kan hierdoor uitgaan."
"%1$s. Tik om in te stellen op trillen."
- "%1$s. Tik om te dempen."
- "dempen"
- "dempen opheffen"
+ "%1$s. Tik om geluid uit te zetten."
+ "geluid uit"
+ "geluid aanzetten"
"trillen"
"%s-volumeknoppen"
"Gesprekken en meldingen gaan over (%1$s)"
@@ -641,14 +642,14 @@
"Wifi"
"Bluetooth en wifi"
"Systeem-UI-tuner"
- "Percentage ingebouwde batterij weergeven"
- "Accupercentage weergeven in het icoon op de statusbalk wanneer er niet wordt opgeladen"
+ "Percentage ingebouwde batterij tonen"
+ "Batterijniveau (percentage) tonen in het icoon op de statusbalk wanneer niet wordt opgeladen"
"Snelle instellingen"
"Statusbalk"
"Overzicht"
"Demomodus voor systeemgebruikersinterface"
- "Demomodus inschakelen"
- "Demomodus weergeven"
+ "Demomodus aanzetten"
+ "Demomodus tonen"
"Ethernet"
"Wekker"
"Werkprofiel"
@@ -670,61 +671,61 @@
"Verwijderen uit Instellingen"
"Systeem-UI-tuner uit Instellingen verwijderen en het gebruik van alle functies daarvan stopzetten?"
"Deze app is niet geïnstalleerd op je apparaat"
- "Klokseconden weergeven"
- "Klokseconden op de statusbalk weergeven. Kan van invloed zijn op de accuduur."
+ "Klokseconden tonen"
+ "Klokseconden op de statusbalk tonen. Kan van invloed zijn op de batterijduur."
"Snelle instellingen opnieuw indelen"
- "Helderheid weergeven in Snelle instellingen"
+ "Helderheid tonen in Snelle instellingen"
"Experimenteel"
- "Bluetooth inschakelen?"
- "Als je je toetsenbord wilt verbinden met je tablet, moet je eerst Bluetooth inschakelen."
- "Inschakelen"
- "Meldingen zonder geluid weergeven"
+ "Bluetooth aanzetten?"
+ "Als je je toetsenbord wilt verbinden met je tablet, moet je eerst Bluetooth aanzetten."
+ "Aanzetten"
+ "Meldingen zonder geluid tonen"
"Alle meldingen blokkeren"
"Niet zonder geluid weergeven"
"Niet zonder geluid weergeven of blokkeren"
"Beheeropties voor meldingen met betrekking tot stroomverbruik"
"Aan"
"Uit"
- "Met beheeropties voor meldingen met betrekking tot stroomverbruik kun je een belangrijkheidsniveau van 0 tot 5 instellen voor de meldingen van een app. \n\n""Niveau 5"" \n- Boven aan de lijst met meldingen weergeven \n- Onderbreking op volledig scherm toestaan \n- Altijd korte weergave \n\n""Niveau 4"" \n- Geen onderbreking op volledig scherm \n- Altijd korte weergave \n\n""Niveau 3"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n\n""Niveau 2"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n\n""Niveau 1"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n- Verbergen op vergrendelscherm en statusbalk \n- Onder aan de lijst met meldingen weergeven \n\n""Niveau 0"" \n- Alle meldingen van de app blokkeren"
+ "Met beheeropties voor meldingen met betrekking tot stroomverbruik kun je een belangrijkheidsniveau van 0 tot 5 instellen voor de meldingen van een app. \n\n""Niveau 5"" \n- Bovenaan de lijst met meldingen tonen \n- Onderbreking op volledig scherm toestaan \n- Altijd korte weergave \n\n""Niveau 4"" \n- Geen onderbreking op volledig scherm \n- Altijd korte weergave \n\n""Niveau 3"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n\n""Niveau 2"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n\n""Niveau 1"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n- Verbergen op vergrendelscherm en statusbalk \n- Onderaan de lijst met meldingen tonen \n\n""Niveau 0"" \n- Alle meldingen van de app blokkeren"
"Meldingen"
- "Meldingen worden niet meer weergegeven"
+ "Je ziet deze meldingen niet meer"
"Deze meldingen worden geminimaliseerd"
- "Deze meldingen worden zonder geluid weergegeven"
+ "Deze meldingen worden zonder geluid getoond"
"Deze meldingen stellen je op de hoogte"
- "Meestal sluit je deze meldingen. \nWil je ze blijven weergeven?"
+ "Meestal sluit je deze meldingen. \nWil je ze blijven tonen?"
"Klaar"
"Toepassen"
- "Deze meldingen blijven weergeven?"
+ "Deze meldingen blijven tonen?"
"Meldingen stoppen"
"Zonder geluid afleveren"
"Blokkeren"
- "Blijven weergeven"
+ "Blijven tonen"
"Minimaliseren"
"Stil"
"Stil blijven"
"Waarschuwen"
"Blijven waarschuwen"
- "Meldingen uitschakelen"
- "Meldingen van deze app blijven weergeven?"
+ "Meldingen uitzetten"
+ "Meldingen van deze app blijven tonen?"
"Stil"
"Standaard"
"Bubbel"
"Geen geluid of trilling"
- "Geen geluid of trilling en wordt lager in het gedeelte met gesprekken weergegeven"
+ "Geen geluid of trilling en wordt lager in het gedeelte met gesprekken getoond"
"Kan overgaan of trillen op basis van de telefooninstellingen"
- "Kan overgaan of trillen op basis van de telefooninstellingen. Gesprekken uit %1$s worden standaard als bubbels weergegeven."
+ "Kan overgaan of trillen op basis van de telefooninstellingen. Gesprekken uit %1$s worden standaard als bubbels getoond."
"Trekt de aandacht met een zwevende snelkoppeling naar deze content."
- "Wordt bovenaan het gespreksgedeelte weergegeven, verschijnt als zwevende bubbel, geeft profielfoto weer op vergrendelscherm"
+ "Verschijnt als zwevende bubbel bovenaan het gespreksgedeelte en toont profielfoto op vergrendelscherm"
"Instellingen"
"Prioriteit"
"%1$s ondersteunt geen gespreksfuncties"
"Geen recente bubbels"
- "Recente bubbels en gesloten bubbels worden hier weergegeven"
+ "Recente bubbels en gesloten bubbels zie je hier"
"Deze meldingen kunnen niet worden aangepast."
- "Deze groep meldingen kan hier niet worden geconfigureerd"
+ "Deze groep meldingen kan hier niet worden ingesteld"
"Melding via proxy"
"Alle meldingen van %1$s"
- "Meer weergeven"
+ "Meer tonen"
"Deze app gebruikt de camera."
"Deze app gebruikt de microfoon."
"Deze app wordt over andere apps op je scherm heen weergegeven."
@@ -746,7 +747,7 @@
"Geen belangrijk gesprek"
"Zonder geluid"
"Waarschuwen"
- "Ballon weergeven"
+ "Ballon tonen"
"Bubbels verwijderen"
"Toevoegen aan startscherm"
"%1$s "
@@ -810,7 +811,7 @@
"Muziek"
"YouTube"
"Agenda"
- "Weergeven met volumeknoppen"
+ "Tonen met volumeknoppen"
"Niet storen"
"Volumeknoppen als sneltoets"
"\'Niet storen\' afsluiten bij volume omhoog"
@@ -821,8 +822,8 @@
"Hoofdtelefoon aangesloten"
"Headset aangesloten"
"Databesparing"
- "Databesparing is ingeschakeld"
- "Databesparing is uitgeschakeld"
+ "Databesparing staat aan"
+ "Databesparing staat uit"
"Aan"
"Uit"
"Niet beschikbaar"
@@ -860,16 +861,16 @@
"Bewerken"
"Tijd"
- - "Uren, minuten en seconden weergeven"
- - "Uren en minuten weergeven (standaard)"
- - "Dit icoon niet weergeven"
+ - "Uren, minuten en seconden tonen"
+ - "Uren en minuten tonen (standaard)"
+ - "Dit icoon niet tonen"
- - "Percentage altijd weergeven"
- - "Percentage weergeven tijdens opladen (standaard)"
- - "Dit icoon niet weergeven"
+ - "Percentage altijd tonen"
+ - "Percentage tonen tijdens opladen (standaard)"
+ - "Dit icoon niet tonen"
- "Pictogrammen voor meldingen met lage prioriteit weergeven"
+ "Iconen voor meldingen met lage prioriteit tonen"
"Overig"
"Scheiding voor gesplitst scherm"
"Linkerscherm op volledig scherm"
@@ -922,7 +923,7 @@
"Formaat aanpassen"
"Telefoon uitgezet wegens hitte"
"Je telefoon functioneert nu weer zoals gebruikelijk.\nTik voor meer informatie"
- "Je telefoon was te warm en is uitgeschakeld om af te koelen. Je telefoon presteert nu weer zoals gebruikelijk.\n\nJe telefoon kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je telefoon gebruikt bij hoge temperaturen."
+ "Je telefoon was te warm en is uitgezet om af te koelen. Je telefoon presteert nu weer zoals gebruikelijk.\n\nJe telefoon kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je telefoon gebruikt bij hoge temperaturen."
"Onderhoudsstappen bekijken"
"De telefoon wordt warm"
"Bepaalde functies zijn beperkt terwijl de telefoon afkoelt.\nTik voor meer informatie"
@@ -960,12 +961,12 @@
"Mobiele data"
"%1$s — %2$s"
"%1$s, %2$s"
- "Wifi is uitgeschakeld"
- "Bluetooth is uitgeschakeld"
- "\'Niet storen\' is uitgeschakeld"
- "\'Niet storen\' is ingeschakeld door een automatische regel (%s)."
- "\'Niet storen\' is ingeschakeld door een app (%s)."
- "\'Niet storen\' is ingeschakeld door een automatische regel of app."
+ "Wifi staat uit"
+ "Bluetooth staat uit"
+ "Niet storen staat uit"
+ "Niet storen is aangezet door een automatische regel (%s)."
+ "Niet storen is aangezet door een app (%s)."
+ "Niet storen is aangezet door een automatische regel of app."
"Tot %s"
"Behouden"
"Vervangen"
@@ -975,17 +976,17 @@
"Je hebt dan geen toegang meer tot data of internet via %s. Internet is alleen nog beschikbaar via wifi."
"je provider"
"Aangezien een app een rechtenverzoek afdekt, kan Instellingen je reactie niet verifiëren."
- "%1$s toestaan om segmenten van %2$s weer te geven?"
+ "%1$s toestaan om segmenten van %2$s te tonen?"
"- Deze kan informatie lezen van %1$s"
"- Deze kan acties uitvoeren in %1$s"
- "%1$s toestaan om segmenten van apps weer te geven"
+ "%1$s toestaan om segmenten van apps te tonen"
"Toestaan"
"Weigeren"
"Tikken om Batterijbesparing in te schakelen"
- "Inschakelen wanneer de batterij waarschijnlijk leeg raakt"
+ "Aanzetten als de batterij waarschijnlijk leeg raakt"
"Nee"
- "Batterijbesparing is ingeschakeld"
- "Batterijbesparing wordt automatisch ingeschakeld wanneer de batterijstatus lager is dan %d%%."
+ "Batterijbesparing staat aan"
+ "Batterijbesparing wordt automatisch aangezet wanneer de batterijstatus lager is dan %d%%."
"Instellingen"
"OK"
"Dump SysUI Heap"
@@ -1012,9 +1013,9 @@
"Naar linksonder verplaatsen"
"Naar rechtsonder verplaatsen"
"Bubbel sluiten"
- "Gesprekken niet in bubbels weergeven"
+ "Gesprekken niet in bubbels tonen"
"Chatten met bubbels"
- "Nieuwe gesprekken worden weergegeven als zwevende iconen of \'bubbels\'. Tik om een bubbel te openen. Sleep om de bubbel te verplaatsen."
+ "Nieuwe gesprekken worden als zwevende iconen of bubbels getoond. Tik om een bubbel te openen. Sleep om een bubbel te verplaatsen."
"Beheer bubbels wanneer je wilt"
"Tik op Beheren om bubbels van deze app uit te schakelen"
"OK"
@@ -1024,9 +1025,9 @@
"Stand-by"
"Gesprek ingesteld als prioriteit"
"Prioriteitsgesprekken:"
- "Worden bovenaan het gespreksgedeelte weergegeven"
+ "Worden bovenaan het gespreksgedeelte getoond"
"Tonen profielafbeelding op vergrendelscherm"
- "Worden als zwevende ballon weergegeven vóór apps"
+ "Zijn als zwevende ballon zichtbaar vóór apps"
"Onderbreken \'Niet storen\'"
"OK"
"Instellingen"
@@ -1097,4 +1098,6 @@
"%1$s (verbinding verbroken)"
"Kan geen verbinding maken. Probeer het nog eens."
"Nieuw apparaat koppelen"
+ "Probleem bij het lezen van je batterijmeter"
+ "Tik hier voor meer informatie"
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index a6927218d5cb..fd1134960f1e 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -181,6 +181,7 @@
"ବ୍ୟାଟେରୀର ଦୁଇଟି ବାର୍ ଅଛି।"
"ବ୍ୟାଟେରୀର ତିନୋଟି ବାର୍ ଅଛି।"
"ବ୍ୟାଟେରୀ ପୂର୍ଣ୍ଣ।"
+ "ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଅଜଣା ଅଟେ।"
"କୌଣସି ଫୋନ୍ ନାହିଁ।"
"ଫୋନର ଗୋଟିଏ ବାର ଅଛି।"
"ଫୋନର ଦୁଇଟି ବାର୍ ଅଛି।"
@@ -370,7 +371,7 @@
"ସେଟିଂସ୍"
"ସମୟ"
"ମୁଁ"
- "ୟୁଜର୍"
+ "ଉପଯୋଗକର୍ତ୍ତା"
"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା"
"ୱାଇ-ଫାଇ"
"ସଂଯୁକ୍ତ ହୋଇନାହିଁ"
@@ -475,10 +476,10 @@
"ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କରନ୍ତୁ"
"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା"
"ଅତିଥିଙ୍କୁ କାଢ଼ିଦେବେ?"
- "ଏହି ଅବଧିର ସମସ୍ତ ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"
+ "ଏହି ସେସନର ସମସ୍ତ ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"
"କାଢ଼ିଦିଅନ୍ତୁ"
"ପୁଣି ସ୍ୱାଗତ, ଅତିଥି!"
- "ଆପଣ ନିଜର ଅବଧି ଜାରି ରଖିବାକୁ ଚାହାନ୍ତି କି?"
+ "ଆପଣ ନିଜର ସେସନ୍ ଜାରି ରଖିବାକୁ ଚାହାଁନ୍ତି କି?"
"ଆରମ୍ଭ କରନ୍ତୁ"
"ହଁ, ଜାରି ରଖନ୍ତୁ"
"ଅତିଥି ୟୁଜର୍"
@@ -488,7 +489,7 @@
"ବର୍ତ୍ତମାନର ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍ କରନ୍ତୁ"
"ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍ କରନ୍ତୁ"
"ନୂତନ ଉପଯୋଗକର୍ତ୍ତା ଯୋଗ କରିବେ?"
- "ଜଣେ ନୂଆ ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ିବାବେଳେ, ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ସ୍ଥାନ ସେଟ୍ କରିବାକୁ ପଡ଼ିବ। \n \n ଅନ୍ୟ ସମସ୍ତ ୟୁଜର୍ଙ୍କ ପାଇଁ ଯେକୌଣସି ୟୁଜର୍ ଆପ୍ଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରିପାରିବେ।"
+ "ଆପଣ ଜଣେ ନୂଆ ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କଲେ,ତାଙ୍କୁ ସ୍ପେସ୍ ସେଟ୍ ଅପ୍ କରିବାକୁ ପଡ଼ିବ। \n \n ଅନ୍ୟ ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଯେ କୌଣସି ଉପଯୋଗକର୍ତ୍ତା ଆପଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରିପାରିବେ।"
"ଉପଯୋଗକର୍ତ୍ତା ସୀମାରେ ପହଞ୍ଚିଛି"
- କେବଳ %d ଉପଯୋଗକର୍ତ୍ତା ହିଁ ତିଆରି କରିହେବ।
@@ -1097,4 +1098,6 @@
"%1$s (ବିଚ୍ଛିନ୍ନ କରାଯାଇଛି)"
"ସଂଯୋଗ କରାଯାଇପାରିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"
"ନୂଆ ଡିଭାଇସକୁ ପେୟାର୍ କରନ୍ତୁ"
+ "ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ମିଟର୍ ପଢ଼ିବାରେ ସମସ୍ୟା ହେଉଛି"
+ "ଅଧିକ ସୂଚନା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 4db23a63c0bb..7da4635b77e9 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -181,6 +181,7 @@
"ਬੈਟਰੀ ਦੋ ਬਾਰਸ।"
"ਬੈਟਰੀ ਤਿੰਨ ਬਾਰਸ।"
"ਬੈਟਰੀ ਪੂਰੀ।"
+ "ਬੈਟਰੀ ਪ੍ਰਤੀਸ਼ਤ ਅਗਿਆਤ ਹੈ।"
"ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ।"
"ਫ਼ੋਨ ਇੱਕ ਬਾਰ।"
"ਫ਼ੋਨ ਦੋ ਬਾਰਸ।"
@@ -479,7 +480,7 @@
"ਹਟਾਓ"
"ਮਹਿਮਾਨ, ਫਿਰ ਤੁਹਾਡਾ ਸੁਆਗਤ ਹੈ!"
"ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਸੈਸ਼ਨ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
- "ਸ਼ੁਰੂ ਕਰੋ"
+ "ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ"
"ਹਾਂ, ਜਾਰੀ ਰੱਖੋ"
"ਮਹਿਮਾਨ ਉਪਭੋਗਤਾ"
"ਐਪਾਂ ਅਤੇ ਡਾਟਾ ਮਿਟਾਉਣ ਲਈ, ਮਹਿਮਾਨ ਵਰਤੋਂਕਾਰ ਹਟਾਓ"
@@ -707,7 +708,7 @@
"ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ"
"ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"
"ਸ਼ਾਂਤ"
- "ਪੂਰਵ-ਨਿਰਧਾਰਤ"
+ "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ"
"ਬੁਲਬੁਲਾ"
"ਕੋਈ ਧੁਨੀ ਜਾਂ ਥਰਥਰਾਹਟ ਨਹੀਂ"
"ਕੋਈ ਧੁਨੀ ਜਾਂ ਥਰਥਰਾਹਟ ਨਹੀਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਵਿੱਚ ਹੇਠਲੇ ਪਾਸੇ ਦਿਸਦੀਆਂ ਹਨ"
@@ -1097,4 +1098,6 @@
"%1$s (ਡਿਸਕਨੈਕਟ ਹੋਇਆ)"
"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
"ਨਵਾਂ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ"
+ "ਤੁਹਾਡੇ ਬੈਟਰੀ ਮੀਟਰ ਨੂੰ ਪੜ੍ਹਨ ਵਿੱਚ ਸਮੱਸਿਆ ਹੋ ਰਹੀ ਹੈ"
+ "ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index ad41a59a5a68..56ed3de4cd88 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -181,6 +181,7 @@
"Bateria: dwa paski."
"Bateria: trzy paski."
"Bateria naładowana."
+ "Poziom naładowania baterii jest nieznany."
"Brak sygnału telefonu."
"Telefon: jeden pasek."
"Telefon: dwa paski."
@@ -481,7 +482,7 @@
"Usunąć gościa?"
"Wszystkie aplikacje i dane w tej sesji zostaną usunięte."
"Usuń"
- "Witaj ponownie, gościu!"
+ "Witaj ponownie, Gościu!"
"Chcesz kontynuować sesję?"
"Rozpocznij nową"
"Tak, kontynuuj"
@@ -1109,4 +1110,6 @@
"%1$s (rozłączono)"
"Nie udało się połączyć. Spróbuj ponownie."
"Sparuj nowe urządzenie"
+ "Problem z odczytaniem pomiaru wykorzystania baterii"
+ "Kliknij, aby uzyskać więcej informacji"
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 43f6b2b4ea2d..860c372eec80 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -181,6 +181,7 @@
"Duas barras de bateria."
"Três barras de bateria."
"Bateria cheia."
+ "Porcentagem da bateria desconhecida."
"Sem telefone."
"Uma barra de sinal do telefone."
"Duas barras de sinal do telefone."
@@ -474,16 +475,16 @@
"Mostrar perfil"
"Adicionar usuário"
"Novo usuário"
- "Remover convidado?"
+ "Remover visitante?"
"Todos os apps e dados nesta sessão serão excluídos."
"Remover"
- "Bem-vindo, convidado."
+ "Você voltou, visitante!"
"Quer continuar a sessão?"
"Recomeçar"
"Sim, continuar"
- "Usuário convidado"
- "Para excluir apps e dados, remova o usuário convidado"
- "REMOVER CONVIDADO"
+ "Usuário visitante"
+ "Para excluir apps e dados, remova o usuário visitante"
+ "REMOVER VISITANTE"
"Desconectar usuário"
"Desconectar usuário atual"
"DESCONECTAR USUÁRIO"
@@ -784,7 +785,7 @@
"Parar"
"Avançar"
"Anterior"
- "Retroceder"
+ "Voltar"
"Avançar rapidamente"
"Page Up"
"Page Down"
@@ -843,7 +844,7 @@
- "Inclinação à esquerda"
- "Inclinação à direita"
- "Alternador de teclado"
+ "Seletor de teclado"
"Salvar"
"Redefinir"
"Ajustar largura do botão"
@@ -1097,4 +1098,6 @@
"%1$s (desconectado)"
"Não foi possível conectar. Tente novamente."
"Parear novo dispositivo"
+ "Problema para ler seu medidor de bateria"
+ "Toque para mais informações"
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index c707ad6be72a..b491bd6b8f74 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -181,6 +181,7 @@
"Duas barras de bateria."
"Três barras de bateria."
"Bateria carregada."
+ "Percentagem da bateria desconhecida."
"Sem telefone."
"Uma barra de telefone."
"Duas barras de telefone."
@@ -475,9 +476,9 @@
"Adicionar utilizador"
"Novo utilizador"
"Remover o convidado?"
- "Todas as aplicações e dados desta sessão serão eliminados."
+ "Todas as apps e dados desta sessão serão eliminados."
"Remover"
- "Bem-vindo de volta, caro(a) convidado(a)!"
+ "Bem-vindo de volta, convidado!"
"Pretende continuar a sessão?"
"Recomeçar"
"Sim, continuar"
@@ -488,7 +489,7 @@
"Terminar sessão do utilizador atual"
"TERMINAR SESSÃO DO UTILIZADOR"
"Adicionar um novo utilizador?"
- "Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço.\n\nQualquer utilizador pode atualizar aplicações para todos os outros utilizadores."
+ "Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço.\n\nQualquer utilizador pode atualizar apps para todos os outros utilizadores."
"Limite de utilizadores alcançado"
- Pode adicionar até %d utilizadores.
@@ -1097,4 +1098,6 @@
"%1$s (desligado)"
"Não foi possível ligar. Tente novamente."
"Sincronize o novo dispositivo"
+ "Ocorreu um problema ao ler o medidor da bateria"
+ "Toque para obter mais informações"
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 43f6b2b4ea2d..860c372eec80 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -181,6 +181,7 @@
"Duas barras de bateria."
"Três barras de bateria."
"Bateria cheia."
+ "Porcentagem da bateria desconhecida."
"Sem telefone."
"Uma barra de sinal do telefone."
"Duas barras de sinal do telefone."
@@ -474,16 +475,16 @@
"Mostrar perfil"
"Adicionar usuário"
"Novo usuário"
- "Remover convidado?"
+ "Remover visitante?"
"Todos os apps e dados nesta sessão serão excluídos."
"Remover"
- "Bem-vindo, convidado."
+ "Você voltou, visitante!"
"Quer continuar a sessão?"
"Recomeçar"
"Sim, continuar"
- "Usuário convidado"
- "Para excluir apps e dados, remova o usuário convidado"
- "REMOVER CONVIDADO"
+ "Usuário visitante"
+ "Para excluir apps e dados, remova o usuário visitante"
+ "REMOVER VISITANTE"
"Desconectar usuário"
"Desconectar usuário atual"
"DESCONECTAR USUÁRIO"
@@ -784,7 +785,7 @@
"Parar"
"Avançar"
"Anterior"
- "Retroceder"
+ "Voltar"
"Avançar rapidamente"
"Page Up"
"Page Down"
@@ -843,7 +844,7 @@
- "Inclinação à esquerda"
- "Inclinação à direita"
- "Alternador de teclado"
+ "Seletor de teclado"
"Salvar"
"Redefinir"
"Ajustar largura do botão"
@@ -1097,4 +1098,6 @@
"%1$s (desconectado)"
"Não foi possível conectar. Tente novamente."
"Parear novo dispositivo"
+ "Problema para ler seu medidor de bateria"
+ "Toque para mais informações"
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 5dbee8ff9b0c..6046383df330 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -181,6 +181,7 @@
"Baterie: două bare."
"Baterie: trei bare."
"Baterie: complet."
+ "Procentajul bateriei este necunoscut."
"Nu există semnal pentru telefon."
"Semnal pentru telefon: o bară."
"Semnal pentru telefon: două bare."
@@ -1103,4 +1104,6 @@
"%1$s (s-a deconectat)"
"Nu s-a putut conecta. Reîncercați."
"Asociați un nou dispozitiv"
+ "Problemă la citirea măsurării bateriei"
+ "Atingeți pentru mai multe informații"
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 33bcc77926b7..405cbdb22a48 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -181,6 +181,7 @@
"Заряд батареи: два деления."
"Заряд батареи: три деления."
"Батарея полностью заряжена."
+ "Уровень заряда батареи в процентах неизвестен."
"Сигнал телефонной сети отсутствует."
"Сигнал телефонной сети: одно деление."
"Сигнал телефонной сети: два деления."
@@ -1109,4 +1110,6 @@
"%1$s (отключено)"
"Не удалось подключиться. Повторите попытку."
"Подключить новое устройство"
+ "Не удается получить данные об уровне заряда батареи"
+ "Нажмите, чтобы узнать больше."
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 2d9879b93ad0..8c061fcea8ae 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -181,6 +181,7 @@
"බැටරිය තීරු දෙකයි."
"බැටරිය තීරු තුනයි."
"බැටරිය පිරී ඇත."
+ "බැටරි ප්රතිශතය නොදනී."
"දුරකථනයක් නැත."
"දුරකථනය තීරු එකයි."
"දුරකථනය තීරු දෙකයි."
@@ -1097,4 +1098,6 @@
"%1$s (විසන්ධි විය)"
"සම්බන්ධ වීමට නොහැකි විය. නැවත උත්සාහ කරන්න."
"නව උපාංගය යුගල කරන්න"
+ "ඔබගේ බැටරි මනුව කියවීමේ දෝෂයකි"
+ "තවත් තොරතුරු සඳහා තට්ටු කරන්න"
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index a1724a4f62c3..4a29d87f44b0 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -181,6 +181,7 @@
"Dve čiarky batérie."
"Tri čiarky batérie."
"Batéria je nabitá."
+ "Percento batérie nie je známe."
"Žiadna telefónna sieť."
"Jeden stĺpec signálu telefónnej siete."
"Dve čiarky signálu telefónnej siete."
@@ -1109,4 +1110,6 @@
"%1$s (odpojené)"
"Nepodarilo sa pripojiť. Skúste to znova."
"Spárovať nové zariadenie"
+ "Pri čítaní meradla batérie sa vyskytol problém"
+ "Klepnutím si zobrazíte ďalšie informácie"
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 11d3fc53fbc6..d5de4d3f0d30 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -181,6 +181,7 @@
"Baterija z dvema črticama."
"Baterija s tremi črticami."
"Baterija je polna."
+ "Neznan odstotek napolnjenosti baterije."
"Ni telefona."
"Telefon z eno črtico."
"Telefon z dvema črticama."
@@ -423,7 +424,7 @@
"Vklop ob %s"
"Do %s"
"Temna tema"
- "Varčevanje z baterijo"
+ "Varčevanje z energijo baterije"
"Ob sončnem zahodu"
"Do sončnega vzhoda"
"Vklop ob %s"
@@ -1109,4 +1110,6 @@
"%1$s (povezava prekinjena)"
"Povezave ni bilo mogoče vzpostaviti. Poskusite znova."
"Seznanitev nove naprave"
+ "Težava z branjem indikatorja stanja napolnjenosti baterije"
+ "Dotaknite se za več informacij"
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 99b2ed553ff6..de8090136376 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -181,6 +181,7 @@
"Bateria ka edhe dy vija."
"Bateria ka edhe tre vija."
"Bateria u mbush."
+ "Përqindja e baterisë e panjohur."
"Nuk ka telefon."
"Telefoni ka edhe një vijë."
"Telefoni ka dy vija."
@@ -1097,4 +1098,6 @@
"%1$s (e shkëputur)"
"Nuk mund të lidhej. Provo sërish."
"Çifto pajisjen e re"
+ "Problem me leximin e matësit të baterisë"
+ "Trokit për më shumë informacione"
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 69d596841ff4..425ce213c1c3 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -181,6 +181,7 @@
"Батерија од две црте."
"Батерија од три црте."
"Батерија је пуна."
+ "Проценат напуњености батерије није познат."
"Нема телефона."
"Сигнал телефона има једну црту."
"Сигнал телефона од две црте."
@@ -1103,4 +1104,6 @@
"%1$s (веза је прекинута)"
"Повезивање није успело. Пробајте поново."
"Упари нови уређај"
+ "Проблем са очитавањем мерача батерије"
+ "Додирните за више информација"
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 26ab0dd18d5e..27de6d27b3f9 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -76,18 +76,18 @@
"Läs mer"
"Zooma för att fylla skärm"
"Dra för att fylla skärmen"
- "Skärmdump"
+ "Skärmbild"
"har skickat en bild"
- "Skärmdumpen sparas ..."
- "Skärmdumpen sparas ..."
- "Skärmdumpen har sparats"
- "Visa skärmdumpen genom att trycka här"
- "Det gick inte att spara skärmdumpen"
- "Testa att ta en skärmdump igen"
- "Det går inte att spara skärmdumpen eftersom lagringsutrymmet inte räcker"
- "Appen eller organisationen tillåter inte att du tar skärmdumpar"
- "Stäng skärmdump"
- "Förhandsgranskning av skärmdump"
+ "Skärmbilden sparas ..."
+ "Skärmbilden sparas ..."
+ "Skärmbilden har sparats"
+ "Visa skärmbilden genom att trycka här"
+ "Det gick inte att spara skärmbilden"
+ "Testa att ta en skärmbild igen"
+ "Det går inte att spara skärmbilden eftersom lagringsutrymmet inte räcker"
+ "Appen eller organisationen tillåter inte att du tar skärmbilder"
+ "Stäng skärmbild"
+ "Förhandsgranskning av skärmbild"
"Skärminspelare"
"Behandlar skärminspelning"
"Avisering om att skärminspelning pågår"
@@ -181,6 +181,7 @@
"Batteri: två staplar."
"Batteri: tre staplar."
"Batteriet är fulladdat."
+ "Okänd batterinivå."
"Ingen telefon."
"Telefon: en stapel."
"Telefon: två staplar."
@@ -477,7 +478,7 @@
"Vill du ta bort gästen?"
"Alla appar och data i denna session kommer att raderas."
"Ta bort"
- "Välkommen tillbaka gäst!"
+ "Välkommen tillbaka som gäst!"
"Vill du fortsätta sessionen?"
"Börja om"
"Ja, fortsätt"
@@ -714,7 +715,7 @@
"Kan ringa eller vibrera beroende på inställningarna på telefonen"
"Kan ringa eller vibrera beroende på inställningarna på telefonen. Konversationer från %1$s visas i bubblor som standard."
"Behåller din uppmärksamhet med en flytande genväg till innehållet."
- "Visas högst upp bland konversationerna som en flytande bubbla, visar profilbilden på låsskärmen"
+ "Visas högst upp bland konversationerna som en flytande bubbla och visar profilbilden på låsskärmen"
"Inställningar"
"Prioritet"
"%1$s har inte stöd för konversationsfunktioner"
@@ -947,7 +948,7 @@
"Appen %1$s"
"Aviseringar"
"Batteri"
- "Skärmdumpar"
+ "Skärmbilder"
"Allmänna meddelanden"
"Lagring"
"Tips"
@@ -1097,4 +1098,6 @@
"%1$s (frånkopplad)"
"Det gick inte att ansluta. Försök igen."
"Parkoppla en ny enhet"
+ "Batteriindikatorn visas inte"
+ "Tryck för mer information"
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index b5ac5eb512e5..fb1ae5569009 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -24,7 +24,7 @@
"Hakuna arifa"
"Inaendelea"
"Arifa"
- "Huenda chaji itaisha hivi karibuni"
+ "Chaji inaweza kuisha hivi karibuni"
"Imebakisha %s"
"Imesalia %1$s, itadumu takribani %2$s kulingana na jinsi unavyotumia"
"Imesalia %1$s, itadumu takribani %2$s"
@@ -181,6 +181,7 @@
"Pau mbili za betri"
"Pau tatu za betri."
"Betri imejaa."
+ "Asilimia ya betri haijulikani."
"Hakuna simu"
"Mwambaa mmoja wa simu."
"Miambaa miwili ya simu"
@@ -477,9 +478,9 @@
"Ungependa kumwondoa mgeni?"
"Data na programu zote katika kipindi hiki zitafutwa."
"Ondoa"
- "Karibu tena, mwalikwa!"
+ "Karibu tena mgeni!"
"Je, unataka kuendelea na kipindi chako?"
- "Anza tena"
+ "Anza upya"
"Ndiyo, endelea"
"Mtumiaji mgeni"
"Ili kufuta programu na data, mwondoe mtumiaji mgeni"
@@ -1097,4 +1098,6 @@
"%1$s (hakijaunganishwa)"
"Imeshindwa kuunganisha. Jaribu tena."
"Oanisha kifaa kipya"
+ "Tatizo la kusoma mita ya betri yako"
+ "Gusa ili upate maelezo zaidi"
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index f809ec15fed1..e085e63d781f 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -45,7 +45,7 @@
"அறிவிப்புகள்"
"புளூடூத் இணைக்கப்பட்டது"
"உள்ளீட்டு முறைகளை அமை"
- "கைமுறை விசைப்பலகை"
+ "கைமுறை கீபோர்டு"
"%2$sஐ அணுக, %1$s ஆப்ஸை அனுமதிக்கவா?"
"%2$sஐப் பயன்படுத்த %1$sஐ அனுமதிக்கவா?\nஇந்த ஆப்ஸிற்கு ரெக்கார்டு செய்வதற்கான அனுமதி வழங்கப்படவில்லை, எனினும் இந்த USB சாதனம் மூலம் ஆடியோவைப் பதிவுசெய்யும்."
"%2$sஐ அணுக, %1$s ஆப்ஸை அனுமதிக்கவா?"
@@ -181,6 +181,7 @@
"பேட்டரி சக்தி இரண்டு பார் அளவில் உள்ளது."
"பேட்டரி சக்தி மூன்று பார் அளவில் உள்ளது."
"பேட்டரி முழுமையாக உள்ளது."
+ "பேட்டரி சதவீதம் தெரியவில்லை."
"சிக்னல் இல்லை."
"சிக்னல் ஒரு கோட்டில் உள்ளது."
"சிக்னல் இரண்டு கோட்டில் உள்ளது."
@@ -419,7 +420,7 @@
"%sக்கு ஆன் செய்"
"%s வரை"
"டார்க் தீம்"
- "பேட்டரி சேமிப்பான்"
+ "பேட்டரி சேமிப்பு"
"மாலையில் ஆன் செய்"
"காலை வரை"
"%sக்கு ஆன் செய்"
@@ -475,7 +476,7 @@
"பயனரைச் சேர்"
"புதியவர்"
"கெஸ்ட்டை அகற்றவா?"
- "இந்த அமர்வின் எல்லா பயன்பாடுகளும், தரவும் நீக்கப்படும்."
+ "இந்த அமர்வின் எல்லா ஆப்ஸும் தரவும் நீக்கப்படும்."
"அகற்று"
"நல்வரவு!"
"உங்கள் அமர்வைத் தொடர விருப்பமா?"
@@ -488,7 +489,7 @@
"தற்போதைய பயனரிலிருந்து வெளியேறு"
"பயனரை வெளியேற்று"
"புதியவரைச் சேர்க்கவா?"
- "புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்.\n\nஎந்தவொரு பயனரும், மற்ற எல்லா பயனர்களுக்காகவும் பயன்பாடுகளைப் புதுப்பிக்கலாம்."
+ "புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்.\n\nஎந்தவொரு பயனரும், மற்ற எல்லா பயனர்களுக்காகவும் ஆப்ஸைப் புதுப்பிக்கலாம்."
"பயனர் வரம்பை அடைந்துவிட்டீர்கள்"
- %d பயனர்கள் வரை சேர்க்க முடியும்.
@@ -676,7 +677,7 @@
"விரைவு அமைப்புகளில் ஒளிர்வுப் பட்டியைக் காட்டு"
"பரிசோதனை முயற்சி"
"புளூடூத்தை இயக்கவா?"
- "உங்கள் டேப்லெட்டுடன் விசைப்பலகையை இணைக்க, முதலில் புளூடூத்தை இயக்க வேண்டும்."
+ "உங்கள் டேப்லெட்டுடன் கீபோர்டை இணைக்க, முதலில் புளூடூத்தை இயக்க வேண்டும்."
"இயக்கு"
"ஒலியின்றி அறிவிப்புகளைக் காட்டு"
"எல்லா அறிவிப்புகளையும் தடு"
@@ -748,7 +749,7 @@
"விழிப்பூட்டுகிறது"
"குமிழைக் காட்டு"
"குமிழ்களை அகற்று"
- "முகப்புத் திரையில் சேர்"
+ "முகப்புத் திரையில் சேருங்கள்"
"%1$s "
"அறிவிப்புக் கட்டுப்பாடுகள்"
"அறிவிப்பை உறக்கநிலையாக்கும் விருப்பங்கள்"
@@ -766,7 +767,7 @@
"பேட்டரி பயன்பாடு"
"சார்ஜ் செய்யும் போது பேட்டரி சேமிப்பானைப் பயன்படுத்த முடியாது"
- "பேட்டரி சேமிப்பான்"
+ "பேட்டரி சேமிப்பு"
"செயல்திறனையும் பின்புலத்தில் தரவு செயலாக்கப்படுவதையும் குறைக்கும்"
"%1$s பட்டன்"
"ஹோம்"
@@ -799,7 +800,7 @@
"சமீபத்தியவை"
"முந்தையது"
"அறிவிப்புகள்"
- "கீபோர்ட் ஷார்ட்கட்கள்"
+ "கீபோர்டு ஷார்ட்கட்கள்"
"கீபோர்டு லே அவுட்டை மாற்று"
"ஆப்ஸ்"
"அசிஸ்ட்"
@@ -834,7 +835,7 @@
- "கிளிப்போர்டு"
- "விசைக்குறியீடு"
- - "சுழற்ற உறுதிப்படுத்து, விசைப்பலகை மாற்றி"
+ - "சுழற்ற உறுதிப்படுத்து, கீபோர்டு மாற்றி"
- "ஏதுமில்லை"
@@ -843,7 +844,7 @@
- "இடப்புறம் சாய்ந்தது"
- "வலப்புறம் சாய்ந்தது"
- "விசைப்பலகை மாற்றி"
+ "கீபோர்டு மாற்றி"
"சேமி"
"மீட்டமை"
"பட்டனின் அகலத்தை மாற்று"
@@ -1097,4 +1098,6 @@
"%1$s (இணைப்பு துண்டிக்கப்பட்டது)"
"இணைக்க முடியவில்லை. மீண்டும் முயலவும்."
"புதிய சாதனத்தை இணைத்தல்"
+ "பேட்டரி அளவை அறிவதில் சிக்கல்"
+ "மேலும் தகவல்களுக்கு தட்டவும்"
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index d56c1e1ddb09..865821f9f2a7 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -52,7 +52,7 @@
"%2$sని నిర్వహించడానికి %1$sని తెరవాలా?"
"%2$sని హ్యాండిల్ చేయడానికి %1$sను తెరవాలా?\nఈ యాప్కు రికార్డ్ చేసే అనుమతి మంజూరు కాలేదు, అయినా ఈ USB పరికరం ద్వారా ఆడియోను క్యాప్చర్ చేయగలదు."
"%2$sని నిర్వహించడానికి %1$sని తెరవాలా?"
- "ఈ USB ఉపకరణంతో ఇన్స్టాల్ చేయబడిన అనువర్తనాలు ఏవీ పని చేయవు. ఈ ఉపకరణం గురించి %1$sలో మరింత తెలుసుకోండి"
+ "ఈ USB ఉపకరణంతో ఇన్స్టాల్ చేయబడిన యాప్లు ఏవీ పని చేయవు. ఈ ఉపకరణం గురించి %1$sలో మరింత తెలుసుకోండి"
"USB ఉపకరణం"
"వీక్షించండి"
"%2$s కనెక్ట్ అయి ఉన్న ఎల్లప్పుడూ %1$sని తెరవండి"
@@ -181,6 +181,7 @@
"బ్యాటరీ రెండు బార్లు."
"బ్యాటరీ మూడు బార్లు."
"బ్యాటరీ నిండింది."
+ "బ్యాటరీ శాతం తెలియదు."
"ఫోన్ లేదు."
"ఫోన్ ఒక బారు."
"ఫోన్ రెండు బార్లు."
@@ -370,7 +371,7 @@
"సెట్టింగ్లు"
"సమయం"
"నేను"
- "వినియోగదారు"
+ "యూజర్"
"కొత్త వినియోగదారు"
"Wi-Fi"
"కనెక్ట్ చేయబడలేదు"
@@ -472,30 +473,30 @@
"వినియోగదారుని మార్చు, ప్రస్తుత వినియోగదారు %s"
"ప్రస్తుత వినియోగదారు %s"
"ప్రొఫైల్ని చూపు"
- "వినియోగదారుని జోడించండి"
+ "యూజర్ను జోడించండి"
"కొత్త వినియోగదారు"
- "అతిథిని తీసివేయాలా?"
- "ఈ సెషన్లోని అన్ని అనువర్తనాలు మరియు డేటా తొలగించబడతాయి."
+ "గెస్ట్ను తీసివేయాలా?"
+ "ఈ సెషన్లోని అన్ని యాప్లు మరియు డేటా తొలగించబడతాయి."
"తీసివేయి"
- "పునఃస్వాగతం, అతిథి!"
+ "గెస్ట్కు తిరిగి స్వాగతం!"
"మీరు మీ సెషన్ని కొనసాగించాలనుకుంటున్నారా?"
"మొదటి నుండి ప్రారంభించు"
"అవును, కొనసాగించు"
"అతిథి వినియోగదారు"
- "అనువర్తనాలు, డేటా తొలగించేందుకు అతిథి వినియోగదారు తీసివేయండి"
+ "యాప్లు, డేటా తొలగించేందుకు అతిథి వినియోగదారు తీసివేయండి"
"అతిథిని తీసివేయి"
"వినియోగదారుని లాగ్ అవుట్ చేయండి"
"ప్రస్తుత వినియోగదారును లాగ్ అవుట్ చేయండి"
"వినియోగదారుని లాగ్ అవుట్ చేయి"
- "కొత్త వినియోగదారుని జోడించాలా?"
- "మీరు కొత్త వినియోగదారుని జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి.\n\nఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం అనువర్తనాలను నవీకరించగలరు."
+ "కొత్త యూజర్ను జోడించాలా?"
+ "ఒక కొత్త యూజర్ను మీరు జోడించినప్పుడు, ఆ వ్యక్తి తన స్పేస్ను సెటప్ చేసుకోవాలి.\n\nఏ యూజర్ అయినా మిగతా అందరు యూజర్ల కోసం యాప్లను అప్డేట్ చేయగలరు."
"వినియోగదారు పరిమితిని చేరుకున్నారు"
- మీరు %d వినియోగదారుల వరకు జోడించవచ్చు.
- ఒక్క వినియోగదారుని మాత్రమే సృష్టించవచ్చు.
"వినియోగదారుని తీసివేయాలా?"
- "ఈ వినియోగదారుకు సంబంధించిన అన్ని అనువర్తనాలు మరియు డేటా తొలగించబడతాయి."
+ "ఈ వినియోగదారుకు సంబంధించిన అన్ని యాప్లు మరియు డేటా తొలగించబడతాయి."
"తీసివేయి"
"బ్యాటరీ సేవర్ ఆన్లో ఉంది"
"పనితీరుని మరియు నేపథ్య డేటాను తగ్గిస్తుంది"
@@ -549,29 +550,29 @@
"మీ కార్యాలయ ప్రొఫైల్లో మీ సంస్థ ఒక ప్రమాణపత్ర అధికారాన్ని ఇన్స్టాల్ చేసింది. మీ సురక్షిత నెట్వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు."
"ఈ పరికరంలో ప్రమాణపత్ర అధికారం ఇన్స్టాల్ చేయబడింది. మీ సురక్షిత నెట్వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు."
"మీ నిర్వాహకులు మీ పరికరంలోని ట్రాఫిక్ని పర్యవేక్షించగల నెట్వర్క్ లాగింగ్ని ఆన్ చేసారు."
- "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
- "మీరు ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$s మరియు %2$sకి కనెక్ట్ చేయబడ్డారు."
- "మీ కార్యాలయ ప్రొఫైల్ ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది."
- "మీ వ్యక్తిగత ప్రొఫైల్ ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది."
+ "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
+ "మీరు ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$s మరియు %2$sకి కనెక్ట్ చేయబడ్డారు."
+ "మీ కార్యాలయ ప్రొఫైల్ ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది."
+ "మీ వ్యక్తిగత ప్రొఫైల్ ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది."
"మీ పరికరం %1$s ద్వారా నిర్వహించబడుతోంది."
"%1$s మీ పరికరాన్ని నిర్వహించడానికి %2$sని ఉపయోగిస్తుంది."
"మీ పరికరంతో అనుబంధించబడిన సెట్టింగ్లు, కార్పొరేట్ యాక్సెస్, యాప్లు, డేటా మరియు మీ పరికరం యొక్క స్థాన సమాచారాన్ని మీ నిర్వాహకులు పర్యవేక్షించగలరు మరియు నిర్వహించగలరు."
" "
"మరింత తెలుసుకోండి"
- "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
+ "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
" "
"VPN సెట్టింగ్లను తెరవండి"
" "
"విశ్వసనీయ ఆధారాలను తెరువు"
"మీ నిర్వాహకులు మీ పరికరంలోని ట్రాఫిక్ని పర్యవేక్షించగల నెట్వర్క్ లాగింగ్ని ఆన్ చేసారు.\n\nమరింత సమాచారం కావాలంటే, మీ నిర్వాహకులను సంప్రదించండి."
"మీరు VPN కనెక్షన్ సెటప్ చేయడానికి ఒక యాప్నకు అనుమతి ఇచ్చారు.\n\nఈ యాప్ ఇమెయిల్లు,యాప్లు మరియు వెబ్సైట్లతో సహా మీ డివైజ్ మరియు నెట్వర్క్ కార్యకలాపాన్ని పర్యవేక్షించగలదు."
- "%1$s ద్వారా మీ కార్యాలయ ప్రొఫైల్ నిర్వహించబడుతోంది.\n\nఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల సామర్థ్యం మీ నిర్వాహకులకు ఉంది.\n\nమరింత సమాచారం కావాలంటే, మీ నిర్వాహకులను సంప్రదించండి.\n\nమీరు VPNకి కూడా కనెక్ట్ అయ్యారు, ఇది మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
+ "%1$s ద్వారా మీ కార్యాలయ ప్రొఫైల్ నిర్వహించబడుతోంది.\n\nఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల సామర్థ్యం మీ నిర్వాహకులకు ఉంది.\n\nమరింత సమాచారం కావాలంటే, మీ నిర్వాహకులను సంప్రదించండి.\n\nమీరు VPNకి కూడా కనెక్ట్ అయ్యారు, ఇది మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
"VPN"
- "మీరు ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడ్డారు."
- "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
- "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
- "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ కార్యాలయ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకులను సంప్రదించండి."
- "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ కార్యాలయ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %3$sకి కూడా మీరు కనెక్ట్ చేయబడ్డారు."
+ "మీరు ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడ్డారు."
+ "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
+ "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."
+ "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ కార్యాలయ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకులను సంప్రదించండి."
+ "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్లు, యాప్లు మరియు వెబ్సైట్లతో సహా మీ కార్యాలయ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల %3$sకి కూడా మీరు కనెక్ట్ చేయబడ్డారు."
"TrustAgent ద్వారా అన్లాక్ చేయబడింది"
"మీరు మాన్యువల్గా అన్లాక్ చేస్తే మినహా పరికరం లాక్ చేయబడి ఉంటుంది"
"%1$s\n%2$s"
@@ -748,7 +749,7 @@
"అలర్ట్ చేయడం"
"బబుల్ను చూపించు"
"బబుల్స్ తీసివేయి"
- "హోమ్ స్క్రీన్కు జోడించు"
+ "హోమ్ స్క్రీన్కు జోడించండి"
"%1$s "
"నోటిఫికేషన్ నియంత్రణలు"
"నోటిఫికేషన్ తాత్కాలిక ఆపివేత ఎంపికలు"
@@ -922,7 +923,7 @@
"పరిమాణం మార్చు"
"వేడెక్కినందుకు ఫోన్ ఆఫ్ చేయబడింది"
"మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తోంది.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"
- "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత అనువర్తనాలు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి అనువర్తనాలు) ఉపయోగించడం\n • పెద్ద ఫైల్లను డౌన్లోడ్ లేదా అప్లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్ని ఉపయోగించడం"
+ "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత యాప్లు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి యాప్లు) ఉపయోగించడం\n • పెద్ద ఫైల్లను డౌన్లోడ్ లేదా అప్లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్ని ఉపయోగించడం"
"తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి"
"ఫోన్ వేడెక్కుతోంది"
"ఫోన్ను చల్లబరిచే క్రమంలో కొన్ని ఫీచర్లు పరిమితం చేయబడ్డాయి.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"
@@ -1097,4 +1098,6 @@
"%1$s (డిస్కనెక్ట్ అయ్యింది)"
"కనెక్ట్ చేయడం సాధ్యపడలేదు. మళ్లీ ట్రై చేయండి."
"కొత్త పరికరాన్ని పెయిర్ చేయండి"
+ "మీ బ్యాటరీ మీటర్ను చదవడంలో సమస్య"
+ "మరింత సమాచారం కోసం ట్యాప్ చేయండి"
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 2bde0db6c8e8..b542be31cd08 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -88,7 +88,7 @@
"แอปหรือองค์กรของคุณไม่อนุญาตให้จับภาพหน้าจอ"
"ปิดภาพหน้าจอ"
"ตัวอย่างภาพหน้าจอ"
- "โปรแกรมอัดหน้าจอ"
+ "โปรแกรมบันทึกหน้าจอ"
"กำลังประมวลผลการอัดหน้าจอ"
"การแจ้งเตือนต่อเนื่องสำหรับเซสชันการบันทึกหน้าจอ"
"เริ่มบันทึกเลยไหม"
@@ -181,6 +181,7 @@
"แบตเตอรี่สองขีด"
"แบตเตอรี่สามขีด"
"แบตเตอรี่เต็ม"
+ "ไม่ทราบเปอร์เซ็นต์แบตเตอรี่"
"ไม่มีสัญญาณโทรศัพท์"
"สัญญาณโทรศัพท์หนึ่งขีด"
"สัญญาณโทรศัพท์สองขีด"
@@ -477,7 +478,7 @@
"ต้องการนำผู้เข้าร่วมออกไหม"
"ระบบจะลบแอปและข้อมูลทั้งหมดในเซสชันนี้"
"นำออก"
- "ยินดีต้อนรับท่านผู้เยี่ยมชมกลับมาอีกครั้ง!"
+ "ยินดีต้อนรับผู้เข้าร่วมกลับมาอีกครั้ง"
"คุณต้องการอยู่ในเซสชันต่อไปไหม"
"เริ่มต้นใหม่"
"ใช่ ดำเนินการต่อ"
@@ -751,7 +752,7 @@
"เพิ่มลงในหน้าจอหลัก"
"%1$s "
"ส่วนควบคุมการแจ้งเตือน"
- "ตัวเลือกการปิดเสียงแจ้งเตือนชั่วคราว"
+ "ตัวเลือกการเลื่อนการแจ้งเตือน"
"เตือนฉัน"
"การตั้งค่า"
"เลิกทำ"
@@ -1097,4 +1098,6 @@
"%1$s (ยกเลิกการเชื่อมต่อแล้ว)"
"เชื่อมต่อไม่ได้ ลองใหม่"
"จับคู่อุปกรณ์ใหม่"
+ "พบปัญหาในการอ่านเครื่องวัดแบตเตอรี่"
+ "แตะดูข้อมูลเพิ่มเติม"
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 53c889dbbda1..238fbc92b1ef 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -181,6 +181,7 @@
"Baterya na dalawang bar."
"Baterya na tatlong bar."
"Puno na ang baterya."
+ "Hindi alam ang porsyento ng baterya."
"Walang telepono."
"Telepono na isang bar."
"Telepono na dalawang bar."
@@ -389,7 +390,7 @@
"AUTO"
"I-invert ang mga kulay"
"Correction mode ng kulay"
- "Marami pang setting"
+ "Higit pang setting"
"Tapos na"
"Nakakonekta"
"Nakakonekta, baterya %1$s"
@@ -477,7 +478,7 @@
"Alisin ang bisita?"
"Ide-delete ang lahat ng app at data sa session na ito."
"Alisin"
- "Maligayang pagbabalik, bisita!"
+ "Welcome ulit, bisita!"
"Gusto mo bang ipagpatuloy ang iyong session?"
"Magsimulang muli"
"Oo, magpatuloy"
@@ -1097,4 +1098,6 @@
"%1$s (nakadiskonekta)"
"Hindi makakonekta. Subukan ulit."
"Magpares ng bagong device"
+ "Nagkaproblema sa pagbabasa ng iyong battery meter"
+ "I-tap para sa higit pang impormasyon"
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 74bfb7542c03..093f18f699a9 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -181,6 +181,7 @@
"Pil gücü iki çubuk."
"Pil gücü üç çubuk."
"Pil tam dolu."
+ "Pil yüzdesi bilinmiyor."
"Telefon sinyali yok."
"Telefon sinyali bir çubuk."
"Telefon sinyali iki çubuk."
@@ -477,7 +478,7 @@
"Misafir oturumu kaldırılsın mı?"
"Bu oturumdaki tüm uygulamalar ve veriler silinecek."
"Kaldır"
- "Tekrar hoş geldiniz sayın misafir!"
+ "Misafir kullanıcı, tekrar hoşgeldiniz"
"Oturumunuza devam etmek istiyor musunuz?"
"Baştan başla"
"Evet, devam et"
@@ -1097,4 +1098,6 @@
"%1$s (bağlı değil)"
"Bağlanılamadı. Tekrar deneyin."
"Yeni cihaz eşle"
+ "Pil ölçeriniz okunurken sorun oluştu"
+ "Daha fazla bilgi için dokunun"
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index de1f6362c31f..52e41ff57059 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -181,6 +181,7 @@
"Заряд акумулятора: дві смужки."
"Заряд акумулятора: три смужки."
"Акумулятор заряджений."
+ "Відсоток заряду акумулятора невідомий."
"Немає сигналу телефону."
"Одна смужка сигналу телефону."
"Дві смужки сигналу телефону."
@@ -478,7 +479,7 @@
"Показати профіль"
"Додати користувача"
"Новий користувач"
- "Вийти з режиму гостя?"
+ "Видалити гостя?"
"Усі додатки й дані з цього сеансу буде видалено."
"Вийти"
"З поверненням!"
@@ -1109,4 +1110,6 @@
"%1$s (відключено)"
"Не вдалося підключитися. Повторіть спробу."
"Підключити новий пристрій"
+ "Не вдалось отримати дані лічильника акумулятора"
+ "Натисніть, щоб дізнатися більше"
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 39d251b079bd..0a3853ecfc04 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -181,6 +181,7 @@
"بیٹری کے دو بارز۔"
"بیٹری کے تین بارز۔"
"بیٹری بھری ہے۔"
+ "بیٹری کی فیصد نامعلوم ہے۔"
"کوئی فون نہیں ہے۔"
"فون کا ایک بار۔"
"فون کے دو بارز۔"
@@ -1097,4 +1098,6 @@
"%1$s (غیر منسلک ہو گیا)"
"منسلک نہیں ہو سکا۔ پھر کوشش کریں۔"
"نئے آلہ کا جوڑا بنائیں"
+ "آپ کے بیٹری میٹر کو پڑھنے میں دشواری"
+ "مزید معلومات کے لیے تھپتھپائیں"
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 80f5d6fc3304..59240ee1754a 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -181,6 +181,7 @@
"Batareya ikkta panelda."
"Batareya uchta panelda."
"Batareya to‘la."
+ "Batareya quvvati foizi nomaʼlum."
"Signal yo‘q."
"Telefon bitta panelda."
"Telefon ikkita panelda."
@@ -474,7 +475,7 @@
"Profilni ko‘rsatish"
"Foydalanuvchi"
"Yangi foydalanuvchi"
- "Mehmon hisobi o‘chirib tashlansinmi?"
+ "Mehmon olib tashlansinmi?"
"Ushbu seansdagi barcha ilovalar va ma’lumotlar o‘chirib tashlanadi."
"Olib tashlash"
"Xush kelibsiz, mehmon!"
@@ -483,7 +484,7 @@
"Ha, davom ettirilsin"
"Mehmon foydalanuvchi"
"Ilova va ma’l-ni o‘chirish u-n mehmon hisobini o‘chiring"
- "MEHMON HISOBINI O‘CHIRISH"
+ "MEHMONNI OLIB TASHLASH"
"Foydalanuvchi nomidan chiqish"
"Joriy foydalanuvchini tizimdan chiqaring"
"FOYDALANUVCHI NOMIDAN CHIQISH"
@@ -513,7 +514,7 @@
"Bildirishnomalar"
"Suhbatlar"
"Barcha sokin bildirishnomalarni tozalash"
- "Bezovta qilinmasin rejimida bildirishnomalar pauza qilingan"
+ "Bezovta qilinmasin rejimida bildirishnomalar pauza qilinadi"
"Boshlash"
"Bildirishnomalar yo‘q"
"Profil kuzatilishi mumkin"
@@ -1097,4 +1098,6 @@
"%1$s (uzilgan)"
"Ulanmadi. Qayta urining."
"Yangi qurilmani ulash"
+ "Batareya quvvati aniqlanmadi"
+ "Batafsil axborot olish uchun bosing"
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 378a47c0b321..e51036a745e3 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -181,6 +181,7 @@
"Mức pin hai vạch."
"Mức pin ba vạch."
"Mức pin đầy."
+ "Tỷ lệ phần trăm pin không xác định."
"Không có điện thoại nào."
"Tín hiệu điện thoại một vạch."
"Tín hiệu điện thoại hai vạch."
@@ -389,7 +390,7 @@
"TỰ ĐỘNG"
"Đảo ngược màu"
"Chế độ chỉnh màu"
- "Cài đặt khác"
+ "Chế độ cài đặt khác"
"Xong"
"Đã kết nối"
"Đã kết nối, mức pin %1$s"
@@ -714,7 +715,7 @@
"Có thể đổ chuông hoặc rung tùy theo chế độ cài đặt trên điện thoại"
"Có thể đổ chuông hoặc rung tùy theo chế độ cài đặt trên điện thoại. Theo mặc định, các cuộc trò chuyện từ %1$s được phép hiển thị dưới dạng bong bóng."
"Luôn chú ý vào nội dung này bằng phím tắt nổi."
- "Hiển thị cuộc trò chuyện ở đầu phần cuộc trò chuyện và dưới dạng bong bóng nổi, hiển thị ảnh hồ sơ trên màn hình khóa"
+ "Hiển thị ở đầu phần cuộc trò chuyện, dưới dạng bong bóng nổi và hiển thị ảnh hồ sơ trên màn hình khóa"
"Cài đặt"
"Mức độ ưu tiên"
"%1$s không hỗ trợ các tính năng trò chuyện"
@@ -737,7 +738,7 @@
"Đã mở điều khiển thông báo đối với %1$s"
"Đã đóng điều khiển thông báo đối với %1$s"
"Cho phép thông báo từ kênh này"
- "Cài đặt khác"
+ "Chế độ cài đặt khác"
"Tùy chỉnh"
"Xong"
"Hoàn tác"
@@ -832,7 +833,7 @@
"Loại nút bổ sung bên phải"
"(mặc định)"
- - "Khay nhớ tạm"
+ - "Bảng nhớ tạm"
- "Mã phím"
- "Xác nhận xoay, trình chuyển đổi bàn phím"
- "Không có"
@@ -847,7 +848,7 @@
"Lưu"
"Đặt lại"
"Điều chỉnh chiều rộng nút"
- "Khay nhớ tạm"
+ "Bảng nhớ tạm"
"Nút điều hướng tùy chỉnh"
"Mã phím bên trái"
"Mã phím bên phải"
@@ -1097,4 +1098,6 @@
"%1$s (đã ngắt kết nối)"
"Không thể kết nối. Hãy thử lại."
"Ghép nối thiết bị mới"
+ "Đã xảy ra vấn đề khi đọc dung lượng pin của bạn"
+ "Nhấn để biết thêm thông tin"
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 748298c1741a..d7717333bbf3 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -63,9 +63,9 @@
"允许"
"不允许使用 USB 调试功能"
"目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。"
- "要允许在此网络上进行无线调试吗?"
+ "要允许通过此网络上进行无线调试吗?"
"网络名称 (SSID)\n%1$s\n\nWLAN 地址 (BSSID)\n%2$s"
- "在此网络上始终允许"
+ "始终允许通过此网络进行调试"
"允许"
"不允许使用无线调试功能"
"目前已登录此设备的用户无法开启无线调试功能。要使用此功能,请切换为主要用户的帐号。"
@@ -181,6 +181,7 @@
"电池电量为两格。"
"电池电量为三格。"
"电池电量满格。"
+ "电池电量百分比未知。"
"没有手机信号。"
"手机信号强度为一格。"
"手机信号强度为两格。"
@@ -508,7 +509,7 @@
"全部清除"
"管理"
"历史记录"
- "新"
+ "最新"
"静音"
"通知"
"对话"
@@ -1097,11 +1098,14 @@
"%1$s(已断开连接)"
"无法连接。请重试。"
"与新设备配对"
-
+
+
重启
重启...
系统
恢复模式
引导模式
设置
+ "读取电池计量器时出现问题"
+ "点按即可了解详情"
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 259a975d81f1..a1e7054c9faa 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -181,6 +181,7 @@
"電池電量為兩格。"
"電池電量為三格。"
"電池已滿。"
+ "電量百分比不明。"
"沒有電話訊號。"
"電話訊號強度為一格。"
"電話訊號強度為兩格。"
@@ -714,9 +715,9 @@
"可能會根據手機設定發出鈴聲或震動"
"可能會根據手機設定發出鈴聲或震動。「%1$s」的對話會預設以對話氣泡顯示。"
"為此內容建立浮動捷徑以保持注意力。"
- "以浮動對話泡顯示在對話部分的頂部,並在上鎖畫面顯示個人檔案相片"
+ "在對話部分頂部顯示浮動對話氣泡,並在上鎖畫面上顯示個人檔案相片"
"設定"
- "重要"
+ "優先"
"「%1$s」不支援對話功能"
"沒有最近曾使用的小視窗"
"最近使用和關閉的小視窗會在這裡顯示"
@@ -1097,4 +1098,6 @@
"%1$s (已中斷連線)"
"無法連線,請再試一次。"
"配對新裝置"
+ "讀取電池計量器時發生問題"
+ "輕按即可瞭解詳情"
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 05ff15513b68..ed114c488fff 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -71,7 +71,7 @@
"目前登入這部裝置的使用者無法開啟無線偵錯功能。如要使用這項功能,請切換到主要使用者。"
"USB 連接埠已停用"
"為了避免液體或灰塵導致你的裝置受損,系統已停用 USB 連接埠,因此目前無法偵測任何配件。\n\n系統會在可繼續使用 USB 連接埠時通知你。"
- "USB 通訊埠已啟用,可偵測充電器和配件"
+ "USB 連接埠已啟用,可偵測充電器和配件"
"啟用 USB 連接埠"
"瞭解詳情"
"放大為全螢幕"
@@ -181,6 +181,7 @@
"電池電量兩格。"
"電池電量三格。"
"電池電量已滿。"
+ "電池電量不明。"
"沒有電話訊號。"
"電話訊號強度一格。"
"電話訊號強度兩格。"
@@ -419,7 +420,7 @@
"%s 開啟"
"%s 關閉"
"深色主題"
- "省電模式"
+ "節約耗電量"
"於日落時開啟"
"於日出時關閉"
"開啟時間:%s"
@@ -766,7 +767,7 @@
"電池用量"
"充電時無法使用省電模式"
- "省電模式"
+ "節約耗電量"
"降低效能並限制背景資料傳輸"
"%1$s 按鈕"
"Home 鍵"
@@ -1097,4 +1098,6 @@
"%1$s (已中斷連線)"
"無法連線,請再試一次。"
"配對新裝置"
+ "讀取電池計量器時發生問題"
+ "輕觸即可瞭解詳情"
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index eda3079e2868..c8356fa25c11 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -181,6 +181,7 @@
"Amabha amabili ebhethri"
"Amabha amathathu ebhethri"
"Ibhethri igcwele."
+ "Iphesenti lebhethri alaziwa."
"Ayikho ifoni."
"Ibha eyodwa yefoni"
"Amabha amabilil efoni."
@@ -1097,4 +1098,6 @@
"%1$s (inqamukile)"
"Ayikwazanga ukuxhumeka. Zama futhi."
"Bhangqa idivayisi entsha"
+ "Kube khona inkinga ngokufunda imitha yakho yebhethri"
+ "Thepha ukuze uthole olunye ulwazi"
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 17cca4c2f50d..6c01c3b587a6 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -587,4 +587,8 @@
true
+
+ false
+
+
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index a27a2359bf68..74c132ba4b0c 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -437,6 +437,8 @@
Battery three bars.
Battery full.
+
+ Battery percentage unknown.
No phone.
@@ -2882,4 +2884,11 @@
Recovery
Bootloader
Settings
+
+
+ Problem reading your battery meter
+
+ Tap for more information
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 6174b3030a03..326eeba99736 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -1729,7 +1729,7 @@ public void handleMessage(Message msg) {
}
// Take a guess at initial SIM state, battery status and PLMN until we get an update
- mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, 100, 0, 0, 0, 0, 0, 0, false);
+ mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, 100, 0, 0, 0, 0, 0, 0, false, false, false, false, false, true);
// Watch for interesting updates
final IntentFilter filter = new IntentFilter();
@@ -2601,6 +2601,8 @@ private boolean isBatteryUpdateInteresting(BatteryStatus old, BatteryStatus curr
final boolean wasPluggedIn = old.isPluggedIn();
final boolean stateChangedWhilePluggedIn = wasPluggedIn && nowPluggedIn
&& (old.status != current.status);
+ final boolean nowPresent = current.present;
+ final boolean wasPresent = old.present;
// change in plug state is always interesting
if (wasPluggedIn != nowPluggedIn || stateChangedWhilePluggedIn) {
@@ -2635,6 +2637,11 @@ private boolean isBatteryUpdateInteresting(BatteryStatus old, BatteryStatus curr
return true;
}
+ // Battery either showed up or disappeared
+ if (wasPresent != nowPresent) {
+ return true;
+ }
+
return false;
}
@@ -3082,4 +3089,4 @@ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println(" Running on Automotive build");
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 31e36f2cdd33..fad7079939a3 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -34,6 +34,7 @@
import android.content.res.TypedArray;
import android.database.ContentObserver;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
@@ -97,12 +98,15 @@ public class BatteryMeterView extends LinearLayout implements
private int mTextColor;
private int mLevel;
private int mShowPercentMode = MODE_DEFAULT;
- private boolean mForceShowPercent;
private boolean mShowPercentAvailable;
// Some places may need to show the battery conditionally, and not obey the tuner
private boolean mIgnoreTunerUpdates;
private boolean mIsSubscribedForTunerUpdates;
private boolean mCharging;
+ // Error state where we know nothing about the current battery state
+ private boolean mBatteryStateUnknown;
+ // Lazily-loaded since this is expected to be a rare-if-ever state
+ private Drawable mUnknownStateDrawable;
private int mDarkModeSingleToneColor;
private int mDarkModeBackgroundColor;
@@ -372,6 +376,11 @@ public void updatePercentView() {
}
private void updatePercentText() {
+ if (mBatteryStateUnknown) {
+ setContentDescription(getContext().getString(R.string.accessibility_battery_unknown));
+ return;
+ }
+
if (mBatteryController == null) {
return;
}
@@ -412,9 +421,13 @@ private void updateShowPercent() {
final boolean systemSetting = 0 != whitelistIpcs(() -> Settings.System
.getIntForUser(getContext().getContentResolver(),
SHOW_BATTERY_PERCENT, 0, mUser));
+ boolean shouldShow =
+ (mShowPercentAvailable && systemSetting && mShowPercentMode != MODE_OFF)
+ || mShowPercentMode == MODE_ON
+ || mShowPercentMode == MODE_ESTIMATE;
+ shouldShow = shouldShow && !mBatteryStateUnknown;
- if ((mShowPercentAvailable && systemSetting && mShowPercentMode != MODE_OFF)
- || mShowPercentMode == MODE_ON || mShowPercentMode == MODE_ESTIMATE) {
+ if (shouldShow) {
if (!showing) {
mBatteryPercentView = loadPercentView();
if (mPercentageStyleId != 0) { // Only set if specified as attribute
@@ -440,6 +453,32 @@ public void onDensityOrFontScaleChanged() {
scaleBatteryMeterViews();
}
+ private Drawable getUnknownStateDrawable() {
+ if (mUnknownStateDrawable == null) {
+ mUnknownStateDrawable = mContext.getDrawable(R.drawable.ic_battery_unknown);
+ mUnknownStateDrawable.setTint(mTextColor);
+ }
+
+ return mUnknownStateDrawable;
+ }
+
+ @Override
+ public void onBatteryUnknownStateChanged(boolean isUnknown) {
+ if (mBatteryStateUnknown == isUnknown) {
+ return;
+ }
+
+ mBatteryStateUnknown = isUnknown;
+
+ if (mBatteryStateUnknown) {
+ mBatteryIconView.setImageDrawable(getUnknownStateDrawable());
+ } else {
+ mBatteryIconView.setImageDrawable(mDrawable);
+ }
+
+ updateShowPercent();
+ }
+
/**
* Looks up the scale factor for status bar icons and scales the battery view by that amount.
*/
@@ -483,6 +522,10 @@ public void updateColors(int foregroundColor, int backgroundColor, int singleTon
if (mBatteryPercentView != null) {
mBatteryPercentView.setTextColor(singleToneColor);
}
+
+ if (mUnknownStateDrawable != null) {
+ mUnknownStateDrawable.setTint(singleToneColor);
+ }
}
private int getColorForDarkIntensity(float darkIntensity, int lightColor, int darkColor) {
@@ -496,8 +539,8 @@ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println(" mDrawable.getPowerSave: " + powerSave);
pw.println(" mBatteryPercentView.getText(): " + percent);
pw.println(" mTextColor: #" + Integer.toHexString(mTextColor));
+ pw.println(" mBatteryStateUnknown: " + mBatteryStateUnknown);
pw.println(" mLevel: " + mLevel);
- pw.println(" mForceShowPercent: " + mForceShowPercent);
}
private final class SettingObserver extends ContentObserver {
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index d17ca4041b31..0bb8c9cd81f3 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -16,6 +16,8 @@
package com.android.systemui;
+import static com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
@@ -697,14 +699,15 @@ public boolean isDismissGesture(MotionEvent ev) {
float translation = getTranslation(mCurrView);
return ev.getActionMasked() == MotionEvent.ACTION_UP
&& !mFalsingManager.isUnlockingDisabled()
- && !isFalseGesture(ev) && (swipedFastEnough() || swipedFarEnough())
+ && !isFalseGesture() && (swipedFastEnough() || swipedFarEnough())
&& mCallback.canChildBeDismissedInDirection(mCurrView, translation > 0);
}
- public boolean isFalseGesture(MotionEvent ev) {
+ /** Returns true if the gesture should be rejected. */
+ public boolean isFalseGesture() {
boolean falsingDetected = mCallback.isAntiFalsingNeeded();
if (mFalsingManager.isClassifierEnabled()) {
- falsingDetected = falsingDetected && mFalsingManager.isFalseTouch();
+ falsingDetected = falsingDetected && mFalsingManager.isFalseTouch(NOTIFICATION_DISMISS);
} else {
falsingDetected = falsingDetected && !mTouchAboveFalsingThreshold;
}
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIService.java b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
index 708002d5b946..1f41038c260f 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIService.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
@@ -32,6 +32,7 @@
import com.android.systemui.dump.DumpHandler;
import com.android.systemui.dump.LogBufferFreezer;
import com.android.systemui.dump.SystemUIAuxiliaryDumpService;
+import com.android.systemui.statusbar.policy.BatteryStateNotifier;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -44,18 +45,21 @@ public class SystemUIService extends Service {
private final DumpHandler mDumpHandler;
private final BroadcastDispatcher mBroadcastDispatcher;
private final LogBufferFreezer mLogBufferFreezer;
+ private final BatteryStateNotifier mBatteryStateNotifier;
@Inject
public SystemUIService(
@Main Handler mainHandler,
DumpHandler dumpHandler,
BroadcastDispatcher broadcastDispatcher,
- LogBufferFreezer logBufferFreezer) {
+ LogBufferFreezer logBufferFreezer,
+ BatteryStateNotifier batteryStateNotifier) {
super();
mMainHandler = mainHandler;
mDumpHandler = dumpHandler;
mBroadcastDispatcher = broadcastDispatcher;
mLogBufferFreezer = logBufferFreezer;
+ mBatteryStateNotifier = batteryStateNotifier;
}
@Override
@@ -68,6 +72,11 @@ public void onCreate() {
// Finish initializing dump logic
mLogBufferFreezer.attach(mBroadcastDispatcher);
+ // If configured, set up a battery notification
+ if (getResources().getBoolean(R.bool.config_showNotificationForUnknownBatteryState)) {
+ mBatteryStateNotifier.startListening();
+ }
+
// For debugging RescueParty
if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.crash_sysui", false)) {
throw new RuntimeException();
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java
index 1d47fc520ec2..7daad1ca7e79 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java
@@ -160,12 +160,12 @@ protected int getStateForAfterError() {
@Override
protected void handleResetAfterError() {
- resetErrorView(mContext, mIndicatorView);
+ resetErrorView();
}
@Override
protected void handleResetAfterHelp() {
- resetErrorView(mContext, mIndicatorView);
+ resetErrorView();
}
@Override
@@ -185,7 +185,7 @@ public void updateState(@BiometricState int newState) {
if (newState == STATE_AUTHENTICATING_ANIMATING_IN ||
(newState == STATE_AUTHENTICATING && mSize == AuthDialog.SIZE_MEDIUM)) {
- resetErrorView(mContext, mIndicatorView);
+ resetErrorView();
}
// Do this last since the state variable gets updated.
@@ -204,9 +204,8 @@ public void onAuthenticationFailed(String failureReason) {
super.onAuthenticationFailed(failureReason);
}
- static void resetErrorView(Context context, TextView textView) {
- textView.setTextColor(context.getResources().getColor(
- R.color.biometric_dialog_gray, context.getTheme()));
- textView.setVisibility(View.INVISIBLE);
+ private void resetErrorView() {
+ mIndicatorView.setTextColor(mTextColorHint);
+ mIndicatorView.setVisibility(View.INVISIBLE);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.java
index 176e9e6b1c9b..45ee4ad9ae50 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.java
@@ -78,7 +78,7 @@ void onAttachedToWindowInternal() {
private void showTouchSensorString() {
mIndicatorView.setText(R.string.fingerprint_dialog_touch_sensor);
- mIndicatorView.setTextColor(R.color.biometric_dialog_gray);
+ mIndicatorView.setTextColor(mTextColorHint);
}
private void updateIcon(int lastState, int newState) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java
index 7c25d2811793..f9c6d32d1d19 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java
@@ -82,7 +82,7 @@ public abstract class AuthBiometricView extends LinearLayout {
* Authenticated, dialog animating away soon.
*/
protected static final int STATE_AUTHENTICATED = 6;
-
+
@Retention(RetentionPolicy.SOURCE)
@IntDef({STATE_IDLE, STATE_AUTHENTICATING_ANIMATING_IN, STATE_AUTHENTICATING, STATE_HELP,
STATE_ERROR, STATE_PENDING_CONFIRMATION, STATE_AUTHENTICATED})
@@ -155,8 +155,8 @@ public int getMediumToLargeAnimationDurationMs() {
private final Injector mInjector;
private final Handler mHandler;
private final AccessibilityManager mAccessibilityManager;
- private final int mTextColorError;
- private final int mTextColorHint;
+ protected final int mTextColorError;
+ protected final int mTextColorHint;
private AuthPanelController mPanelController;
private Bundle mBiometricPromptBundle;
@@ -169,7 +169,7 @@ public int getMediumToLargeAnimationDurationMs() {
private TextView mSubtitleView;
private TextView mDescriptionView;
protected ImageView mIconView;
- @VisibleForTesting protected TextView mIndicatorView;
+ protected TextView mIndicatorView;
@VisibleForTesting Button mNegativeButton;
@VisibleForTesting Button mPositiveButton;
@VisibleForTesting Button mTryAgainButton;
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java
index b71e3adae8ac..ed9b904e5238 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java
@@ -43,6 +43,7 @@
import com.android.internal.logging.InstanceId;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.phone.StatusBar;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -623,7 +624,8 @@ public int getAppUid() {
private int getUid(final Context context) {
if (mAppUid != -1) return mAppUid;
- final PackageManager pm = context.getPackageManager();
+ final PackageManager pm = StatusBar.getPackageManagerForUser(context,
+ mUser.getIdentifier());
if (pm == null) return -1;
try {
final ApplicationInfo info = pm.getApplicationInfo(mShortcutInfo.getPackage(), 0);
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
index 5deae925ba30..fb819f04e0e1 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
@@ -1386,10 +1386,10 @@ public void applyUpdate(BubbleData.Update update) {
}
}
}
- mDataRepository.removeBubbles(mCurrentUserId, bubblesToBeRemovedFromRepository);
+ mDataRepository.removeBubbles(bubblesToBeRemovedFromRepository);
if (update.addedBubble != null && mStackView != null) {
- mDataRepository.addBubble(mCurrentUserId, update.addedBubble);
+ mDataRepository.addBubble(update.addedBubble);
mStackView.addBubble(update.addedBubble);
}
@@ -1400,7 +1400,7 @@ public void applyUpdate(BubbleData.Update update) {
// 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) {
- mDataRepository.addBubbles(mCurrentUserId, update.bubbles);
+ mDataRepository.addBubbles(update.bubbles);
mStackView.updateBubbleOrder(update.bubbles);
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt
index db64a13f3df3..a363208e8f10 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt
@@ -16,7 +16,6 @@
package com.android.systemui.bubbles
import android.annotation.SuppressLint
-import android.annotation.UserIdInt
import android.content.pm.LauncherApps
import android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC
import android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED_BY_ANY_LAUNCHER
@@ -51,31 +50,31 @@ internal class BubbleDataRepository @Inject constructor(
* Adds the bubble in memory, then persists the snapshot after adding the bubble to disk
* asynchronously.
*/
- fun addBubble(@UserIdInt userId: Int, bubble: Bubble) = addBubbles(userId, listOf(bubble))
+ fun addBubble(bubble: Bubble) = addBubbles(listOf(bubble))
/**
* Adds the bubble in memory, then persists the snapshot after adding the bubble to disk
* asynchronously.
*/
- fun addBubbles(@UserIdInt userId: Int, bubbles: List) {
+ fun addBubbles(bubbles: List) {
if (DEBUG) Log.d(TAG, "adding ${bubbles.size} bubbles")
- val entities = transform(userId, bubbles).also(volatileRepository::addBubbles)
+ val entities = transform(bubbles).also(volatileRepository::addBubbles)
if (entities.isNotEmpty()) persistToDisk()
}
/**
* Removes the bubbles from memory, then persists the snapshot to disk asynchronously.
*/
- fun removeBubbles(@UserIdInt userId: Int, bubbles: List) {
+ fun removeBubbles(bubbles: List) {
if (DEBUG) Log.d(TAG, "removing ${bubbles.size} bubbles")
- val entities = transform(userId, bubbles).also(volatileRepository::removeBubbles)
+ val entities = transform(bubbles).also(volatileRepository::removeBubbles)
if (entities.isNotEmpty()) persistToDisk()
}
- private fun transform(userId: Int, bubbles: List): List {
+ private fun transform(bubbles: List): List {
return bubbles.mapNotNull { b ->
BubbleEntity(
- userId,
+ b.user.identifier,
b.packageName,
b.metadataShortcutId ?: return@mapNotNull null,
b.key,
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java
index 1929fc4e9dbf..a6cf69a0f0a9 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java
@@ -48,6 +48,7 @@
import com.android.launcher3.icons.BitmapInfo;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.phone.StatusBar;
import java.lang.ref.WeakReference;
import java.util.List;
@@ -146,7 +147,8 @@ static BubbleViewInfo populate(Context c, BubbleStackView stackView,
}
// App name & app icon
- PackageManager pm = c.getPackageManager();
+ PackageManager pm = StatusBar.getPackageManagerForUser(
+ c, b.getUser().getIdentifier());
ApplicationInfo appInfo;
Drawable badgedIcon;
Drawable appIcon;
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
index 646e62062dfb..6961b45c3c37 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
@@ -70,7 +70,7 @@ public void setIsFalseTouch(boolean isFalseTouch) {
}
@Override
- public boolean isFalseTouch() {
+ public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
return mIsFalseTouch;
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java
index cc64fb53f15f..decaec10e572 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java
@@ -262,7 +262,7 @@ public boolean isUnlockingDisabled() {
/**
* @return true if the classifier determined that this is not a human interacting with the phone
*/
- public boolean isFalseTouch() {
+ public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
if (FalsingLog.ENABLED) {
// We're getting some false wtfs from touches that happen after the device went
// to sleep. Only report missing sessions that happen when the device is interactive.
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
index d0df46e86a4b..c91a4a9e0f8b 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
@@ -191,8 +191,8 @@ public boolean isUnlockingDisabled() {
}
@Override
- public boolean isFalseTouch() {
- return mInternalFalsingManager.isFalseTouch();
+ public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
+ return mInternalFalsingManager.isFalseTouch(interactionType);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java
index a50f9ce9713b..9d847ca62465 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java
@@ -189,7 +189,8 @@ public boolean isClassifierEnabled() {
}
@Override
- public boolean isFalseTouch() {
+ public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
+ mDataProvider.setInteractionType(interactionType);
if (!mDataProvider.isDirty()) {
return mPreviousResult;
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java
index ea46441c8fbe..8d067489a8cc 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java
@@ -116,7 +116,10 @@ List getRecentMotionEvents() {
* interactionType is defined by {@link com.android.systemui.classifier.Classifier}.
*/
final void setInteractionType(@Classifier.InteractionType int interactionType) {
- this.mInteractionType = interactionType;
+ if (mInteractionType != interactionType) {
+ mInteractionType = interactionType;
+ mDirty = true;
+ }
}
public boolean isDirty() {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index 6dd08981a435..72ba58be8544 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -46,6 +46,7 @@
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.internal.logging.nano.MetricsProto;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.sensors.AsyncSensorManager;
@@ -82,6 +83,7 @@ public class DozeSensors {
private boolean mSettingRegistered;
private boolean mListening;
private boolean mDisableProx;
+ private boolean mListeningTouchScreenSensors;
@VisibleForTesting
public enum DozeSensorsUiEvent implements UiEventLogger.UiEventEnum {
@@ -227,22 +229,25 @@ static Sensor findSensorWithType(SensorManager sensorManager, String type) {
/**
* If sensors should be registered and sending signals.
*/
- public void setListening(boolean listen) {
- if (mListening == listen) {
+ public void setListening(boolean listen, boolean includeTouchScreenSensors) {
+ if (mListening == listen && mListeningTouchScreenSensors == includeTouchScreenSensors) {
return;
}
mListening = listen;
+ mListeningTouchScreenSensors = includeTouchScreenSensors;
updateListening();
}
/**
* Registers/unregisters sensors based on internal state.
*/
- public void updateListening() {
+ private void updateListening() {
boolean anyListening = false;
for (TriggerSensor s : mSensors) {
- s.setListening(mListening);
- if (mListening) {
+ boolean listen = mListening
+ && (!s.mRequiresTouchscreen || mListeningTouchScreenSensors);
+ s.setListening(listen);
+ if (listen) {
anyListening = true;
}
}
@@ -314,11 +319,15 @@ public void ignoreTouchScreenSensorsSettingInterferingWithDocking(boolean ignore
/** Dump current state */
public void dump(PrintWriter pw) {
+ pw.println("mListening=" + mListening);
+ pw.println("mListeningTouchScreenSensors=" + mListeningTouchScreenSensors);
+ IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " ");
+ idpw.increaseIndent();
for (TriggerSensor s : mSensors) {
- pw.println(" Sensor: " + s.toString());
+ idpw.println("Sensor: " + s.toString());
}
if (!mDisableProx) // Useless
- pw.println(" ProxSensor: " + mProximitySensor.toString());
+ idpw.println("ProxSensor: " + mProximitySensor.toString());
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index cbf8f578744c..043edee44492 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -38,6 +38,7 @@
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.systemui.Dependency;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dock.DockManager;
@@ -408,15 +409,12 @@ public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState)
break;
case DOZE_PULSE_DONE:
mDozeSensors.requestTemporaryDisable();
- // A pulse will temporarily disable sensors that require a touch screen.
- // Let's make sure that they are re-enabled when the pulse is over.
- mDozeSensors.updateListening();
break;
case FINISH:
mBroadcastReceiver.unregister(mBroadcastDispatcher);
mDozeHost.removeCallback(mHostCallback);
mDockManager.removeListener(mDockEventListener);
- mDozeSensors.setListening(false);
+ mDozeSensors.setListening(false, false);
mDozeSensors.setProxListening(false);
mWantSensors = false;
mWantProx = false;
@@ -424,20 +422,16 @@ public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState)
break;
default:
}
+ mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors);
}
@Override
public void onScreenState(int state) {
mDozeSensors.onScreenState(state);
- if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND
- || state == Display.STATE_OFF) {
- mDozeSensors.setProxListening(mWantProx);
- mDozeSensors.setListening(mWantSensors);
- mDozeSensors.setTouchscreenSensorsListening(mWantTouchScreenSensors);
- } else {
- mDozeSensors.setProxListening(false);
- mDozeSensors.setListening(mWantSensors);
- }
+ mDozeSensors.setProxListening(mWantProx && (state == Display.STATE_DOZE
+ || state == Display.STATE_DOZE_SUSPEND
+ || state == Display.STATE_OFF));
+ mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors);
}
private void checkTriggersAtInit() {
@@ -513,7 +507,9 @@ public void dump(PrintWriter pw) {
pw.println(" pulsePending=" + mPulsePending);
pw.println("DozeSensors:");
- mDozeSensors.dump(pw);
+ IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " ");
+ idpw.increaseIndent();
+ mDozeSensors.dump(idpw);
}
private class TriggerReceiver extends BroadcastReceiver {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt
index 77cac5023db3..486399979db7 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt
@@ -30,6 +30,7 @@ import com.android.settingslib.Utils
import com.android.systemui.Gefingerpoken
import com.android.systemui.qs.PageIndicator
import com.android.systemui.R
+import com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.util.animation.PhysicsAnimator
import com.android.systemui.util.concurrency.DelayableExecutor
@@ -315,7 +316,8 @@ class MediaCarouselScrollHandler(
return false
}
- private fun isFalseTouch() = falsingProtectionNeeded && falsingManager.isFalseTouch
+ private fun isFalseTouch() = falsingProtectionNeeded &&
+ falsingManager.isFalseTouch(NOTIFICATION_DISMISS)
private fun getMaxTranslation() = if (showsSettingsButton) {
settingsButton.width
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index eab6035a05a2..dba4255a6518 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -16,6 +16,7 @@
package com.android.systemui.media;
+import static android.app.Notification.safeCharSequence;
import static android.provider.Settings.ACTION_MEDIA_CONTROLS_SETTINGS;
import android.app.PendingIntent;
@@ -266,9 +267,14 @@ public void bind(@NonNull MediaData data, String key) {
iconDrawable.setTint(mForegroundColor);
appIcon.setImageDrawable(iconDrawable);
+ // App title
+ TextView appName = mViewHolder.getAppName();
+ appName.setText(data.getApp());
+ appName.setTextColor(mForegroundColor);
+
// Song name
TextView titleText = mViewHolder.getTitleText();
- titleText.setText(data.getSong());
+ titleText.setText(safeCharSequence(data.getSong()));
titleText.setTextColor(mForegroundColor);
// Artist name
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
index 01a839102379..c9f4d56aad77 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
@@ -74,6 +74,7 @@ private const val DEBUG = true
private const val DEFAULT_LUMINOSITY = 0.25f
private const val LUMINOSITY_THRESHOLD = 0.05f
private const val SATURATION_MULTIPLIER = 0.8f
+const val DEFAULT_COLOR = Color.DKGRAY
private val LOADING = MediaData(-1, false, 0, 0, null, null, null, null, null,
emptyList(), emptyList(), "INVALID", null, null, null, true, null)
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt
index a46ecaff7719..ed37b1a04872 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt
@@ -106,9 +106,9 @@ class PrivacyItemController @Inject constructor(
uiExecutor.execute(notifyChanges)
}
- var allIndicatorsAvailable = isAllIndicatorsEnabled()
+ var allIndicatorsAvailable = false
private set
- var micCameraAvailable = isMicCameraEnabled()
+ var micCameraAvailable = false
private set
private val devicePropertiesChangedListener =
@@ -161,10 +161,6 @@ class PrivacyItemController @Inject constructor(
}
init {
- deviceConfigProxy.addOnPropertiesChangedListener(
- DeviceConfig.NAMESPACE_PRIVACY,
- uiExecutor,
- devicePropertiesChangedListener)
dumpManager.registerDumpable(TAG, this)
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
index 4d768397913a..be396b26135d 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
@@ -294,8 +294,10 @@ Notification.Action createShareAction(Context context, Resources r, Uri uri) {
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// cancel current pending intent (if any) since clipData isn't used for matching
- PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0,
- sharingChooserIntent, PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+ PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
+ context, 0, sharingChooserIntent,
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+ null, UserHandle.CURRENT);
// Create a share action for the notification
PendingIntent shareAction = PendingIntent.getBroadcastAsUser(context, requestCode,
@@ -307,7 +309,8 @@ Notification.Action createShareAction(Context context, Resources r, Uri uri) {
mSmartActionsEnabled)
.setAction(Intent.ACTION_SEND)
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
- PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.SYSTEM);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+ UserHandle.SYSTEM);
Notification.Action.Builder shareActionBuilder = new Notification.Action.Builder(
Icon.createWithResource(r, R.drawable.ic_screenshot_share),
@@ -336,7 +339,7 @@ Notification.Action createEditAction(Context context, Resources r, Uri uri) {
editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0,
- editIntent, 0, null, UserHandle.CURRENT);
+ editIntent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT);
// Make sure pending intents for the system user are still unique across users
// by setting the (otherwise unused) request code to the current user id.
@@ -351,7 +354,8 @@ Notification.Action createEditAction(Context context, Resources r, Uri uri) {
mSmartActionsEnabled)
.setAction(Intent.ACTION_EDIT)
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
- PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.SYSTEM);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+ UserHandle.SYSTEM);
Notification.Action.Builder editActionBuilder = new Notification.Action.Builder(
Icon.createWithResource(r, R.drawable.ic_screenshot_edit),
r.getString(com.android.internal.R.string.screenshot_edit), editAction);
@@ -373,7 +377,9 @@ Notification.Action createDeleteAction(Context context, Resources r, Uri uri) {
.putExtra(GlobalScreenshot.EXTRA_SMART_ACTIONS_ENABLED,
mSmartActionsEnabled)
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
- PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
+ PendingIntent.FLAG_CANCEL_CURRENT
+ | PendingIntent.FLAG_ONE_SHOT
+ | PendingIntent.FLAG_IMMUTABLE);
Notification.Action.Builder deleteActionBuilder = new Notification.Action.Builder(
Icon.createWithResource(r, R.drawable.ic_screenshot_delete),
r.getString(com.android.internal.R.string.delete), deleteAction);
@@ -414,7 +420,7 @@ private List buildSmartActions(
PendingIntent broadcastIntent = PendingIntent.getBroadcast(context,
mRandom.nextInt(),
intent,
- PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
broadcastActions.add(new Notification.Action.Builder(action.getIcon(), action.title,
broadcastIntent).setContextual(true).addExtras(extras).build());
}
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java
index 5aeca5e07bdd..6c9f61be2986 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java
@@ -141,14 +141,14 @@ private void updateDimTargets() {
@ImeAnimationFlags
public int onImeStartPositioning(int displayId, int hiddenTop, int shownTop,
boolean imeShouldShow, boolean imeIsFloating, SurfaceControl.Transaction t) {
- mHiddenTop = hiddenTop;
- mShownTop = shownTop;
- mTargetShown = imeShouldShow;
if (!isDividerVisible()) {
return 0;
}
- final boolean splitIsVisible = !getView().isHidden();
+ mHiddenTop = hiddenTop;
+ mShownTop = shownTop;
+ mTargetShown = imeShouldShow;
mSecondaryHasFocus = getSecondaryHasFocus(displayId);
+ final boolean splitIsVisible = !getView().isHidden();
final boolean targetAdjusted = splitIsVisible && imeShouldShow && mSecondaryHasFocus
&& !imeIsFloating && !getLayout().mDisplayLayout.isLandscape()
&& !mSplits.mDivider.isMinimized();
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index b6c6afd523b3..e59dca9d98c7 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -618,7 +618,7 @@ private ValueAnimator getFlingAnimator(int position, final SnapTarget snapTarget
mEntranceAnimationRunning = false;
mExitAnimationRunning = false;
if (!dismissed && !wasMinimizeInteraction) {
- WindowManagerProxy.applyResizeSplits(snapTarget.position, mSplitLayout);
+ mWindowManagerProxy.applyResizeSplits(snapTarget.position, mSplitLayout);
}
if (mCallback != null) {
mCallback.onDraggingEnd();
@@ -845,15 +845,7 @@ void setMinimizedDockStack(boolean minimized, boolean isHomeStackResizable,
}
void enterSplitMode(boolean isHomeStackResizable) {
- post(() -> {
- final SurfaceControl sc = getWindowSurfaceControl();
- if (sc == null) {
- return;
- }
- Transaction t = mTiles.getTransaction();
- t.show(sc).apply();
- mTiles.releaseTransaction(t);
- });
+ setHidden(false);
SnapTarget miniMid =
mSplitLayout.getMinimizedSnapAlgorithm(isHomeStackResizable).getMiddleTarget();
@@ -880,16 +872,19 @@ private SurfaceControl getWindowSurfaceControl() {
}
void exitSplitMode() {
- // Reset tile bounds
final SurfaceControl sc = getWindowSurfaceControl();
if (sc == null) {
return;
}
Transaction t = mTiles.getTransaction();
- t.hide(sc).apply();
+ t.hide(sc);
+ mImeController.setDimsHidden(t, true);
+ t.apply();
mTiles.releaseTransaction(t);
+
+ // Reset tile bounds
int midPos = mSplitLayout.getSnapAlgorithm().getMiddleTarget().position;
- WindowManagerProxy.applyResizeSplits(midPos, mSplitLayout);
+ mWindowManagerProxy.applyResizeSplits(midPos, mSplitLayout);
}
public void setMinimizedDockStack(boolean minimized, long animDuration,
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java
index 410e3dd39a0b..e593db86bd12 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java
@@ -37,7 +37,6 @@
import android.window.TaskOrganizer;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
-import android.window.WindowOrganizer;
import com.android.internal.annotations.GuardedBy;
import com.android.systemui.TransactionPool;
@@ -112,10 +111,10 @@ public void setTouchRegion(Rect region) {
mExecutor.execute(mSetTouchableRegionRunnable);
}
- static void applyResizeSplits(int position, SplitDisplayLayout splitLayout) {
+ void applyResizeSplits(int position, SplitDisplayLayout splitLayout) {
WindowContainerTransaction t = new WindowContainerTransaction();
splitLayout.resizeSplits(position, t);
- WindowOrganizer.applyTransaction(t);
+ applySyncTransaction(t);
}
private static boolean getHomeAndRecentsTasks(List out,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
index 2124bb076447..48de288cddc7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar;
+import static com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
@@ -194,7 +196,7 @@ private boolean isFalseTouch() {
if (!mDragDownCallback.isFalsingCheckNeeded()) {
return false;
}
- return mFalsingManager.isFalseTouch() || !mDraggedFarEnough;
+ return mFalsingManager.isFalseTouch(NOTIFICATION_DRAG_DOWN) || !mDraggedFarEnough;
}
private void captureStartingChild(float x, float y) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 3d73f1711120..5ef0e680b4f4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -124,6 +124,7 @@ public class KeyguardIndicationController implements StateListener,
private int mChargingSpeed;
private int mChargingWattage;
private int mBatteryLevel;
+ private boolean mBatteryPresent = true;
private long mChargingTimeRemaining;
private float mDisclosureMaxAlpha;
private int mChargingCurrent;
@@ -395,33 +396,19 @@ protected final void updateIndication(boolean animate) {
mWakeLock.setAcquired(false);
}
- if (mVisible) {
- // Walk down a precedence-ordered list of what indication
- // should be shown based on user or device state
- if (mDozing) {
- // When dozing we ignore any text color and use white instead, because
- // colors can be hard to read in low brightness.
- mTextView.setTextColor(Color.WHITE);
- if (!TextUtils.isEmpty(mTransientIndication)) {
- mTextView.switchIndication(mTransientIndication);
- } else if (!TextUtils.isEmpty(mAlignmentIndication)) {
- mTextView.switchIndication(mAlignmentIndication);
- mTextView.setTextColor(mContext.getColor(R.color.misalignment_text_color));
- } else if (mPowerPluggedIn || mEnableBatteryDefender) {
- String indication = computePowerIndication();
- if (animate) {
- animateText(mTextView, indication);
- } else {
- mTextView.switchIndication(indication);
- }
- } else {
- String percentage = NumberFormat.getPercentInstance()
- .format(mBatteryLevel / 100f);
- mTextView.switchIndication(percentage);
- }
- return;
- }
+ if (!mVisible) {
+ return;
+ }
+
+ // A few places might need to hide the indication, so always start by making it visible
+ mIndicationArea.setVisibility(View.VISIBLE);
+
+ boolean showAmbientBattery = Settings.System.getIntForUser(mContext.getContentResolver(),
+ Settings.System.AMBIENT_BATTERY_PERCENT, 0, UserHandle.USER_CURRENT) != 0;
+ // Walk down a precedence-ordered list of what indication
+ // should be shown based on user or device state
+ if (mDozing) {
int userId = KeyguardUpdateMonitor.getCurrentUser();
String trustGrantedIndication = getTrustGrantedIndication();
String trustManagedIndication = getTrustManagedIndication();
@@ -432,7 +419,15 @@ protected final void updateIndication(boolean animate) {
}
boolean isError = false;
- if (!mKeyguardUpdateMonitor.isUserUnlocked(userId)) {
+ // When dozing we ignore any text color and use white instead, because
+ // colors can be hard to read in low brightness.
+ mTextView.setTextColor(Color.WHITE);
+ if (!TextUtils.isEmpty(mTransientIndication)) {
+ mTextView.switchIndication(mTransientIndication);
+ } else if (!mBatteryPresent) {
+ // If there is no battery detected, hide the indication and bail
+ mIndicationArea.setVisibility(View.GONE);
+ } else if (!mKeyguardUpdateMonitor.isUserUnlocked(userId)) {
mTextView.switchIndication(com.android.internal.R.string.lockscreen_storage_locked);
} else if (!TextUtils.isEmpty(mTransientIndication)) {
mTextView.switchIndication(mTransientIndication);
@@ -449,25 +444,90 @@ protected final void updateIndication(boolean animate) {
}
} else if (!TextUtils.isEmpty(mAlignmentIndication)) {
mTextView.switchIndication(mAlignmentIndication);
- isError = true;
+ mTextView.setTextColor(mContext.getColor(R.color.misalignment_text_color));
} else if (mPowerPluggedIn || mEnableBatteryDefender) {
- if (DEBUG_CHARGING_SPEED) {
- powerIndication += ", " + (mChargingWattage / 1000) + " mW";
- }
+ String indication = computePowerIndication();
if (animate) {
- animateText(mTextView, powerIndication);
+ animateText(mTextView, indication);
} else {
- mTextView.switchIndication(powerIndication);
+ mTextView.switchIndication(indication);
}
- } else if (!TextUtils.isEmpty(trustManagedIndication)
- && mKeyguardUpdateMonitor.getUserTrustIsManaged(userId)
- && !mKeyguardUpdateMonitor.getUserHasTrust(userId)) {
- mTextView.switchIndication(trustManagedIndication);
} else {
- mTextView.switchIndication(mRestingIndication);
+ if (showAmbientBattery) {
+ String percentage = NumberFormat.getPercentInstance()
+ .format(mBatteryLevel / 100f);
+ mTextView.switchIndication(percentage);
+ } else {
+ mTextView.switchIndication(null);
+ }
}
mTextView.setTextColor(isError ? Utils.getColorError(mContext)
: mInitialTextColorState);
+ updateChargingIndication();
+ return;
+ }
+
+ int userId = KeyguardUpdateMonitor.getCurrentUser();
+ String trustGrantedIndication = getTrustGrantedIndication();
+ String trustManagedIndication = getTrustManagedIndication();
+
+ String powerIndication = null;
+ if (mPowerPluggedIn || mEnableBatteryDefender) {
+ powerIndication = computePowerIndication();
+ }
+
+ // Some cases here might need to hide the indication (if the battery is not present)
+ boolean hideIndication = false;
+ boolean isError = false;
+ if (!mKeyguardUpdateMonitor.isUserUnlocked(userId)) {
+ mTextView.switchIndication(com.android.internal.R.string.lockscreen_storage_locked);
+ } else if (!TextUtils.isEmpty(mTransientIndication)) {
+ if (powerIndication != null && !mTransientIndication.equals(powerIndication)) {
+ String indication = mContext.getResources().getString(
+ R.string.keyguard_indication_trust_unlocked_plugged_in,
+ mTransientIndication, powerIndication);
+ mTextView.switchIndication(indication);
+ hideIndication = !mBatteryPresent;
+ } else {
+ mTextView.switchIndication(mTransientIndication);
+ }
+ isError = mTransientTextIsError;
+ } else if (!TextUtils.isEmpty(trustGrantedIndication)
+ && mKeyguardUpdateMonitor.getUserHasTrust(userId)) {
+ if (powerIndication != null) {
+ String indication = mContext.getResources().getString(
+ R.string.keyguard_indication_trust_unlocked_plugged_in,
+ trustGrantedIndication, powerIndication);
+ mTextView.switchIndication(indication);
+ hideIndication = !mBatteryPresent;
+ } else {
+ mTextView.switchIndication(trustGrantedIndication);
+ }
+ } else if (!TextUtils.isEmpty(mAlignmentIndication)) {
+ mTextView.switchIndication(mAlignmentIndication);
+ isError = true;
+ hideIndication = !mBatteryPresent;
+ } else if (mPowerPluggedIn || mEnableBatteryDefender) {
+ if (DEBUG_CHARGING_SPEED) {
+ powerIndication += ", " + (mChargingWattage / 1000) + " mW";
+ }
+ if (animate) {
+ animateText(mTextView, powerIndication);
+ } else {
+ mTextView.switchIndication(powerIndication);
+ }
+ hideIndication = !mBatteryPresent;
+ } else if (!TextUtils.isEmpty(trustManagedIndication)
+ && mKeyguardUpdateMonitor.getUserTrustIsManaged(userId)
+ && !mKeyguardUpdateMonitor.getUserHasTrust(userId)) {
+ mTextView.switchIndication(trustManagedIndication);
+ } else {
+ mTextView.switchIndication(mRestingIndication);
+ }
+ mTextView.setTextColor(isError ? Utils.getColorError(mContext)
+ : mInitialTextColorState);
+ if (hideIndication) {
+ mIndicationArea.setVisibility(View.GONE);
}
}
@@ -680,6 +740,7 @@ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println(" mMessageToShowOnScreenOn: " + mMessageToShowOnScreenOn);
pw.println(" mDozing: " + mDozing);
pw.println(" mBatteryLevel: " + mBatteryLevel);
+ pw.println(" mBatteryPresent: " + mBatteryPresent);
pw.println(" mTextView.getText(): " + (mTextView == null ? null : mTextView.getText()));
pw.println(" computePowerIndication(): " + computePowerIndication());
}
@@ -723,6 +784,7 @@ public void onRefreshBatteryInfo(BatteryStatus status) {
mBatteryLevel = status.level;
mBatteryOverheated = status.isOverheated();
mEnableBatteryDefender = mBatteryOverheated && status.isPluggedIn();
+ mBatteryPresent = status.present;
try {
mChargingTimeRemaining = mPowerPluggedIn
? mBatteryInfo.computeChargeTimeRemaining() : -1;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
index 7b2585324b9f..38f96f42bdd4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
@@ -30,6 +30,7 @@ import android.view.ViewConfiguration
import com.android.systemui.Gefingerpoken
import com.android.systemui.Interpolators
import com.android.systemui.R
+import com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator
@@ -106,7 +107,7 @@ constructor(
private var velocityTracker: VelocityTracker? = null
private val isFalseTouch: Boolean
- get() = falsingManager.isFalseTouch
+ get() = falsingManager.isFalseTouch(NOTIFICATION_DRAG_DOWN)
var qsExpanded: Boolean = false
var pulseExpandAbortListener: Runnable? = null
var bouncerShowing: Boolean = false
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 01d31039a749..412d34261178 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -33,6 +33,7 @@
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.Parcelable;
@@ -83,6 +84,16 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi
public static final int STATE_DOT = 1;
public static final int STATE_HIDDEN = 2;
+ /**
+ * Maximum allowed byte count for an icon bitmap
+ * @see android.graphics.RecordingCanvas.MAX_BITMAP_SIZE
+ */
+ private static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB
+ /**
+ * Maximum allowed width or height for an icon drawable, if we can't get byte count
+ */
+ private static final int MAX_IMAGE_SIZE = 5000;
+
private static final String TAG = "StatusBarIconView";
private static final Property ICON_APPEAR_AMOUNT
= new FloatProperty("iconAppearAmount") {
@@ -378,6 +389,22 @@ private boolean updateDrawable(boolean withClear) {
Log.w(TAG, "No icon for slot " + mSlot + "; " + mIcon.icon);
return false;
}
+
+ if (drawable instanceof BitmapDrawable && ((BitmapDrawable) drawable).getBitmap() != null) {
+ // If it's a bitmap we can check the size directly
+ int byteCount = ((BitmapDrawable) drawable).getBitmap().getByteCount();
+ if (byteCount > MAX_BITMAP_SIZE) {
+ Log.w(TAG, "Drawable is too large (" + byteCount + " bytes) " + mIcon);
+ return false;
+ }
+ } else if (drawable.getIntrinsicWidth() > MAX_IMAGE_SIZE
+ || drawable.getIntrinsicHeight() > MAX_IMAGE_SIZE) {
+ // Otherwise, check dimensions
+ Log.w(TAG, "Drawable is too large (" + drawable.getIntrinsicWidth() + "x"
+ + drawable.getIntrinsicHeight() + ") " + mIcon);
+ return false;
+ }
+
if (withClear) {
setImageDrawable(null);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java
index d7d09e05c238..ac528b245ce9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java
@@ -209,7 +209,7 @@ private void handleSwipeFromClosedState(MotionEvent ev, View animView, float vel
|| (isFastNonDismissGesture && isAbleToShowMenu);
int menuSnapTarget = menuRow.getMenuSnapTarget();
boolean isNonFalseMenuRevealingGesture =
- !isFalseGesture(ev) && isMenuRevealingGestureAwayFromMenu;
+ !isFalseGesture() && isMenuRevealingGestureAwayFromMenu;
if ((isNonDismissGestureTowardsMenu || isNonFalseMenuRevealingGesture)
&& menuSnapTarget != 0) {
// Menu has not been snapped to previously and this is menu revealing gesture
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
index 603679afc109..14f8363b4345 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
@@ -560,20 +560,21 @@ private boolean isWithinTouchRegion(int x, int y) {
if (mVocab != null) {
app = mVocab.getOrDefault(mPackageName, -1);
}
- // Check if we are within the tightest bounds beyond which
- // we would not need to run the ML model.
- boolean withinRange = x <= mMLEnableWidth + mLeftInset
- || x >= (mDisplaySize.x - mMLEnableWidth - mRightInset);
- if (!withinRange) {
+
+ // Denotes whether we should proceed with the gesture. Even if it is false, we may want to
+ // log it assuming it is not invalid due to exclusion.
+ boolean withinRange = x < mEdgeWidthLeft + mLeftInset
+ || x >= (mDisplaySize.x - mEdgeWidthRight - mRightInset);
+ if (withinRange) {
int results = -1;
- if (mUseMLModel && (results = getBackGesturePredictionsCategory(x, y, app)) != -1) {
- withinRange = results == 1;
- } else {
- // Denotes whether we should proceed with the gesture.
- // Even if it is false, we may want to log it assuming
- // it is not invalid due to exclusion.
- withinRange = x <= mEdgeWidthLeft + mLeftInset
- || x >= (mDisplaySize.x - mEdgeWidthRight - mRightInset);
+
+ // Check if we are within the tightest bounds beyond which we would not need to run the
+ // ML model
+ boolean withinMinRange = x < mMLEnableWidth + mLeftInset
+ || x >= (mDisplaySize.x - mMLEnableWidth - mRightInset);
+ if (!withinMinRange && mUseMLModel
+ && (results = getBackGesturePredictionsCategory(x, y, app)) != -1) {
+ withinRange = (results == 1);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
index 858023dc6c62..ba9420265849 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
@@ -27,6 +27,7 @@
import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.classifier.Classifier;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.KeyguardAffordanceView;
@@ -317,7 +318,9 @@ private void flingWithCurrentVelocity(boolean forceSnapBack, float lastX, float
// We snap back if the current translation is not far enough
boolean snapBack = false;
if (mCallback.needsAntiFalsing()) {
- snapBack = snapBack || mFalsingManager.isFalseTouch();
+ snapBack = snapBack || mFalsingManager.isFalseTouch(
+ mTargetedView == mRightIcon
+ ? Classifier.RIGHT_AFFORDANCE : Classifier.LEFT_AFFORDANCE);
}
snapBack = snapBack || isBelowFalsingThreshold();
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 38b6f013596d..b5ecbc916752 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -18,6 +18,7 @@
import static android.view.View.GONE;
+import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_ALL;
@@ -72,6 +73,7 @@
import com.android.systemui.DejankUtils;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.classifier.Classifier;
import com.android.systemui.dagger.qualifiers.DisplayId;
import com.android.systemui.doze.DozeLog;
import com.android.systemui.fragments.FragmentHostManager;
@@ -1228,7 +1230,7 @@ private void logQsSwipeDown(float y) {
}
private boolean flingExpandsQs(float vel) {
- if (mFalsingManager.isUnlockingDisabled() || isFalseTouch()) {
+ if (mFalsingManager.isUnlockingDisabled() || isFalseTouch(QUICK_SETTINGS)) {
return false;
}
if (Math.abs(vel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) {
@@ -1238,12 +1240,12 @@ private boolean flingExpandsQs(float vel) {
}
}
- private boolean isFalseTouch() {
+ private boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
if (!mKeyguardAffordanceHelperCallback.needsAntiFalsing()) {
return false;
}
if (mFalsingManager.isClassifierEnabled()) {
- return mFalsingManager.isFalseTouch();
+ return mFalsingManager.isFalseTouch(interactionType);
}
return !mQsTouchAboveFalsingThreshold;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
index f43b20a53ad4..a8a68ee8997f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
@@ -16,6 +16,10 @@
package com.android.systemui.statusbar.phone;
+import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK;
+import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
+import static com.android.systemui.classifier.Classifier.UNLOCK;
+
import static java.lang.Float.isNaN;
import android.animation.Animator;
@@ -41,6 +45,7 @@
import com.android.systemui.DejankUtils;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.classifier.Classifier;
import com.android.systemui.doze.DozeLog;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.FlingAnimationUtils;
@@ -397,7 +402,12 @@ private void endMotionEvent(MotionEvent event, float x, float y, boolean forceCa
mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_UNLOCK, heightDp, velocityDp);
mLockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_UNLOCK);
}
- fling(vel, expand, isFalseTouch(x, y));
+ @Classifier.InteractionType int interactionType = vel > 0
+ ? QUICK_SETTINGS : (
+ mKeyguardStateController.canDismissLockScreen()
+ ? UNLOCK : BOUNCER_UNLOCK);
+
+ fling(vel, expand, isFalseTouch(x, y, interactionType));
onTrackingStopped(expand);
mUpdateFlingOnLayout = expand && mPanelClosedOnDown && !mHasLayoutedSinceDown;
if (mUpdateFlingOnLayout) {
@@ -480,7 +490,11 @@ protected boolean flingExpands(float vel, float vectorVel, float x, float y) {
return true;
}
- if (isFalseTouch(x, y)) {
+ @Classifier.InteractionType int interactionType = vel > 0
+ ? QUICK_SETTINGS : (
+ mKeyguardStateController.canDismissLockScreen() ? UNLOCK : BOUNCER_UNLOCK);
+
+ if (isFalseTouch(x, y, interactionType)) {
return true;
}
if (Math.abs(vectorVel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) {
@@ -499,12 +513,13 @@ protected boolean shouldExpandWhenNotFlinging() {
* @param y the final y-coordinate when the finger was lifted
* @return whether this motion should be regarded as a false touch
*/
- private boolean isFalseTouch(float x, float y) {
+ private boolean isFalseTouch(float x, float y,
+ @Classifier.InteractionType int interactionType) {
if (!mStatusBar.isFalsingThresholdNeeded()) {
return false;
}
if (mFalsingManager.isClassifierEnabled()) {
- return mFalsingManager.isFalseTouch();
+ return mFalsingManager.isFalseTouch(interactionType);
}
if (!mTouchAboveFalsingThreshold) {
return true;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
index e5a46797d035..5009fce5216d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -97,6 +97,9 @@ default void onBatteryLevelChanged(int level, boolean pluggedIn, boolean chargin
default void onPowerSaveChanged(boolean isPowerSave) {
}
+ default void onBatteryUnknownStateChanged(boolean isUnknown) {
+ }
+
default void onReverseChanged(boolean isReverse, int level, String name) {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
index d30f01a658f6..ea79c246f014 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.policy;
+import static android.os.BatteryManager.EXTRA_PRESENT;
+
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -70,6 +72,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
protected int mLevel;
protected boolean mPluggedIn;
protected boolean mCharging;
+ private boolean mStateUnknown = false;
private boolean mCharged;
protected boolean mPowerSave;
private boolean mAodPowerSave;
@@ -126,6 +129,7 @@ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.print(" mCharging="); pw.println(mCharging);
pw.print(" mCharged="); pw.println(mCharged);
pw.print(" mPowerSave="); pw.println(mPowerSave);
+ pw.print(" mStateUnknown="); pw.println(mStateUnknown);
}
@Override
@@ -139,8 +143,11 @@ public void addCallback(BatteryController.BatteryStateChangeCallback cb) {
mChangeCallbacks.add(cb);
}
if (!mHasReceivedBattery) return;
+
+ // Make sure new callbacks get the correct initial state
cb.onBatteryLevelChanged(mLevel, mPluggedIn, mCharging);
cb.onPowerSaveChanged(mPowerSave);
+ cb.onBatteryUnknownStateChanged(mStateUnknown);
}
@Override
@@ -168,6 +175,13 @@ public void onReceive(final Context context, Intent intent) {
mWirelessCharging = mCharging && intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0)
== BatteryManager.BATTERY_PLUGGED_WIRELESS;
+ boolean present = intent.getBooleanExtra(EXTRA_PRESENT, true);
+ boolean unknown = !present;
+ if (unknown != mStateUnknown) {
+ mStateUnknown = unknown;
+ fireBatteryUnknownStateChanged();
+ }
+
fireBatteryLevelChanged();
} else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) {
updatePowerSave();
@@ -316,6 +330,15 @@ protected void fireBatteryLevelChanged() {
}
}
+ private void fireBatteryUnknownStateChanged() {
+ synchronized (mChangeCallbacks) {
+ final int n = mChangeCallbacks.size();
+ for (int i = 0; i < n; i++) {
+ mChangeCallbacks.get(i).onBatteryUnknownStateChanged(mStateUnknown);
+ }
+ }
+ }
+
private void firePowerSaveChanged() {
synchronized (mChangeCallbacks) {
final int N = mChangeCallbacks.size();
@@ -340,6 +363,7 @@ public void dispatchDemoCommand(String command, Bundle args) {
String level = args.getString("level");
String plugged = args.getString("plugged");
String powerSave = args.getString("powersave");
+ String present = args.getString("present");
if (level != null) {
mLevel = Math.min(Math.max(Integer.parseInt(level), 0), 100);
}
@@ -350,6 +374,10 @@ public void dispatchDemoCommand(String command, Bundle args) {
mPowerSave = powerSave.equals("true");
firePowerSaveChanged();
}
+ if (present != null) {
+ mStateUnknown = !present.equals("true");
+ fireBatteryUnknownStateChanged();
+ }
fireBatteryLevelChanged();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt
new file mode 100644
index 000000000000..92e5b78f776a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt
@@ -0,0 +1,90 @@
+/*
+ * 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.policy
+
+import android.app.Notification
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.app.PendingIntent
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import com.android.systemui.R
+import com.android.systemui.util.concurrency.DelayableExecutor
+import javax.inject.Inject
+
+/**
+ * Listens for important battery states and sends non-dismissible system notifications if there is a
+ * problem
+ */
+class BatteryStateNotifier @Inject constructor(
+ val controller: BatteryController,
+ val noMan: NotificationManager,
+ val delayableExecutor: DelayableExecutor,
+ val context: Context
+) : BatteryController.BatteryStateChangeCallback {
+ var stateUnknown = false
+
+ fun startListening() {
+ controller.addCallback(this)
+ }
+
+ fun stopListening() {
+ controller.removeCallback(this)
+ }
+
+ override fun onBatteryUnknownStateChanged(isUnknown: Boolean) {
+ stateUnknown = isUnknown
+ if (stateUnknown) {
+ val channel = NotificationChannel("battery_status", "Battery status",
+ NotificationManager.IMPORTANCE_DEFAULT)
+ noMan.createNotificationChannel(channel)
+
+ val intent = Intent(Intent.ACTION_VIEW,
+ Uri.parse(context.getString(R.string.config_batteryStateUnknownUrl)))
+ val pi = PendingIntent.getActivity(context, 0, intent, 0)
+
+ val builder = Notification.Builder(context, channel.id)
+ .setAutoCancel(false)
+ .setContentTitle(
+ context.getString(R.string.battery_state_unknown_notification_title))
+ .setContentText(
+ context.getString(R.string.battery_state_unknown_notification_text))
+ .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
+ .setContentIntent(pi)
+ .setAutoCancel(true)
+ .setOngoing(true)
+
+ noMan.notify(TAG, ID, builder.build())
+ } else {
+ scheduleNotificationCancel()
+ }
+ }
+
+ private fun scheduleNotificationCancel() {
+ val r = {
+ if (!stateUnknown) {
+ noMan.cancel(ID)
+ }
+ }
+ delayableExecutor.executeDelayed(r, DELAY_MILLIS)
+ }
+}
+
+private const val TAG = "BatteryStateNotifier"
+private const val ID = 666
+private const val DELAY_MILLIS: Long = 4 * 60 * 60 * 1000
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
index 08cd6e383897..8d77c4a194a9 100644
--- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
+++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
@@ -33,7 +33,7 @@ public interface WakeLock {
static final String REASON_WRAP = "wrap";
/**
- * Default wake-lock timeout, to avoid battery regressions.
+ * Default wake-lock timeout in milliseconds, to avoid battery regressions.
*/
long DEFAULT_MAX_TIMEOUT = 20000;
@@ -104,6 +104,7 @@ public void release(String why) {
if (count == null) {
Log.wtf(TAG, "Releasing WakeLock with invalid reason: " + why,
new Throwable());
+ return;
} else if (count == 1) {
mActiveClients.remove(why);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java
index dd4ea578dafe..20e09a2df1cb 100644
--- a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java
+++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java
@@ -24,12 +24,12 @@
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
-import android.os.Handler;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Slog;
import android.util.SparseArray;
import android.view.IDisplayWindowInsetsController;
+import android.view.IWindowManager;
import android.view.InsetsSource;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
@@ -39,11 +39,15 @@
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
+import androidx.annotation.BinderThread;
+import androidx.annotation.VisibleForTesting;
+
import com.android.internal.view.IInputMethodManager;
import com.android.systemui.TransactionPool;
import com.android.systemui.dagger.qualifiers.Main;
import java.util.ArrayList;
+import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -66,20 +70,22 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
private static final int DIRECTION_HIDE = 2;
private static final int FLOATING_IME_BOTTOM_INSET = -80;
- SystemWindows mSystemWindows;
- final Handler mHandler;
+ protected final IWindowManager mWmService;
+ protected final Executor mMainExecutor;
final TransactionPool mTransactionPool;
+ final DisplayController mDisplayController;
final SparseArray mImePerDisplay = new SparseArray<>();
final ArrayList mPositionProcessors = new ArrayList<>();
@Inject
- public DisplayImeController(SystemWindows syswin, DisplayController displayController,
- @Main Handler mainHandler, TransactionPool transactionPool) {
- mHandler = mainHandler;
- mSystemWindows = syswin;
+ public DisplayImeController(IWindowManager wmService, DisplayController displayController,
+ @Main Executor mainExecutor, TransactionPool transactionPool) {
+ mWmService = wmService;
+ mMainExecutor = mainExecutor;
mTransactionPool = transactionPool;
+ mDisplayController = displayController;
displayController.addDisplayWindowListener(this);
}
@@ -88,12 +94,8 @@ public void onDisplayAdded(int displayId) {
// Add's a system-ui window-manager specifically for ime. This type is special because
// WM will defer IME inset handling to it in multi-window scenarious.
PerDisplay pd = new PerDisplay(displayId,
- mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation());
- try {
- mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, pd);
- } catch (RemoteException e) {
- Slog.w(TAG, "Unable to set insets controller on display " + displayId);
- }
+ mDisplayController.getDisplayLayout(displayId).rotation());
+ pd.register();
mImePerDisplay.put(displayId, pd);
}
@@ -103,7 +105,7 @@ public void onDisplayConfigurationChanged(int displayId, Configuration newConfig
if (pd == null) {
return;
}
- if (mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation()
+ if (mDisplayController.getDisplayLayout(displayId).rotation()
!= pd.mRotation && isImeShowing(displayId)) {
pd.startAnimation(true, false /* forceRestart */);
}
@@ -112,7 +114,7 @@ public void onDisplayConfigurationChanged(int displayId, Configuration newConfig
@Override
public void onDisplayRemoved(int displayId) {
try {
- mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, null);
+ mWmService.setDisplayWindowInsetsController(displayId, null);
} catch (RemoteException e) {
Slog.w(TAG, "Unable to remove insets controller on display " + displayId);
}
@@ -180,9 +182,12 @@ public void removePositionProcessor(ImePositionProcessor processor) {
}
}
- class PerDisplay extends IDisplayWindowInsetsController.Stub {
+ /** An implementation of {@link IDisplayWindowInsetsController} for a given display id. */
+ public class PerDisplay {
final int mDisplayId;
final InsetsState mInsetsState = new InsetsState();
+ protected final DisplayWindowInsetsControllerImpl mInsetsControllerImpl =
+ new DisplayWindowInsetsControllerImpl();
InsetsSourceControl mImeSourceControl = null;
int mAnimationDirection = DIRECTION_NONE;
ValueAnimator mAnimation = null;
@@ -196,26 +201,32 @@ class PerDisplay extends IDisplayWindowInsetsController.Stub {
mRotation = initialRotation;
}
- @Override
+ public void register() {
+ try {
+ mWmService.setDisplayWindowInsetsController(mDisplayId, mInsetsControllerImpl);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Unable to set insets controller on display " + mDisplayId);
+ }
+ }
+
public void insetsChanged(InsetsState insetsState) {
- mHandler.post(() -> {
- if (mInsetsState.equals(insetsState)) {
- return;
- }
+ if (mInsetsState.equals(insetsState)) {
+ return;
+ }
- final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME);
- final Rect newFrame = newSource.getFrame();
- final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame();
+ mImeShowing = insetsState.getSourceOrDefaultVisibility(InsetsState.ITYPE_IME);
- mInsetsState.set(insetsState, true /* copySources */);
- if (mImeShowing && !newFrame.equals(oldFrame) && newSource.isVisible()) {
- if (DEBUG) Slog.d(TAG, "insetsChanged when IME showing, restart animation");
- startAnimation(mImeShowing, true /* forceRestart */);
- }
- });
+ final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME);
+ final Rect newFrame = newSource.getFrame();
+ final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame();
+
+ mInsetsState.set(insetsState, true /* copySources */);
+ if (mImeShowing && !newFrame.equals(oldFrame) && newSource.isVisible()) {
+ if (DEBUG) Slog.d(TAG, "insetsChanged when IME showing, restart animation");
+ startAnimation(mImeShowing, true /* forceRestart */);
+ }
}
- @Override
public void insetsControlChanged(InsetsState insetsState,
InsetsSourceControl[] activeControls) {
insetsChanged(insetsState);
@@ -225,27 +236,25 @@ public void insetsControlChanged(InsetsState insetsState,
continue;
}
if (activeControl.getType() == InsetsState.ITYPE_IME) {
- mHandler.post(() -> {
- final Point lastSurfacePosition = mImeSourceControl != null
- ? mImeSourceControl.getSurfacePosition() : null;
- final boolean positionChanged =
- !activeControl.getSurfacePosition().equals(lastSurfacePosition);
- final boolean leashChanged =
- !haveSameLeash(mImeSourceControl, activeControl);
- mImeSourceControl = activeControl;
- if (mAnimation != null) {
- if (positionChanged) {
- startAnimation(mImeShowing, true /* forceRestart */);
- }
- } else {
- if (leashChanged) {
- applyVisibilityToLeash();
- }
- if (!mImeShowing) {
- removeImeSurface();
- }
+ final Point lastSurfacePosition = mImeSourceControl != null
+ ? mImeSourceControl.getSurfacePosition() : null;
+ final boolean positionChanged =
+ !activeControl.getSurfacePosition().equals(lastSurfacePosition);
+ final boolean leashChanged =
+ !haveSameLeash(mImeSourceControl, activeControl);
+ mImeSourceControl = activeControl;
+ if (mAnimation != null) {
+ if (positionChanged) {
+ startAnimation(mImeShowing, true /* forceRestart */);
+ }
+ } else {
+ if (leashChanged) {
+ applyVisibilityToLeash();
}
- });
+ if (!mImeShowing) {
+ removeImeSurface();
+ }
+ }
}
}
}
@@ -265,25 +274,22 @@ private void applyVisibilityToLeash() {
}
}
- @Override
public void showInsets(int types, boolean fromIme) {
if ((types & WindowInsets.Type.ime()) == 0) {
return;
}
if (DEBUG) Slog.d(TAG, "Got showInsets for ime");
- mHandler.post(() -> startAnimation(true /* show */, false /* forceRestart */));
+ startAnimation(true /* show */, false /* forceRestart */);
}
- @Override
public void hideInsets(int types, boolean fromIme) {
if ((types & WindowInsets.Type.ime()) == 0) {
return;
}
if (DEBUG) Slog.d(TAG, "Got hideInsets for ime");
- mHandler.post(() -> startAnimation(false /* show */, false /* forceRestart */));
+ startAnimation(false /* show */, false /* forceRestart */);
}
- @Override
public void topFocusedWindowChanged(String packageName) {
// no-op
}
@@ -294,7 +300,7 @@ public void topFocusedWindowChanged(String packageName) {
private void setVisibleDirectly(boolean visible) {
mInsetsState.getSource(InsetsState.ITYPE_IME).setVisible(visible);
try {
- mSystemWindows.mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState);
+ mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState);
} catch (RemoteException e) {
}
}
@@ -313,7 +319,7 @@ private boolean calcIsFloating(InsetsSource imeSource) {
// an IME inset). For now, we assume that no non-floating IME will be <= this nav bar
// frame height so any reported frame that is <= nav-bar frame height is assumed to
// be floating.
- return frame.height() <= mSystemWindows.mDisplayController.getDisplayLayout(mDisplayId)
+ return frame.height() <= mDisplayController.getDisplayLayout(mDisplayId)
.navBarFrameHeight();
}
@@ -329,7 +335,7 @@ private void startAnimation(final boolean show, final boolean forceRestart) {
// pretend the ime has some size just below the screen.
mImeFrame.set(newFrame);
final int floatingInset = (int) (
- mSystemWindows.mDisplayController.getDisplayLayout(mDisplayId).density()
+ mDisplayController.getDisplayLayout(mDisplayId).density()
* FLOATING_IME_BOTTOM_INSET);
mImeFrame.bottom -= floatingInset;
} else if (newFrame.height() != 0) {
@@ -446,6 +452,47 @@ public void onAnimationEnd(Animator animation) {
setVisibleDirectly(true /* visible */);
}
}
+
+ @VisibleForTesting
+ @BinderThread
+ public class DisplayWindowInsetsControllerImpl
+ extends IDisplayWindowInsetsController.Stub {
+ @Override
+ public void topFocusedWindowChanged(String packageName) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.topFocusedWindowChanged(packageName);
+ });
+ }
+
+ @Override
+ public void insetsChanged(InsetsState insetsState) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.insetsChanged(insetsState);
+ });
+ }
+
+ @Override
+ public void insetsControlChanged(InsetsState insetsState,
+ InsetsSourceControl[] activeControls) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.insetsControlChanged(insetsState, activeControls);
+ });
+ }
+
+ @Override
+ public void showInsets(int types, boolean fromIme) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.showInsets(types, fromIme);
+ });
+ }
+
+ @Override
+ public void hideInsets(int types, boolean fromIme) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.hideInsets(types, fromIme);
+ });
+ }
+ }
}
void removeImeSurface() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
index 1ad88560bf9c..8fc2d1ad0fe5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
@@ -44,11 +44,19 @@
import android.app.INotificationManager;
import android.app.Notification;
import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
import android.content.pm.LauncherApps;
+import android.content.pm.PackageManager;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
import android.hardware.display.AmbientDisplayConfiguration;
import android.hardware.face.FaceManager;
import android.os.Handler;
import android.os.PowerManager;
+import android.os.UserHandle;
import android.service.dreams.IDreamManager;
import android.service.notification.NotificationListenerService;
import android.service.notification.ZenModeConfig;
@@ -77,6 +85,7 @@
import com.android.systemui.statusbar.notification.NotificationFilter;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
import com.android.systemui.statusbar.phone.DozeParameters;
@@ -89,6 +98,7 @@
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.tests.R;
import com.android.systemui.util.FloatingContentCoordinator;
import com.google.common.collect.ImmutableList;
@@ -1022,6 +1032,74 @@ public void test_notVisuallyInterruptive_updateOverflowBubble_notAdded() {
assertThat(mBubbleData.hasBubbleInStackWithKey(mRow.getEntry().getKey())).isFalse();
}
+ /**
+ * Verifies that the package manager for the user is used when loading info for the bubble.
+ */
+ @Test
+ public void test_bubbleViewInfoGetPackageForUser() throws Exception {
+ final int workProfileUserId = 10;
+ final UserHandle workUser = new UserHandle(workProfileUserId);
+ final String workPkg = "work.pkg";
+
+ final Bubble bubble = createBubble(workProfileUserId, workPkg);
+ assertEquals(workProfileUserId, bubble.getUser().getIdentifier());
+
+ final Context context = setUpContextWithPackageManager(workPkg, null /* AppInfo */);
+ when(context.getResources()).thenReturn(mContext.getResources());
+ final Context userContext = setUpContextWithPackageManager(workPkg,
+ mock(ApplicationInfo.class));
+
+ // If things are working correctly, StatusBar.getPackageManagerForUser will call this
+ when(context.createPackageContextAsUser(eq(workPkg), anyInt(), eq(workUser)))
+ .thenReturn(userContext);
+
+ BubbleViewInfoTask.BubbleViewInfo info = BubbleViewInfoTask.BubbleViewInfo.populate(context,
+ mBubbleController.getStackView(),
+ new BubbleIconFactory(mContext),
+ bubble,
+ true /* skipInflation */);
+
+ verify(userContext, times(1)).getPackageManager();
+ verify(context, times(1)).createPackageContextAsUser(eq(workPkg),
+ eq(Context.CONTEXT_RESTRICTED),
+ eq(workUser));
+ assertNotNull(info);
+ }
+
+ /** Creates a bubble using the userId and package. */
+ private Bubble createBubble(int userId, String pkg) {
+ final UserHandle userHandle = new UserHandle(userId);
+ NotificationEntry workEntry = new NotificationEntryBuilder()
+ .setPkg(pkg)
+ .setUser(userHandle)
+ .build();
+ workEntry.setBubbleMetadata(getMetadata());
+ workEntry.setFlagBubble(true);
+
+ return new Bubble(workEntry,
+ null,
+ mock(BubbleController.PendingIntentCanceledListener.class));
+ }
+
+ /** Creates a context that will return a PackageManager with specific AppInfo. */
+ private Context setUpContextWithPackageManager(String pkg, ApplicationInfo info)
+ throws Exception {
+ final PackageManager pm = mock(PackageManager.class);
+ when(pm.getApplicationInfo(eq(pkg), anyInt())).thenReturn(info);
+
+ if (info != null) {
+ Drawable d = mock(Drawable.class);
+ when(d.getBounds()).thenReturn(new Rect());
+ when(pm.getApplicationIcon(anyString())).thenReturn(d);
+ when(pm.getUserBadgedIcon(any(), any())).thenReturn(d);
+ }
+
+ final Context context = mock(Context.class);
+ when(context.getPackageName()).thenReturn(pkg);
+ when(context.getPackageManager()).thenReturn(pm);
+ return context;
+ }
+
/**
* Sets the bubble metadata flags for this entry. These ]flags are normally set by
* NotificationManagerService when the notification is sent, however, these tests do not
@@ -1038,4 +1116,13 @@ private void setMetadataFlags(NotificationEntry entry, int flag, boolean enableF
}
bubbleMetadata.setFlags(flags);
}
+
+ private Notification.BubbleMetadata getMetadata() {
+ Intent target = new Intent(mContext, BubblesTestActivity.class);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, 0);
+
+ return new Notification.BubbleMetadata.Builder(bubbleIntent,
+ Icon.createWithResource(mContext, R.drawable.android))
+ .build();
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
index ebd2c3afe646..35e3bb392f7c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
@@ -77,8 +77,6 @@ public class DozeSensorsTest extends SysuiTestCase {
@Mock
private Consumer mProxCallback;
@Mock
- private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
- @Mock
private TriggerSensor mTriggerSensor;
@Mock
private DozeLog mDozeLog;
@@ -110,7 +108,7 @@ public void testRegisterProx() {
@Test
public void testSensorDebounce() {
- mDozeSensors.setListening(true);
+ mDozeSensors.setListening(true, true);
mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class));
mTestableLooper.processAllMessages();
@@ -128,7 +126,7 @@ public void testSensorDebounce() {
@Test
public void testSetListening_firstTrue_registerSettingsObserver() {
verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
- mDozeSensors.setListening(true);
+ mDozeSensors.setListening(true, true);
verify(mTriggerSensor).registerSettingsObserver(any(ContentObserver.class));
}
@@ -136,8 +134,8 @@ public void testSetListening_firstTrue_registerSettingsObserver() {
@Test
public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() {
verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
- mDozeSensors.setListening(true);
- mDozeSensors.setListening(true);
+ mDozeSensors.setListening(true, true);
+ mDozeSensors.setListening(true, true);
verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 655f933d28fe..be4fdb0babc6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -149,6 +149,7 @@ public void testTransitionTo_disablesAndEnablesTouchSensors() {
clearInvocations(mSensors);
mTriggers.transitionTo(DozeMachine.State.DOZE_PULSING, DozeMachine.State.DOZE_PULSE_DONE);
+ mTriggers.transitionTo(DozeMachine.State.DOZE_PULSE_DONE, DozeMachine.State.DOZE_AOD);
waitForSensorManager();
verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
index b47ee2921380..2f99b2a2a449 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
@@ -2,6 +2,7 @@ package com.android.systemui.media
import android.app.Notification.MediaStyle
import android.app.PendingIntent
+import android.graphics.Bitmap
import android.media.MediaDescription
import android.media.MediaMetadata
import android.media.session.MediaController
@@ -246,4 +247,26 @@ class MediaDataManagerTest : SysuiTestCase() {
verify(listener).onMediaDataRemoved(eq(KEY))
}
+
+ @Test
+ fun testBadArtwork_doesNotUse() {
+ // WHEN notification has a too-small artwork
+ val artwork = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+ val notif = SbnBuilder().run {
+ setPkg(PACKAGE_NAME)
+ modifyNotification(context).also {
+ it.setSmallIcon(android.R.drawable.ic_media_pause)
+ it.setStyle(MediaStyle().apply { setMediaSession(session.sessionToken) })
+ it.setLargeIcon(artwork)
+ }
+ build()
+ }
+ mediaDataManager.onNotificationAdded(KEY, notif)
+
+ // THEN it loads and uses the default background color
+ assertThat(backgroundExecutor.runAllReady()).isEqualTo(1)
+ assertThat(foregroundExecutor.runAllReady()).isEqualTo(1)
+ verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor))
+ assertThat(mediaDataCaptor.value!!.backgroundColor).isEqualTo(DEFAULT_COLOR)
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerFlagsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerFlagsTest.kt
deleted file mode 100644
index 25fb7d300b8f..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerFlagsTest.kt
+++ /dev/null
@@ -1,214 +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.privacy
-
-import android.os.UserManager
-import android.provider.DeviceConfig
-import android.testing.AndroidTestingRunner
-import androidx.test.filters.SmallTest
-import com.android.internal.config.sysui.SystemUiDeviceConfigFlags
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.appops.AppOpsController
-import com.android.systemui.broadcast.BroadcastDispatcher
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.util.DeviceConfigProxy
-import com.android.systemui.util.DeviceConfigProxyFake
-import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.time.FakeSystemClock
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertTrue
-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.Mockito.anyBoolean
-import org.mockito.Mockito.atLeastOnce
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
-
-@RunWith(AndroidTestingRunner::class)
-@SmallTest
-class PrivacyItemControllerFlagsTest : SysuiTestCase() {
- companion object {
- fun capture(argumentCaptor: ArgumentCaptor): T = argumentCaptor.capture()
- fun eq(value: T): T = Mockito.eq(value) ?: value
- fun any(): T = Mockito.any()
-
- private const val ALL_INDICATORS =
- SystemUiDeviceConfigFlags.PROPERTY_PERMISSIONS_HUB_ENABLED
- private const val MIC_CAMERA = SystemUiDeviceConfigFlags.PROPERTY_MIC_CAMERA_ENABLED
- }
-
- @Mock
- private lateinit var appOpsController: AppOpsController
- @Mock
- private lateinit var callback: PrivacyItemController.Callback
- @Mock
- private lateinit var userManager: UserManager
- @Mock
- private lateinit var broadcastDispatcher: BroadcastDispatcher
- @Mock
- private lateinit var dumpManager: DumpManager
-
- private lateinit var privacyItemController: PrivacyItemController
- private lateinit var executor: FakeExecutor
- private lateinit var deviceConfigProxy: DeviceConfigProxy
-
- fun PrivacyItemController(): PrivacyItemController {
- return PrivacyItemController(
- appOpsController,
- executor,
- executor,
- broadcastDispatcher,
- deviceConfigProxy,
- userManager,
- dumpManager
- )
- }
-
- @Before
- fun setup() {
- MockitoAnnotations.initMocks(this)
- executor = FakeExecutor(FakeSystemClock())
- deviceConfigProxy = DeviceConfigProxyFake()
-
- privacyItemController = PrivacyItemController()
- privacyItemController.addCallback(callback)
-
- executor.runAllReady()
- }
-
- @Test
- fun testNotListeningAllByDefault() {
- assertFalse(privacyItemController.allIndicatorsAvailable)
- }
-
- @Test
- fun testMicCameraListeningByDefault() {
- assertTrue(privacyItemController.micCameraAvailable)
- }
-
- @Test
- fun testMicCameraChanged() {
- changeMicCamera(false) // default is true
- executor.runAllReady()
-
- verify(callback).onFlagMicCameraChanged(false)
- verify(callback, never()).onFlagAllChanged(anyBoolean())
-
- assertFalse(privacyItemController.micCameraAvailable)
- assertFalse(privacyItemController.allIndicatorsAvailable)
- }
-
- @Test
- fun testAllChanged() {
- changeAll(true)
- executor.runAllReady()
-
- verify(callback).onFlagAllChanged(true)
- verify(callback, never()).onFlagMicCameraChanged(anyBoolean())
-
- assertTrue(privacyItemController.allIndicatorsAvailable)
- }
-
- @Test
- fun testBothChanged() {
- changeAll(true)
- changeMicCamera(false)
- executor.runAllReady()
-
- verify(callback, atLeastOnce()).onFlagAllChanged(true)
- verify(callback, atLeastOnce()).onFlagMicCameraChanged(false)
-
- assertTrue(privacyItemController.allIndicatorsAvailable)
- assertFalse(privacyItemController.micCameraAvailable)
- }
-
- @Test
- fun testAll_listeningToAll() {
- changeAll(true)
- executor.runAllReady()
-
- verify(appOpsController).addCallback(eq(PrivacyItemController.OPS), any())
- }
-
- @Test
- fun testMicCamera_listening() {
- changeMicCamera(true)
- executor.runAllReady()
-
- verify(appOpsController).addCallback(eq(PrivacyItemController.OPS), any())
- }
-
- @Test
- fun testAllFalse_notListening() {
- changeAll(true)
- executor.runAllReady()
- changeAll(false)
- changeMicCamera(false)
- executor.runAllReady()
-
- verify(appOpsController).removeCallback(any(), any())
- }
-
- @Test
- fun testSomeListening_stillListening() {
- // Mic and camera are true by default
- changeAll(true)
- executor.runAllReady()
- changeAll(false)
- executor.runAllReady()
-
- verify(appOpsController, never()).removeCallback(any(), any())
- }
-
- @Test
- fun testAllDeleted_micCameraFalse_stopListening() {
- changeMicCamera(false)
- changeAll(true)
- executor.runAllReady()
- changeAll(null)
- executor.runAllReady()
-
- verify(appOpsController).removeCallback(any(), any())
- }
-
- @Test
- fun testMicDeleted_stillListening() {
- changeMicCamera(true)
- executor.runAllReady()
- changeMicCamera(null)
- executor.runAllReady()
-
- verify(appOpsController, never()).removeCallback(any(), any())
- }
-
- private fun changeMicCamera(value: Boolean?) = changeProperty(MIC_CAMERA, value)
- private fun changeAll(value: Boolean?) = changeProperty(ALL_INDICATORS, value)
-
- private fun changeProperty(name: String, value: Boolean?) {
- deviceConfigProxy.setProperty(
- DeviceConfig.NAMESPACE_PRIVACY,
- name,
- value?.toString(),
- false
- )
- }
-}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt
deleted file mode 100644
index 38e8823adfbb..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt
+++ /dev/null
@@ -1,330 +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.privacy
-
-import android.app.ActivityManager
-import android.app.AppOpsManager
-import android.content.Intent
-import android.content.pm.UserInfo
-import android.os.UserHandle
-import android.os.UserManager
-import android.provider.DeviceConfig
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper.RunWithLooper
-import androidx.test.filters.SmallTest
-import com.android.internal.config.sysui.SystemUiDeviceConfigFlags
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.appops.AppOpItem
-import com.android.systemui.appops.AppOpsController
-import com.android.systemui.broadcast.BroadcastDispatcher
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.util.DeviceConfigProxy
-import com.android.systemui.util.DeviceConfigProxyFake
-import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.time.FakeSystemClock
-import org.hamcrest.Matchers.hasItem
-import org.hamcrest.Matchers.not
-import org.hamcrest.Matchers.nullValue
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertThat
-import org.junit.Assert.assertTrue
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.ArgumentMatchers.anyList
-import org.mockito.Captor
-import org.mockito.Mock
-import org.mockito.Mockito
-import org.mockito.Mockito.atLeastOnce
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.never
-import org.mockito.Mockito.reset
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.MockitoAnnotations
-
-@RunWith(AndroidTestingRunner::class)
-@SmallTest
-@RunWithLooper
-class PrivacyItemControllerTest : SysuiTestCase() {
-
- companion object {
- val CURRENT_USER_ID = ActivityManager.getCurrentUser()
- val TEST_UID = CURRENT_USER_ID * UserHandle.PER_USER_RANGE
- const val TEST_PACKAGE_NAME = "test"
-
- private const val ALL_INDICATORS =
- SystemUiDeviceConfigFlags.PROPERTY_PERMISSIONS_HUB_ENABLED
- private const val MIC_CAMERA = SystemUiDeviceConfigFlags.PROPERTY_MIC_CAMERA_ENABLED
- fun capture(argumentCaptor: ArgumentCaptor): T = argumentCaptor.capture()
- fun eq(value: T): T = Mockito.eq(value) ?: value
- fun any(): T = Mockito.any()
- }
-
- @Mock
- private lateinit var appOpsController: AppOpsController
- @Mock
- private lateinit var callback: PrivacyItemController.Callback
- @Mock
- private lateinit var userManager: UserManager
- @Mock
- private lateinit var broadcastDispatcher: BroadcastDispatcher
- @Mock
- private lateinit var dumpManager: DumpManager
- @Captor
- private lateinit var argCaptor: ArgumentCaptor>
- @Captor
- private lateinit var argCaptorCallback: ArgumentCaptor
-
- private lateinit var privacyItemController: PrivacyItemController
- private lateinit var executor: FakeExecutor
- private lateinit var deviceConfigProxy: DeviceConfigProxy
-
- fun PrivacyItemController(): PrivacyItemController {
- return PrivacyItemController(
- appOpsController,
- executor,
- executor,
- broadcastDispatcher,
- deviceConfigProxy,
- userManager,
- dumpManager
- )
- }
-
- @Before
- fun setup() {
- MockitoAnnotations.initMocks(this)
- executor = FakeExecutor(FakeSystemClock())
- deviceConfigProxy = DeviceConfigProxyFake()
-
- changeAll(true)
-
- doReturn(listOf(object : UserInfo() {
- init {
- id = CURRENT_USER_ID
- }
- })).`when`(userManager).getProfiles(anyInt())
-
- privacyItemController = PrivacyItemController()
- }
-
- @Test
- fun testSetListeningTrueByAddingCallback() {
- privacyItemController.addCallback(callback)
- executor.runAllReady()
- verify(appOpsController).addCallback(eq(PrivacyItemController.OPS),
- any())
- verify(callback).onPrivacyItemsChanged(anyList())
- }
-
- @Test
- fun testSetListeningFalseByRemovingLastCallback() {
- privacyItemController.addCallback(callback)
- executor.runAllReady()
- verify(appOpsController, never()).removeCallback(any(),
- any())
- privacyItemController.removeCallback(callback)
- executor.runAllReady()
- verify(appOpsController).removeCallback(eq(PrivacyItemController.OPS),
- any())
- verify(callback).onPrivacyItemsChanged(emptyList())
- }
-
- @Test
- fun testDistinctItems() {
- doReturn(listOf(AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 0),
- AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 1)))
- .`when`(appOpsController).getActiveAppOpsForUser(anyInt())
-
- privacyItemController.addCallback(callback)
- executor.runAllReady()
- verify(callback).onPrivacyItemsChanged(capture(argCaptor))
- assertEquals(1, argCaptor.value.size)
- }
-
- @Test
- fun testRegisterReceiver_allUsers() {
- privacyItemController.addCallback(callback)
- executor.runAllReady()
- verify(broadcastDispatcher, atLeastOnce()).registerReceiver(
- eq(privacyItemController.userSwitcherReceiver), any(), eq(null), eq(UserHandle.ALL))
- verify(broadcastDispatcher, never())
- .unregisterReceiver(eq(privacyItemController.userSwitcherReceiver))
- }
-
- @Test
- fun testReceiver_ACTION_USER_FOREGROUND() {
- privacyItemController.userSwitcherReceiver.onReceive(context,
- Intent(Intent.ACTION_USER_SWITCHED))
- executor.runAllReady()
- verify(userManager).getProfiles(anyInt())
- }
-
- @Test
- fun testReceiver_ACTION_MANAGED_PROFILE_ADDED() {
- privacyItemController.userSwitcherReceiver.onReceive(context,
- Intent(Intent.ACTION_MANAGED_PROFILE_AVAILABLE))
- executor.runAllReady()
- verify(userManager).getProfiles(anyInt())
- }
-
- @Test
- fun testReceiver_ACTION_MANAGED_PROFILE_REMOVED() {
- privacyItemController.userSwitcherReceiver.onReceive(context,
- Intent(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE))
- executor.runAllReady()
- verify(userManager).getProfiles(anyInt())
- }
-
- @Test
- fun testAddMultipleCallbacks() {
- val otherCallback = mock(PrivacyItemController.Callback::class.java)
- privacyItemController.addCallback(callback)
- executor.runAllReady()
- verify(callback).onPrivacyItemsChanged(anyList())
-
- privacyItemController.addCallback(otherCallback)
- executor.runAllReady()
- verify(otherCallback).onPrivacyItemsChanged(anyList())
- // Adding a callback should not unnecessarily call previous ones
- verifyNoMoreInteractions(callback)
- }
-
- @Test
- fun testMultipleCallbacksAreUpdated() {
- doReturn(emptyList()).`when`(appOpsController).getActiveAppOpsForUser(anyInt())
-
- val otherCallback = mock(PrivacyItemController.Callback::class.java)
- privacyItemController.addCallback(callback)
- privacyItemController.addCallback(otherCallback)
- executor.runAllReady()
- reset(callback)
- reset(otherCallback)
-
- verify(appOpsController).addCallback(any(), capture(argCaptorCallback))
- argCaptorCallback.value.onActiveStateChanged(0, TEST_UID, "", true)
- executor.runAllReady()
- verify(callback).onPrivacyItemsChanged(anyList())
- verify(otherCallback).onPrivacyItemsChanged(anyList())
- }
-
- @Test
- fun testRemoveCallback() {
- doReturn(emptyList()).`when`(appOpsController).getActiveAppOpsForUser(anyInt())
- val otherCallback = mock(PrivacyItemController.Callback::class.java)
- privacyItemController.addCallback(callback)
- privacyItemController.addCallback(otherCallback)
- executor.runAllReady()
- executor.runAllReady()
- reset(callback)
- reset(otherCallback)
-
- verify(appOpsController).addCallback(any(), capture(argCaptorCallback))
- privacyItemController.removeCallback(callback)
- argCaptorCallback.value.onActiveStateChanged(0, TEST_UID, "", true)
- executor.runAllReady()
- verify(callback, never()).onPrivacyItemsChanged(anyList())
- verify(otherCallback).onPrivacyItemsChanged(anyList())
- }
-
- @Test
- fun testListShouldNotHaveNull() {
- doReturn(listOf(AppOpItem(AppOpsManager.OP_ACTIVATE_VPN, TEST_UID, "", 0),
- AppOpItem(AppOpsManager.OP_COARSE_LOCATION, TEST_UID, "", 0)))
- .`when`(appOpsController).getActiveAppOpsForUser(anyInt())
- privacyItemController.addCallback(callback)
- executor.runAllReady()
- executor.runAllReady()
-
- verify(callback).onPrivacyItemsChanged(capture(argCaptor))
- assertEquals(1, argCaptor.value.size)
- assertThat(argCaptor.value, not(hasItem(nullValue())))
- }
-
- @Test
- fun testListShouldBeCopy() {
- val list = listOf(PrivacyItem(PrivacyType.TYPE_CAMERA,
- PrivacyApplication("", TEST_UID)))
- privacyItemController.privacyList = list
- val privacyList = privacyItemController.privacyList
- assertEquals(list, privacyList)
- assertTrue(list !== privacyList)
- }
-
- @Test
- fun testNotListeningWhenIndicatorsDisabled() {
- changeAll(false)
- changeMicCamera(false)
- privacyItemController.addCallback(callback)
- executor.runAllReady()
- verify(appOpsController, never()).addCallback(eq(PrivacyItemController.OPS),
- any())
- }
-
- @Test
- fun testNotSendingLocationWhenOnlyMicCamera() {
- changeAll(false)
- changeMicCamera(true)
- executor.runAllReady()
-
- doReturn(listOf(AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 0),
- AppOpItem(AppOpsManager.OP_COARSE_LOCATION, TEST_UID, "", 0)))
- .`when`(appOpsController).getActiveAppOpsForUser(anyInt())
-
- privacyItemController.addCallback(callback)
- executor.runAllReady()
-
- verify(callback).onPrivacyItemsChanged(capture(argCaptor))
-
- assertEquals(1, argCaptor.value.size)
- assertEquals(PrivacyType.TYPE_CAMERA, argCaptor.value[0].privacyType)
- }
-
- @Test
- fun testNotUpdated_LocationChangeWhenOnlyMicCamera() {
- doReturn(listOf(AppOpItem(AppOpsManager.OP_COARSE_LOCATION, TEST_UID, "", 0)))
- .`when`(appOpsController).getActiveAppOpsForUser(anyInt())
-
- privacyItemController.addCallback(callback)
- changeAll(false)
- changeMicCamera(true)
- executor.runAllReady()
- reset(callback) // Clean callback
-
- verify(appOpsController).addCallback(any(), capture(argCaptorCallback))
- argCaptorCallback.value.onActiveStateChanged(
- AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true)
-
- verify(callback, never()).onPrivacyItemsChanged(any())
- }
-
- private fun changeMicCamera(value: Boolean?) = changeProperty(MIC_CAMERA, value)
- private fun changeAll(value: Boolean?) = changeProperty(ALL_INDICATORS, value)
-
- private fun changeProperty(name: String, value: Boolean?) {
- deviceConfigProxy.setProperty(
- DeviceConfig.NAMESPACE_PRIVACY,
- name,
- value?.toString(),
- false
- )
- }
-}
\ No newline at end of file
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 052f3382099f..91144be7347d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -495,7 +495,7 @@ public void onRefreshBatteryInfo_computesChargingTime() throws RemoteException {
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
80 /* level */, BatteryManager.BATTERY_PLUGGED_WIRELESS, 100 /* health */,
- 0 /* maxChargingWattage */);
+ 0 /* maxChargingWattage */, true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
verify(mIBatteryStats).computeChargeTimeRemaining();
@@ -507,7 +507,7 @@ public void onRefreshBatteryInfo_computesChargingTime_onlyWhenCharging()
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
80 /* level */, 0 /* plugged */, 100 /* health */,
- 0 /* maxChargingWattage */);
+ 0 /* maxChargingWattage */, true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
verify(mIBatteryStats, never()).computeChargeTimeRemaining();
@@ -553,7 +553,8 @@ public void onRefreshBatteryInfo_chargingWithOverheat_presentChargingLimited() {
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
80 /* level */, BatteryManager.BATTERY_PLUGGED_AC,
- BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */);
+ BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */,
+ true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
mController.setVisible(true);
@@ -569,7 +570,8 @@ public void onRefreshBatteryInfo_pluggedWithOverheat_presentChargingLimited() {
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_DISCHARGING,
80 /* level */, BatteryManager.BATTERY_PLUGGED_AC,
- BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */);
+ BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */,
+ true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
mController.setVisible(true);
@@ -585,7 +587,8 @@ public void onRefreshBatteryInfo_fullChargedWithOverheat_presentCharged() {
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
100 /* level */, BatteryManager.BATTERY_PLUGGED_AC,
- BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */);
+ BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */,
+ true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
mController.setVisible(true);
@@ -599,7 +602,7 @@ public void onRefreshBatteryInfo_dischargingWithOverheat_presentBatteryPercentag
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_DISCHARGING,
90 /* level */, 0 /* plugged */, BatteryManager.BATTERY_HEALTH_OVERHEAT,
- 0 /* maxChargingWattage */);
+ 0 /* maxChargingWattage */, true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
mController.setDozing(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
index 9971e0cf81a3..edafa6549027 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
@@ -35,6 +35,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
+import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Icon;
import android.os.UserHandle;
@@ -123,4 +124,13 @@ public void testGetContrastedStaticDrawableColor() {
assertEquals("Transparent backgrounds should fallback to drawable color",
color, mIconView.getStaticDrawableColor());
}
+
+ @Test
+ public void testGiantImageNotAllowed() {
+ Bitmap largeBitmap = Bitmap.createBitmap(6000, 6000, Bitmap.Config.ARGB_8888);
+ Icon icon = Icon.createWithBitmap(largeBitmap);
+ StatusBarIcon largeIcon = new StatusBarIcon(UserHandle.ALL, "mockPackage",
+ icon, 0, 0, "");
+ assertFalse(mIconView.set(largeIcon));
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java
index eca48c8c2ee1..e985a61c7a56 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java
@@ -16,7 +16,11 @@
package com.android.systemui.statusbar.policy;
+import static android.os.BatteryManager.EXTRA_PRESENT;
+
+import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Intent;
@@ -30,6 +34,7 @@
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.power.EnhancedEstimates;
+import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
import org.junit.Assert;
import org.junit.Before;
@@ -93,4 +98,36 @@ public void testIndependentAODBatterySaver_false() {
Assert.assertFalse(mBatteryController.isAodPowerSave());
}
+ @Test
+ public void testBatteryPresentState_notPresent() {
+ // GIVEN a battery state callback listening for changes
+ BatteryStateChangeCallback cb = mock(BatteryStateChangeCallback.class);
+ mBatteryController.addCallback(cb);
+
+ // WHEN the state of the battery becomes unknown
+ Intent i = new Intent(Intent.ACTION_BATTERY_CHANGED);
+ i.putExtra(EXTRA_PRESENT, false);
+ mBatteryController.onReceive(getContext(), i);
+
+ // THEN the callback is notified
+ verify(cb, atLeastOnce()).onBatteryUnknownStateChanged(true);
+ }
+
+ @Test
+ public void testBatteryPresentState_callbackAddedAfterStateChange() {
+ // GIVEN a battery state callback
+ BatteryController.BatteryStateChangeCallback cb =
+ mock(BatteryController.BatteryStateChangeCallback.class);
+
+ // GIVEN the state has changed before adding a new callback
+ Intent i = new Intent(Intent.ACTION_BATTERY_CHANGED);
+ i.putExtra(EXTRA_PRESENT, false);
+ mBatteryController.onReceive(getContext(), i);
+
+ // WHEN a callback is added
+ mBatteryController.addCallback(cb);
+
+ // THEN it is informed about the battery state
+ verify(cb, atLeastOnce()).onBatteryUnknownStateChanged(true);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt
new file mode 100644
index 000000000000..dcd57f137d71
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt
@@ -0,0 +1,81 @@
+/*
+ * 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.policy
+
+import android.app.NotificationManager
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper.RunWithLooper
+
+import androidx.test.filters.SmallTest
+
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.time.FakeSystemClock
+
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyString
+import org.mockito.Mock
+import org.mockito.Mockito
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+private fun anyObject(): T {
+ return Mockito.anyObject()
+}
+
+@RunWith(AndroidTestingRunner::class)
+@RunWithLooper()
+@SmallTest
+class BatteryStateNotifierTest : SysuiTestCase() {
+ @Mock private lateinit var batteryController: BatteryController
+ @Mock private lateinit var noMan: NotificationManager
+
+ private val clock = FakeSystemClock()
+ private val executor = FakeExecutor(clock)
+
+ private lateinit var notifier: BatteryStateNotifier
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ notifier = BatteryStateNotifier(batteryController, noMan, executor, context)
+ notifier.startListening()
+
+ context.ensureTestableResources()
+ }
+
+ @Test
+ fun testNotifyWhenStateUnknown() {
+ notifier.onBatteryUnknownStateChanged(true)
+ verify(noMan).notify(anyString(), anyInt(), anyObject())
+ }
+
+ @Test
+ fun testCancelAfterDelay() {
+ notifier.onBatteryUnknownStateChanged(true)
+ notifier.onBatteryUnknownStateChanged(false)
+
+ clock.advanceTime(DELAY_MILLIS + 1)
+ verify(noMan).cancel(anyInt())
+ }
+}
+
+// From BatteryStateNotifier.kt
+private const val DELAY_MILLIS: Long = 40 * 60 * 60 * 1000
diff --git a/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml
index 1d888942f49b..b47f0258ada4 100644
--- a/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml
+++ b/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml
@@ -18,7 +18,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
"Tethering heeft geen internet"
"Apparaten kunnen niet worden verbonden"
- "Tethering uitschakelen"
- "Hotspot of tethering is ingeschakeld"
+ "Tethering uitzetten"
+ "Hotspot of tethering staat aan"
"Er kunnen extra kosten voor roaming in rekening worden gebracht."
diff --git a/packages/Tethering/res/values-nl/strings.xml b/packages/Tethering/res/values-nl/strings.xml
index 18b2bbfc7670..82ada9d01fab 100644
--- a/packages/Tethering/res/values-nl/strings.xml
+++ b/packages/Tethering/res/values-nl/strings.xml
@@ -18,7 +18,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
"Tethering of hotspot actief"
"Tik om in te stellen."
- "Tethering is uitgeschakeld"
+ "Tethering staat uit"
"Neem contact op met je beheerder voor meer informatie"
"Status van hotspot en tethering"
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index b13bef2de151..89a6eca8fdaa 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -30,6 +30,7 @@
import android.app.backup.IFullBackupRestoreObserver;
import android.app.backup.IRestoreSession;
import android.app.backup.ISelectBackupTransportCallback;
+import android.app.compat.CompatChanges;
import android.app.job.JobParameters;
import android.app.job.JobScheduler;
import android.app.job.JobService;
@@ -506,6 +507,12 @@ public void setBackupServiceActive(int userId, boolean makeActive) {
*/
@Override
public boolean isBackupServiceActive(int userId) {
+ int callingUid = Binder.getCallingUid();
+ if (CompatChanges.isChangeEnabled(
+ BackupManager.IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE, callingUid)) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
+ "isBackupServiceActive");
+ }
synchronized (mStateLock) {
return !mGlobalDisable && isBackupActivatedForUser(userId);
}
diff --git a/services/core/Android.bp b/services/core/Android.bp
index d934cb2b016b..967b5c6e16e6 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -1,3 +1,10 @@
+filegroup {
+ name: "services.core-sources-deviceconfig-interface",
+ srcs: [
+ "java/com/android/server/utils/DeviceConfigInterface.java"
+ ],
+}
+
filegroup {
name: "services.core-sources",
srcs: ["java/**/*.java"],
diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java
index 94d2b148ce0b..f4a94ddc61dd 100644
--- a/services/core/java/com/android/server/BatteryService.java
+++ b/services/core/java/com/android/server/BatteryService.java
@@ -1532,6 +1532,8 @@ public void run() {
if (Objects.equals(newService, oldService)) return;
Slog.i(TAG, "health: new instance registered " + mInstanceName);
+ // #init() may be called with null callback. Skip null callbacks.
+ if (mCallback == null) return;
mCallback.onRegistration(oldService, newService, mInstanceName);
} catch (NoSuchElementException | RemoteException ex) {
Slog.e(TAG, "health: Cannot get instance '" + mInstanceName
diff --git a/services/core/java/com/android/server/BluetoothAirplaneModeListener.java b/services/core/java/com/android/server/BluetoothAirplaneModeListener.java
index 31cd5d519d87..0b2cc8890922 100644
--- a/services/core/java/com/android/server/BluetoothAirplaneModeListener.java
+++ b/services/core/java/com/android/server/BluetoothAirplaneModeListener.java
@@ -127,7 +127,9 @@ void handleAirplaneModeChange() {
}
return;
}
- mAirplaneHelper.onAirplaneModeChanged(mBluetoothManager);
+ if (mAirplaneHelper != null) {
+ mAirplaneHelper.onAirplaneModeChanged(mBluetoothManager);
+ }
}
@VisibleForTesting
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index e5eeeb3e6b35..02f885e8076f 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -58,6 +58,7 @@
import android.Manifest;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
@@ -511,14 +512,21 @@ private String scrubPath(String path) {
}
}
- private @Nullable VolumeInfo findStorageForUuid(String volumeUuid) {
+ private @Nullable VolumeInfo findStorageForUuidAsUser(String volumeUuid,
+ @UserIdInt int userId) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, volumeUuid)) {
- return storage.findVolumeById(VolumeInfo.ID_EMULATED_INTERNAL + ";" + 0);
+ return storage.findVolumeById(VolumeInfo.ID_EMULATED_INTERNAL + ";" + userId);
} else if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, volumeUuid)) {
return storage.getPrimaryPhysicalVolume();
} else {
- return storage.findEmulatedForPrivate(storage.findVolumeByUuid(volumeUuid));
+ VolumeInfo info = storage.findVolumeByUuid(volumeUuid);
+ if (info == null) {
+ Slog.w(TAG, "findStorageForUuidAsUser cannot find volumeUuid:" + volumeUuid);
+ return null;
+ }
+ String emulatedUuid = info.getId().replace("private", "emulated") + ";" + userId;
+ return storage.findVolumeById(emulatedUuid);
}
}
@@ -2769,8 +2777,9 @@ public void setPrimaryStorageUuid(String volumeUuid, IPackageMoveObserver callba
return;
} else {
- from = findStorageForUuid(mPrimaryStorageUuid);
- to = findStorageForUuid(volumeUuid);
+ int currentUserId = mCurrentUserId;
+ from = findStorageForUuidAsUser(mPrimaryStorageUuid, currentUserId);
+ to = findStorageForUuidAsUser(volumeUuid, currentUserId);
if (from == null) {
Slog.w(TAG, "Failing move due to missing from volume " + mPrimaryStorageUuid);
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index c4f1c805398b..918aeb72105d 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -2623,6 +2623,7 @@ private boolean checkListenerPermission(int events, int subId, String callingPac
LocationAccessPolicy.LocationPermissionQuery.Builder locationQueryBuilder =
new LocationAccessPolicy.LocationPermissionQuery.Builder()
.setCallingPackage(callingPackage)
+ .setCallingFeatureId(callingFeatureId)
.setMethod(message + " events: " + events)
.setCallingPid(Binder.getCallingPid())
.setCallingUid(Binder.getCallingUid());
@@ -2761,6 +2762,7 @@ private boolean checkFineLocationAccess(Record r, int minSdk) {
LocationAccessPolicy.LocationPermissionQuery query =
new LocationAccessPolicy.LocationPermissionQuery.Builder()
.setCallingPackage(r.callingPackage)
+ .setCallingFeatureId(r.callingFeatureId)
.setCallingPid(r.callerPid)
.setCallingUid(r.callerUid)
.setMethod("TelephonyRegistry push")
@@ -2779,6 +2781,7 @@ private boolean checkCoarseLocationAccess(Record r, int minSdk) {
LocationAccessPolicy.LocationPermissionQuery query =
new LocationAccessPolicy.LocationPermissionQuery.Builder()
.setCallingPackage(r.callingPackage)
+ .setCallingFeatureId(r.callingFeatureId)
.setCallingPid(r.callerPid)
.setCallingUid(r.callerUid)
.setMethod("TelephonyRegistry push")
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 27c3ff1b4c09..2e04f9c2bcd1 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -3071,7 +3071,8 @@ private void createNoCredentialsPermissionNotification(Account account, Intent i
.setContentTitle(title)
.setContentText(subtitle)
.setContentIntent(PendingIntent.getActivityAsUser(mContext, 0, intent,
- PendingIntent.FLAG_CANCEL_CURRENT, null, user))
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+ null, user))
.build();
installNotification(getCredentialPermissionNotificationId(
account, authTokenType, uid), n, packageName, user.getIdentifier());
@@ -5293,7 +5294,8 @@ private void doNotification(UserAccounts accounts, Account account, CharSequence
.setContentTitle(String.format(notificationTitleFormat, account.name))
.setContentText(message)
.setContentIntent(PendingIntent.getActivityAsUser(
- mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT,
+ mContext, 0, intent,
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
null, new UserHandle(userId)))
.build();
installNotification(id, n, packageName, userId);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 69dddeb1b548..e292e6fb29d1 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -119,6 +119,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;
@@ -433,6 +434,45 @@ boolean hasBackgroundServicesLocked(int callingUser) {
return smap != null ? smap.mStartingBackground.size() >= mMaxStartingBackground : false;
}
+ boolean hasForegroundServiceNotificationLocked(String pkg, int userId, String channelId) {
+ final ServiceMap smap = mServiceMap.get(userId);
+ if (smap != null) {
+ for (int i = 0; i < smap.mServicesByInstanceName.size(); i++) {
+ final ServiceRecord sr = smap.mServicesByInstanceName.valueAt(i);
+ if (sr.appInfo.packageName.equals(pkg) && sr.isForeground) {
+ if (Objects.equals(sr.foregroundNoti.getChannelId(), channelId)) {
+ if (DEBUG_FOREGROUND_SERVICE) {
+ Slog.d(TAG_SERVICE, "Channel u" + userId + "/pkg=" + pkg
+ + "/channelId=" + channelId
+ + " has fg service notification");
+ }
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ void stopForegroundServicesForChannelLocked(String pkg, int userId, String channelId) {
+ final ServiceMap smap = mServiceMap.get(userId);
+ if (smap != null) {
+ for (int i = 0; i < smap.mServicesByInstanceName.size(); i++) {
+ final ServiceRecord sr = smap.mServicesByInstanceName.valueAt(i);
+ if (sr.appInfo.packageName.equals(pkg) && sr.isForeground) {
+ if (Objects.equals(sr.foregroundNoti.getChannelId(), channelId)) {
+ if (DEBUG_FOREGROUND_SERVICE) {
+ Slog.d(TAG_SERVICE, "Stopping FGS u" + userId + "/pkg=" + pkg
+ + "/channelId=" + channelId
+ + " for conversation channel clear");
+ }
+ stopServiceLocked(sr);
+ }
+ }
+ }
+ }
+ }
+
private ServiceMap getServiceMapLocked(int callingUser) {
ServiceMap smap = mServiceMap.get(callingUser);
if (smap == null) {
@@ -4882,17 +4922,24 @@ private boolean shouldAllowWhileInUsePermissionInFgsLocked(String callingPackage
return true;
}
- if (r.app != null) {
+ if (r != null && r.app != null) {
ActiveInstrumentation instr = r.app.getActiveInstrumentation();
if (instr != null && instr.mHasBackgroundActivityStartsPermission) {
return true;
}
}
- final boolean hasAllowBackgroundActivityStartsToken = r.app != null
- ? !r.app.mAllowBackgroundActivityStartsTokens.isEmpty() : false;
- if (hasAllowBackgroundActivityStartsToken) {
- return true;
+ for (int i = mAm.mProcessList.mLruProcesses.size() - 1; i >= 0; i--) {
+ final ProcessRecord pr = mAm.mProcessList.mLruProcesses.get(i);
+ if (pr.uid == callingUid) {
+ if (!pr.mAllowBackgroundActivityStartsTokens.isEmpty()) {
+ return true;
+ }
+ if (pr.getWindowProcessController()
+ .areBackgroundActivityStartsAllowedByGracePeriodSafe()) {
+ return true;
+ }
+ }
}
if (mAm.checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid)
@@ -4911,6 +4958,10 @@ private boolean shouldAllowWhileInUsePermissionInFgsLocked(String callingPackage
return true;
}
+ if (mAm.mInternal.isTempAllowlistedForFgsWhileInUse(callingUid)) {
+ return true;
+ }
+
final boolean isWhiteListedPackage =
mWhiteListAllowWhileInUsePermissionInFgs.contains(callingPackage);
if (isWhiteListedPackage) {
@@ -4924,4 +4975,10 @@ private boolean shouldAllowWhileInUsePermissionInFgsLocked(String callingPackage
}
return false;
}
+
+ boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid,
+ String callingPackage) {
+ return shouldAllowWhileInUsePermissionInFgsLocked(
+ callingPackage, callingPid, callingUid, null, null, false);
+ }
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 8b5a8e8a0eed..51d1cf15cef6 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -183,6 +183,7 @@
import android.app.PendingIntent;
import android.app.ProcessMemoryState;
import android.app.ProfilerInfo;
+import android.app.PropertyInvalidatedCache;
import android.app.WaitResult;
import android.app.backup.IBackupManager;
import android.app.usage.UsageEvents;
@@ -1260,6 +1261,13 @@ void dumpDebug(ProtoOutputStream proto, long fieldId) {
final PendingTempWhitelists mPendingTempWhitelist = new PendingTempWhitelists(this);
+ /**
+ * List of uids that are allowed to have while-in-use permission when FGS is started from
+ * background.
+ */
+ private final FgsWhileInUseTempAllowList mFgsWhileInUseTempAllowList =
+ new FgsWhileInUseTempAllowList();
+
/**
* Information about and control over application operations
*/
@@ -2127,7 +2135,7 @@ public void setSystemProcess() {
0,
new HostingRecord("system"));
app.setPersistent(true);
- app.pid = MY_PID;
+ app.pid = app.mPidForCompact = MY_PID;
app.getWindowProcessController().setPid(MY_PID);
app.maxAdj = ProcessList.SYSTEM_ADJ;
app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
@@ -5110,6 +5118,9 @@ private boolean attachApplicationLocked(@NonNull IApplicationThread thread,
EventLogTags.writeAmProcBound(app.userId, app.pid, app.processName);
app.curAdj = app.setAdj = app.verifiedAdj = ProcessList.INVALID_ADJ;
+ synchronized (mOomAdjuster.mCachedAppOptimizer) {
+ app.mSetAdjForCompact = ProcessList.INVALID_ADJ;
+ }
mOomAdjuster.setAttachingSchedGroupLocked(app);
app.forcingToImportant = null;
updateProcessForegroundLocked(app, false, 0, false);
@@ -6005,9 +6016,7 @@ private boolean isAppForeground(int uid) {
}
private boolean isAppBad(ApplicationInfo info) {
- synchronized (this) {
- return mAppErrors.isBadProcessLocked(info);
- }
+ return mAppErrors.isBadProcess(info.processName, info.uid);
}
// NOTE: this is an internal method used by the OnShellCommand implementation only and should
@@ -12844,6 +12853,10 @@ final void dumpBinderCacheContents(FileDescriptor fd, PrintWriter pw, String[] a
if (r.thread != null) {
pw.println("\n\n** Cache info for pid " + r.pid + " [" + r.processName + "] **");
pw.flush();
+ if (r.pid == MY_PID) {
+ PropertyInvalidatedCache.dumpCacheInfo(fd, args);
+ continue;
+ }
try {
TransferPipe tp = new TransferPipe();
try {
@@ -19724,6 +19737,22 @@ public boolean hasRunningForegroundService(int uid, int foregroundServicetype) {
return false;
}
+ @Override
+ public boolean hasForegroundServiceNotification(String pkg, int userId,
+ String channelId) {
+ synchronized (ActivityManagerService.this) {
+ return mServices.hasForegroundServiceNotificationLocked(pkg, userId, channelId);
+ }
+ }
+
+ @Override
+ public void stopForegroundServicesForChannel(String pkg, int userId,
+ String channelId) {
+ synchronized (ActivityManagerService.this) {
+ mServices.stopForegroundServicesForChannelLocked(pkg, userId, channelId);
+ }
+ }
+
@Override
public void registerProcessObserver(IProcessObserver processObserver) {
ActivityManagerService.this.registerProcessObserver(processObserver);
@@ -19776,6 +19805,24 @@ public void deletePendingTopUid(int uid) {
public boolean isPendingTopUid(int uid) {
return mPendingStartActivityUids.isPendingTopUid(uid);
}
+
+ @Override
+ public void tempAllowWhileInUsePermissionInFgs(int uid, long duration) {
+ mFgsWhileInUseTempAllowList.add(uid, duration);
+ }
+
+ @Override
+ public boolean isTempAllowlistedForFgsWhileInUse(int uid) {
+ return mFgsWhileInUseTempAllowList.isAllowed(uid);
+ }
+
+ @Override
+ public boolean canAllowWhileInUsePermissionInFgs(int pid, int uid,
+ @NonNull String packageName) {
+ synchronized (ActivityManagerService.this) {
+ return mServices.canAllowWhileInUsePermissionInFgsLocked(pid, uid, packageName);
+ }
+ }
}
long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) {
@@ -20376,7 +20423,7 @@ public boolean enableAppFreezer(boolean enable) {
int callerUid = Binder.getCallingUid();
// Only system can toggle the freezer state
- if (callerUid == SYSTEM_UID) {
+ if (callerUid == SYSTEM_UID || Build.IS_DEBUGGABLE) {
return mOomAdjuster.mCachedAppOptimizer.enableFreezer(enable);
} else {
throw new SecurityException("Caller uid " + callerUid + " cannot set freezer state ");
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 50d2cab0af81..9838f01510a3 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -97,9 +97,19 @@ class AppErrors {
* a minimum amount of time; they are removed from it when they are
* later restarted (hopefully due to some user action). The value is the
* time it was added to the list.
+ *
+ * Read access is UNLOCKED, and must either be based on a single lookup
+ * call on the current mBadProcesses instance, or a local copy of that
+ * reference must be made and the local copy treated as the source of
+ * truth. Mutations are performed by synchronizing on mBadProcessLock,
+ * cloning the existing mBadProcesses instance, performing the mutation,
+ * then changing the volatile "live" mBadProcesses reference to point to the
+ * mutated version. These operations are very rare compared to lookups:
+ * we intentionally trade additional cost for mutations for eliminating
+ * lock operations from the simple lookup cases.
*/
- private final ProcessMap mBadProcesses = new ProcessMap<>();
-
+ private volatile ProcessMap mBadProcesses = new ProcessMap<>();
+ private final Object mBadProcessLock = new Object();
AppErrors(Context context, ActivityManagerService service, PackageWatchdog watchdog) {
context.assertRuntimeOverlayThemable();
@@ -109,7 +119,8 @@ class AppErrors {
}
void dumpDebug(ProtoOutputStream proto, long fieldId, String dumpPackage) {
- if (mProcessCrashTimes.getMap().isEmpty() && mBadProcesses.getMap().isEmpty()) {
+ final ProcessMap badProcesses = mBadProcesses;
+ if (mProcessCrashTimes.getMap().isEmpty() && badProcesses.getMap().isEmpty()) {
return;
}
@@ -144,8 +155,8 @@ void dumpDebug(ProtoOutputStream proto, long fieldId, String dumpPackage) {
}
- if (!mBadProcesses.getMap().isEmpty()) {
- final ArrayMap> pmap = mBadProcesses.getMap();
+ if (!badProcesses.getMap().isEmpty()) {
+ final ArrayMap> pmap = badProcesses.getMap();
final int processCount = pmap.size();
for (int ip = 0; ip < processCount; ip++) {
final long btoken = proto.start(AppErrorsProto.BAD_PROCESSES);
@@ -209,9 +220,10 @@ boolean dumpLocked(FileDescriptor fd, PrintWriter pw, boolean needSep, String du
}
}
- if (!mBadProcesses.getMap().isEmpty()) {
+ final ProcessMap badProcesses = mBadProcesses;
+ if (!badProcesses.getMap().isEmpty()) {
boolean printed = false;
- final ArrayMap> pmap = mBadProcesses.getMap();
+ final ArrayMap> pmap = badProcesses.getMap();
final int processCount = pmap.size();
for (int ip = 0; ip < processCount; ip++) {
final String pname = pmap.keyAt(ip);
@@ -263,12 +275,27 @@ boolean dumpLocked(FileDescriptor fd, PrintWriter pw, boolean needSep, String du
return needSep;
}
- boolean isBadProcessLocked(ApplicationInfo info) {
- return mBadProcesses.get(info.processName, info.uid) != null;
+ boolean isBadProcess(final String processName, final int uid) {
+ // NO LOCKING for the simple lookup
+ return mBadProcesses.get(processName, uid) != null;
+ }
+
+ void clearBadProcess(final String processName, final int uid) {
+ synchronized (mBadProcessLock) {
+ final ProcessMap badProcesses = new ProcessMap<>();
+ badProcesses.putAll(mBadProcesses);
+ badProcesses.remove(processName, uid);
+ mBadProcesses = badProcesses;
+ }
}
- void clearBadProcessLocked(ApplicationInfo info) {
- mBadProcesses.remove(info.processName, info.uid);
+ void markBadProcess(final String processName, final int uid, BadProcessInfo info) {
+ synchronized (mBadProcessLock) {
+ final ProcessMap badProcesses = new ProcessMap<>();
+ badProcesses.putAll(mBadProcesses);
+ badProcesses.put(processName, uid, info);
+ mBadProcesses = badProcesses;
+ }
}
void resetProcessCrashTimeLocked(ApplicationInfo info) {
@@ -737,10 +764,10 @@ boolean handleAppCrashLocked(ProcessRecord app, String reason,
app.info.processName);
if (!app.isolated) {
// XXX We don't have a way to mark isolated processes
- // as bad, since they don't have a peristent identity.
- mBadProcesses.put(app.info.processName, app.uid,
+ // as bad, since they don't have a persistent identity.
+ markBadProcess(app.info.processName, app.uid,
new BadProcessInfo(now, shortMsg, longMsg, stackTrace));
- mProcessCrashTimes.remove(app.info.processName, app.uid);
+ mProcessCrashTimes.remove(app.processName, app.uid);
}
app.bad = true;
app.removed = true;
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index 36d4a38c1624..2f776fc55034 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -133,7 +133,7 @@ interface ProcessDependencies {
static final int REPORT_UNFREEZE_MSG = 4;
//TODO:change this static definition into a configurable flag.
- static final int FREEZE_TIMEOUT_MS = 10000;
+ static final long FREEZE_TIMEOUT_MS = 600000;
static final int DO_FREEZE = 1;
static final int REPORT_UNFREEZE = 2;
@@ -151,6 +151,7 @@ interface ProcessDependencies {
*/
final ServiceThread mCachedAppOptimizerThread;
+ @GuardedBy("this")
private final ArrayList mPendingCompactionProcesses =
new ArrayList();
private final ActivityManagerService mAm;
@@ -348,51 +349,74 @@ void dump(PrintWriter pw) {
@GuardedBy("mAm")
void compactAppSome(ProcessRecord app) {
- app.reqCompactAction = COMPACT_PROCESS_SOME;
- mPendingCompactionProcesses.add(app);
- mCompactionHandler.sendMessage(
- mCompactionHandler.obtainMessage(
- COMPACT_PROCESS_MSG, app.setAdj, app.setProcState));
+ synchronized (this) {
+ app.reqCompactAction = COMPACT_PROCESS_SOME;
+ if (!app.mPendingCompact) {
+ app.mPendingCompact = true;
+ mPendingCompactionProcesses.add(app);
+ mCompactionHandler.sendMessage(
+ mCompactionHandler.obtainMessage(
+ COMPACT_PROCESS_MSG, app.setAdj, app.setProcState));
+ }
+ }
}
@GuardedBy("mAm")
void compactAppFull(ProcessRecord app) {
- app.reqCompactAction = COMPACT_PROCESS_FULL;
- mPendingCompactionProcesses.add(app);
- mCompactionHandler.sendMessage(
- mCompactionHandler.obtainMessage(
- COMPACT_PROCESS_MSG, app.setAdj, app.setProcState));
-
+ synchronized (this) {
+ app.reqCompactAction = COMPACT_PROCESS_FULL;
+ if (!app.mPendingCompact) {
+ app.mPendingCompact = true;
+ mPendingCompactionProcesses.add(app);
+ mCompactionHandler.sendMessage(
+ mCompactionHandler.obtainMessage(
+ COMPACT_PROCESS_MSG, app.setAdj, app.setProcState));
+ }
+ }
}
@GuardedBy("mAm")
void compactAppPersistent(ProcessRecord app) {
- app.reqCompactAction = COMPACT_PROCESS_PERSISTENT;
- mPendingCompactionProcesses.add(app);
- mCompactionHandler.sendMessage(
- mCompactionHandler.obtainMessage(
- COMPACT_PROCESS_MSG, app.curAdj, app.setProcState));
+ synchronized (this) {
+ app.reqCompactAction = COMPACT_PROCESS_PERSISTENT;
+ if (!app.mPendingCompact) {
+ app.mPendingCompact = true;
+ mPendingCompactionProcesses.add(app);
+ mCompactionHandler.sendMessage(
+ mCompactionHandler.obtainMessage(
+ COMPACT_PROCESS_MSG, app.curAdj, app.setProcState));
+ }
+ }
}
@GuardedBy("mAm")
boolean shouldCompactPersistent(ProcessRecord app, long now) {
- return (app.lastCompactTime == 0
- || (now - app.lastCompactTime) > mCompactThrottlePersistent);
+ synchronized (this) {
+ return (app.lastCompactTime == 0
+ || (now - app.lastCompactTime) > mCompactThrottlePersistent);
+ }
}
@GuardedBy("mAm")
void compactAppBfgs(ProcessRecord app) {
- app.reqCompactAction = COMPACT_PROCESS_BFGS;
- mPendingCompactionProcesses.add(app);
- mCompactionHandler.sendMessage(
- mCompactionHandler.obtainMessage(
- COMPACT_PROCESS_MSG, app.curAdj, app.setProcState));
+ synchronized (this) {
+ app.reqCompactAction = COMPACT_PROCESS_BFGS;
+ if (!app.mPendingCompact) {
+ app.mPendingCompact = true;
+ mPendingCompactionProcesses.add(app);
+ mCompactionHandler.sendMessage(
+ mCompactionHandler.obtainMessage(
+ COMPACT_PROCESS_MSG, app.curAdj, app.setProcState));
+ }
+ }
}
@GuardedBy("mAm")
boolean shouldCompactBFGS(ProcessRecord app, long now) {
- return (app.lastCompactTime == 0
- || (now - app.lastCompactTime) > mCompactThrottleBFGS);
+ synchronized (this) {
+ return (app.lastCompactTime == 0
+ || (now - app.lastCompactTime) > mCompactThrottleBFGS);
+ }
}
@GuardedBy("mAm")
@@ -722,10 +746,12 @@ static String compactActionIntToString(int action) {
// This will ensure app will be out of the freezer for at least FREEZE_TIMEOUT_MS
void unfreezeTemporarily(ProcessRecord app) {
- synchronized (mAm) {
- if (app.frozen) {
- unfreezeAppLocked(app);
- freezeAppAsync(app);
+ if (mUseFreezer) {
+ synchronized (mAm) {
+ if (app.frozen) {
+ unfreezeAppLocked(app);
+ freezeAppAsync(app);
+ }
}
}
}
@@ -852,18 +878,19 @@ public void handleMessage(Message msg) {
LastCompactionStats lastCompactionStats;
int lastOomAdj = msg.arg1;
int procState = msg.arg2;
- synchronized (mAm) {
+ synchronized (CachedAppOptimizer.this) {
proc = mPendingCompactionProcesses.remove(0);
pendingAction = proc.reqCompactAction;
- pid = proc.pid;
+ pid = proc.mPidForCompact;
name = proc.processName;
+ proc.mPendingCompact = false;
// don't compact if the process has returned to perceptible
// and this is only a cached/home/prev compaction
if ((pendingAction == COMPACT_PROCESS_SOME
|| pendingAction == COMPACT_PROCESS_FULL)
- && (proc.setAdj <= ProcessList.PERCEPTIBLE_APP_ADJ)) {
+ && (proc.mSetAdjForCompact <= ProcessList.PERCEPTIBLE_APP_ADJ)) {
if (DEBUG_COMPACTION) {
Slog.d(TAG_AM,
"Skipping compaction as process " + name + " is "
@@ -1050,7 +1077,7 @@ public void handleMessage(Message msg) {
lastOomAdj, ActivityManager.processStateAmToProto(procState),
zramFreeKbBefore, zramFreeKbAfter);
}
- synchronized (mAm) {
+ synchronized (CachedAppOptimizer.this) {
proc.lastCompactTime = end;
proc.lastCompactAction = pendingAction;
}
@@ -1101,15 +1128,26 @@ public void handleMessage(Message msg) {
}
private void freezeProcess(ProcessRecord proc) {
- final int pid;
- final String name;
+ final int pid = proc.pid;
+ final String name = proc.processName;
final long unfrozenDuration;
final boolean frozen;
- synchronized (mAm) {
- pid = proc.pid;
- name = proc.processName;
+ try {
+ // pre-check for locks to avoid unnecessary freeze/unfreeze operations
+ if (Process.hasFileLocks(pid)) {
+ if (DEBUG_FREEZER) {
+ Slog.d(TAG_AM, name + " (" + pid + ") holds file locks, not freezing");
+ }
+ return;
+ }
+ } catch (Exception e) {
+ Slog.e(TAG_AM, "Not freezing. Unable to check file locks for " + name + "(" + pid
+ + "): " + e);
+ return;
+ }
+ synchronized (mAm) {
if (proc.curAdj < ProcessList.CACHED_APP_MIN_ADJ
|| proc.shouldNotFreeze) {
if (DEBUG_FREEZER) {
@@ -1141,29 +1179,50 @@ private void freezeProcess(ProcessRecord proc) {
frozen = proc.frozen;
}
- if (frozen) {
- if (DEBUG_FREEZER) {
- Slog.d(TAG_AM, "froze " + pid + " " + name);
- }
+ if (!frozen) {
+ return;
+ }
- EventLog.writeEvent(EventLogTags.AM_FREEZE, pid, name);
- try {
- freezeBinder(pid, true);
- } catch (RuntimeException e) {
- Slog.e(TAG_AM, "Unable to freeze binder for " + pid + " " + name);
- proc.kill("Unable to freeze binder interface",
- ApplicationExitInfo.REASON_OTHER,
- ApplicationExitInfo.SUBREASON_INVALID_STATE, true);
- }
+ if (DEBUG_FREEZER) {
+ Slog.d(TAG_AM, "froze " + pid + " " + name);
+ }
+
+ EventLog.writeEvent(EventLogTags.AM_FREEZE, pid, name);
- // See above for why we're not taking mPhenotypeFlagLock here
- if (mRandom.nextFloat() < mFreezerStatsdSampleRate) {
- FrameworkStatsLog.write(FrameworkStatsLog.APP_FREEZE_CHANGED,
- FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP,
- pid,
- name,
- unfrozenDuration);
+ try {
+ freezeBinder(pid, true);
+ } catch (RuntimeException e) {
+ Slog.e(TAG_AM, "Unable to freeze binder for " + pid + " " + name);
+ proc.kill("Unable to freeze binder interface",
+ ApplicationExitInfo.REASON_OTHER,
+ ApplicationExitInfo.SUBREASON_INVALID_STATE, true);
+ }
+
+ // See above for why we're not taking mPhenotypeFlagLock here
+ if (mRandom.nextFloat() < mFreezerStatsdSampleRate) {
+ FrameworkStatsLog.write(FrameworkStatsLog.APP_FREEZE_CHANGED,
+ FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP,
+ pid,
+ name,
+ unfrozenDuration);
+ }
+
+ try {
+ // post-check to prevent races
+ if (Process.hasFileLocks(pid)) {
+ if (DEBUG_FREEZER) {
+ Slog.d(TAG_AM, name + " (" + pid + ") holds file locks, reverting freeze");
+ }
+
+ synchronized (mAm) {
+ unfreezeAppLocked(proc);
+ }
+ }
+ } catch (Exception e) {
+ Slog.e(TAG_AM, "Unable to check file locks for " + name + "(" + pid + "): " + e);
+ synchronized (mAm) {
+ unfreezeAppLocked(proc);
}
}
}
diff --git a/services/core/java/com/android/server/am/FgsWhileInUseTempAllowList.java b/services/core/java/com/android/server/am/FgsWhileInUseTempAllowList.java
new file mode 100644
index 000000000000..ed0f264049ef
--- /dev/null
+++ b/services/core/java/com/android/server/am/FgsWhileInUseTempAllowList.java
@@ -0,0 +1,82 @@
+/*
+ * 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.am;
+
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
+
+import android.os.SystemClock;
+import android.util.Slog;
+import android.util.SparseLongArray;
+
+/**
+ * List of uids that are allowed to have while-in-use permission when FGS is started
+ * from background.
+ */
+final class FgsWhileInUseTempAllowList {
+ /**
+ * This list is supposed to have a small number of entries. If exceeds MAX_SIZE, log a warning
+ * message.
+ */
+ private static final int MAX_SIZE = 100;
+ /**
+ * The key is the UID, the value is expiration elapse time in ms of this temp-allowed UID.
+ */
+ private final SparseLongArray mTempAllowListFgs = new SparseLongArray();
+
+ private final Object mLock = new Object();
+
+ void add(int uid, long durationMs) {
+ synchronized (mLock) {
+ if (durationMs <= 0) {
+ Slog.e(TAG_AM, "FgsWhileInUseTempAllowList bad duration:" + durationMs
+ + " uid: " + uid);
+ return;
+ }
+ // The temp allowlist should be a short list with only a few entries in it.
+ final int size = mTempAllowListFgs.size();
+ if (size > MAX_SIZE) {
+ Slog.w(TAG_AM, "FgsWhileInUseTempAllowList length:" + size + " exceeds "
+ + MAX_SIZE);
+ }
+ final long now = SystemClock.elapsedRealtime();
+ for (int index = mTempAllowListFgs.size() - 1; index >= 0; index--) {
+ if (mTempAllowListFgs.valueAt(index) < now) {
+ mTempAllowListFgs.removeAt(index);
+ }
+ }
+ final long existingExpirationTime = mTempAllowListFgs.get(uid, -1);
+ final long expirationTime = now + durationMs;
+ if (existingExpirationTime == -1 || existingExpirationTime < expirationTime) {
+ mTempAllowListFgs.put(uid, expirationTime);
+ }
+ }
+ }
+
+ boolean isAllowed(int uid) {
+ synchronized (mLock) {
+ final int index = mTempAllowListFgs.indexOfKey(uid);
+ if (index < 0) {
+ return false;
+ } else if (mTempAllowListFgs.valueAt(index) < SystemClock.elapsedRealtime()) {
+ mTempAllowListFgs.removeAt(index);
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index f0343e1d807c..faa7dce31690 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -2198,6 +2198,9 @@ private final boolean applyOomAdjLocked(ProcessRecord app, boolean doingAll, lon
}
app.setAdj = app.curAdj;
app.verifiedAdj = ProcessList.INVALID_ADJ;
+ synchronized (mCachedAppOptimizer) {
+ app.mSetAdjForCompact = app.setAdj;
+ }
}
final int curSchedGroup = app.getCurrentSchedulingGroup();
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index c851a88b6e68..f1e4ae5ceecd 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -2336,7 +2336,7 @@ final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
if ((intentFlags & Intent.FLAG_FROM_BACKGROUND) != 0) {
// If we are in the background, then check to see if this process
// is bad. If so, we will just silently fail.
- if (mService.mAppErrors.isBadProcessLocked(info)) {
+ if (mService.mAppErrors.isBadProcess(info.processName, info.uid)) {
if (DEBUG_PROCESSES) Slog.v(TAG, "Bad process: " + info.uid
+ "/" + info.processName);
return null;
@@ -2349,11 +2349,11 @@ final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
if (DEBUG_PROCESSES) Slog.v(TAG, "Clearing bad process: " + info.uid
+ "/" + info.processName);
mService.mAppErrors.resetProcessCrashTimeLocked(info);
- if (mService.mAppErrors.isBadProcessLocked(info)) {
+ if (mService.mAppErrors.isBadProcess(info.processName, info.uid)) {
EventLog.writeEvent(EventLogTags.AM_PROC_GOOD,
UserHandle.getUserId(info.uid), info.uid,
info.processName);
- mService.mAppErrors.clearBadProcessLocked(info);
+ mService.mAppErrors.clearBadProcess(info.processName, info.uid);
if (app != null) {
app.bad = false;
}
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index c5152c081e70..284903d390d4 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -59,6 +59,7 @@
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.procstats.ProcessState;
import com.android.internal.app.procstats.ProcessStats;
@@ -162,8 +163,11 @@ boolean containsKey(Object key) {
int curCapability; // Current capability flags of this process. For example,
// PROCESS_CAPABILITY_FOREGROUND_LOCATION is one capability.
int setCapability; // Last set capability flags.
+ @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer")
long lastCompactTime; // The last time that this process was compacted
+ @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer")
int reqCompactAction; // The most recent compaction action requested for this app.
+ @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer")
int lastCompactAction; // The most recent compaction action performed for this app.
boolean frozen; // True when the process is frozen.
long freezeUnfreezeTime; // Last time the app was (un)frozen, 0 for never
@@ -352,6 +356,24 @@ boolean containsKey(Object key) {
boolean mReachable; // Whether or not this process is reachable from given process
+ /**
+ * The snapshot of {@link #setAdj}, meant to be read by {@link CachedAppOptimizer} only.
+ */
+ @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer")
+ int mSetAdjForCompact;
+
+ /**
+ * The snapshot of {@link #pid}, meant to be read by {@link CachedAppOptimizer} only.
+ */
+ @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer")
+ int mPidForCompact;
+
+ /**
+ * This process has been scheduled for a memory compaction.
+ */
+ @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer")
+ boolean mPendingCompact;
+
void setStartParams(int startUid, HostingRecord hostingRecord, String seInfo,
long startTime) {
this.startUid = startUid;
@@ -447,8 +469,10 @@ void dump(PrintWriter pw, String prefix) {
pw.print(" setRaw="); pw.print(setRawAdj);
pw.print(" cur="); pw.print(curAdj);
pw.print(" set="); pw.println(setAdj);
- pw.print(prefix); pw.print("lastCompactTime="); pw.print(lastCompactTime);
- pw.print(" lastCompactAction="); pw.println(lastCompactAction);
+ synchronized (mService.mOomAdjuster.mCachedAppOptimizer) {
+ pw.print(prefix); pw.print("lastCompactTime="); pw.print(lastCompactTime);
+ pw.print(" lastCompactAction="); pw.println(lastCompactAction);
+ }
pw.print(prefix); pw.print("mCurSchedGroup="); pw.print(mCurSchedGroup);
pw.print(" setSchedGroup="); pw.print(setSchedGroup);
pw.print(" systemNoUi="); pw.print(systemNoUi);
@@ -672,6 +696,9 @@ void dump(PrintWriter pw, String prefix) {
public void setPid(int _pid) {
pid = _pid;
+ synchronized (mService.mOomAdjuster.mCachedAppOptimizer) {
+ mPidForCompact = _pid;
+ }
mWindowProcessController.setPid(pid);
procStatFile = null;
shortStringName = null;
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index a5d2ca3ad4ff..3cf6b197a03b 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -583,6 +583,10 @@ int evalMode(int op, int mode) {
if (mActivityManagerInternal != null
&& mActivityManagerInternal.isPendingTopUid(uid)) {
return MODE_ALLOWED;
+ } else if (mActivityManagerInternal != null
+ && mActivityManagerInternal.isTempAllowlistedForFgsWhileInUse(
+ uid)) {
+ return MODE_ALLOWED;
} else if ((capability & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0) {
return MODE_ALLOWED;
} else {
@@ -592,6 +596,10 @@ int evalMode(int op, int mode) {
if (mActivityManagerInternal != null
&& mActivityManagerInternal.isPendingTopUid(uid)) {
return MODE_ALLOWED;
+ } else if (mActivityManagerInternal != null
+ && mActivityManagerInternal.isTempAllowlistedForFgsWhileInUse(
+ uid)) {
+ return MODE_ALLOWED;
} else if ((capability & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0) {
return MODE_ALLOWED;
} else {
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 852868616afd..713f9c8f173d 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1484,6 +1484,14 @@ void setDisplayWhiteBalanceLoggingEnabled(boolean enabled) {
}
}
+ void setDisplayModeDirectorLoggingEnabled(boolean enabled) {
+ synchronized (mSyncRoot) {
+ if (mDisplayModeDirector != null) {
+ mDisplayModeDirector.setLoggingEnabled(enabled);
+ }
+ }
+ }
+
void setAmbientColorTemperatureOverride(float cct) {
if (mDisplayPowerController != null) {
synchronized (mSyncRoot) {
diff --git a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
index 0c6c797b917a..d1d04966bdec 100644
--- a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
+++ b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
@@ -54,6 +54,10 @@ public int onCommand(String cmd) {
return setDisplayWhiteBalanceLoggingEnabled(true);
case "dwb-logging-disable":
return setDisplayWhiteBalanceLoggingEnabled(false);
+ case "dmd-logging-enable":
+ return setDisplayModeDirectorLoggingEnabled(true);
+ case "dmd-logging-disable":
+ return setDisplayModeDirectorLoggingEnabled(false);
case "dwb-set-cct":
return setAmbientColorTemperatureOverride();
default:
@@ -80,6 +84,10 @@ public void onHelp() {
pw.println(" Enable display white-balance logging.");
pw.println(" dwb-logging-disable");
pw.println(" Disable display white-balance logging.");
+ pw.println(" dmd-logging-enable");
+ pw.println(" Enable display mode director logging.");
+ pw.println(" dmd-logging-disable");
+ pw.println(" Disable display mode director logging.");
pw.println(" dwb-set-cct CCT");
pw.println(" Sets the ambient color temperature override to CCT (use -1 to disable).");
pw.println();
@@ -132,6 +140,11 @@ private int setDisplayWhiteBalanceLoggingEnabled(boolean enabled) {
return 0;
}
+ private int setDisplayModeDirectorLoggingEnabled(boolean enabled) {
+ mService.setDisplayModeDirectorLoggingEnabled(enabled);
+ return 0;
+ }
+
private int setAmbientColorTemperatureOverride() {
String cctText = getNextArg();
if (cctText == null) {
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java
index 3c050804f01d..9693057778ec 100644
--- a/services/core/java/com/android/server/display/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/DisplayModeDirector.java
@@ -46,13 +46,18 @@
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.display.utils.AmbientFilter;
import com.android.server.display.utils.AmbientFilterFactory;
+import com.android.server.utils.DeviceConfigInterface;
import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Date;
import java.util.List;
+import java.util.Locale;
import java.util.Objects;
/**
@@ -61,12 +66,14 @@
*/
public class DisplayModeDirector {
private static final String TAG = "DisplayModeDirector";
- private static final boolean DEBUG = false;
+ private boolean mLoggingEnabled;
private static final int MSG_REFRESH_RATE_RANGE_CHANGED = 1;
- private static final int MSG_BRIGHTNESS_THRESHOLDS_CHANGED = 2;
+ private static final int MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED = 2;
private static final int MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED = 3;
- private static final int MSG_REFRESH_RATE_IN_ZONE_CHANGED = 4;
+ private static final int MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED = 4;
+ private static final int MSG_REFRESH_RATE_IN_HIGH_ZONE_CHANGED = 5;
+ private static final int MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED = 6;
// Special ID used to indicate that given vote is to be applied globally, rather than to a
// specific display.
@@ -79,6 +86,13 @@ public class DisplayModeDirector {
private final Context mContext;
private final DisplayModeDirectorHandler mHandler;
+ private final Injector mInjector;
+
+ private final AppRequestObserver mAppRequestObserver;
+ private final SettingsObserver mSettingsObserver;
+ private final DisplayObserver mDisplayObserver;
+ private final DeviceConfigInterface mDeviceConfig;
+ private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings;
// A map from the display ID to the collection of votes and their priority. The latter takes
// the form of another map from the priority to the vote itself so that each priority is
@@ -89,17 +103,19 @@ public class DisplayModeDirector {
// A map from the display ID to the default mode of that display.
private SparseArray mDefaultModeByDisplay;
- private final AppRequestObserver mAppRequestObserver;
- private final SettingsObserver mSettingsObserver;
- private final DisplayObserver mDisplayObserver;
private BrightnessObserver mBrightnessObserver;
- private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings;
private DesiredDisplayModeSpecsListener mDesiredDisplayModeSpecsListener;
public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler) {
+ this(context, handler, new RealInjector());
+ }
+
+ public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler,
+ @NonNull Injector injector) {
mContext = context;
mHandler = new DisplayModeDirectorHandler(handler.getLooper());
+ mInjector = injector;
mVotesByDisplay = new SparseArray<>();
mSupportedModesByDisplay = new SparseArray<>();
mDefaultModeByDisplay = new SparseArray<>();
@@ -108,6 +124,7 @@ public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler) {
mDisplayObserver = new DisplayObserver(context, handler);
mBrightnessObserver = new BrightnessObserver(context, handler);
mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings();
+ mDeviceConfig = injector.getDeviceConfig();
}
/**
@@ -130,6 +147,14 @@ public void start(SensorManager sensorManager) {
}
+ public void setLoggingEnabled(boolean loggingEnabled) {
+ if (mLoggingEnabled == loggingEnabled) {
+ return;
+ }
+ mLoggingEnabled = loggingEnabled;
+ mBrightnessObserver.setLoggingEnabled(loggingEnabled);
+ }
+
@NonNull
private SparseArray getVotesLocked(int displayId) {
SparseArray displayVotes = mVotesByDisplay.get(displayId);
@@ -231,7 +256,7 @@ public DesiredDisplayModeSpecs getDesiredDisplayModeSpecs(int displayId) {
availableModes = filterModes(modes, primarySummary);
if (availableModes.length > 0) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.w(TAG, "Found available modes=" + Arrays.toString(availableModes)
+ " with lowest priority considered "
+ Vote.priorityToString(lowestConsideredPriority)
@@ -244,7 +269,7 @@ public DesiredDisplayModeSpecs getDesiredDisplayModeSpecs(int displayId) {
break;
}
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.w(TAG, "Couldn't find available modes with lowest priority set to "
+ Vote.priorityToString(lowestConsideredPriority)
+ " and with the following constraints: "
@@ -266,7 +291,7 @@ public DesiredDisplayModeSpecs getDesiredDisplayModeSpecs(int displayId) {
Math.min(appRequestSummary.minRefreshRate, primarySummary.minRefreshRate);
appRequestSummary.maxRefreshRate =
Math.max(appRequestSummary.maxRefreshRate, primarySummary.maxRefreshRate);
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.i(TAG,
String.format("App request range: [%.0f %.0f]",
appRequestSummary.minRefreshRate,
@@ -293,7 +318,7 @@ private int[] filterModes(Display.Mode[] supportedModes, VoteSummary summary) {
for (Display.Mode mode : supportedModes) {
if (mode.getPhysicalWidth() != summary.width
|| mode.getPhysicalHeight() != summary.height) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", wrong size"
+ ": desiredWidth=" + summary.width
+ ": desiredHeight=" + summary.height
@@ -308,7 +333,7 @@ private int[] filterModes(Display.Mode[] supportedModes, VoteSummary summary) {
// comparison.
if (refreshRate < (summary.minRefreshRate - FLOAT_TOLERANCE)
|| refreshRate > (summary.maxRefreshRate + FLOAT_TOLERANCE)) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ ", outside refresh rate bounds"
+ ": minRefreshRate=" + summary.minRefreshRate
@@ -348,6 +373,23 @@ public void setDesiredDisplayModeSpecsListener(
}
}
+ /**
+ * Retrieve the Vote for the given display and priority. Intended only for testing purposes.
+ *
+ * @param displayId the display to query for
+ * @param priority the priority of the vote to return
+ * @return the vote corresponding to the given {@code displayId} and {@code priority},
+ * or {@code null} if there isn't one
+ */
+ @VisibleForTesting
+ @Nullable
+ Vote getVote(int displayId, int priority) {
+ synchronized (mLock) {
+ SparseArray votes = getVotesLocked(displayId);
+ return votes.get(priority);
+ }
+ }
+
/**
* Print the object's state and debug information into the given stream.
*
@@ -391,7 +433,7 @@ private void updateVoteLocked(int priority, Vote vote) {
}
private void updateVoteLocked(int displayId, int priority, Vote vote) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.i(TAG, "updateVoteLocked(displayId=" + displayId
+ ", priority=" + Vote.priorityToString(priority)
+ ", vote=" + vote + ")");
@@ -412,7 +454,7 @@ private void updateVoteLocked(int displayId, int priority, Vote vote) {
}
if (votes.size() == 0) {
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.i(TAG, "No votes left for display " + displayId + ", removing.");
}
mVotesByDisplay.remove(displayId);
@@ -465,6 +507,17 @@ void injectBrightnessObserver(BrightnessObserver brightnessObserver) {
mBrightnessObserver = brightnessObserver;
}
+ @VisibleForTesting
+ BrightnessObserver getBrightnessObserver() {
+ return mBrightnessObserver;
+ }
+
+ @VisibleForTesting
+ SettingsObserver getSettingsObserver() {
+ return mSettingsObserver;
+ }
+
+
@VisibleForTesting
DesiredDisplayModeSpecs getDesiredDisplayModeSpecsWithInjectedFpsSettings(
float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) {
@@ -493,28 +546,41 @@ private final class DisplayModeDirectorHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
- case MSG_BRIGHTNESS_THRESHOLDS_CHANGED:
+ case MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED: {
Pair thresholds = (Pair) msg.obj;
+ mBrightnessObserver.onDeviceConfigLowBrightnessThresholdsChanged(
+ thresholds.first, thresholds.second);
+ break;
+ }
- if (thresholds != null) {
- mBrightnessObserver.onDeviceConfigThresholdsChanged(
- thresholds.first, thresholds.second);
- } else {
- mBrightnessObserver.onDeviceConfigThresholdsChanged(null, null);
- }
+ case MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED: {
+ int refreshRateInZone = msg.arg1;
+ mBrightnessObserver.onDeviceConfigRefreshRateInLowZoneChanged(
+ refreshRateInZone);
break;
+ }
+
+ case MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED: {
+ Pair thresholds = (Pair) msg.obj;
+
+ mBrightnessObserver.onDeviceConfigHighBrightnessThresholdsChanged(
+ thresholds.first, thresholds.second);
- case MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED:
- Float defaultPeakRefreshRate = (Float) msg.obj;
- mSettingsObserver.onDeviceConfigDefaultPeakRefreshRateChanged(
- defaultPeakRefreshRate);
break;
+ }
- case MSG_REFRESH_RATE_IN_ZONE_CHANGED:
+ case MSG_REFRESH_RATE_IN_HIGH_ZONE_CHANGED: {
int refreshRateInZone = msg.arg1;
- mBrightnessObserver.onDeviceConfigRefreshRateInZoneChanged(
+ mBrightnessObserver.onDeviceConfigRefreshRateInHighZoneChanged(
refreshRateInZone);
break;
+ }
+
+ case MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED:
+ Float defaultPeakRefreshRate = (Float) msg.obj;
+ mSettingsObserver.onDeviceConfigDefaultPeakRefreshRateChanged(
+ defaultPeakRefreshRate);
+ break;
case MSG_REFRESH_RATE_RANGE_CHANGED:
DesiredDisplayModeSpecsListener desiredDisplayModeSpecsListener =
@@ -685,10 +751,11 @@ static final class Vote {
// by all other considerations. It acts to set a default frame rate for a device.
public static final int PRIORITY_DEFAULT_REFRESH_RATE = 0;
- // LOW_BRIGHTNESS votes for a single refresh rate like [60,60], [90,90] or null.
+ // FLICKER votes for a single refresh rate like [60,60], [90,90] or null.
// If the higher voters result is a range, it will fix the rate to a single choice.
- // It's used to avoid rate switch in certain conditions.
- public static final int PRIORITY_LOW_BRIGHTNESS = 1;
+ // It's used to avoid refresh rate switches in certain conditions which may result in the
+ // user seeing the display flickering when the switches occur.
+ public static final int PRIORITY_FLICKER = 1;
// SETTING_MIN_REFRESH_RATE is used to propose a lower bound of display refresh rate.
// It votes [MIN_REFRESH_RATE, Float.POSITIVE_INFINITY]
@@ -761,8 +828,8 @@ public static String priorityToString(int priority) {
switch (priority) {
case PRIORITY_DEFAULT_REFRESH_RATE:
return "PRIORITY_DEFAULT_REFRESH_RATE";
- case PRIORITY_LOW_BRIGHTNESS:
- return "PRIORITY_LOW_BRIGHTNESS";
+ case PRIORITY_FLICKER:
+ return "PRIORITY_FLICKER";
case PRIORITY_USER_SETTING_MIN_REFRESH_RATE:
return "PRIORITY_USER_SETTING_MIN_REFRESH_RATE";
case PRIORITY_APP_REQUEST_REFRESH_RATE:
@@ -787,7 +854,8 @@ public String toString() {
}
}
- private final class SettingsObserver extends ContentObserver {
+ @VisibleForTesting
+ final class SettingsObserver extends ContentObserver {
private final Uri mPeakRefreshRateSetting =
Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE);
private final Uri mMinRefreshRateSetting =
@@ -810,8 +878,7 @@ private final class SettingsObserver extends ContentObserver {
public void observe() {
final ContentResolver cr = mContext.getContentResolver();
- cr.registerContentObserver(mPeakRefreshRateSetting, false /*notifyDescendants*/, this,
- UserHandle.USER_SYSTEM);
+ mInjector.registerPeakRefreshRateObserver(cr, this);
cr.registerContentObserver(mMinRefreshRateSetting, false /*notifyDescendants*/, this,
UserHandle.USER_SYSTEM);
cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this,
@@ -829,6 +896,13 @@ public void observe() {
}
}
+ public void setDefaultRefreshRate(float refreshRate) {
+ synchronized (mLock) {
+ mDefaultRefreshRate = refreshRate;
+ updateRefreshRateSettingLocked();
+ }
+ }
+
public void onDeviceConfigDefaultPeakRefreshRateChanged(Float defaultPeakRefreshRate) {
if (defaultPeakRefreshRate == null) {
defaultPeakRefreshRate = (float) mContext.getResources().getInteger(
@@ -1033,6 +1107,7 @@ public void onDisplayRemoved(int displayId) {
@Override
public void onDisplayChanged(int displayId) {
updateDisplayModes(displayId);
+ // TODO: Break the coupling between DisplayObserver and BrightnessObserver.
mBrightnessObserver.onDisplayChanged(displayId);
}
@@ -1071,15 +1146,17 @@ private void updateDisplayModes(int displayId) {
*/
@VisibleForTesting
public class BrightnessObserver extends ContentObserver {
- // TODO: brightnessfloat: change this to the float setting
- private final Uri mDisplayBrightnessSetting =
- Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
private final static int LIGHT_SENSOR_RATE_MS = 250;
- private int[] mDisplayBrightnessThresholds;
- private int[] mAmbientBrightnessThresholds;
+ private int[] mLowDisplayBrightnessThresholds;
+ private int[] mLowAmbientBrightnessThresholds;
+ private int[] mHighDisplayBrightnessThresholds;
+ private int[] mHighAmbientBrightnessThresholds;
// valid threshold if any item from the array >= 0
- private boolean mShouldObserveDisplayChange;
- private boolean mShouldObserveAmbientChange;
+ private boolean mShouldObserveDisplayLowChange;
+ private boolean mShouldObserveAmbientLowChange;
+ private boolean mShouldObserveDisplayHighChange;
+ private boolean mShouldObserveAmbientHighChange;
+ private boolean mLoggingEnabled;
private SensorManager mSensorManager;
private Sensor mLightSensor;
@@ -1087,50 +1164,134 @@ public class BrightnessObserver extends ContentObserver {
// Take it as low brightness before valid sensor data comes
private float mAmbientLux = -1.0f;
private AmbientFilter mAmbientFilter;
+ private int mBrightness = -1;
private final Context mContext;
- // Enable light sensor only when mShouldObserveAmbientChange is true, screen is on, peak
- // refresh rate changeable and low power mode off. After initialization, these states will
+ // Enable light sensor only when mShouldObserveAmbientLowChange is true or
+ // mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate
+ // changeable and low power mode off. After initialization, these states will
// be updated from the same handler thread.
- private boolean mScreenOn = false;
+ private int mDefaultDisplayState = Display.STATE_UNKNOWN;
private boolean mRefreshRateChangeable = false;
private boolean mLowPowerModeEnabled = false;
- private int mRefreshRateInZone;
+ private int mRefreshRateInLowZone;
+ private int mRefreshRateInHighZone;
BrightnessObserver(Context context, Handler handler) {
super(handler);
mContext = context;
- mDisplayBrightnessThresholds = context.getResources().getIntArray(
+ mLowDisplayBrightnessThresholds = context.getResources().getIntArray(
R.array.config_brightnessThresholdsOfPeakRefreshRate);
- mAmbientBrightnessThresholds = context.getResources().getIntArray(
+ mLowAmbientBrightnessThresholds = context.getResources().getIntArray(
R.array.config_ambientThresholdsOfPeakRefreshRate);
- if (mDisplayBrightnessThresholds.length != mAmbientBrightnessThresholds.length) {
- throw new RuntimeException("display brightness threshold array and ambient "
- + "brightness threshold array have different length");
+ if (mLowDisplayBrightnessThresholds.length != mLowAmbientBrightnessThresholds.length) {
+ throw new RuntimeException("display low brightness threshold array and ambient "
+ + "brightness threshold array have different length: "
+ + "displayBrightnessThresholds="
+ + Arrays.toString(mLowDisplayBrightnessThresholds)
+ + ", ambientBrightnessThresholds="
+ + Arrays.toString(mLowAmbientBrightnessThresholds));
}
+
+ mHighDisplayBrightnessThresholds = context.getResources().getIntArray(
+ R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate);
+ mHighAmbientBrightnessThresholds = context.getResources().getIntArray(
+ R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate);
+ if (mHighDisplayBrightnessThresholds.length
+ != mHighAmbientBrightnessThresholds.length) {
+ throw new RuntimeException("display high brightness threshold array and ambient "
+ + "brightness threshold array have different length: "
+ + "displayBrightnessThresholds="
+ + Arrays.toString(mHighDisplayBrightnessThresholds)
+ + ", ambientBrightnessThresholds="
+ + Arrays.toString(mHighAmbientBrightnessThresholds));
+ }
+ mRefreshRateInHighZone = context.getResources().getInteger(
+ R.integer.config_fixedRefreshRateInHighZone);
+ }
+
+ /**
+ * @return the refresh to lock to when in a low brightness zone
+ */
+ @VisibleForTesting
+ int getRefreshRateInLowZone() {
+ return mRefreshRateInLowZone;
+ }
+
+ /**
+ * @return the display brightness thresholds for the low brightness zones
+ */
+ @VisibleForTesting
+ int[] getLowDisplayBrightnessThresholds() {
+ return mLowDisplayBrightnessThresholds;
+ }
+
+ /**
+ * @return the ambient brightness thresholds for the low brightness zones
+ */
+ @VisibleForTesting
+ int[] getLowAmbientBrightnessThresholds() {
+ return mLowAmbientBrightnessThresholds;
+ }
+
+ public void registerLightSensor(SensorManager sensorManager, Sensor lightSensor) {
+ mSensorManager = sensorManager;
+ mLightSensor = lightSensor;
+
+ mSensorManager.registerListener(mLightSensorListener,
+ mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler);
}
public void observe(SensorManager sensorManager) {
mSensorManager = sensorManager;
+ final ContentResolver cr = mContext.getContentResolver();
+ mBrightness = Settings.System.getIntForUser(cr,
+ Settings.System.SCREEN_BRIGHTNESS, -1 /*default*/, cr.getUserId());
// DeviceConfig is accessible after system ready.
- int[] brightnessThresholds = mDeviceConfigDisplaySettings.getBrightnessThresholds();
- int[] ambientThresholds = mDeviceConfigDisplaySettings.getAmbientThresholds();
+ int[] lowDisplayBrightnessThresholds =
+ mDeviceConfigDisplaySettings.getLowDisplayBrightnessThresholds();
+ int[] lowAmbientBrightnessThresholds =
+ mDeviceConfigDisplaySettings.getLowAmbientBrightnessThresholds();
+
+ if (lowDisplayBrightnessThresholds != null && lowAmbientBrightnessThresholds != null
+ && lowDisplayBrightnessThresholds.length
+ == lowAmbientBrightnessThresholds.length) {
+ mLowDisplayBrightnessThresholds = lowDisplayBrightnessThresholds;
+ mLowAmbientBrightnessThresholds = lowAmbientBrightnessThresholds;
+ }
+
+
+ int[] highDisplayBrightnessThresholds =
+ mDeviceConfigDisplaySettings.getHighDisplayBrightnessThresholds();
+ int[] highAmbientBrightnessThresholds =
+ mDeviceConfigDisplaySettings.getHighAmbientBrightnessThresholds();
- if (brightnessThresholds != null && ambientThresholds != null
- && brightnessThresholds.length == ambientThresholds.length) {
- mDisplayBrightnessThresholds = brightnessThresholds;
- mAmbientBrightnessThresholds = ambientThresholds;
+ if (highDisplayBrightnessThresholds != null && highAmbientBrightnessThresholds != null
+ && highDisplayBrightnessThresholds.length
+ == highAmbientBrightnessThresholds.length) {
+ mHighDisplayBrightnessThresholds = highDisplayBrightnessThresholds;
+ mHighAmbientBrightnessThresholds = highAmbientBrightnessThresholds;
}
- mRefreshRateInZone = mDeviceConfigDisplaySettings.getRefreshRateInZone();
+ mRefreshRateInLowZone = mDeviceConfigDisplaySettings.getRefreshRateInLowZone();
+ mRefreshRateInHighZone = mDeviceConfigDisplaySettings.getRefreshRateInHighZone();
+
restartObserver();
mDeviceConfigDisplaySettings.startListening();
}
+ public void setLoggingEnabled(boolean loggingEnabled) {
+ if (mLoggingEnabled == loggingEnabled) {
+ return;
+ }
+ mLoggingEnabled = loggingEnabled;
+ mLightSensorListener.setLoggingEnabled(loggingEnabled);
+ }
+
public void onRefreshRateSettingChangedLocked(float min, float max) {
boolean changeable = (max - min > 1f && max > 60f);
if (mRefreshRateChangeable != changeable) {
@@ -1138,7 +1299,7 @@ public void onRefreshRateSettingChangedLocked(float min, float max) {
updateSensorStatus();
if (!changeable) {
// Revoke previous vote from BrightnessObserver
- updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, null);
+ updateVoteLocked(Vote.PRIORITY_FLICKER, null);
}
}
}
@@ -1150,25 +1311,48 @@ public void onLowPowerModeEnabledLocked(boolean b) {
}
}
- public void onDeviceConfigThresholdsChanged(int[] brightnessThresholds,
+ public void onDeviceConfigLowBrightnessThresholdsChanged(int[] displayThresholds,
int[] ambientThresholds) {
- if (brightnessThresholds != null && ambientThresholds != null
- && brightnessThresholds.length == ambientThresholds.length) {
- mDisplayBrightnessThresholds = brightnessThresholds;
- mAmbientBrightnessThresholds = ambientThresholds;
+ if (displayThresholds != null && ambientThresholds != null
+ && displayThresholds.length == ambientThresholds.length) {
+ mLowDisplayBrightnessThresholds = displayThresholds;
+ mLowAmbientBrightnessThresholds = ambientThresholds;
} else {
// Invalid or empty. Use device default.
- mDisplayBrightnessThresholds = mContext.getResources().getIntArray(
+ mLowDisplayBrightnessThresholds = mContext.getResources().getIntArray(
R.array.config_brightnessThresholdsOfPeakRefreshRate);
- mAmbientBrightnessThresholds = mContext.getResources().getIntArray(
+ mLowAmbientBrightnessThresholds = mContext.getResources().getIntArray(
R.array.config_ambientThresholdsOfPeakRefreshRate);
}
restartObserver();
}
- public void onDeviceConfigRefreshRateInZoneChanged(int refreshRate) {
- if (refreshRate != mRefreshRateInZone) {
- mRefreshRateInZone = refreshRate;
+ public void onDeviceConfigRefreshRateInLowZoneChanged(int refreshRate) {
+ if (refreshRate != mRefreshRateInLowZone) {
+ mRefreshRateInLowZone = refreshRate;
+ restartObserver();
+ }
+ }
+
+ public void onDeviceConfigHighBrightnessThresholdsChanged(int[] displayThresholds,
+ int[] ambientThresholds) {
+ if (displayThresholds != null && ambientThresholds != null
+ && displayThresholds.length == ambientThresholds.length) {
+ mHighDisplayBrightnessThresholds = displayThresholds;
+ mHighAmbientBrightnessThresholds = ambientThresholds;
+ } else {
+ // Invalid or empty. Use device default.
+ mHighDisplayBrightnessThresholds = mContext.getResources().getIntArray(
+ R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate);
+ mHighAmbientBrightnessThresholds = mContext.getResources().getIntArray(
+ R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate);
+ }
+ restartObserver();
+ }
+
+ public void onDeviceConfigRefreshRateInHighZoneChanged(int refreshRate) {
+ if (refreshRate != mRefreshRateInHighZone) {
+ mRefreshRateInHighZone = refreshRate;
restartObserver();
}
}
@@ -1176,48 +1360,95 @@ public void onDeviceConfigRefreshRateInZoneChanged(int refreshRate) {
public void dumpLocked(PrintWriter pw) {
pw.println(" BrightnessObserver");
pw.println(" mAmbientLux: " + mAmbientLux);
- pw.println(" mRefreshRateInZone: " + mRefreshRateInZone);
+ pw.println(" mBrightness: " + mBrightness);
+ pw.println(" mDefaultDisplayState: " + mDefaultDisplayState);
+ pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled);
+ pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable);
+ pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange);
+ pw.println(" mShouldObserveAmbientLowChange: " + mShouldObserveAmbientLowChange);
+ pw.println(" mRefreshRateInLowZone: " + mRefreshRateInLowZone);
+
+ for (int d : mLowDisplayBrightnessThresholds) {
+ pw.println(" mDisplayLowBrightnessThreshold: " + d);
+ }
- for (int d: mDisplayBrightnessThresholds) {
- pw.println(" mDisplayBrightnessThreshold: " + d);
+ for (int d : mLowAmbientBrightnessThresholds) {
+ pw.println(" mAmbientLowBrightnessThreshold: " + d);
}
- for (int d: mAmbientBrightnessThresholds) {
- pw.println(" mAmbientBrightnessThreshold: " + d);
+ pw.println(" mShouldObserveDisplayHighChange: " + mShouldObserveDisplayHighChange);
+ pw.println(" mShouldObserveAmbientHighChange: " + mShouldObserveAmbientHighChange);
+ pw.println(" mRefreshRateInHighZone: " + mRefreshRateInHighZone);
+
+ for (int d : mHighDisplayBrightnessThresholds) {
+ pw.println(" mDisplayHighBrightnessThresholds: " + d);
+ }
+
+ for (int d : mHighAmbientBrightnessThresholds) {
+ pw.println(" mAmbientHighBrightnessThresholds: " + d);
}
mLightSensorListener.dumpLocked(pw);
+
+ if (mAmbientFilter != null) {
+ IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ ipw.setIndent(" ");
+ mAmbientFilter.dump(ipw);
+ }
}
public void onDisplayChanged(int displayId) {
if (displayId == Display.DEFAULT_DISPLAY) {
- onScreenOn(isDefaultDisplayOn());
+ updateDefaultDisplayState();
}
}
@Override
public void onChange(boolean selfChange, Uri uri, int userId) {
synchronized (mLock) {
- onBrightnessChangedLocked();
+ final ContentResolver cr = mContext.getContentResolver();
+ int brightness = Settings.System.getIntForUser(cr,
+ Settings.System.SCREEN_BRIGHTNESS, -1 /*default*/, cr.getUserId());
+ if (brightness != mBrightness) {
+ mBrightness = brightness;
+ onBrightnessChangedLocked();
+ }
}
}
private void restartObserver() {
- mShouldObserveDisplayChange = checkShouldObserve(mDisplayBrightnessThresholds);
- mShouldObserveAmbientChange = checkShouldObserve(mAmbientBrightnessThresholds);
-
final ContentResolver cr = mContext.getContentResolver();
- if (mShouldObserveDisplayChange) {
+
+ if (mRefreshRateInLowZone > 0) {
+ mShouldObserveDisplayLowChange = hasValidThreshold(
+ mLowDisplayBrightnessThresholds);
+ mShouldObserveAmbientLowChange = hasValidThreshold(
+ mLowAmbientBrightnessThresholds);
+ } else {
+ mShouldObserveDisplayLowChange = false;
+ mShouldObserveAmbientLowChange = false;
+ }
+
+ if (mRefreshRateInHighZone > 0) {
+ mShouldObserveDisplayHighChange = hasValidThreshold(
+ mHighDisplayBrightnessThresholds);
+ mShouldObserveAmbientHighChange = hasValidThreshold(
+ mHighAmbientBrightnessThresholds);
+ } else {
+ mShouldObserveDisplayHighChange = false;
+ mShouldObserveAmbientHighChange = false;
+ }
+
+ if (mShouldObserveDisplayLowChange || mShouldObserveDisplayHighChange) {
// Content Service does not check if an listener has already been registered.
// To ensure only one listener is registered, force an unregistration first.
- cr.unregisterContentObserver(this);
- cr.registerContentObserver(mDisplayBrightnessSetting,
- false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM);
+ mInjector.unregisterBrightnessObserver(cr, this);
+ mInjector.registerBrightnessObserver(cr, this);
} else {
- cr.unregisterContentObserver(this);
+ mInjector.unregisterBrightnessObserver(cr, this);
}
- if (mShouldObserveAmbientChange) {
+ if (mShouldObserveAmbientLowChange || mShouldObserveAmbientHighChange) {
Resources resources = mContext.getResources();
String lightSensorType = resources.getString(
com.android.internal.R.string.config_displayLightSensorType);
@@ -1243,8 +1474,6 @@ private void restartObserver() {
mAmbientFilter = AmbientFilterFactory.createBrightnessFilter(TAG, res);
mLightSensor = lightSensor;
-
- onScreenOn(isDefaultDisplayOn());
}
} else {
mAmbientFilter = null;
@@ -1263,11 +1492,7 @@ private void restartObserver() {
* Checks to see if at least one value is positive, in which case it is necessary to listen
* to value changes.
*/
- private boolean checkShouldObserve(int[] a) {
- if (mRefreshRateInZone <= 0) {
- return false;
- }
-
+ private boolean hasValidThreshold(int[] a) {
for (int d: a) {
if (d >= 0) {
return true;
@@ -1277,13 +1502,13 @@ private boolean checkShouldObserve(int[] a) {
return false;
}
- private boolean isInsideZone(int brightness, float lux) {
- for (int i = 0; i < mDisplayBrightnessThresholds.length; i++) {
- int disp = mDisplayBrightnessThresholds[i];
- int ambi = mAmbientBrightnessThresholds[i];
+ private boolean isInsideLowZone(int brightness, float lux) {
+ for (int i = 0; i < mLowDisplayBrightnessThresholds.length; i++) {
+ int disp = mLowDisplayBrightnessThresholds[i];
+ int ambi = mLowAmbientBrightnessThresholds[i];
if (disp >= 0 && ambi >= 0) {
- if (brightness <= disp && mAmbientLux <= ambi) {
+ if (brightness <= disp && lux <= ambi) {
return true;
}
} else if (disp >= 0) {
@@ -1291,7 +1516,7 @@ private boolean isInsideZone(int brightness, float lux) {
return true;
}
} else if (ambi >= 0) {
- if (mAmbientLux <= ambi) {
+ if (lux <= ambi) {
return true;
}
}
@@ -1299,27 +1524,85 @@ private boolean isInsideZone(int brightness, float lux) {
return false;
}
- // TODO: brightnessfloat: make it use float not int
- private void onBrightnessChangedLocked() {
- int brightness = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.SCREEN_BRIGHTNESS, -1);
+ private boolean isInsideHighZone(int brightness, float lux) {
+ for (int i = 0; i < mHighDisplayBrightnessThresholds.length; i++) {
+ int disp = mHighDisplayBrightnessThresholds[i];
+ int ambi = mHighAmbientBrightnessThresholds[i];
+
+ if (disp >= 0 && ambi >= 0) {
+ if (brightness >= disp && lux >= ambi) {
+ return true;
+ }
+ } else if (disp >= 0) {
+ if (brightness >= disp) {
+ return true;
+ }
+ } else if (ambi >= 0) {
+ if (lux >= ambi) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+ private void onBrightnessChangedLocked() {
Vote vote = null;
- boolean insideZone = isInsideZone(brightness, mAmbientLux);
- if (insideZone) {
- vote = Vote.forRefreshRates(mRefreshRateInZone, mRefreshRateInZone);
+
+ if (mBrightness < 0) {
+ // Either the setting isn't available or we shouldn't be observing yet anyways.
+ // Either way, just bail out since there's nothing we can do here.
+ return;
+ }
+
+ boolean insideLowZone = hasValidLowZone() && isInsideLowZone(mBrightness, mAmbientLux);
+ if (insideLowZone) {
+ vote = Vote.forRefreshRates(mRefreshRateInLowZone, mRefreshRateInLowZone);
+ }
+
+ boolean insideHighZone = hasValidHighZone()
+ && isInsideHighZone(mBrightness, mAmbientLux);
+ if (insideHighZone) {
+ vote = Vote.forRefreshRates(mRefreshRateInHighZone, mRefreshRateInHighZone);
}
- if (DEBUG) {
- Slog.d(TAG, "Display brightness " + brightness + ", ambient lux " + mAmbientLux +
- ", Vote " + vote);
+ if (mLoggingEnabled) {
+ Slog.d(TAG, "Display brightness " + mBrightness + ", ambient lux " + mAmbientLux
+ + ", Vote " + vote);
+ }
+ updateVoteLocked(Vote.PRIORITY_FLICKER, vote);
+ }
+
+ private boolean hasValidLowZone() {
+ return mRefreshRateInLowZone > 0
+ && (mShouldObserveDisplayLowChange || mShouldObserveAmbientLowChange);
+ }
+
+ private boolean hasValidHighZone() {
+ return mRefreshRateInHighZone > 0
+ && (mShouldObserveDisplayHighChange || mShouldObserveAmbientHighChange);
+ }
+
+ private void updateDefaultDisplayState() {
+ Display display = mContext.getSystemService(DisplayManager.class)
+ .getDisplay(Display.DEFAULT_DISPLAY);
+ if (display == null) {
+ return;
}
- updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, vote);
+
+ setDefaultDisplayState(display.getState());
}
- private void onScreenOn(boolean on) {
- if (mScreenOn != on) {
- mScreenOn = on;
+ @VisibleForTesting
+ public void setDefaultDisplayState(int state) {
+ if (mLoggingEnabled) {
+ Slog.d(TAG, "setDefaultDisplayState: mDefaultDisplayState = "
+ + mDefaultDisplayState + ", state = " + state);
+ }
+
+ if (mDefaultDisplayState != state) {
+ mDefaultDisplayState = state;
updateSensorStatus();
}
}
@@ -1329,55 +1612,89 @@ private void updateSensorStatus() {
return;
}
- if (mShouldObserveAmbientChange && mScreenOn && !mLowPowerModeEnabled
- && mRefreshRateChangeable) {
+ if (mLoggingEnabled) {
+ Slog.d(TAG, "updateSensorStatus: mShouldObserveAmbientLowChange = "
+ + mShouldObserveAmbientLowChange + ", mShouldObserveAmbientHighChange = "
+ + mShouldObserveAmbientHighChange);
+ Slog.d(TAG, "updateSensorStatus: mLowPowerModeEnabled = "
+ + mLowPowerModeEnabled + ", mRefreshRateChangeable = "
+ + mRefreshRateChangeable);
+ }
+
+ if ((mShouldObserveAmbientLowChange || mShouldObserveAmbientHighChange)
+ && isDeviceActive() && !mLowPowerModeEnabled && mRefreshRateChangeable) {
mSensorManager.registerListener(mLightSensorListener,
mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler);
+ if (mLoggingEnabled) {
+ Slog.d(TAG, "updateSensorStatus: registerListener");
+ }
} else {
mLightSensorListener.removeCallbacks();
mSensorManager.unregisterListener(mLightSensorListener);
+ if (mLoggingEnabled) {
+ Slog.d(TAG, "updateSensorStatus: unregisterListener");
+ }
}
}
- private boolean isDefaultDisplayOn() {
- final Display display = mContext.getSystemService(DisplayManager.class)
- .getDisplay(Display.DEFAULT_DISPLAY);
- return display.getState() != Display.STATE_OFF
- && mContext.getSystemService(PowerManager.class).isInteractive();
+ private boolean isDeviceActive() {
+ return mDefaultDisplayState == Display.STATE_ON;
}
private final class LightSensorEventListener implements SensorEventListener {
final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS;
private float mLastSensorData;
+ private long mTimestamp;
+ private boolean mLoggingEnabled;
public void dumpLocked(PrintWriter pw) {
pw.println(" mLastSensorData: " + mLastSensorData);
+ pw.println(" mTimestamp: " + formatTimestamp(mTimestamp));
+ }
+
+
+ public void setLoggingEnabled(boolean loggingEnabled) {
+ if (mLoggingEnabled == loggingEnabled) {
+ return;
+ }
+ mLoggingEnabled = loggingEnabled;
}
@Override
public void onSensorChanged(SensorEvent event) {
mLastSensorData = event.values[0];
- if (DEBUG) {
+ if (mLoggingEnabled) {
Slog.d(TAG, "On sensor changed: " + mLastSensorData);
}
- boolean zoneChanged = isDifferentZone(mLastSensorData, mAmbientLux);
- if (zoneChanged && mLastSensorData < mAmbientLux) {
- // Easier to see flicker at lower brightness environment. Forget the history to
- // get immediate response.
- mAmbientFilter.clear();
+ boolean lowZoneChanged = isDifferentZone(mLastSensorData, mAmbientLux,
+ mLowAmbientBrightnessThresholds);
+ boolean highZoneChanged = isDifferentZone(mLastSensorData, mAmbientLux,
+ mHighAmbientBrightnessThresholds);
+ if ((lowZoneChanged && mLastSensorData < mAmbientLux)
+ || (highZoneChanged && mLastSensorData > mAmbientLux)) {
+ // Easier to see flicker at lower brightness environment or high brightness
+ // environment. Forget the history to get immediate response.
+ if (mAmbientFilter != null) {
+ mAmbientFilter.clear();
+ }
}
long now = SystemClock.uptimeMillis();
- mAmbientFilter.addValue(now, mLastSensorData);
+ mTimestamp = System.currentTimeMillis();
+ if (mAmbientFilter != null) {
+ mAmbientFilter.addValue(now, mLastSensorData);
+ }
mHandler.removeCallbacks(mInjectSensorEventRunnable);
processSensorData(now);
- if (zoneChanged && mLastSensorData > mAmbientLux) {
+ if ((lowZoneChanged && mLastSensorData > mAmbientLux)
+ || (highZoneChanged && mLastSensorData < mAmbientLux)) {
// Sensor may not report new event if there is no brightness change.
// Need to keep querying the temporal filter for the latest estimation,
- // until enter in higher lux zone or is interrupted by a new sensor event.
+ // until sensor readout and filter estimation are in the same zone or
+ // is interrupted by a new sensor event.
mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS);
}
}
@@ -1391,18 +1708,26 @@ public void removeCallbacks() {
mHandler.removeCallbacks(mInjectSensorEventRunnable);
}
+ private String formatTimestamp(long time) {
+ SimpleDateFormat dateFormat =
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US);
+ return dateFormat.format(new Date(time));
+ }
+
private void processSensorData(long now) {
- mAmbientLux = mAmbientFilter.getEstimate(now);
+ if (mAmbientFilter != null) {
+ mAmbientLux = mAmbientFilter.getEstimate(now);
+ } else {
+ mAmbientLux = mLastSensorData;
+ }
synchronized (mLock) {
onBrightnessChangedLocked();
}
}
- private boolean isDifferentZone(float lux1, float lux2) {
- for (int z = 0; z < mAmbientBrightnessThresholds.length; z++) {
- final float boundary = mAmbientBrightnessThresholds[z];
-
+ private boolean isDifferentZone(float lux1, float lux2, int[] luxThresholds) {
+ for (final float boundary : luxThresholds) {
// Test each boundary. See if the current value and the new value are at
// different sides.
if ((lux1 <= boundary && lux2 > boundary)
@@ -1422,7 +1747,10 @@ public void run() {
processSensorData(now);
// Inject next event if there is a possible zone change.
- if (isDifferentZone(mLastSensorData, mAmbientLux)) {
+ if (isDifferentZone(mLastSensorData, mAmbientLux,
+ mLowAmbientBrightnessThresholds)
+ || isDifferentZone(mLastSensorData, mAmbientLux,
+ mHighAmbientBrightnessThresholds)) {
mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS);
}
}
@@ -1435,72 +1763,113 @@ public DeviceConfigDisplaySettings() {
}
public void startListening() {
- DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
BackgroundThread.getExecutor(), this);
}
/*
* Return null if no such property or wrong format (not comma separated integers).
*/
- public int[] getBrightnessThresholds() {
+ public int[] getLowDisplayBrightnessThresholds() {
return getIntArrayProperty(
DisplayManager.DeviceConfig.
- KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS);
+ KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS);
}
/*
* Return null if no such property or wrong format (not comma separated integers).
*/
- public int[] getAmbientThresholds() {
+ public int[] getLowAmbientBrightnessThresholds() {
return getIntArrayProperty(
DisplayManager.DeviceConfig.
- KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS);
+ KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS);
+ }
+
+ public int getRefreshRateInLowZone() {
+ int defaultRefreshRateInZone = mContext.getResources().getInteger(
+ R.integer.config_defaultRefreshRateInZone);
+
+ int refreshRate = mDeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE,
+ defaultRefreshRateInZone);
+
+ return refreshRate;
}
/*
- * Return null if no such property
+ * Return null if no such property or wrong format (not comma separated integers).
*/
- public Float getDefaultPeakRefreshRate() {
- float defaultPeakRefreshRate = DeviceConfig.getFloat(
- DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
- DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DEFAULT, -1);
+ public int[] getHighDisplayBrightnessThresholds() {
+ return getIntArrayProperty(
+ DisplayManager.DeviceConfig
+ .KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS);
+ }
- if (defaultPeakRefreshRate == -1) {
- return null;
- }
- return defaultPeakRefreshRate;
+ /*
+ * Return null if no such property or wrong format (not comma separated integers).
+ */
+ public int[] getHighAmbientBrightnessThresholds() {
+ return getIntArrayProperty(
+ DisplayManager.DeviceConfig
+ .KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS);
}
- public int getRefreshRateInZone() {
+ public int getRefreshRateInHighZone() {
int defaultRefreshRateInZone = mContext.getResources().getInteger(
- R.integer.config_defaultRefreshRateInZone);
+ R.integer.config_fixedRefreshRateInHighZone);
- int refreshRate = DeviceConfig.getInt(
+ int refreshRate = mDeviceConfig.getInt(
DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
- DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE,
+ DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE,
defaultRefreshRateInZone);
return refreshRate;
}
+ /*
+ * Return null if no such property
+ */
+ public Float getDefaultPeakRefreshRate() {
+ float defaultPeakRefreshRate = mDeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DEFAULT, -1);
+
+ if (defaultPeakRefreshRate == -1) {
+ return null;
+ }
+ return defaultPeakRefreshRate;
+ }
+
@Override
public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) {
- int[] brightnessThresholds = getBrightnessThresholds();
- int[] ambientThresholds = getAmbientThresholds();
Float defaultPeakRefreshRate = getDefaultPeakRefreshRate();
- int refreshRateInZone = getRefreshRateInZone();
-
- mHandler.obtainMessage(MSG_BRIGHTNESS_THRESHOLDS_CHANGED,
- new Pair(brightnessThresholds, ambientThresholds))
- .sendToTarget();
mHandler.obtainMessage(MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED,
defaultPeakRefreshRate).sendToTarget();
- mHandler.obtainMessage(MSG_REFRESH_RATE_IN_ZONE_CHANGED, refreshRateInZone,
- 0).sendToTarget();
+
+ int[] lowDisplayBrightnessThresholds = getLowDisplayBrightnessThresholds();
+ int[] lowAmbientBrightnessThresholds = getLowAmbientBrightnessThresholds();
+ int refreshRateInLowZone = getRefreshRateInLowZone();
+
+ mHandler.obtainMessage(MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED,
+ new Pair<>(lowDisplayBrightnessThresholds, lowAmbientBrightnessThresholds))
+ .sendToTarget();
+ mHandler.obtainMessage(MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED, refreshRateInLowZone, 0)
+ .sendToTarget();
+
+ int[] highDisplayBrightnessThresholds = getHighDisplayBrightnessThresholds();
+ int[] highAmbientBrightnessThresholds = getHighAmbientBrightnessThresholds();
+ int refreshRateInHighZone = getRefreshRateInHighZone();
+
+ mHandler.obtainMessage(MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED,
+ new Pair<>(highDisplayBrightnessThresholds, highAmbientBrightnessThresholds))
+ .sendToTarget();
+ mHandler.obtainMessage(MSG_REFRESH_RATE_IN_HIGH_ZONE_CHANGED, refreshRateInHighZone, 0)
+ .sendToTarget();
}
private int[] getIntArrayProperty(String prop) {
- String strArray = DeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, prop,
+ String strArray = mDeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, prop,
null);
if (strArray != null) {
@@ -1527,4 +1896,52 @@ private int[] parseIntArray(@NonNull String strArray) {
}
}
+ interface Injector {
+ // TODO: brightnessfloat: change this to the float setting
+ Uri DISPLAY_BRIGHTNESS_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
+ Uri PEAK_REFRESH_RATE_URI = Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE);
+
+ @NonNull
+ DeviceConfigInterface getDeviceConfig();
+
+ void registerBrightnessObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer);
+
+ void unregisterBrightnessObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer);
+
+ void registerPeakRefreshRateObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer);
+ }
+
+ @VisibleForTesting
+ static class RealInjector implements Injector {
+
+ @Override
+ @NonNull
+ public DeviceConfigInterface getDeviceConfig() {
+ return DeviceConfigInterface.REAL;
+ }
+
+ @Override
+ public void registerBrightnessObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ cr.registerContentObserver(DISPLAY_BRIGHTNESS_URI, false /*notifyDescendants*/,
+ observer, UserHandle.USER_SYSTEM);
+ }
+
+ @Override
+ public void unregisterBrightnessObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ cr.unregisterContentObserver(observer);
+ }
+
+ @Override
+ public void registerPeakRefreshRateObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ cr.registerContentObserver(PEAK_REFRESH_RATE_URI, false /*notifyDescendants*/,
+ observer, UserHandle.USER_SYSTEM);
+ }
+ }
+
}
diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
index 57323170b327..551df49b550f 100644
--- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
@@ -91,6 +91,10 @@ final class WifiDisplayAdapter extends DisplayAdapter {
private boolean mPendingStatusChangeBroadcast;
+ private static final String[] RECEIVER_PERMISSIONS_FOR_BROADCAST = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ };
+
// Called with SyncRoot lock held.
public WifiDisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
Context context, Handler handler, Listener listener,
@@ -432,7 +436,8 @@ private void handleSendStatusChangeBroadcast() {
}
// Send protected broadcast about wifi display status to registered receivers.
- getContext().sendBroadcastAsUser(intent, UserHandle.ALL);
+ getContext().createContextAsUser(UserHandle.ALL, 0)
+ .sendBroadcastWithMultiplePermissions(intent, RECEIVER_PERMISSIONS_FOR_BROADCAST);
}
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
index d644b1dc6ca0..e2943f0a35bb 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
@@ -35,6 +35,7 @@
import android.service.gatekeeper.GateKeeperResponse;
import android.service.gatekeeper.IGateKeeperService;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
@@ -904,7 +905,7 @@ public Set getPendingTokensForUser(int userId) {
if (!tokenMap.containsKey(userId)) {
return Collections.emptySet();
}
- return tokenMap.get(userId).keySet();
+ return new ArraySet<>(tokenMap.get(userId).keySet());
}
public boolean removePendingToken(long handle, int userId) {
diff --git a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java
index 6e655eafa0e9..d1eaaf86d7ca 100644
--- a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java
+++ b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java
@@ -18,6 +18,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.app.BroadcastOptions;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
@@ -196,6 +197,8 @@ public boolean send(Context context, KeyEvent keyEvent, String callingPackageNam
// TODO: Find a way to also send PID/UID in secure way.
mediaButtonIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, callingPackageName);
+ final BroadcastOptions options = BroadcastOptions.makeBasic();
+ options.setBackgroundActivityStartsAllowed(true);
if (mPendingIntent != null) {
if (DEBUG_KEY_EVENT) {
Log.d(TAG, "Sending " + keyEvent + " to the last known PendingIntent "
@@ -203,7 +206,8 @@ public boolean send(Context context, KeyEvent keyEvent, String callingPackageNam
}
try {
mPendingIntent.send(
- context, resultCode, mediaButtonIntent, onFinishedListener, handler);
+ context, resultCode, mediaButtonIntent, onFinishedListener, handler,
+ /* requiredPermission= */null, options.toBundle());
} catch (PendingIntent.CanceledException e) {
Log.w(TAG, "Error sending key event to media button receiver " + mPendingIntent, e);
return false;
@@ -226,7 +230,8 @@ public boolean send(Context context, KeyEvent keyEvent, String callingPackageNam
break;
default:
// Legacy behavior for other cases.
- context.sendBroadcastAsUser(mediaButtonIntent, userHandle);
+ context.sendBroadcastAsUser(mediaButtonIntent, userHandle,
+ /* requiredPermission= */null, options.toBundle());
}
} catch (Exception e) {
Log.w(TAG, "Error sending media button to the restored intent "
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 02b7582a8637..348e9c122a9a 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -986,6 +986,12 @@ class SessionCb {
public boolean sendMediaButton(String packageName, int pid, int uid,
boolean asSystemService, KeyEvent keyEvent, int sequenceId, ResultReceiver cb) {
try {
+ if (KeyEvent.isMediaSessionKey(keyEvent.getKeyCode())) {
+ final String reason = "action=" + KeyEvent.actionToString(keyEvent.getAction())
+ + ";code=" + KeyEvent.keyCodeToString(keyEvent.getKeyCode());
+ mService.tempAllowlistTargetPkgIfPossible(getUid(), getPackageName(),
+ pid, uid, packageName, reason);
+ }
if (asSystemService) {
mCb.onMediaButton(mContext.getPackageName(), Process.myPid(),
Process.SYSTEM_UID, createMediaButtonIntent(keyEvent), sequenceId, cb);
@@ -1003,6 +1009,12 @@ public boolean sendMediaButton(String packageName, int pid, int uid,
public boolean sendMediaButton(String packageName, int pid, int uid,
boolean asSystemService, KeyEvent keyEvent) {
try {
+ if (KeyEvent.isMediaSessionKey(keyEvent.getKeyCode())) {
+ final String reason = "action=" + KeyEvent.actionToString(keyEvent.getAction())
+ + ";code=" + KeyEvent.keyCodeToString(keyEvent.getKeyCode());
+ mService.tempAllowlistTargetPkgIfPossible(getUid(), getPackageName(),
+ pid, uid, packageName, reason);
+ }
if (asSystemService) {
mCb.onMediaButton(mContext.getPackageName(), Process.myPid(),
Process.SYSTEM_UID, createMediaButtonIntent(keyEvent), 0, null);
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 803eb862e0f1..1a2743f73b49 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -25,6 +25,7 @@
import static com.android.server.media.MediaKeyDispatcher.isTripleTapOverridden;
import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
import android.app.INotificationManager;
import android.app.KeyguardManager;
import android.app.PendingIntent;
@@ -114,6 +115,8 @@ public class MediaSessionService extends SystemService implements Monitor {
+ /* Buffer for delayed delivery of key event */ 50;
private static final int MULTI_TAP_TIMEOUT = ViewConfiguration.getMultiPressTimeout();
+ private static final int TEMP_ALLOW_WHILE_IN_USE_PERMISSION_IN_FGS_DURATION_MS = 10_000;
+
private final Context mContext;
private final SessionManagerImpl mSessionManagerImpl;
private final MessageHandler mHandler = new MessageHandler();
@@ -133,6 +136,7 @@ public class MediaSessionService extends SystemService implements Monitor {
private final List mSession2TokensListenerRecords =
new ArrayList<>();
+ private ActivityManagerInternal mActivityManagerInternal;
private KeyguardManager mKeyguardManager;
private AudioManagerInternal mAudioManagerInternal;
private ContentResolver mContentResolver;
@@ -168,6 +172,7 @@ public MediaSessionService(Context context) {
public void onStart() {
publishBinderService(Context.MEDIA_SESSION_SERVICE, mSessionManagerImpl);
Watchdog.getInstance().addMonitor(this);
+ mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
mAudioManagerInternal = LocalServices.getService(AudioManagerInternal.class);
mAudioPlayerStateMonitor = AudioPlayerStateMonitor.getInstance(mContext);
@@ -493,6 +498,25 @@ private void enforcePackageName(String packageName, int uid) {
throw new IllegalArgumentException("packageName is not owned by the calling process");
}
+ void tempAllowlistTargetPkgIfPossible(int targetUid, String targetPackage,
+ int callingPid, int callingUid, String callingPackage, String reason) {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ enforcePackageName(callingPackage, callingUid);
+ if (targetUid != callingUid
+ && mActivityManagerInternal.canAllowWhileInUsePermissionInFgs(callingPid,
+ callingUid, callingPackage)) {
+ Log.d(TAG, "tempAllowlistTargetPkgIfPossible callingPackage:"
+ + callingPackage + " targetPackage:" + targetPackage
+ + " reason:" + reason);
+ mActivityManagerInternal.tempAllowWhileInUsePermissionInFgs(targetUid,
+ TEMP_ALLOW_WHILE_IN_USE_PERMISSION_IN_FGS_DURATION_MS);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
/**
* Checks a caller's authorization to register an IRemoteControlDisplay.
* Authorization is granted if one of the following is true:
diff --git a/services/core/java/com/android/server/media/MediaShellCommand.java b/services/core/java/com/android/server/media/MediaShellCommand.java
index 20df271a1de2..b199325798f4 100644
--- a/services/core/java/com/android/server/media/MediaShellCommand.java
+++ b/services/core/java/com/android/server/media/MediaShellCommand.java
@@ -64,7 +64,7 @@ public int onCommand(String cmd) {
}
if (sThread == null) {
Looper.prepare();
- sThread = ActivityThread.systemMain();
+ sThread = ActivityThread.currentActivityThread();
Context context = sThread.getSystemContext();
sMediaSessionManager =
(MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 6102706f60b4..eeccb73da3ae 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -3092,23 +3092,19 @@ private void enforceSubscriptionPlanAccess(int subId, int callingUid, String cal
// Verify they're not lying about package name
mAppOps.checkPackage(callingUid, callingPackage);
- final SubscriptionManager sm;
- final SubscriptionInfo si;
final PersistableBundle config;
+ final TelephonyManager tm;
final long token = Binder.clearCallingIdentity();
try {
- sm = mContext.getSystemService(SubscriptionManager.class);
- si = sm.getActiveSubscriptionInfo(subId);
config = mCarrierConfigManager.getConfigForSubId(subId);
+ tm = mContext.getSystemService(TelephonyManager.class);
} finally {
Binder.restoreCallingIdentity(token);
}
- // First check: is caller the CarrierService?
- if (si != null) {
- if (si.isEmbedded() && sm.canManageSubscription(si, callingPackage)) {
- return;
- }
+ // First check: does caller have carrier privilege?
+ if (tm != null && tm.hasCarrierPrivileges(subId)) {
+ return;
}
// Second check: has the CarrierService delegated access?
diff --git a/services/core/java/com/android/server/notification/EventConditionProvider.java b/services/core/java/com/android/server/notification/EventConditionProvider.java
index a4a94c29abfa..25ad9280fa99 100644
--- a/services/core/java/com/android/server/notification/EventConditionProvider.java
+++ b/services/core/java/com/android/server/notification/EventConditionProvider.java
@@ -271,7 +271,7 @@ private void rescheduleAlarm(long now, long time) {
new Intent(ACTION_EVALUATE)
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
.putExtra(EXTRA_TIME, time),
- PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
alarms.cancel(pendingIntent);
if (time == 0 || time < now) {
if (DEBUG) Slog.d(TAG, "Not scheduling evaluate: " + (time == 0 ? "no time specified"
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 0e1a24a0fd90..191a4eb41a32 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -403,6 +403,7 @@ public class NotificationManagerService extends SystemService {
private IActivityManager mAm;
private ActivityTaskManagerInternal mAtm;
private ActivityManager mActivityManager;
+ private ActivityManagerInternal mAmi;
private IPackageManager mPackageManager;
private PackageManager mPackageManagerClient;
AudioManager mAudioManager;
@@ -1876,7 +1877,7 @@ void init(WorkerHandler handler, RankingHandler rankingHandler,
DevicePolicyManagerInternal dpm, IUriGrantsManager ugm,
UriGrantsManagerInternal ugmInternal, AppOpsManager appOps, UserManager userManager,
NotificationHistoryManager historyManager, StatsManager statsManager,
- TelephonyManager telephonyManager) {
+ TelephonyManager telephonyManager, ActivityManagerInternal ami) {
mHandler = handler;
Resources resources = getContext().getResources();
mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(),
@@ -1897,6 +1898,7 @@ void init(WorkerHandler handler, RankingHandler rankingHandler,
mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
mCompanionManager = companionManager;
mActivityManager = activityManager;
+ mAmi = ami;
mDeviceIdleController = IDeviceIdleController.Stub.asInterface(
ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
mDpm = dpm;
@@ -2119,7 +2121,8 @@ null, snoozeHelper, new NotificationUsageStats(getContext()),
new NotificationHistoryManager(getContext(), handler),
mStatsManager = (StatsManager) getContext().getSystemService(
Context.STATS_MANAGER),
- getContext().getSystemService(TelephonyManager.class));
+ getContext().getSystemService(TelephonyManager.class),
+ LocalServices.getService(ActivityManagerInternal.class));
// register for various Intents
IntentFilter filter = new IntentFilter();
@@ -3405,15 +3408,30 @@ public NotificationChannel getNotificationChannelForPackage(String pkg, int uid,
pkg, uid, channelId, conversationId, true, includeDeleted);
}
+ // Returns 'true' if the given channel has a notification associated
+ // with an active foreground service.
+ private void enforceDeletingChannelHasNoFgService(String pkg, int userId,
+ String channelId) {
+ if (mAmi.hasForegroundServiceNotification(pkg, userId, channelId)) {
+ Slog.w(TAG, "Package u" + userId + "/" + pkg
+ + " may not delete notification channel '"
+ + channelId + "' with fg service");
+ throw new SecurityException("Not allowed to delete channel " + channelId
+ + " with a foreground service");
+ }
+ }
+
@Override
public void deleteNotificationChannel(String pkg, String channelId) {
checkCallerIsSystemOrSameApp(pkg);
final int callingUid = Binder.getCallingUid();
+ final int callingUser = UserHandle.getUserId(callingUid);
if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(channelId)) {
throw new IllegalArgumentException("Cannot delete default channel");
}
+ enforceDeletingChannelHasNoFgService(pkg, callingUser, channelId);
cancelAllNotificationsInt(MY_UID, MY_PID, pkg, channelId, 0, 0, true,
- UserHandle.getUserId(callingUid), REASON_CHANNEL_BANNED, null);
+ callingUser, REASON_CHANNEL_BANNED, null);
mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, channelId);
mListeners.notifyNotificationChannelChanged(pkg,
UserHandle.getUserHandleForUid(callingUid),
@@ -3426,19 +3444,23 @@ public void deleteNotificationChannel(String pkg, String channelId) {
public void deleteConversationNotificationChannels(String pkg, int uid,
String conversationId) {
checkCallerIsSystem();
- final int callingUid = Binder.getCallingUid();
List channels =
mPreferencesHelper.getNotificationChannelsByConversationId(
pkg, uid, conversationId);
if (!channels.isEmpty()) {
+ // Preflight for fg service notifications in these channels: do nothing
+ // unless they're all eligible
+ final int appUserId = UserHandle.getUserId(uid);
for (NotificationChannel nc : channels) {
+ final String channelId = nc.getId();
+ mAmi.stopForegroundServicesForChannel(pkg, appUserId, channelId);
cancelAllNotificationsInt(MY_UID, MY_PID, pkg, nc.getId(), 0, 0, true,
- UserHandle.getUserId(callingUid), REASON_CHANNEL_BANNED, null);
- mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, nc.getId());
+ appUserId, REASON_CHANNEL_BANNED, null);
+ mPreferencesHelper.deleteNotificationChannel(pkg, uid, channelId);
mListeners.notifyNotificationChannelChanged(pkg,
- UserHandle.getUserHandleForUid(callingUid),
+ UserHandle.getUserHandleForUid(uid),
mPreferencesHelper.getNotificationChannel(
- pkg, callingUid, nc.getId(), true),
+ pkg, uid, channelId, true),
NOTIFICATION_CHANNEL_OR_GROUP_DELETED);
}
handleSavePolicyFile();
@@ -3469,13 +3491,20 @@ public void deleteNotificationChannelGroup(String pkg, String groupId) {
NotificationChannelGroup groupToDelete =
mPreferencesHelper.getNotificationChannelGroup(groupId, pkg, callingUid);
if (groupToDelete != null) {
+ // Preflight for allowability
+ final int userId = UserHandle.getUserId(callingUid);
+ List groupChannels = groupToDelete.getChannels();
+ for (int i = 0; i < groupChannels.size(); i++) {
+ enforceDeletingChannelHasNoFgService(pkg, userId,
+ groupChannels.get(i).getId());
+ }
List deletedChannels =
mPreferencesHelper.deleteNotificationChannelGroup(pkg, callingUid, groupId);
for (int i = 0; i < deletedChannels.size(); i++) {
final NotificationChannel deletedChannel = deletedChannels.get(i);
cancelAllNotificationsInt(MY_UID, MY_PID, pkg, deletedChannel.getId(), 0, 0,
true,
- UserHandle.getUserId(Binder.getCallingUid()), REASON_CHANNEL_BANNED,
+ userId, REASON_CHANNEL_BANNED,
null);
mListeners.notifyNotificationChannelChanged(pkg,
UserHandle.getUserHandleForUid(callingUid),
@@ -5231,7 +5260,8 @@ private void createAutoGroupSummary(int userId, String pkg, String triggeringKey
Intent appIntent = getContext().getPackageManager().getLaunchIntentForPackage(pkg);
if (appIntent != null) {
summaryNotification.contentIntent = PendingIntent.getActivityAsUser(
- getContext(), 0, appIntent, 0, null, UserHandle.of(userId));
+ getContext(), 0, appIntent, PendingIntent.FLAG_IMMUTABLE, null,
+ UserHandle.of(userId));
}
final StatusBarNotification summarySbn =
new StatusBarNotification(adjustedSbn.getPackageName(),
@@ -5694,7 +5724,7 @@ void enqueueNotificationInternal(final String pkg, final String opPkg, final int
+ " trying to post for invalid pkg " + pkg + " in user " + incomingUserId);
}
- checkRestrictedCategories(notification);
+ checkRestrictedCategories(pkg, notification);
// Fix the notification as best we can.
try {
@@ -6846,11 +6876,12 @@ void scheduleTimeoutLocked(NotificationRecord record) {
final PendingIntent pi = PendingIntent.getBroadcast(getContext(),
REQUEST_CODE_TIMEOUT,
new Intent(ACTION_NOTIFICATION_TIMEOUT)
+ .setPackage(PackageManagerService.PLATFORM_PACKAGE_NAME)
.setData(new Uri.Builder().scheme(SCHEME_TIMEOUT)
.appendPath(record.getKey()).build())
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
.putExtra(EXTRA_KEY, record.getKey()),
- PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
mSystemClock.elapsedRealtime() + record.getNotification().getTimeoutAfter(),
pi);
@@ -7153,15 +7184,7 @@ private boolean playVibration(final NotificationRecord record, long[] vibration,
// so need to check the notification still valide for vibrate.
synchronized (mNotificationLock) {
if (mNotificationsByKey.get(record.getKey()) != null) {
- // Vibrator checks the appops for the op package, not the caller,
- // so we need to add the bypass dnd flag to be heard. it's ok to
- // always add this flag here because we've already checked that we can
- // bypass dnd
- AudioAttributes.Builder aab =
- new AudioAttributes.Builder(record.getAudioAttributes())
- .setFlags(FLAG_BYPASS_INTERRUPTION_POLICY);
- mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getOpPkg(),
- effect, "Notification (delayed)", aab.build());
+ vibrate(record, effect, true);
} else {
Slog.e(TAG, "No vibration for canceled notification : "
+ record.getKey());
@@ -7169,8 +7192,7 @@ private boolean playVibration(final NotificationRecord record, long[] vibration,
}
}).start();
} else {
- mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getPackageName(),
- effect, "Notification", record.getAudioAttributes());
+ vibrate(record, effect, false);
}
return true;
} finally{
@@ -7178,6 +7200,16 @@ private boolean playVibration(final NotificationRecord record, long[] vibration,
}
}
+ private void vibrate(NotificationRecord record, VibrationEffect effect, boolean delayed) {
+ // We need to vibrate as "android" so we can breakthrough DND. VibratorManagerService
+ // doesn't have a concept of vibrating on an app's behalf, so add the app information
+ // to the reason so we can still debug from bugreports
+ String reason = "Notification (" + record.getSbn().getOpPkg() + " "
+ + record.getSbn().getUid() + ") " + (delayed ? "(Delayed)" : "");
+ mVibrator.vibrate(Process.SYSTEM_UID, PackageManagerService.PLATFORM_PACKAGE_NAME,
+ effect, reason, record.getAudioAttributes());
+ }
+
private boolean isNotificationForCurrentUser(NotificationRecord record) {
final int currentUser;
final long token = Binder.clearCallingIdentity();
@@ -8537,7 +8569,7 @@ private boolean isCallerAndroid(String callingPkg, int uid) {
* Check if the notification is of a category type that is restricted to system use only,
* if so throw SecurityException
*/
- private void checkRestrictedCategories(final Notification notification) {
+ private void checkRestrictedCategories(final String pkg, final Notification notification) {
try {
if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0)) {
return;
@@ -8547,10 +8579,24 @@ private void checkRestrictedCategories(final Notification notification) {
+ "restrictions check thus the check will be done anyway");
}
if (Notification.CATEGORY_CAR_EMERGENCY.equals(notification.category)
- || Notification.CATEGORY_CAR_WARNING.equals(notification.category)
- || Notification.CATEGORY_CAR_INFORMATION.equals(notification.category)) {
+ || Notification.CATEGORY_CAR_WARNING.equals(notification.category)) {
checkCallerIsSystem();
}
+
+ if (Notification.CATEGORY_CAR_INFORMATION.equals(notification.category)) {
+ checkCallerIsSystemOrSUW(pkg);
+ }
+ }
+
+ private void checkCallerIsSystemOrSUW(final String pkg) {
+
+ final PackageManagerInternal pmi = LocalServices.getService(
+ PackageManagerInternal.class);
+ String suwPkg = pmi.getSetupWizardPackageName();
+ if (suwPkg != null && suwPkg.equals(pkg)) {
+ return;
+ }
+ checkCallerIsSystem();
}
@VisibleForTesting
diff --git a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
index 961d3db867e9..35170332a077 100644
--- a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
+++ b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
@@ -223,7 +223,7 @@ private void updateAlarm(long now, long time) {
new Intent(ACTION_EVALUATE)
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
.putExtra(EXTRA_TIME, time),
- PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
alarms.cancel(pendingIntent);
if (time > now) {
if (DEBUG) Slog.d(TAG, String.format("Scheduling evaluate for %s, in %s, now=%s",
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index d9d949154ce1..1be8390a8757 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -757,12 +757,15 @@ boolean uninstallApex(String apexPackagePath) {
void registerApkInApex(AndroidPackage pkg) {
synchronized (mLock) {
for (ActiveApexInfo aai : mActiveApexInfosCache) {
- if (pkg.getBaseCodePath().startsWith(aai.apexDirectory.getAbsolutePath())) {
+ if (pkg.getBaseCodePath().startsWith(
+ aai.apexDirectory.getAbsolutePath() + File.separator)) {
List apks = mApksInApex.get(aai.apexModuleName);
if (apks == null) {
apks = Lists.newArrayList();
mApksInApex.put(aai.apexModuleName, apks);
}
+ Slog.i(TAG, "Registering " + pkg.getPackageName() + " as apk-in-apex of "
+ + aai.apexModuleName);
apks.add(pkg.getPackageName());
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 969fa8282b70..ae0d9de17d7a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -20,6 +20,7 @@
import static android.Manifest.permission.INSTALL_PACKAGES;
import static android.Manifest.permission.MANAGE_DEVICE_ADMINS;
import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS;
+import static android.Manifest.permission.QUERY_ALL_PACKAGES;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.REQUEST_DELETE_PACKAGES;
import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
@@ -28,6 +29,7 @@
import static android.app.AppOpsManager.MODE_DEFAULT;
import static android.app.AppOpsManager.MODE_IGNORED;
import static android.content.Intent.ACTION_MAIN;
+import static android.content.Intent.CATEGORY_BROWSABLE;
import static android.content.Intent.CATEGORY_DEFAULT;
import static android.content.Intent.CATEGORY_HOME;
import static android.content.Intent.EXTRA_LONG_VERSION_CODE;
@@ -3671,8 +3673,6 @@ public boolean hasFeature(String feature) {
PackageParser.readConfigUseRoundIcon(mContext.getResources());
mServiceStartWithDelay = SystemClock.uptimeMillis() + (60 * 1000L);
-
- Slog.i(TAG, "Fix for b/169414761 is applied");
}
private void enableComponents(String[] components, boolean enable) {
@@ -6233,6 +6233,10 @@ private static boolean isRecoverSignatureUpdateNeeded(VersionInfo ver) {
@Override
public List getAllPackages() {
+ // Allow iorapd to call this method.
+ if (Binder.getCallingUid() != Process.IORAPD_UID) {
+ enforceSystemOrRootOrShell("getAllPackages is limited to privileged callers");
+ }
final int callingUid = Binder.getCallingUid();
final int callingUserId = UserHandle.getUserId(callingUid);
synchronized (mLock) {
@@ -6511,14 +6515,10 @@ private ResolveInfo resolveIntentInternal(Intent intent, String resolvedType, in
true /*allowDynamicSplits*/);
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
- final boolean queryMayBeFiltered =
- UserHandle.getAppId(filterCallingUid) >= Process.FIRST_APPLICATION_UID
- && !resolveForStart;
-
final ResolveInfo bestChoice =
chooseBestActivity(
intent, resolvedType, flags, privateResolveFlags, query, userId,
- queryMayBeFiltered);
+ queryMayBeFiltered(filterCallingUid, resolveForStart));
final boolean nonBrowserOnly =
(privateResolveFlags & PackageManagerInternal.RESOLVE_NON_BROWSER_ONLY) != 0;
if (nonBrowserOnly && bestChoice != null && bestChoice.handleAllWebDataURI) {
@@ -6530,6 +6530,25 @@ private ResolveInfo resolveIntentInternal(Intent intent, String resolvedType, in
}
}
+ /**
+ * Returns whether the query may be filtered to packages which are visible to the caller.
+ * Filtering occurs except in the following cases:
+ *
+ * - system processes
+ *
- applications granted {@link android.Manifest.permission#QUERY_ALL_PACKAGES}
+ *
- when querying to start an app
+ *
+ *
+ * @param filterCallingUid the UID of the calling application
+ * @param queryForStart whether query is to start an app
+ * @return whether filtering may occur
+ */
+ private boolean queryMayBeFiltered(int filterCallingUid, boolean queryForStart) {
+ return UserHandle.getAppId(filterCallingUid) >= Process.FIRST_APPLICATION_UID
+ && checkUidPermission(QUERY_ALL_PACKAGES, filterCallingUid) != PERMISSION_GRANTED
+ && !queryForStart;
+ }
+
@Override
public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) {
if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.SYSTEM_UID)) {
@@ -6895,7 +6914,7 @@ ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType, i
boolean removeMatches, boolean debug, int userId) {
return findPreferredActivityNotLocked(
intent, resolvedType, flags, query, priority, always, removeMatches, debug, userId,
- UserHandle.getAppId(Binder.getCallingUid()) >= Process.FIRST_APPLICATION_UID);
+ queryMayBeFiltered(Binder.getCallingUid(), /* queryForStart= */ false));
}
// TODO: handle preferred activities missing while user has amnesia
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 7b4e4d94baa2..8ab2b35c6cee 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -168,6 +168,8 @@ public int onCommand(String cmd) {
switch (cmd) {
case "path":
return runPath();
+ case "validate":
+ return runValidate();
case "dump":
return runDump();
case "list":
@@ -322,6 +324,17 @@ public int onCommand(String cmd) {
return -1;
}
+ private int runValidate() {
+ final PrintWriter pw = getOutPrintWriter();
+ String identifier = getNextArgRequired();
+ if ("169414761".equals(identifier)) {
+ pw.println("applied");
+ } else {
+ pw.println("missing");
+ }
+ return 0;
+ }
+
/**
* Shows module info
*
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index b0e43a61ecbf..d174f3e9071c 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -2654,9 +2654,9 @@ private boolean shouldBeHiddenByKeyguard(WindowState win, WindowState imeTarget)
/** {@inheritDoc} */
@Override
- public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme,
- CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon,
- int logo, int windowFlags, Configuration overrideConfig, int displayId) {
+ public StartingSurface addSplashScreen(IBinder appToken, int userId, String packageName,
+ int theme, CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes,
+ int icon, int logo, int windowFlags, Configuration overrideConfig, int displayId) {
if (!SHOW_SPLASH_SCREENS) {
return null;
}
@@ -2683,10 +2683,12 @@ public StartingSurface addSplashScreen(IBinder appToken, String packageName, int
if (theme != context.getThemeResId() || labelRes != 0) {
try {
- context = context.createPackageContext(packageName, CONTEXT_RESTRICTED);
+ context = context.createPackageContextAsUser(packageName, CONTEXT_RESTRICTED,
+ UserHandle.of(userId));
context.setTheme(theme);
} catch (PackageManager.NameNotFoundException e) {
- // Ignore
+ Slog.w(TAG, "Failed creating package context with package name "
+ + packageName + " for user " + userId, e);
}
}
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 7da39ce263c1..e82c871a0d80 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -939,9 +939,9 @@ default int getSubWindowLayerFromTypeLw(int type) {
* @return The starting surface.
*
*/
- public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme,
- CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon,
- int logo, int windowFlags, Configuration overrideConfig, int displayId);
+ public StartingSurface addSplashScreen(IBinder appToken, int userId, String packageName,
+ int theme, CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes,
+ int icon, int logo, int windowFlags, Configuration overrideConfig, int displayId);
/**
* Set or clear a window which can behave as the keyguard.
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 96b53f0baa35..486de39deeb8 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -1565,9 +1565,6 @@ int pullCpuTimePerUidFreqLocked(int atomTag, List pulledData) {
// Aggregate times for the same uids.
SparseArray aggregated = new SparseArray<>();
mCpuUidFreqTimeReader.readAbsolute((uid, cpuFreqTimeMs) -> {
- // For uids known to be aggregated from many entries allow mutating in place to avoid
- // many copies. Otherwise, copy before aggregating.
- boolean mutateInPlace = false;
if (UserHandle.isIsolated(uid)) {
// Skip individual isolated uids because they are recycled and quickly removed from
// the underlying data source.
@@ -1575,26 +1572,18 @@ int pullCpuTimePerUidFreqLocked(int atomTag, List pulledData) {
} else if (UserHandle.isSharedAppGid(uid)) {
// All shared app gids are accounted together.
uid = LAST_SHARED_APPLICATION_GID;
- mutateInPlace = true;
- } else if (UserHandle.isApp(uid)) {
- // Apps are accounted under their app id.
+ } else {
+ // Everything else is accounted under their base uid.
uid = UserHandle.getAppId(uid);
}
long[] aggCpuFreqTimeMs = aggregated.get(uid);
- if (aggCpuFreqTimeMs != null) {
- if (!mutateInPlace) {
- aggCpuFreqTimeMs = Arrays.copyOf(aggCpuFreqTimeMs, cpuFreqTimeMs.length);
- aggregated.put(uid, aggCpuFreqTimeMs);
- }
- for (int freqIndex = 0; freqIndex < cpuFreqTimeMs.length; ++freqIndex) {
- aggCpuFreqTimeMs[freqIndex] += cpuFreqTimeMs[freqIndex];
- }
- } else {
- if (mutateInPlace) {
- cpuFreqTimeMs = Arrays.copyOf(cpuFreqTimeMs, cpuFreqTimeMs.length);
- }
- aggregated.put(uid, cpuFreqTimeMs);
+ if (aggCpuFreqTimeMs == null) {
+ aggCpuFreqTimeMs = new long[cpuFreqTimeMs.length];
+ aggregated.put(uid, aggCpuFreqTimeMs);
+ }
+ for (int freqIndex = 0; freqIndex < cpuFreqTimeMs.length; ++freqIndex) {
+ aggCpuFreqTimeMs[freqIndex] += cpuFreqTimeMs[freqIndex];
}
});
@@ -2621,7 +2610,6 @@ private int pullProcStatsLocked(int section, int atomTag, List pulle
try {
// force procstats to flush & combine old files into one store
long lastHighWaterMark = readProcStatsHighWaterMark(section);
- List statsFiles = new ArrayList<>();
ProtoOutputStream[] protoStreams = new ProtoOutputStream[MAX_PROCSTATS_SHARDS];
for (int i = 0; i < protoStreams.length; i++) {
@@ -2631,7 +2619,7 @@ private int pullProcStatsLocked(int section, int atomTag, List pulle
ProcessStats procStats = new ProcessStats(false);
// Force processStatsService to aggregate all in-storage and in-memory data.
long highWaterMark = processStatsService.getCommittedStatsMerged(
- lastHighWaterMark, section, true, statsFiles, procStats);
+ lastHighWaterMark, section, true, null, procStats);
procStats.dumpAggregatedProtoForStatsd(protoStreams, MAX_PROCSTATS_RAW_SHARD_SIZE);
for (int i = 0; i < protoStreams.length; i++) {
diff --git a/services/core/java/com/android/server/storage/StorageUserConnection.java b/services/core/java/com/android/server/storage/StorageUserConnection.java
index 1c29c69239f6..af2628971bdd 100644
--- a/services/core/java/com/android/server/storage/StorageUserConnection.java
+++ b/services/core/java/com/android/server/storage/StorageUserConnection.java
@@ -23,6 +23,7 @@
import static com.android.server.storage.StorageSessionController.ExternalStorageServiceException;
import android.annotation.MainThread;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Context;
@@ -34,13 +35,12 @@
import android.os.ParcelFileDescriptor;
import android.os.ParcelableException;
import android.os.RemoteCallback;
+import android.os.RemoteException;
import android.os.UserHandle;
-import android.os.UserManagerInternal;
import android.os.storage.StorageManagerInternal;
import android.os.storage.StorageVolume;
import android.service.storage.ExternalStorageService;
import android.service.storage.IExternalStorageService;
-import android.text.TextUtils;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
@@ -48,14 +48,14 @@
import com.android.server.LocalServices;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
/**
* Controls the lifecycle of the {@link ActiveConnection} to an {@link ExternalStorageService}
@@ -66,25 +66,20 @@ public final class StorageUserConnection {
private static final int DEFAULT_REMOTE_TIMEOUT_SECONDS = 20;
- private final Object mLock = new Object();
+ private final Object mSessionsLock = new Object();
private final Context mContext;
private final int mUserId;
private final StorageSessionController mSessionController;
private final ActiveConnection mActiveConnection = new ActiveConnection();
- private final boolean mIsDemoUser;
@GuardedBy("mLock") private final Map mSessions = new HashMap<>();
- @GuardedBy("mLock") @Nullable private HandlerThread mHandlerThread;
+ private final HandlerThread mHandlerThread;
public StorageUserConnection(Context context, int userId, StorageSessionController controller) {
mContext = Objects.requireNonNull(context);
mUserId = Preconditions.checkArgumentNonnegative(userId);
mSessionController = controller;
- mIsDemoUser = LocalServices.getService(UserManagerInternal.class)
- .getUserInfo(userId).isDemo();
- if (mIsDemoUser) {
- mHandlerThread = new HandlerThread("StorageUserConnectionThread-" + mUserId);
- mHandlerThread.start();
- }
+ mHandlerThread = new HandlerThread("StorageUserConnectionThread-" + mUserId);
+ mHandlerThread.start();
}
/**
@@ -101,13 +96,12 @@ public void startSession(String sessionId, ParcelFileDescriptor pfd, String uppe
Objects.requireNonNull(upperPath);
Objects.requireNonNull(lowerPath);
- prepareRemote();
- synchronized (mLock) {
+ Session session = new Session(sessionId, upperPath, lowerPath);
+ synchronized (mSessionsLock) {
Preconditions.checkArgument(!mSessions.containsKey(sessionId));
- Session session = new Session(sessionId, upperPath, lowerPath);
mSessions.put(sessionId, session);
- mActiveConnection.startSessionLocked(session, pfd);
}
+ mActiveConnection.startSession(session, pfd);
}
/**
@@ -121,10 +115,13 @@ public void notifyVolumeStateChanged(String sessionId, StorageVolume vol)
Objects.requireNonNull(sessionId);
Objects.requireNonNull(vol);
- prepareRemote();
- synchronized (mLock) {
- mActiveConnection.notifyVolumeStateChangedLocked(sessionId, vol);
+ synchronized (mSessionsLock) {
+ if (!mSessions.containsKey(sessionId)) {
+ Slog.i(TAG, "No session found for sessionId: " + sessionId);
+ return;
+ }
}
+ mActiveConnection.notifyVolumeStateChanged(sessionId, vol);
}
/**
@@ -135,7 +132,7 @@ public void notifyVolumeStateChanged(String sessionId, StorageVolume vol)
* with {@link #waitForExit}.
**/
public Session removeSession(String sessionId) {
- synchronized (mLock) {
+ synchronized (mSessionsLock) {
return mSessions.remove(sessionId);
}
}
@@ -153,10 +150,7 @@ public void removeSessionAndWait(String sessionId) throws ExternalStorageService
}
Slog.i(TAG, "Waiting for session end " + session + " ...");
- prepareRemote();
- synchronized (mLock) {
- mActiveConnection.endSessionLocked(session);
- }
+ mActiveConnection.endSession(session);
}
/** Restarts all available sessions for a user without blocking.
@@ -164,7 +158,7 @@ public void removeSessionAndWait(String sessionId) throws ExternalStorageService
* Any failures will be ignored.
**/
public void resetUserSessions() {
- synchronized (mLock) {
+ synchronized (mSessionsLock) {
if (mSessions.isEmpty()) {
// Nothing to reset if we have no sessions to restart; we typically
// hit this path if the user was consciously shut down.
@@ -179,7 +173,7 @@ public void resetUserSessions() {
* Removes all sessions, without waiting.
*/
public void removeAllSessions() {
- synchronized (mLock) {
+ synchronized (mSessionsLock) {
Slog.i(TAG, "Removing " + mSessions.size() + " sessions for user: " + mUserId + "...");
mSessions.clear();
}
@@ -191,68 +185,54 @@ public void removeAllSessions() {
*/
public void close() {
mActiveConnection.close();
- if (mIsDemoUser) {
- mHandlerThread.quit();
- }
+ mHandlerThread.quit();
}
/** Returns all created sessions. */
public Set getAllSessionIds() {
- synchronized (mLock) {
+ synchronized (mSessionsLock) {
return new HashSet<>(mSessions.keySet());
}
}
- private void prepareRemote() throws ExternalStorageServiceException {
- try {
- waitForLatch(mActiveConnection.bind(), "remote_prepare_user " + mUserId);
- } catch (IllegalStateException | TimeoutException e) {
- throw new ExternalStorageServiceException("Failed to prepare remote", e);
- }
- }
-
- private void waitForLatch(CountDownLatch latch, String reason) throws TimeoutException {
- try {
- if (!latch.await(DEFAULT_REMOTE_TIMEOUT_SECONDS, TimeUnit.SECONDS)) {
- // TODO(b/140025078): Call ActivityManager ANR API?
- Slog.wtf(TAG, "Failed to bind to the ExternalStorageService for user " + mUserId);
- throw new TimeoutException("Latch wait for " + reason + " elapsed");
- }
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- throw new IllegalStateException("Latch wait for " + reason + " interrupted");
- }
+ @FunctionalInterface
+ interface AsyncStorageServiceCall {
+ void run(@NonNull IExternalStorageService service, RemoteCallback callback) throws
+ RemoteException;
}
private final class ActiveConnection implements AutoCloseable {
+ private final Object mLock = new Object();
+
// Lifecycle connection to the external storage service, needed to unbind.
@GuardedBy("mLock") @Nullable private ServiceConnection mServiceConnection;
- // True if we are connecting, either bound or binding
- // False && mRemote != null means we are connected
- // False && mRemote == null means we are neither connecting nor connected
- @GuardedBy("mLock") @Nullable private boolean mIsConnecting;
- // Binder object representing the external storage service.
- // Non-null indicates we are connected
- @GuardedBy("mLock") @Nullable private IExternalStorageService mRemote;
- // Exception, if any, thrown from #startSessionLocked or #endSessionLocked
- // Local variables cannot be referenced from a lambda expression :( so we
- // save the exception received in the callback here. Since we guard access
- // (and clear the exception state) with the same lock which we hold during
- // the entire transaction, there is no risk of race.
- @GuardedBy("mLock") @Nullable private ParcelableException mLastException;
- // Not guarded by any lock intentionally and non final because we cannot
- // reset latches so need to create a new one after one use
- private CountDownLatch mLatch;
+
+ // A future that holds the remote interface
+ @GuardedBy("mLock")
+ @Nullable private CompletableFuture mRemoteFuture;
+
+ // A list of outstanding futures for async calls, for which we are still waiting
+ // for a callback. Used to unblock waiters if the service dies.
+ @GuardedBy("mLock")
+ private ArrayList> mOutstandingOps = new ArrayList<>();
@Override
public void close() {
ServiceConnection oldConnection = null;
synchronized (mLock) {
Slog.i(TAG, "Closing connection for user " + mUserId);
- mIsConnecting = false;
oldConnection = mServiceConnection;
mServiceConnection = null;
- mRemote = null;
+ if (mRemoteFuture != null) {
+ // Let folks who are waiting for the connection know it ain't gonna happen
+ mRemoteFuture.cancel(true);
+ mRemoteFuture = null;
+ }
+ // Let folks waiting for callbacks from the remote know it ain't gonna happen
+ for (CompletableFuture op : mOutstandingOps) {
+ op.cancel(true);
+ }
+ mOutstandingOps.clear();
}
if (oldConnection != null) {
@@ -266,37 +246,37 @@ public void close() {
}
}
- public boolean isActiveLocked(Session session) {
- if (!session.isInitialisedLocked()) {
- Slog.i(TAG, "Session not initialised " + session);
- return false;
- }
+ private void waitForAsync(AsyncStorageServiceCall asyncCall) throws Exception {
+ CompletableFuture serviceFuture = connectIfNeeded();
+ CompletableFuture opFuture = new CompletableFuture<>();
- if (mRemote == null) {
- throw new IllegalStateException("Valid session with inactive connection");
- }
- return true;
- }
+ try {
+ synchronized (mLock) {
+ mOutstandingOps.add(opFuture);
+ }
+ serviceFuture.thenCompose(service -> {
+ try {
+ asyncCall.run(service,
+ new RemoteCallback(result -> setResult(result, opFuture)));
+ } catch (RemoteException e) {
+ opFuture.completeExceptionally(e);
+ }
- public void startSessionLocked(Session session, ParcelFileDescriptor fd)
- throws ExternalStorageServiceException {
- if (!isActiveLocked(session)) {
- try {
- fd.close();
- } catch (IOException e) {
- // ignore
+ return opFuture;
+ }).get(DEFAULT_REMOTE_TIMEOUT_SECONDS, TimeUnit.SECONDS);
+ } finally {
+ synchronized (mLock) {
+ mOutstandingOps.remove(opFuture);
}
- return;
}
+ }
- CountDownLatch latch = new CountDownLatch(1);
+ public void startSession(Session session, ParcelFileDescriptor fd)
+ throws ExternalStorageServiceException {
try {
- mRemote.startSession(session.sessionId,
+ waitForAsync((service, callback) -> service.startSession(session.sessionId,
FLAG_SESSION_TYPE_FUSE | FLAG_SESSION_ATTRIBUTE_INDEXABLE,
- fd, session.upperPath, session.lowerPath, new RemoteCallback(result ->
- setResultLocked(latch, result)));
- waitForLatch(latch, "start_session " + session);
- maybeThrowExceptionLocked();
+ fd, session.upperPath, session.lowerPath, callback));
} catch (Exception e) {
throw new ExternalStorageServiceException("Failed to start session: " + session, e);
} finally {
@@ -308,73 +288,49 @@ fd, session.upperPath, session.lowerPath, new RemoteCallback(result ->
}
}
- public void endSessionLocked(Session session) throws ExternalStorageServiceException {
- if (!isActiveLocked(session)) {
- // Nothing to end, not started yet
- return;
- }
-
- CountDownLatch latch = new CountDownLatch(1);
+ public void endSession(Session session) throws ExternalStorageServiceException {
try {
- mRemote.endSession(session.sessionId, new RemoteCallback(result ->
- setResultLocked(latch, result)));
- waitForLatch(latch, "end_session " + session);
- maybeThrowExceptionLocked();
+ waitForAsync((service, callback) ->
+ service.endSession(session.sessionId, callback));
} catch (Exception e) {
throw new ExternalStorageServiceException("Failed to end session: " + session, e);
}
}
- public void notifyVolumeStateChangedLocked(String sessionId, StorageVolume vol) throws
+
+ public void notifyVolumeStateChanged(String sessionId, StorageVolume vol) throws
ExternalStorageServiceException {
- CountDownLatch latch = new CountDownLatch(1);
try {
- mRemote.notifyVolumeStateChanged(sessionId, vol, new RemoteCallback(
- result -> setResultLocked(latch, result)));
- waitForLatch(latch, "notify_volume_state_changed " + vol);
- maybeThrowExceptionLocked();
+ waitForAsync((service, callback) ->
+ service.notifyVolumeStateChanged(sessionId, vol, callback));
} catch (Exception e) {
throw new ExternalStorageServiceException("Failed to notify volume state changed "
+ "for vol : " + vol, e);
}
}
- private void setResultLocked(CountDownLatch latch, Bundle result) {
- mLastException = result.getParcelable(EXTRA_ERROR);
- latch.countDown();
- }
-
- private void maybeThrowExceptionLocked() throws IOException {
- if (mLastException != null) {
- ParcelableException lastException = mLastException;
- mLastException = null;
- try {
- lastException.maybeRethrow(IOException.class);
- } catch (IOException e) {
- throw e;
- }
- throw new RuntimeException(lastException);
+ private void setResult(Bundle result, CompletableFuture future) {
+ ParcelableException ex = result.getParcelable(EXTRA_ERROR);
+ if (ex != null) {
+ future.completeExceptionally(ex);
+ } else {
+ future.complete(null);
}
}
- public CountDownLatch bind() throws ExternalStorageServiceException {
+ private CompletableFuture connectIfNeeded() throws
+ ExternalStorageServiceException {
ComponentName name = mSessionController.getExternalStorageServiceComponentName();
if (name == null) {
// Not ready to bind
throw new ExternalStorageServiceException(
"Not ready to bind to the ExternalStorageService for user " + mUserId);
}
-
synchronized (mLock) {
- if (mRemote != null || mIsConnecting) {
- // Connected or connecting (bound or binding)
- // Will wait on a latch that will countdown when we connect, unless we are
- // connected and the latch has already countdown, yay!
- return mLatch;
- } // else neither connected nor connecting
-
- mLatch = new CountDownLatch(1);
- mIsConnecting = true;
+ if (mRemoteFuture != null) {
+ return mRemoteFuture;
+ }
+ CompletableFuture future = new CompletableFuture<>();
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
@@ -406,16 +362,9 @@ public void onNullBinding(ComponentName name) {
private void handleConnection(IBinder service) {
synchronized (mLock) {
- if (mIsConnecting) {
- mRemote = IExternalStorageService.Stub.asInterface(service);
- mIsConnecting = false;
- mLatch.countDown();
- // Separate thread so we don't block the main thead
- return;
- }
+ future.complete(
+ IExternalStorageService.Stub.asInterface(service));
}
- Slog.wtf(TAG, "Connection closed to the ExternalStorageService for user "
- + mUserId);
}
private void handleDisconnection() {
@@ -429,32 +378,19 @@ private void handleDisconnection() {
};
Slog.i(TAG, "Binding to the ExternalStorageService for user " + mUserId);
- if (mIsDemoUser) {
- // Schedule on a worker thread for demo user to avoid deadlock
- if (mContext.bindServiceAsUser(new Intent().setComponent(name),
- mServiceConnection,
- Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
- mHandlerThread.getThreadHandler(),
- UserHandle.of(mUserId))) {
- Slog.i(TAG, "Bound to the ExternalStorageService for user " + mUserId);
- return mLatch;
- } else {
- mIsConnecting = false;
- throw new ExternalStorageServiceException(
- "Failed to bind to the ExternalStorageService for user " + mUserId);
- }
+ // Schedule on a worker thread, because the system server main thread can be
+ // very busy early in boot.
+ if (mContext.bindServiceAsUser(new Intent().setComponent(name),
+ mServiceConnection,
+ Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
+ mHandlerThread.getThreadHandler(),
+ UserHandle.of(mUserId))) {
+ Slog.i(TAG, "Bound to the ExternalStorageService for user " + mUserId);
+ mRemoteFuture = future;
+ return future;
} else {
- if (mContext.bindServiceAsUser(new Intent().setComponent(name),
- mServiceConnection,
- Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
- UserHandle.of(mUserId))) {
- Slog.i(TAG, "Bound to the ExternalStorageService for user " + mUserId);
- return mLatch;
- } else {
- mIsConnecting = false;
- throw new ExternalStorageServiceException(
- "Failed to bind to the ExternalStorageService for user " + mUserId);
- }
+ throw new ExternalStorageServiceException(
+ "Failed to bind to the ExternalStorageService for user " + mUserId);
}
}
}
@@ -476,10 +412,5 @@ public String toString() {
return "[SessionId: " + sessionId + ". UpperPath: " + upperPath + ". LowerPath: "
+ lowerPath + "]";
}
-
- @GuardedBy("mLock")
- public boolean isInitialisedLocked() {
- return !TextUtils.isEmpty(upperPath) && !TextUtils.isEmpty(lowerPath);
- }
}
}
diff --git a/services/core/java/com/android/server/wm/utils/DeviceConfigInterface.java b/services/core/java/com/android/server/utils/DeviceConfigInterface.java
similarity index 90%
rename from services/core/java/com/android/server/wm/utils/DeviceConfigInterface.java
rename to services/core/java/com/android/server/utils/DeviceConfigInterface.java
index ab7e7f63cafd..09da01119634 100644
--- a/services/core/java/com/android/server/wm/utils/DeviceConfigInterface.java
+++ b/services/core/java/com/android/server/utils/DeviceConfigInterface.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.server.wm.utils;
+package com.android.server.utils;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -53,6 +53,11 @@ public interface DeviceConfigInterface {
*/
boolean getBoolean(@NonNull String namespace, @NonNull String name, boolean defaultValue);
+ /**
+ * @see DeviceConfig#getFloat
+ */
+ float getFloat(@NonNull String namespace, @NonNull String name, float defaultValue);
+
/**
* @see DeviceConfig#addOnPropertiesChangedListener
*/
@@ -95,6 +100,12 @@ public boolean getBoolean(@NonNull String namespace, @NonNull String name,
return DeviceConfig.getBoolean(namespace, name, defaultValue);
}
+ @Override
+ public float getFloat(@NonNull String namespace, @NonNull String name,
+ float defaultValue) {
+ return DeviceConfig.getFloat(namespace, name, defaultValue);
+ }
+
@Override
public void addOnPropertiesChangedListener(String namespace, Executor executor,
DeviceConfig.OnPropertiesChangedListener listener) {
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 1300e657333c..aaf27d32452d 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -39,7 +39,7 @@
import android.app.WallpaperInfo;
import android.app.WallpaperManager;
import android.app.WallpaperManager.SetWallpaperFlags;
-import android.app.admin.DevicePolicyManager;
+import android.app.admin.DevicePolicyManagerInternal;
import android.app.backup.WallpaperBackupHelper;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -2861,10 +2861,10 @@ public boolean isSetWallpaperAllowed(String callingPackage) {
if (!uidMatchPackage) {
return false; // callingPackage was faked.
}
-
- // TODO(b/144048540): DPM needs to take into account the userId, not just the package.
- final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
- if (dpm.isDeviceOwnerApp(callingPackage) || dpm.isProfileOwnerApp(callingPackage)) {
+ DevicePolicyManagerInternal devicePolicyManagerInternal =
+ LocalServices.getService(DevicePolicyManagerInternal.class);
+ if (devicePolicyManagerInternal != null &&
+ devicePolicyManagerInternal.isDeviceOrProfileOwnerInCallingUser(callingPackage)) {
return true;
}
final int callingUserId = UserHandle.getCallingUserId();
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index 8f59eef49516..eec2e41eb5db 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -264,7 +264,7 @@ void setLatestLaunchedActivity(ActivityRecord r) {
return;
}
mLastLaunchedActivity = r;
- if (!r.noDisplay) {
+ if (!r.noDisplay && !r.mDrawn) {
if (DEBUG_METRICS) Slog.i(TAG, "Add pending draw " + r);
mPendingDrawActivities.add(r);
}
@@ -546,7 +546,7 @@ void notifyActivityLaunched(@NonNull LaunchingState launchingState, int resultCo
+ " processSwitch=" + processSwitch + " info=" + info);
}
- if (launchedActivity.mDrawn) {
+ if (launchedActivity.mDrawn && launchedActivity.isVisible()) {
// Launched activity is already visible. We cannot measure windows drawn delay.
abort(info, "launched activity already visible");
return;
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 7af237b80cfa..54ad4acaca4c 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -2545,7 +2545,11 @@ private void setTargetStackIfNeeded(ActivityRecord intentActivity) {
private void resumeTargetStackIfNeeded() {
if (mDoResume) {
- mRootWindowContainer.resumeFocusedStacksTopActivities(mTargetStack, null, mOptions);
+ if (mTargetStack.isFocusable()) {
+ mRootWindowContainer.resumeFocusedStacksTopActivities(mTargetStack, null, mOptions);
+ } else {
+ mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
+ }
} else {
ActivityOptions.abort(mOptions);
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index adf0b44040d9..f1b110de37ac 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1513,6 +1513,13 @@ boolean handleTopActivityLaunchingInDifferentOrientation(@NonNull ActivityRecord
}
final int rotation = rotationForActivityInDifferentOrientation(r);
if (rotation == ROTATION_UNDEFINED) {
+ // The display rotation won't be changed by current top activity. The client side
+ // adjustments of previous rotated activity should be cleared earlier. Otherwise if
+ // the current top is in the same process, it may get the rotated state. The transform
+ // will be cleared later with transition callback to ensure smooth animation.
+ if (hasTopFixedRotationLaunchingApp()) {
+ mFixedRotationLaunchingApp.notifyFixedRotationTransform(false /* enabled */);
+ }
return false;
}
if (!r.getParent().matchParentBounds()) {
@@ -5877,6 +5884,11 @@ public void hideInsets(@WindowInsets.Type.InsetsType int types, boolean fromIme)
Slog.w(TAG, "Failed to deliver showInsets", e);
}
}
+
+ @Override
+ public boolean getImeRequestedVisibility(@InternalInsetsType int type) {
+ return getInsetsStateController().getImeSourceProvider().isImeShowing();
+ }
}
/**
diff --git a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java
index c4e03f5c65f5..aa76a07bc9c7 100644
--- a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java
+++ b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java
@@ -16,8 +16,6 @@
package com.android.server.wm;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
-
import static com.android.server.wm.ActivityStack.TAG_VISIBILITY;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY;
@@ -174,12 +172,7 @@ private void setActivityVisibilityState(ActivityRecord r, ActivityRecord startin
}
final int windowingMode = mContiner.getWindowingMode();
- if (windowingMode == WINDOWING_MODE_FREEFORM) {
- // The visibility of tasks and the activities they contain in freeform stack are
- // determined individually unlike other stacks where the visibility or fullscreen
- // status of an activity in a previous task affects other.
- mBehindFullscreenActivity = !mContainerShouldBeVisible;
- } else if (!mBehindFullscreenActivity && mContiner.isActivityTypeHome()
+ if (!mBehindFullscreenActivity && mContiner.isActivityTypeHome()
&& r.isRootOfTask()) {
if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Home task: at " + mContiner
+ " stackShouldBeVisible=" + mContainerShouldBeVisible
diff --git a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java
index d9cf637ffaf8..09ab004b4b3b 100644
--- a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java
+++ b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java
@@ -27,7 +27,7 @@
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
-import com.android.server.wm.utils.DeviceConfigInterface;
+import com.android.server.utils.DeviceConfigInterface;
import java.io.PrintWriter;
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index 5ab48e158c4d..d9dde754b736 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -35,6 +35,7 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
private InsetsControlTarget mImeTargetFromIme;
private Runnable mShowImeRunner;
private boolean mIsImeLayoutDrawn;
+ private boolean mImeShowing;
ImeInsetsSourceProvider(InsetsSource source,
InsetsStateController stateController, DisplayContent displayContent) {
@@ -74,6 +75,7 @@ void scheduleShowImePostLayout(InsetsControlTarget imeTarget) {
ProtoLog.i(WM_DEBUG_IME, "call showInsets(ime) on %s",
target.getWindow() != null ? target.getWindow().getName() : "");
+ setImeShowing(true);
target.showInsets(WindowInsets.Type.ime(), true /* fromIme */);
if (target != mImeTargetFromIme && mImeTargetFromIme != null) {
ProtoLog.w(WM_DEBUG_IME,
@@ -147,11 +149,29 @@ boolean isImeTargetFromDisplayContentAndImeSame() {
@Override
public void dump(PrintWriter pw, String prefix) {
super.dump(pw, prefix);
+ pw.print(prefix);
+ pw.print("mImeShowing=");
+ pw.print(mImeShowing);
if (mImeTargetFromIme != null) {
- pw.print(prefix);
- pw.print("showImePostLayout pending for mImeTargetFromIme=");
+ pw.print(" showImePostLayout pending for mImeTargetFromIme=");
pw.print(mImeTargetFromIme);
- pw.println();
}
+ pw.println();
+ }
+
+ /**
+ * Sets whether the IME is currently supposed to be showing according to
+ * InputMethodManagerService.
+ */
+ public void setImeShowing(boolean imeShowing) {
+ mImeShowing = imeShowing;
+ }
+
+ /**
+ * Returns whether the IME is currently supposed to be showing according to
+ * InputMethodManagerService.
+ */
+ public boolean isImeShowing() {
+ return mImeShowing;
}
}
diff --git a/services/core/java/com/android/server/wm/InsetsControlTarget.java b/services/core/java/com/android/server/wm/InsetsControlTarget.java
index 5e7ed3f80e43..2af2a9792337 100644
--- a/services/core/java/com/android/server/wm/InsetsControlTarget.java
+++ b/services/core/java/com/android/server/wm/InsetsControlTarget.java
@@ -38,6 +38,13 @@ default WindowState getWindow() {
return null;
}
+ /**
+ * @return The requested visibility of this target.
+ */
+ default boolean getImeRequestedVisibility(@InsetsState.InternalInsetsType int type) {
+ return InsetsState.getDefaultVisibility(type);
+ }
+
/**
* @return The requested {@link InsetsState} of this target.
*/
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index be1d0fc0ecc8..d0012d0faf08 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -27,6 +27,7 @@
import static android.view.SyncRtSurfaceTransactionApplier.applyParams;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import android.annotation.Nullable;
import android.app.StatusBarManager;
@@ -128,6 +129,9 @@ void setRemoteInsetsControllerControlsSystemBars(boolean controlsSystemBars) {
/** Updates the target which can control system bars. */
void updateBarControlTarget(@Nullable WindowState focusedWin) {
+ if (focusedWin != null && (focusedWin.mAttrs.type == TYPE_APPLICATION_STARTING)) {
+ return;
+ }
if (mFocusedWin != focusedWin){
abortTransient();
}
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 9fdfbd0a09da..ca83d541a5e8 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -279,7 +279,7 @@ void updateControlForTarget(@Nullable InsetsControlTarget target, boolean force)
}
mAdapter = new ControlAdapter();
if (getSource().getType() == ITYPE_IME) {
- setClientVisible(InsetsState.getDefaultVisibility(mSource.getType()));
+ setClientVisible(target.getImeRequestedVisibility(mSource.getType()));
}
final Transaction t = mDisplayContent.getPendingTransaction();
mWin.startAnimation(t, mAdapter, !mClientVisible /* hidden */,
diff --git a/services/core/java/com/android/server/wm/SplashScreenStartingData.java b/services/core/java/com/android/server/wm/SplashScreenStartingData.java
index 726b7dac6938..f77df2fc06c9 100644
--- a/services/core/java/com/android/server/wm/SplashScreenStartingData.java
+++ b/services/core/java/com/android/server/wm/SplashScreenStartingData.java
@@ -53,8 +53,8 @@ class SplashScreenStartingData extends StartingData {
@Override
StartingSurface createStartingSurface(ActivityRecord activity) {
- return mService.mPolicy.addSplashScreen(activity.token, mPkg, mTheme, mCompatInfo,
- mNonLocalizedLabel, mLabelRes, mIcon, mLogo, mWindowFlags,
+ return mService.mPolicy.addSplashScreen(activity.token, activity.mUserId, mPkg, mTheme,
+ mCompatInfo, mNonLocalizedLabel, mLabelRes, mIcon, mLogo, mWindowFlags,
mMergedOverrideConfiguration, activity.getDisplayContent().getDisplayId());
}
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index db3c74fc94af..b19b8c1ce10b 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -4597,11 +4597,11 @@ boolean setForceHidden(int flags, boolean set) {
}
final boolean wasHidden = isForceHidden();
mForceHiddenFlags = newFlags;
- if (wasHidden && isFocusableAndVisible()) {
- // The change in force-hidden state will change visibility without triggering a stack
- // order change, so we should reset the preferred top focusable stack to ensure it's not
- // used if a new activity is started from this task.
- getDisplayArea().resetPreferredTopFocusableStackIfBelow(this);
+ if (wasHidden != isForceHidden() && isTopActivityFocusable()) {
+ // The change in force-hidden state will change visibility without triggering a root
+ // task order change, so we should reset the preferred top focusable root task to ensure
+ // it's not used if a new activity is started from this task.
+ getDisplayArea().resetPreferredTopFocusableRootTaskIfNeeded(this);
}
return true;
}
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 79f3b8340b21..676d7e507141 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -773,9 +773,10 @@ void onStackRemoved(ActivityStack stack) {
onStackOrderChanged(stack);
}
- void resetPreferredTopFocusableStackIfBelow(Task task) {
+ /** Reset the mPreferredTopFocusableRootTask if it is or below the given task. */
+ void resetPreferredTopFocusableRootTaskIfNeeded(Task task) {
if (mPreferredTopFocusableStack != null
- && mPreferredTopFocusableStack.compareTo(task) < 0) {
+ && mPreferredTopFocusableStack.compareTo(task) <= 0) {
mPreferredTopFocusableStack = null;
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerConstants.java b/services/core/java/com/android/server/wm/WindowManagerConstants.java
index b0c5dbc6cca3..a5ebf9ac74b9 100644
--- a/services/core/java/com/android/server/wm/WindowManagerConstants.java
+++ b/services/core/java/com/android/server/wm/WindowManagerConstants.java
@@ -23,7 +23,7 @@
import android.provider.DeviceConfig;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.wm.utils.DeviceConfigInterface;
+import com.android.server.utils.DeviceConfigInterface;
import java.io.PrintWriter;
import java.util.Objects;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 56c52a4948d9..5cb2b766d8cd 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -282,8 +282,8 @@
import com.android.server.power.ShutdownThread;
import com.android.server.protolog.ProtoLogImpl;
import com.android.server.protolog.common.ProtoLog;
+import com.android.server.utils.DeviceConfigInterface;
import com.android.server.utils.PriorityDump;
-import com.android.server.wm.utils.DeviceConfigInterface;
import java.io.BufferedWriter;
import java.io.DataInputStream;
@@ -7647,6 +7647,9 @@ public void hideIme(IBinder imeTargetWindowToken, int displayId) {
dc.mInputMethodControlTarget.hideInsets(
WindowInsets.Type.ime(), true /* fromIme */);
}
+ if (dc != null) {
+ dc.getInsetsStateController().getImeSourceProvider().setImeShowing(false);
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index df49ac71334f..e6a35f1267b5 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -455,15 +455,13 @@ public void setAllowBackgroundActivityStarts(boolean allowBackgroundActivityStar
mAllowBackgroundActivityStarts = allowBackgroundActivityStarts;
}
- boolean areBackgroundActivityStartsAllowed() {
- // allow if the whitelisting flag was explicitly set
- if (mAllowBackgroundActivityStarts) {
- if (DEBUG_ACTIVITY_STARTS) {
- Slog.d(TAG, "[WindowProcessController(" + mPid
- + ")] Activity start allowed: mAllowBackgroundActivityStarts = true");
- }
- return true;
+ public boolean areBackgroundActivityStartsAllowedByGracePeriodSafe() {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
+ return areBackgroundActivityStartsAllowedByGracePeriod();
}
+ }
+
+ boolean areBackgroundActivityStartsAllowedByGracePeriod() {
// allow if any activity in the caller has either started or finished very recently, and
// it must be started or finished after last stop app switches time.
final long now = SystemClock.uptimeMillis();
@@ -485,8 +483,24 @@ boolean areBackgroundActivityStartsAllowed() {
+ ACTIVITY_BG_START_GRACE_PERIOD_MS
+ "ms grace period but also within stop app switch window");
}
+ }
+ return false;
+ }
+
+ boolean areBackgroundActivityStartsAllowed() {
+ // allow if the whitelisting flag was explicitly set
+ if (mAllowBackgroundActivityStarts) {
+ if (DEBUG_ACTIVITY_STARTS) {
+ Slog.d(TAG, "[WindowProcessController(" + mPid
+ + ")] Activity start allowed: mAllowBackgroundActivityStarts = true");
+ }
+ return true;
+ }
+ if (areBackgroundActivityStartsAllowedByGracePeriod()) {
+ return true;
}
+
// allow if the proc is instrumenting with background activity starts privs
if (mInstrumentingWithBackgroundActivityStartPrivileges) {
if (DEBUG_ACTIVITY_STARTS) {
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index d86f6c998baa..9b1526e9b96f 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -622,11 +622,6 @@ void finishFixedRotationTransform(Runnable applyDisplayRotation) {
state.mIsTransforming = false;
if (applyDisplayRotation != null) {
applyDisplayRotation.run();
- } else {
- // The display will not rotate to the rotation of this container, let's cancel them.
- for (int i = state.mAssociatedTokens.size() - 1; i >= 0; i--) {
- state.mAssociatedTokens.get(i).cancelFixedRotationTransform();
- }
}
// The state is cleared at the end, because it is used to indicate that other windows can
// use seamless rotation when applying rotation to display.
@@ -634,11 +629,15 @@ void finishFixedRotationTransform(Runnable applyDisplayRotation) {
final WindowToken token = state.mAssociatedTokens.get(i);
token.mFixedRotationTransformState = null;
token.notifyFixedRotationTransform(false /* enabled */);
+ if (applyDisplayRotation == null) {
+ // Notify cancellation because the display does not change rotation.
+ token.cancelFixedRotationTransform();
+ }
}
}
/** Notifies application side to enable or disable the rotation adjustment of display info. */
- private void notifyFixedRotationTransform(boolean enabled) {
+ void notifyFixedRotationTransform(boolean enabled) {
FixedRotationAdjustments adjustments = null;
// A token may contain windows of the same processes or different processes. The list is
// used to avoid sending the same adjustments to a process multiple times.
@@ -682,7 +681,6 @@ private void cancelFixedRotationTransform() {
// The window may be detached or detaching.
return;
}
- notifyFixedRotationTransform(false /* enabled */);
final int originalRotation = getWindowConfiguration().getRotation();
onConfigurationChanged(parent.getConfiguration());
onCancelFixedRotationTransform(originalRotation);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index b8a20ed4fe5b..ae354a953eec 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -12839,6 +12839,26 @@ public void resetOp(int op, String packageName, @UserIdInt int userId) {
? AppOpsManager.MODE_ALLOWED
: AppOpsManager.opToDefaultMode(AppOpsManager.OP_INTERACT_ACROSS_PROFILES);
}
+
+ public boolean isDeviceOrProfileOwnerInCallingUser(String packageName) {
+ return isDeviceOwnerInCallingUser(packageName)
+ || isProfileOwnerInCallingUser(packageName);
+ }
+
+ private boolean isDeviceOwnerInCallingUser(String packageName) {
+ final ComponentName deviceOwnerInCallingUser =
+ DevicePolicyManagerService.this.getDeviceOwnerComponent(
+ /* callingUserOnly= */ true);
+ return deviceOwnerInCallingUser != null
+ && packageName.equals(deviceOwnerInCallingUser.getPackageName());
+ }
+
+ private boolean isProfileOwnerInCallingUser(String packageName) {
+ final ComponentName profileOwnerInCallingUser =
+ getProfileOwnerAsUser(UserHandle.getCallingUserId());
+ return profileOwnerInCallingUser != null
+ && packageName.equals(profileOwnerInCallingUser.getPackageName());
+ }
}
private Intent createShowAdminSupportIntent(ComponentName admin, int userId) {
@@ -14461,15 +14481,17 @@ public boolean isBackupServiceEnabled(ComponentName admin) {
}
enforceProfileOrDeviceOwner(admin);
- synchronized (getLockObject()) {
- try {
- IBackupManager ibm = mInjector.getIBackupManager();
- return ibm != null && ibm.isBackupServiceActive(
- mInjector.userHandleGetCallingUserId());
- } catch (RemoteException e) {
- throw new IllegalStateException("Failed requesting backup service state.", e);
+ final int userId = mInjector.userHandleGetCallingUserId();
+ return mInjector.binderWithCleanCallingIdentity(() -> {
+ synchronized (getLockObject()) {
+ try {
+ IBackupManager ibm = mInjector.getIBackupManager();
+ return ibm != null && ibm.isBackupServiceActive(userId);
+ } catch (RemoteException e) {
+ throw new IllegalStateException("Failed requesting backup service state.", e);
+ }
}
- }
+ });
}
@Override
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java
index 96a44a46bbaf..8d245ce4c643 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java
@@ -134,11 +134,11 @@ private ProcessRecord makeProcessRecord(int pid, int uid, int packageUid, String
ApplicationInfo ai = new ApplicationInfo();
ai.packageName = packageName;
ProcessRecord app = new ProcessRecord(mAms, ai, processName, uid);
- app.pid = pid;
+ app.pid = app.mPidForCompact = pid;
app.info.uid = packageUid;
// Exact value does not mater, it can be any state for which compaction is allowed.
app.setProcState = PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
- app.setAdj = 905;
+ app.setAdj = app.mSetAdjForCompact = 905;
return app;
}
diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp
index 979f4e179e95..e57097e48881 100644
--- a/services/tests/servicestests/Android.bp
+++ b/services/tests/servicestests/Android.bp
@@ -48,7 +48,6 @@ android_test {
// TODO: remove once Android migrates to JUnit 4.12,
// which provides assertThrows
"testng",
-
],
aidl: {
@@ -110,6 +109,7 @@ java_library {
"utils/**/*.java",
"utils/**/*.kt",
"utils-mockito/**/*.kt",
+ ":services.core-sources-deviceconfig-interface",
],
static_libs: [
"junit",
@@ -126,6 +126,7 @@ java_library {
"utils/**/*.java",
"utils/**/*.kt",
"utils-mockito/**/*.kt",
+ ":services.core-sources-deviceconfig-interface",
],
static_libs: [
"junit",
diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
index 43a396d8e5d7..faba4e7db99e 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
@@ -16,49 +16,100 @@
package com.android.server.display;
+import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS;
+import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS;
+import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS;
+import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS;
+import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE;
+import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE;
+
+import static com.android.server.display.DisplayModeDirector.Vote.PRIORITY_FLICKER;
+
+import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.internal.verification.VerificationModeFactory.times;
+import android.annotation.NonNull;
+import android.content.ContentResolver;
import android.content.Context;
+import android.content.ContextWrapper;
+import android.database.ContentObserver;
+import android.hardware.Sensor;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
import android.os.Handler;
import android.os.Looper;
+import android.provider.DeviceConfig;
+import android.provider.Settings;
+import android.test.mock.MockContentResolver;
+import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
-import androidx.test.InstrumentationRegistry;
+import androidx.test.core.app.ApplicationProvider;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.internal.util.Preconditions;
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.internal.util.test.FakeSettingsProviderRule;
import com.android.server.display.DisplayModeDirector.BrightnessObserver;
import com.android.server.display.DisplayModeDirector.DesiredDisplayModeSpecs;
import com.android.server.display.DisplayModeDirector.Vote;
+import com.android.server.testutils.FakeDeviceConfigInterface;
import com.google.common.truth.Truth;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class DisplayModeDirectorTest {
// The tolerance within which we consider something approximately equals.
+ private static final String TAG = "DisplayModeDirectorTest";
+ private static final boolean DEBUG = false;
private static final float FLOAT_TOLERANCE = 0.01f;
private Context mContext;
+ private FakesInjector mInjector;
+ private Handler mHandler;
+ @Rule
+ public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ mContext = spy(new ContextWrapper(ApplicationProvider.getApplicationContext()));
+ final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContext);
+ when(mContext.getContentResolver()).thenReturn(resolver);
+ mInjector = new FakesInjector();
+ mHandler = new Handler(Looper.getMainLooper());
}
private DisplayModeDirector createDirectorFromRefreshRateArray(
float[] refreshRates, int baseModeId) {
DisplayModeDirector director =
- new DisplayModeDirector(mContext, new Handler(Looper.getMainLooper()));
+ new DisplayModeDirector(mContext, mHandler, mInjector);
int displayId = 0;
Display.Mode[] modes = new Display.Mode[refreshRates.length];
for (int i = 0; i < refreshRates.length; i++) {
@@ -159,9 +210,9 @@ public void testVotingWithFloatingPointErrors() {
}
@Test
- public void testBrightnessHasLowerPriorityThanUser() {
- assertTrue(Vote.PRIORITY_LOW_BRIGHTNESS < Vote.PRIORITY_APP_REQUEST_REFRESH_RATE);
- assertTrue(Vote.PRIORITY_LOW_BRIGHTNESS < Vote.PRIORITY_APP_REQUEST_SIZE);
+ public void testFlickerHasLowerPriorityThanUser() {
+ assertTrue(PRIORITY_FLICKER < Vote.PRIORITY_APP_REQUEST_REFRESH_RATE);
+ assertTrue(PRIORITY_FLICKER < Vote.PRIORITY_APP_REQUEST_SIZE);
int displayId = 0;
DisplayModeDirector director = createDirectorFromFpsRange(60, 90);
@@ -169,7 +220,7 @@ public void testBrightnessHasLowerPriorityThanUser() {
SparseArray> votesByDisplay = new SparseArray<>();
votesByDisplay.put(displayId, votes);
votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 90));
- votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60));
+ votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(60, 60));
director.injectVotesByDisplay(votesByDisplay);
DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(displayId);
Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60);
@@ -177,7 +228,7 @@ public void testBrightnessHasLowerPriorityThanUser() {
votes.clear();
votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 90));
- votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(90, 90));
+ votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(90, 90));
director.injectVotesByDisplay(votesByDisplay);
desiredSpecs = director.getDesiredDisplayModeSpecs(displayId);
Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90);
@@ -185,7 +236,7 @@ public void testBrightnessHasLowerPriorityThanUser() {
votes.clear();
votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(90, 90));
- votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60));
+ votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(60, 60));
director.injectVotesByDisplay(votesByDisplay);
desiredSpecs = director.getDesiredDisplayModeSpecs(displayId);
Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90);
@@ -193,7 +244,7 @@ public void testBrightnessHasLowerPriorityThanUser() {
votes.clear();
votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 60));
- votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(90, 90));
+ votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(90, 90));
director.injectVotesByDisplay(votesByDisplay);
desiredSpecs = director.getDesiredDisplayModeSpecs(displayId);
Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60);
@@ -202,10 +253,10 @@ public void testBrightnessHasLowerPriorityThanUser() {
@Test
public void testAppRequestRefreshRateRange() {
- // Confirm that the app request range doesn't include low brightness or min refresh rate
- // settings, but does include everything else.
+ // Confirm that the app request range doesn't include flicker or min refresh rate settings,
+ // but does include everything else.
assertTrue(
- Vote.PRIORITY_LOW_BRIGHTNESS < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF);
+ PRIORITY_FLICKER < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF);
assertTrue(Vote.PRIORITY_USER_SETTING_MIN_REFRESH_RATE
< Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF);
assertTrue(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE
@@ -216,7 +267,7 @@ public void testAppRequestRefreshRateRange() {
SparseArray votes = new SparseArray<>();
SparseArray> votesByDisplay = new SparseArray<>();
votesByDisplay.put(displayId, votes);
- votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60));
+ votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(60, 60));
director.injectVotesByDisplay(votesByDisplay);
DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(displayId);
Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60);
@@ -302,4 +353,678 @@ public void testBrightnessObserverCallWithRefreshRateSettings() {
verifyBrightnessObserverCall(director, 90, 90, 0, 90, 90);
verifyBrightnessObserverCall(director, 120, 90, 0, 120, 90);
}
+
+ @Test
+ public void testBrightnessObserverGetsUpdatedRefreshRatesForZone() {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, /* baseModeId= */ 0);
+ SensorManager sensorManager = createMockSensorManager(createLightSensor());
+
+ final int initialRefreshRate = 60;
+ mInjector.getDeviceConfig().setRefreshRateInLowZone(initialRefreshRate);
+ director.start(sensorManager);
+ assertThat(director.getBrightnessObserver().getRefreshRateInLowZone())
+ .isEqualTo(initialRefreshRate);
+
+ final int updatedRefreshRate = 90;
+ mInjector.getDeviceConfig().setRefreshRateInLowZone(updatedRefreshRate);
+ // Need to wait for the property change to propagate to the main thread.
+ waitForIdleSync();
+ assertThat(director.getBrightnessObserver().getRefreshRateInLowZone())
+ .isEqualTo(updatedRefreshRate);
+ }
+
+ @Test
+ public void testBrightnessObserverThresholdsInZone() {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, /* baseModeId= */ 0);
+ SensorManager sensorManager = createMockSensorManager(createLightSensor());
+
+ final int[] initialDisplayThresholds = { 10 };
+ final int[] initialAmbientThresholds = { 20 };
+
+ final FakeDeviceConfig config = mInjector.getDeviceConfig();
+ config.setLowDisplayBrightnessThresholds(initialDisplayThresholds);
+ config.setLowAmbientBrightnessThresholds(initialAmbientThresholds);
+ director.start(sensorManager);
+
+ assertThat(director.getBrightnessObserver().getLowDisplayBrightnessThresholds())
+ .isEqualTo(initialDisplayThresholds);
+ assertThat(director.getBrightnessObserver().getLowAmbientBrightnessThresholds())
+ .isEqualTo(initialAmbientThresholds);
+
+ final int[] updatedDisplayThresholds = { 9, 14 };
+ final int[] updatedAmbientThresholds = { -1, 19 };
+ config.setLowDisplayBrightnessThresholds(updatedDisplayThresholds);
+ config.setLowAmbientBrightnessThresholds(updatedAmbientThresholds);
+ // Need to wait for the property change to propagate to the main thread.
+ waitForIdleSync();
+ assertThat(director.getBrightnessObserver().getLowDisplayBrightnessThresholds())
+ .isEqualTo(updatedDisplayThresholds);
+ assertThat(director.getBrightnessObserver().getLowAmbientBrightnessThresholds())
+ .isEqualTo(updatedAmbientThresholds);
+ }
+
+ @Test
+ public void testLockFpsForLowZone() throws Exception {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
+ setPeakRefreshRate(90);
+ director.getSettingsObserver().setDefaultRefreshRate(90);
+ director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
+
+ final FakeDeviceConfig config = mInjector.getDeviceConfig();
+ config.setRefreshRateInLowZone(90);
+ config.setLowDisplayBrightnessThresholds(new int[] { 10 });
+ config.setLowAmbientBrightnessThresholds(new int[] { 20 });
+
+ Sensor lightSensor = createLightSensor();
+ SensorManager sensorManager = createMockSensorManager(lightSensor);
+
+ director.start(sensorManager);
+
+ ArgumentCaptor listenerCaptor =
+ ArgumentCaptor.forClass(SensorEventListener.class);
+ Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
+ .registerListener(
+ listenerCaptor.capture(),
+ eq(lightSensor),
+ anyInt(),
+ any(Handler.class));
+ SensorEventListener listener = listenerCaptor.getValue();
+
+ setBrightness(10);
+ // Sensor reads 20 lux,
+ listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 20 /*lux*/));
+
+ Vote vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
+ assertVoteForRefreshRateLocked(vote, 90 /*fps*/);
+
+ setBrightness(125);
+ // Sensor reads 1000 lux,
+ listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 1000 /*lux*/));
+
+ vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
+ assertThat(vote).isNull();
+ }
+
+ @Test
+ public void testLockFpsForHighZone() throws Exception {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
+ setPeakRefreshRate(90 /*fps*/);
+ director.getSettingsObserver().setDefaultRefreshRate(90);
+ director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
+
+ final FakeDeviceConfig config = mInjector.getDeviceConfig();
+ config.setRefreshRateInHighZone(60);
+ config.setHighDisplayBrightnessThresholds(new int[] { 255 });
+ config.setHighAmbientBrightnessThresholds(new int[] { 8000 });
+
+ Sensor lightSensor = createLightSensor();
+ SensorManager sensorManager = createMockSensorManager(lightSensor);
+
+ director.start(sensorManager);
+
+ ArgumentCaptor listenerCaptor =
+ ArgumentCaptor.forClass(SensorEventListener.class);
+ Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
+ .registerListener(
+ listenerCaptor.capture(),
+ eq(lightSensor),
+ anyInt(),
+ any(Handler.class));
+ SensorEventListener listener = listenerCaptor.getValue();
+
+ setBrightness(100);
+ // Sensor reads 2000 lux,
+ listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 2000));
+
+ Vote vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
+ assertThat(vote).isNull();
+
+ setBrightness(255);
+ // Sensor reads 9000 lux,
+ listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 9000));
+
+ vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
+ assertVoteForRefreshRateLocked(vote, 60 /*fps*/);
+ }
+
+ @Test
+ public void testSensorRegistration() {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
+ setPeakRefreshRate(90 /*fps*/);
+ director.getSettingsObserver().setDefaultRefreshRate(90);
+ director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
+
+ Sensor lightSensor = createLightSensor();
+ SensorManager sensorManager = createMockSensorManager(lightSensor);
+
+ director.start(sensorManager);
+ ArgumentCaptor listenerCaptor =
+ ArgumentCaptor.forClass(SensorEventListener.class);
+ Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
+ .registerListener(
+ listenerCaptor.capture(),
+ eq(lightSensor),
+ anyInt(),
+ any(Handler.class));
+
+ // Dispaly state changed from On to Doze
+ director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_DOZE);
+ Mockito.verify(sensorManager)
+ .unregisterListener(listenerCaptor.capture());
+
+ // Dispaly state changed from Doze to On
+ director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
+ Mockito.verify(sensorManager, times(2))
+ .registerListener(
+ listenerCaptor.capture(),
+ eq(lightSensor),
+ anyInt(),
+ any(Handler.class));
+
+ }
+
+ private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) {
+ assertThat(vote).isNotNull();
+ final DisplayModeDirector.RefreshRateRange expectedRange =
+ new DisplayModeDirector.RefreshRateRange(refreshRate, refreshRate);
+ assertThat(vote.refreshRateRange).isEqualTo(expectedRange);
+ }
+
+ private static class FakeDeviceConfig extends FakeDeviceConfigInterface {
+ @Override
+ public String getProperty(String namespace, String name) {
+ Preconditions.checkArgument(DeviceConfig.NAMESPACE_DISPLAY_MANAGER.equals(namespace));
+ return super.getProperty(namespace, name);
+ }
+
+ @Override
+ public void addOnPropertiesChangedListener(
+ String namespace,
+ Executor executor,
+ DeviceConfig.OnPropertiesChangedListener listener) {
+ Preconditions.checkArgument(DeviceConfig.NAMESPACE_DISPLAY_MANAGER.equals(namespace));
+ super.addOnPropertiesChangedListener(namespace, executor, listener);
+ }
+
+ void setRefreshRateInLowZone(int fps) {
+ putPropertyAndNotify(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_LOW_ZONE,
+ String.valueOf(fps));
+ }
+
+ void setLowDisplayBrightnessThresholds(int[] brightnessThresholds) {
+ String thresholds = toPropertyValue(brightnessThresholds);
+
+ if (DEBUG) {
+ Slog.e(TAG, "Brightness Thresholds = " + thresholds);
+ }
+
+ putPropertyAndNotify(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS,
+ thresholds);
+ }
+
+ void setLowAmbientBrightnessThresholds(int[] ambientThresholds) {
+ String thresholds = toPropertyValue(ambientThresholds);
+
+ if (DEBUG) {
+ Slog.e(TAG, "Ambient Thresholds = " + thresholds);
+ }
+
+ putPropertyAndNotify(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS,
+ thresholds);
+ }
+
+ void setRefreshRateInHighZone(int fps) {
+ putPropertyAndNotify(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_HIGH_ZONE,
+ String.valueOf(fps));
+ }
+
+ void setHighDisplayBrightnessThresholds(int[] brightnessThresholds) {
+ String thresholds = toPropertyValue(brightnessThresholds);
+
+ if (DEBUG) {
+ Slog.e(TAG, "Brightness Thresholds = " + thresholds);
+ }
+
+ putPropertyAndNotify(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS,
+ thresholds);
+ }
+
+ void setHighAmbientBrightnessThresholds(int[] ambientThresholds) {
+ String thresholds = toPropertyValue(ambientThresholds);
+
+ if (DEBUG) {
+ Slog.e(TAG, "Ambient Thresholds = " + thresholds);
+ }
+
+ putPropertyAndNotify(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS,
+ thresholds);
+ }
+
+ @NonNull
+ private static String toPropertyValue(@NonNull int[] intArray) {
+ return Arrays.stream(intArray)
+ .mapToObj(Integer::toString)
+ .collect(Collectors.joining(","));
+ }
+ }
+
+ private void setBrightness(int brightness) {
+ Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,
+ brightness);
+ mInjector.notifyBrightnessChanged();
+ waitForIdleSync();
+ }
+
+ private void setPeakRefreshRate(float fps) {
+ Settings.System.putFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE,
+ fps);
+ mInjector.notifyPeakRefreshRateChanged();
+ waitForIdleSync();
+ }
+
+ private static SensorManager createMockSensorManager(Sensor... sensors) {
+ SensorManager sensorManager = Mockito.mock(SensorManager.class);
+ when(sensorManager.getSensorList(anyInt())).then((invocation) -> {
+ List requestedSensors = new ArrayList<>();
+ int type = invocation.getArgument(0);
+ for (Sensor sensor : sensors) {
+ if (sensor.getType() == type || type == Sensor.TYPE_ALL) {
+ requestedSensors.add(sensor);
+ }
+ }
+ return requestedSensors;
+ });
+
+ when(sensorManager.getDefaultSensor(anyInt())).then((invocation) -> {
+ int type = invocation.getArgument(0);
+ for (Sensor sensor : sensors) {
+ if (sensor.getType() == type) {
+ return sensor;
+ }
+ }
+ return null;
+ });
+ return sensorManager;
+ }
+
+ private static Sensor createLightSensor() {
+ try {
+ return TestUtils.createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT);
+ } catch (Exception e) {
+ // There's nothing we can do if this fails, just throw a RuntimeException so that we
+ // don't have to mark every function that might call this as throwing Exception
+ throw new RuntimeException("Failed to create a light sensor", e);
+ }
+ }
+
+ private void waitForIdleSync() {
+ mHandler.runWithScissors(() -> { }, 500 /*timeout*/);
+ }
+
+ static class FakesInjector implements DisplayModeDirector.Injector {
+ private final FakeDeviceConfig mDeviceConfig;
+ private ContentObserver mBrightnessObserver;
+ private ContentObserver mPeakRefreshRateObserver;
+
+ FakesInjector() {
+ mDeviceConfig = new FakeDeviceConfig();
+ }
+
+ @NonNull
+ public FakeDeviceConfig getDeviceConfig() {
+ return mDeviceConfig;
+ }
+
+ @Override
+ public void registerBrightnessObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ if (mBrightnessObserver != null) {
+ throw new IllegalStateException("Tried to register a second brightness observer");
+ }
+ mBrightnessObserver = observer;
+ }
+
+ @Override
+ public void unregisterBrightnessObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ mBrightnessObserver = null;
+ }
+
+ void notifyBrightnessChanged() {
+ if (mBrightnessObserver != null) {
+ mBrightnessObserver.dispatchChange(false /*selfChange*/, DISPLAY_BRIGHTNESS_URI);
+ }
+ }
+
+ @Override
+ public void registerPeakRefreshRateObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ mPeakRefreshRateObserver = observer;
+ }
+
+ void notifyPeakRefreshRateChanged() {
+ if (mPeakRefreshRateObserver != null) {
+ mPeakRefreshRateObserver.dispatchChange(false /*selfChange*/,
+ PEAK_REFRESH_RATE_URI);
+ }
+ }
+ }
+
+ @Test
+ public void testBrightnessObserverGetsUpdatedRefreshRatesForZone() {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, /* baseModeId= */ 0);
+ SensorManager sensorManager = createMockSensorManager(createLightSensor());
+
+ final int initialRefreshRate = 60;
+ mInjector.getDeviceConfig().setRefreshRateInLowZone(initialRefreshRate);
+ director.start(sensorManager);
+ assertThat(director.getBrightnessObserver().getRefreshRateInLowZone())
+ .isEqualTo(initialRefreshRate);
+
+ final int updatedRefreshRate = 90;
+ mInjector.getDeviceConfig().setRefreshRateInLowZone(updatedRefreshRate);
+ // Need to wait for the property change to propagate to the main thread.
+ waitForIdleSync();
+ assertThat(director.getBrightnessObserver().getRefreshRateInLowZone())
+ .isEqualTo(updatedRefreshRate);
+ }
+
+ @Test
+ public void testBrightnessObserverThresholdsInZone() {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, /* baseModeId= */ 0);
+ SensorManager sensorManager = createMockSensorManager(createLightSensor());
+
+ final int[] initialDisplayThresholds = { 10 };
+ final int[] initialAmbientThresholds = { 20 };
+
+ final FakeDeviceConfig config = mInjector.getDeviceConfig();
+ config.setLowDisplayBrightnessThresholds(initialDisplayThresholds);
+ config.setLowAmbientBrightnessThresholds(initialAmbientThresholds);
+ director.start(sensorManager);
+
+ assertThat(director.getBrightnessObserver().getLowDisplayBrightnessThresholds())
+ .isEqualTo(initialDisplayThresholds);
+ assertThat(director.getBrightnessObserver().getLowAmbientBrightnessThresholds())
+ .isEqualTo(initialAmbientThresholds);
+
+ final int[] updatedDisplayThresholds = { 9, 14 };
+ final int[] updatedAmbientThresholds = { -1, 19 };
+ config.setLowDisplayBrightnessThresholds(updatedDisplayThresholds);
+ config.setLowAmbientBrightnessThresholds(updatedAmbientThresholds);
+ // Need to wait for the property change to propagate to the main thread.
+ waitForIdleSync();
+ assertThat(director.getBrightnessObserver().getLowDisplayBrightnessThresholds())
+ .isEqualTo(updatedDisplayThresholds);
+ assertThat(director.getBrightnessObserver().getLowAmbientBrightnessThresholds())
+ .isEqualTo(updatedAmbientThresholds);
+ }
+
+ @Test
+ public void testLockFpsForLowZone() throws Exception {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
+ setPeakRefreshRate(90);
+ director.getSettingsObserver().setDefaultRefreshRate(90);
+ director.getBrightnessObserver().setDefaultDisplayState(true);
+
+ final FakeDeviceConfig config = mInjector.getDeviceConfig();
+ config.setRefreshRateInLowZone(90);
+ config.setLowDisplayBrightnessThresholds(new int[] { 10 });
+ config.setLowAmbientBrightnessThresholds(new int[] { 20 });
+
+ Sensor lightSensor = createLightSensor();
+ SensorManager sensorManager = createMockSensorManager(lightSensor);
+
+ director.start(sensorManager);
+
+ ArgumentCaptor listenerCaptor =
+ ArgumentCaptor.forClass(SensorEventListener.class);
+ Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
+ .registerListener(
+ listenerCaptor.capture(),
+ eq(lightSensor),
+ anyInt(),
+ any(Handler.class));
+ SensorEventListener listener = listenerCaptor.getValue();
+
+ setBrightness(10);
+ // Sensor reads 20 lux,
+ listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 20 /*lux*/));
+
+ Vote vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
+ assertVoteForRefreshRateLocked(vote, 90 /*fps*/);
+
+ setBrightness(125);
+ // Sensor reads 1000 lux,
+ listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 1000 /*lux*/));
+
+ vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
+ assertThat(vote).isNull();
+ }
+
+ @Test
+ public void testLockFpsForHighZone() throws Exception {
+ DisplayModeDirector director =
+ createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
+ setPeakRefreshRate(90 /*fps*/);
+ director.getSettingsObserver().setDefaultRefreshRate(90);
+ director.getBrightnessObserver().setDefaultDisplayState(true);
+ director.updateSettingForHighZone(60, new int[] {255}, new int[] {8000});
+
+ Sensor lightSensor = createLightSensor();
+ SensorManager sensorManager = createMockSensorManager(lightSensor);
+
+ director.start(sensorManager);
+
+ ArgumentCaptor listenerCaptor =
+ ArgumentCaptor.forClass(SensorEventListener.class);
+ Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
+ .registerListener(
+ listenerCaptor.capture(),
+ eq(lightSensor),
+ anyInt(),
+ any(Handler.class));
+ SensorEventListener listener = listenerCaptor.getValue();
+
+ setBrightness(100);
+ // Sensor reads 2000 lux,
+ listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 2000));
+
+ Vote vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
+ assertThat(vote).isNull();
+
+ setBrightness(255);
+ // Sensor reads 9000 lux,
+ listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 9000));
+
+ vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER);
+ assertVoteForRefreshRateLocked(vote, 60 /*fps*/);
+ }
+
+ private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) {
+ assertThat(vote).isNotNull();
+ final DisplayModeDirector.RefreshRateRange expectedRange =
+ new DisplayModeDirector.RefreshRateRange(refreshRate, refreshRate);
+ assertThat(vote.refreshRateRange).isEqualTo(expectedRange);
+ }
+
+ private static class FakeDeviceConfig extends FakeDeviceConfigInterface {
+ @Override
+ public String getProperty(String namespace, String name) {
+ Preconditions.checkArgument(DeviceConfig.NAMESPACE_DISPLAY_MANAGER.equals(namespace));
+ return super.getProperty(namespace, name);
+ }
+
+ @Override
+ public void addOnPropertiesChangedListener(
+ String namespace,
+ Executor executor,
+ DeviceConfig.OnPropertiesChangedListener listener) {
+ Preconditions.checkArgument(DeviceConfig.NAMESPACE_DISPLAY_MANAGER.equals(namespace));
+ super.addOnPropertiesChangedListener(namespace, executor, listener);
+ }
+
+ void setRefreshRateInLowZone(int fps) {
+ putPropertyAndNotify(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_ZONE,
+ String.valueOf(fps));
+ }
+
+ void setLowDisplayBrightnessThresholds(int[] brightnessThresholds) {
+ String thresholds = toPropertyValue(brightnessThresholds);
+
+ if (DEBUG) {
+ Slog.e(TAG, "Brightness Thresholds = " + thresholds);
+ }
+
+ putPropertyAndNotify(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS,
+ thresholds);
+ }
+
+ void setLowAmbientBrightnessThresholds(int[] ambientThresholds) {
+ String thresholds = toPropertyValue(ambientThresholds);
+
+ if (DEBUG) {
+ Slog.e(TAG, "Ambient Thresholds = " + thresholds);
+ }
+
+ putPropertyAndNotify(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS,
+ thresholds);
+ }
+
+ @NonNull
+ private static String toPropertyValue(@NonNull int[] intArray) {
+ return Arrays.stream(intArray)
+ .mapToObj(Integer::toString)
+ .collect(Collectors.joining(","));
+ }
+ }
+
+ private void setBrightness(int brightness) {
+ Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,
+ brightness);
+ mInjector.notifyBrightnessChanged();
+ waitForIdleSync();
+ }
+
+ private void setPeakRefreshRate(float fps) {
+ Settings.System.putFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE,
+ fps);
+ mInjector.notifyPeakRefreshRateChanged();
+ waitForIdleSync();
+ }
+
+ private static SensorManager createMockSensorManager(Sensor... sensors) {
+ SensorManager sensorManager = Mockito.mock(SensorManager.class);
+ when(sensorManager.getSensorList(anyInt())).then((invocation) -> {
+ List requestedSensors = new ArrayList<>();
+ int type = invocation.getArgument(0);
+ for (Sensor sensor : sensors) {
+ if (sensor.getType() == type || type == Sensor.TYPE_ALL) {
+ requestedSensors.add(sensor);
+ }
+ }
+ return requestedSensors;
+ });
+
+ when(sensorManager.getDefaultSensor(anyInt())).then((invocation) -> {
+ int type = invocation.getArgument(0);
+ for (Sensor sensor : sensors) {
+ if (sensor.getType() == type) {
+ return sensor;
+ }
+ }
+ return null;
+ });
+ return sensorManager;
+ }
+
+ private static Sensor createLightSensor() {
+ try {
+ return TestUtils.createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT);
+ } catch (Exception e) {
+ // There's nothing we can do if this fails, just throw a RuntimeException so that we
+ // don't have to mark every function that might call this as throwing Exception
+ throw new RuntimeException("Failed to create a light sensor", e);
+ }
+ }
+
+ private void waitForIdleSync() {
+ mHandler.runWithScissors(() -> { }, 500 /*timeout*/);
+ }
+
+ static class FakesInjector implements DisplayModeDirector.Injector {
+ private final FakeDeviceConfig mDeviceConfig;
+ private ContentObserver mBrightnessObserver;
+ private ContentObserver mPeakRefreshRateObserver;
+
+ FakesInjector() {
+ mDeviceConfig = new FakeDeviceConfig();
+ }
+
+ @NonNull
+ public FakeDeviceConfig getDeviceConfig() {
+ return mDeviceConfig;
+ }
+
+ @Override
+ public void registerBrightnessObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ if (mBrightnessObserver != null) {
+ throw new IllegalStateException("Tried to register a second brightness observer");
+ }
+ mBrightnessObserver = observer;
+ }
+
+ @Override
+ public void unregisterBrightnessObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ mBrightnessObserver = null;
+ }
+
+ void notifyBrightnessChanged() {
+ if (mBrightnessObserver != null) {
+ mBrightnessObserver.dispatchChange(false /*selfChange*/, DISPLAY_BRIGHTNESS_URI);
+ }
+ }
+
+ @Override
+ public void registerPeakRefreshRateObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ mPeakRefreshRateObserver = observer;
+ }
+
+ void notifyPeakRefreshRateChanged() {
+ if (mPeakRefreshRateObserver != null) {
+ mPeakRefreshRateObserver.dispatchChange(false /*selfChange*/,
+ PEAK_REFRESH_RATE_URI);
+ }
+ }
+
+ @Override
+ public boolean isDeviceInteractive(@NonNull Context context) {
+ return true;
+ }
+ }
}
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 2c2fdcaab340..f33f9ed1337c 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
@@ -246,7 +246,8 @@ public void testTokenBasedResetPassword() throws RemoteException {
assertFalse(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
assertTrue(mService.hasPendingEscrowToken(PRIMARY_USER_ID));
- mService.verifyCredential(password, 0, PRIMARY_USER_ID).getResponseCode();
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential(
+ password, 0, PRIMARY_USER_ID).getResponseCode());
assertTrue(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
assertFalse(mService.hasPendingEscrowToken(PRIMARY_USER_ID));
@@ -275,7 +276,8 @@ public void testTokenBasedClearPassword() throws RemoteException {
long handle = mLocalService.addEscrowToken(token, PRIMARY_USER_ID, null);
assertFalse(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
- mService.verifyCredential(password, 0, PRIMARY_USER_ID).getResponseCode();
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential(
+ password, 0, PRIMARY_USER_ID).getResponseCode());
assertTrue(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
mLocalService.setLockCredentialWithToken(nonePassword(), handle, token, PRIMARY_USER_ID);
@@ -301,7 +303,8 @@ public void testTokenBasedResetPasswordAfterCredentialChanges() throws RemoteExc
long handle = mLocalService.addEscrowToken(token, PRIMARY_USER_ID, null);
assertFalse(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
- mService.verifyCredential(password, 0, PRIMARY_USER_ID).getResponseCode();
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential(
+ password, 0, PRIMARY_USER_ID).getResponseCode());
assertTrue(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
mService.setLockCredential(pattern, password, PRIMARY_USER_ID);
@@ -376,6 +379,36 @@ public void testEscrowTokenCannotBeActivatedOnUnmanagedUser() {
} catch (SecurityException expected) { }
}
+ @Test
+ public void testActivateMultipleEscrowTokens() throws Exception {
+ byte[] token0 = "some-high-entropy-secure-token-0".getBytes();
+ byte[] token1 = "some-high-entropy-secure-token-1".getBytes();
+ byte[] token2 = "some-high-entropy-secure-token-2".getBytes();
+
+ LockscreenCredential password = newPassword("password");
+ LockscreenCredential pattern = newPattern("123654");
+ initializeCredentialUnderSP(password, PRIMARY_USER_ID);
+
+ long handle0 = mLocalService.addEscrowToken(token0, PRIMARY_USER_ID, null);
+ long handle1 = mLocalService.addEscrowToken(token1, PRIMARY_USER_ID, null);
+ long handle2 = mLocalService.addEscrowToken(token2, PRIMARY_USER_ID, null);
+
+ // Activate token
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential(
+ password, 0, PRIMARY_USER_ID).getResponseCode());
+
+ // Verify tokens work
+ assertTrue(mLocalService.isEscrowTokenActive(handle0, PRIMARY_USER_ID));
+ assertTrue(mLocalService.setLockCredentialWithToken(
+ pattern, handle0, token0, PRIMARY_USER_ID));
+ assertTrue(mLocalService.isEscrowTokenActive(handle1, PRIMARY_USER_ID));
+ assertTrue(mLocalService.setLockCredentialWithToken(
+ pattern, handle1, token1, PRIMARY_USER_ID));
+ assertTrue(mLocalService.isEscrowTokenActive(handle2, PRIMARY_USER_ID));
+ assertTrue(mLocalService.setLockCredentialWithToken(
+ pattern, handle2, token2, PRIMARY_USER_ID));
+ }
+
@Test
public void testSetLockCredentialWithTokenFailsWithoutLockScreen() throws Exception {
LockscreenCredential password = newPassword("password");
@@ -503,7 +536,8 @@ public void testUnlockUserWithToken() throws Exception {
reset(mDevicePolicyManager);
long handle = mLocalService.addEscrowToken(token, PRIMARY_USER_ID, null);
- mService.verifyCredential(password, 0, PRIMARY_USER_ID).getResponseCode();
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential(
+ password, 0, PRIMARY_USER_ID).getResponseCode());
assertTrue(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
mService.onCleanupUser(PRIMARY_USER_ID);
diff --git a/services/tests/wmtests/src/com/android/server/wm/utils/FakeDeviceConfigInterface.java b/services/tests/servicestests/utils/com/android/server/testutils/FakeDeviceConfigInterface.java
similarity index 92%
rename from services/tests/wmtests/src/com/android/server/wm/utils/FakeDeviceConfigInterface.java
rename to services/tests/servicestests/utils/com/android/server/testutils/FakeDeviceConfigInterface.java
index 2904a5b73646..a67f64596ef5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/utils/FakeDeviceConfigInterface.java
+++ b/services/tests/servicestests/utils/com/android/server/testutils/FakeDeviceConfigInterface.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.server.wm.utils;
+package com.android.server.testutils;
import android.annotation.NonNull;
import android.provider.DeviceConfig;
@@ -22,6 +22,7 @@
import android.util.Pair;
import com.android.internal.util.Preconditions;
+import com.android.server.utils.DeviceConfigInterface;
import java.lang.reflect.Constructor;
import java.util.HashMap;
@@ -121,6 +122,19 @@ public long getLong(String namespace, String name, long defaultValue) {
}
}
+ @Override
+ public float getFloat(String namespace, String name, float defaultValue) {
+ String value = getProperty(namespace, name);
+ if (value == null) {
+ return defaultValue;
+ }
+ try {
+ return Float.parseFloat(value);
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ }
+
@Override
public boolean getBoolean(String namespace, String name, boolean defaultValue) {
String value = getProperty(namespace, name);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
index 2e0f1992478d..cfda07c55208 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -57,6 +57,7 @@
import android.media.AudioManager;
import android.net.Uri;
import android.os.Handler;
+import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.VibrationEffect;
@@ -77,10 +78,12 @@
import com.android.internal.util.IntPair;
import com.android.server.UiServiceTestCase;
import com.android.server.lights.LogicalLight;
+import com.android.server.pm.PackageManagerService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.Mockito;
@@ -407,12 +410,17 @@ private void verifyNeverVibrate() {
}
private void verifyVibrate() {
+ ArgumentCaptor captor = ArgumentCaptor.forClass(AudioAttributes.class);
verify(mVibrator, times(1)).vibrate(anyInt(), anyString(), argThat(mVibrateOnceMatcher),
- anyString(), any());
+ anyString(), captor.capture());
+ assertEquals(0, (captor.getValue().getAllFlags()
+ & AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY));
}
private void verifyVibrate(int times) {
- verify(mVibrator, times(times)).vibrate(anyInt(), anyString(), any(), anyString(), any());
+ verify(mVibrator, times(times)).vibrate(eq(Process.SYSTEM_UID),
+ eq(PackageManagerService.PLATFORM_PACKAGE_NAME), any(), anyString(),
+ any(AudioAttributes.class));
}
private void verifyVibrateLooped() {
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 7f0b4dbabc3a..1a4cce466c66 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -84,6 +84,7 @@
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
+import android.app.AlarmManager;
import android.app.AppOpsManager;
import android.app.AutomaticZenRule;
import android.app.IActivityManager;
@@ -111,6 +112,7 @@
import android.content.pm.IPackageManager;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutServiceInternal;
@@ -171,6 +173,7 @@
import com.android.server.lights.LogicalLight;
import com.android.server.notification.NotificationManagerService.NotificationAssistants;
import com.android.server.notification.NotificationManagerService.NotificationListeners;
+import com.android.server.pm.PackageManagerService;
import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -178,7 +181,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -244,6 +246,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
Resources mResources;
@Mock
RankingHandler mRankingHandler;
+ @Mock
+ protected PackageManagerInternal mPackageManagerInternal;
private static final int MAX_POST_DELAY = 1000;
@@ -283,6 +287,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
NotificationHistoryManager mHistoryManager;
@Mock
StatsManager mStatsManager;
+ @Mock
+ AlarmManager mAlarmManager;
NotificationRecordLoggerFake mNotificationRecordLogger = new NotificationRecordLoggerFake();
private InstanceIdSequence mNotificationInstanceIdSequence = new InstanceIdSequenceFake(
1 << 30);
@@ -424,6 +430,8 @@ public void setUp() throws Exception {
LocalServices.addService(DeviceIdleInternal.class, deviceIdleInternal);
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
LocalServices.addService(ActivityManagerInternal.class, activityManagerInternal);
+ mContext.addMockSystemService(Context.ALARM_SERVICE, mAlarmManager);
+
doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any());
@@ -497,7 +505,8 @@ null, new ComponentName(PKG, "test_class"),
mGroupHelper, mAm, mAtm, mAppUsageStats,
mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal,
mAppOpsManager, mUm, mHistoryManager, mStatsManager,
- mock(TelephonyManager.class));
+ mock(TelephonyManager.class),
+ mock(ActivityManagerInternal.class));
mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
mService.setAudioManager(mAudioManager);
@@ -831,6 +840,26 @@ private NotificationRecord addGroupWithBubblesAndValidateAdded(boolean summaryAu
return nrSummary;
}
+ @Test
+ public void testLimitTimeOutBroadcast() {
+ NotificationChannel channel = new NotificationChannel("id", "name",
+ NotificationManager.IMPORTANCE_HIGH);
+ Notification.Builder nb = new Notification.Builder(mContext, channel.getId())
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon)
+ .setTimeoutAfter(1);
+
+ StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
+ NotificationRecord r = new NotificationRecord(mContext, sbn, channel);
+
+ mService.scheduleTimeoutLocked(r);
+ ArgumentCaptor captor = ArgumentCaptor.forClass(PendingIntent.class);
+ verify(mAlarmManager).setExactAndAllowWhileIdle(anyInt(), anyLong(), captor.capture());
+ assertEquals(PackageManagerService.PLATFORM_PACKAGE_NAME,
+ captor.getValue().getIntent().getPackage());
+ }
+
@Test
public void testDefaultAssistant_overrideDefault() {
final int userId = 0;
@@ -1187,6 +1216,26 @@ public void testEnqueuedRestrictedNotifications_badUser() throws Exception {
assertEquals(0, mBinderService.getActiveNotifications(PKG).length);
}
+ @Test
+ public void testEnqueuedRestrictedNotifications_asSuwApp() throws Exception {
+ LocalServices.removeServiceForTest(PackageManagerInternal.class);
+ LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
+ when(mPackageManagerInternal.getSetupWizardPackageName()).thenReturn(PKG);
+
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0))
+ .thenReturn(true);
+
+ final StatusBarNotification sbn =
+ generateNotificationRecord(mTestNotificationChannel, 0, "", false).getSbn();
+ sbn.getNotification().category = Notification.CATEGORY_CAR_INFORMATION;
+ mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ "testEnqueuedRestrictedNotifications_asSuwApp",
+ sbn.getId(), sbn.getNotification(), sbn.getUserId());
+
+ waitForIdle();
+ assertEquals(1, mBinderService.getActiveNotifications(PKG).length);
+ }
+
@Test
public void testBlockedNotifications_blockedByAssistant() throws Exception {
when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(false);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
index ac2c6193c677..1918edb33554 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
@@ -32,6 +32,7 @@
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.IUriGrantsManager;
@@ -156,7 +157,8 @@ public void setUp() throws Exception {
mock(DevicePolicyManagerInternal.class), mock(IUriGrantsManager.class),
mock(UriGrantsManagerInternal.class),
mock(AppOpsManager.class), mUm, mock(NotificationHistoryManager.class),
- mock(StatsManager.class), mock(TelephonyManager.class));
+ mock(StatsManager.class), mock(TelephonyManager.class),
+ mock(ActivityManagerInternal.class));
} catch (SecurityException e) {
if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
throw e;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
index 5b516a9de350..53a6d3ff599f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
@@ -311,6 +311,22 @@ public void testOnActivityLaunchCancelledTrampoline() {
verifyNoMoreInteractions(mLaunchObserver);
}
+ @Test
+ public void testActivityDrawnBeforeTransition() {
+ mTopActivity.setVisible(false);
+ notifyActivityLaunching(mTopActivity.intent);
+ // Assume the activity is launched the second time consecutively. The drawn event is from
+ // the first time (omitted in test) launch that is earlier than transition.
+ mTopActivity.mDrawn = true;
+ notifyWindowsDrawn(mTopActivity);
+ notifyActivityLaunched(START_SUCCESS, mTopActivity);
+ // If the launching activity was drawn when starting transition, the launch event should
+ // be reported successfully.
+ notifyTransitionStarting(mTopActivity);
+
+ verifyOnActivityLaunchFinished(mTopActivity);
+ }
+
@Test
public void testActivityRecordProtoIsNotTooBig() {
// The ActivityRecordProto must not be too big, otherwise converting it at runtime
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 d99606b704e4..b28220585c5c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -88,6 +88,7 @@
import android.annotation.SuppressLint;
import android.app.ActivityTaskManager;
import android.app.WindowConfiguration;
+import android.app.servertransaction.FixedRotationAdjustmentsItem;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.graphics.Region;
@@ -1345,6 +1346,36 @@ public void testRecentsNotRotatingWithFixedRotation() {
assertFalse(recentsActivity.hasFixedRotationTransform());
}
+ @Test
+ public void testClearIntermediateFixedRotationAdjustments() throws RemoteException {
+ final ActivityRecord activity = new ActivityTestsBase.StackBuilder(mWm.mRoot)
+ .setDisplay(mDisplayContent).build().getTopMostActivity();
+ mDisplayContent.setFixedRotationLaunchingApp(activity,
+ (mDisplayContent.getRotation() + 1) % 4);
+ // Create a window so FixedRotationAdjustmentsItem can be sent.
+ createWindow(null, TYPE_APPLICATION_STARTING, activity, "AppWin");
+ final ActivityRecord activity2 = new ActivityTestsBase.StackBuilder(mWm.mRoot)
+ .setDisplay(mDisplayContent).build().getTopMostActivity();
+ activity2.setVisible(false);
+ clearInvocations(mWm.mAtmService.getLifecycleManager());
+ // The first activity has applied fixed rotation but the second activity becomes the top
+ // before the transition is done and it has the same rotation as display, so the dispatched
+ // rotation adjustment of first activity must be cleared.
+ mDisplayContent.handleTopActivityLaunchingInDifferentOrientation(activity2,
+ false /* checkOpening */);
+
+ final ArgumentCaptor adjustmentsCaptor =
+ ArgumentCaptor.forClass(FixedRotationAdjustmentsItem.class);
+ verify(mWm.mAtmService.getLifecycleManager(), atLeastOnce()).scheduleTransaction(
+ eq(activity.app.getThread()), adjustmentsCaptor.capture());
+ // The transformation is kept for animation in real case.
+ assertTrue(activity.hasFixedRotationTransform());
+ final FixedRotationAdjustmentsItem clearAdjustments = FixedRotationAdjustmentsItem.obtain(
+ activity.token, null /* fixedRotationAdjustments */);
+ // The captor may match other items. The first one must be the item to clear adjustments.
+ assertEquals(clearAdjustments, adjustmentsCaptor.getAllValues().get(0));
+ }
+
@Test
public void testRemoteRotation() {
DisplayContent dc = createNewDisplay();
diff --git a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java
index 56cb447e65b0..a85e1db32ce5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java
@@ -31,7 +31,7 @@
import com.android.internal.R;
import com.android.internal.util.Preconditions;
-import com.android.server.wm.utils.FakeDeviceConfigInterface;
+import com.android.server.testutils.FakeDeviceConfigInterface;
import org.junit.After;
import org.junit.Test;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
index 91cfd4e6a89d..59d195b670a8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
@@ -18,7 +18,9 @@
import static android.view.InsetsState.ITYPE_IME;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
+import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.graphics.PixelFormat;
@@ -64,4 +66,22 @@ public void testInputMethodInputTargetCanShowIme() {
mImeProvider.scheduleShowImePostLayout(target);
assertTrue(mImeProvider.isImeTargetFromDisplayContentAndImeSame());
}
+
+ @Test
+ public void testIsImeShowing() {
+ WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
+ makeWindowVisibleAndDrawn(ime);
+ mImeProvider.setWindow(ime, null, null);
+
+ WindowState target = createWindow(null, TYPE_APPLICATION, "app");
+ mDisplayContent.mInputMethodTarget = target;
+ mDisplayContent.mInputMethodControlTarget = target;
+
+ mImeProvider.scheduleShowImePostLayout(target);
+ assertFalse(mImeProvider.isImeShowing());
+ mImeProvider.checkShowImePostLayout();
+ assertTrue(mImeProvider.isImeShowing());
+ mImeProvider.setImeShowing(false);
+ assertFalse(mImeProvider.isImeShowing());
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 4a8e8dafb57d..979bbdad250b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -109,9 +109,9 @@ void setRunnableWhenAddingSplashScreen(Runnable r) {
}
@Override
- public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme,
- CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon,
- int logo, int windowFlags, Configuration overrideConfig, int displayId) {
+ public StartingSurface addSplashScreen(IBinder appToken, int userId, String packageName,
+ int theme, CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes,
+ int icon, int logo, int windowFlags, Configuration overrideConfig, int displayId) {
final com.android.server.wm.WindowState window;
final ActivityRecord activity;
final WindowManagerService wm = mWmSupplier.get();
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java
index 52100116df53..7a0ef0d7d7a9 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java
@@ -32,7 +32,7 @@
import androidx.test.filters.SmallTest;
-import com.android.server.wm.utils.FakeDeviceConfigInterface;
+import com.android.server.testutils.FakeDeviceConfigInterface;
import org.junit.After;
import org.junit.Before;
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 156298c86d41..60242faf3598 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -37,6 +37,8 @@
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+import static com.android.server.wm.WindowStateAnimator.HAS_DRAWN;
+
import static org.mockito.Mockito.mock;
import android.content.Context;
@@ -261,6 +263,13 @@ static void makeWindowVisible(WindowState... windows) {
}
}
+ static void makeWindowVisibleAndDrawn(WindowState... windows) {
+ makeWindowVisible(windows);
+ for (WindowState win : windows) {
+ win.mWinAnimator.mDrawState = HAS_DRAWN;
+ }
+ }
+
/** Creates a {@link ActivityStack} and adds it to the specified {@link DisplayContent}. */
ActivityStack createTaskStackOnDisplay(DisplayContent dc) {
return createTaskStackOnDisplay(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, dc);
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 9995a524670d..8e28efce581b 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -3928,6 +3928,20 @@ private static PersistableBundle getDefaults() {
public static final String KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED =
"use_lower_mtu_value_if_both_received";
+ /**
+ * Indicates temporarily unmetered mobile data is supported by the carrier.
+ * @hide
+ */
+ public static final String KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL =
+ "network_temp_not_metered_supported_bool";
+
+ /**
+ * Indicates whether RTT is supported while roaming.
+ * @hide
+ */
+ public static final String KEY_RTT_SUPPORTED_WHILE_ROAMING_BOOL =
+ "rtt_supported_while_roaming_bool";
+
/** The default value for every variable. */
private final static PersistableBundle sDefaults;
@@ -4283,6 +4297,7 @@ private static PersistableBundle getDefaults() {
sDefaults.putBoolean(KEY_RTT_SUPPORTED_BOOL, false);
sDefaults.putBoolean(KEY_TTY_SUPPORTED_BOOL, true);
sDefaults.putBoolean(KEY_HIDE_TTY_HCO_VCO_WITH_RTT_BOOL, false);
+ sDefaults.putBoolean(KEY_RTT_SUPPORTED_WHILE_ROAMING_BOOL, false);
sDefaults.putBoolean(KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
sDefaults.putBoolean(KEY_SUPPORT_NO_REPLY_TIMER_FOR_CFNRY_BOOL, true);
sDefaults.putStringArray(KEY_FEATURE_ACCESS_CODES_STRING_ARRAY, null);
@@ -4466,6 +4481,7 @@ private static PersistableBundle getDefaults() {
sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL, false);
sDefaults.putString(KEY_DEFAULT_PREFERRED_APN_NAME_STRING, "");
sDefaults.putBoolean(KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED, false);
+ sDefaults.putBoolean(KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL, true);
}
/**
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index 11667c83bc6a..0ee6568b6430 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -148,13 +148,14 @@ public class SubscriptionInfo implements Parcelable {
/**
* The access rules for this subscription, if it is embedded and defines any.
+ * This does not include access rules for non-embedded subscriptions.
*/
@Nullable
private UiccAccessRule[] mNativeAccessRules;
/**
* The carrier certificates for this subscription that are saved in carrier configs.
- * The other carrier certificates are embedded on Uicc and stored as part of mNativeAccessRules.
+ * This does not include access rules from the Uicc, whether embedded or non-embedded.
*/
@Nullable
private UiccAccessRule[] mCarrierConfigAccessRules;
@@ -661,7 +662,6 @@ public boolean canManageSubscription(Context context, String packageName) {
* is authorized to manage this subscription.
* TODO and fix it properly in R / master: either deprecate this and have 3 APIs
* native + carrier + all, or have this return all by default.
- * @throws UnsupportedOperationException if this subscription is not embedded.
* @hide
*/
@SystemApi
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index e9ee06c246ba..c8ba919aa40d 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -2631,6 +2631,10 @@ public void setSubscriptionOverrideCongested(int subId, boolean overrideCongeste
* Checks whether the app with the given context is authorized to manage the given subscription
* according to its metadata.
*
+ * Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded} returns
+ * true). To check for permissions for non-embedded subscription as well,
+ * {@see android.telephony.TelephonyManager#hasCarrierPrivileges}.
+ *
* @param info The subscription to check.
* @return whether the app is authorized to manage this subscription per its metadata.
*/
@@ -2643,6 +2647,10 @@ public boolean canManageSubscription(SubscriptionInfo info) {
* be authorized if it is included in the {@link android.telephony.UiccAccessRule} of the
* {@link android.telephony.SubscriptionInfo} with the access status.
*
+ * Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded} returns
+ * true). To check for permissions for non-embedded subscription as well,
+ * {@see android.telephony.TelephonyManager#hasCarrierPrivileges}.
+ *
* @param info The subscription to check.
* @param packageName Package name of the app to check.
* @return whether the app is authorized to manage this subscription per its access rules.
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 35e263036694..10c3e6db5205 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -8534,6 +8534,9 @@ public boolean isTetheringApnRequired(int subId) {
* call will return true. This access is granted by the owner of the UICC
* card and does not depend on the registered carrier.
*
+ * Note that this API applies to both physical and embedded subscriptions and
+ * is a superset of the checks done in SubscriptionManager#canManageSubscription.
+ *
* @return true if the app has carrier privileges.
*/
public boolean hasCarrierPrivileges() {
@@ -8547,6 +8550,9 @@ public boolean hasCarrierPrivileges() {
* call will return true. This access is granted by the owner of the UICC
* card and does not depend on the registered carrier.
*
+ * Note that this API applies to both physical and embedded subscriptions and
+ * is a superset of the checks done in SubscriptionManager#canManageSubscription.
+ *
* @param subId The subscription to use.
* @return true if the app has carrier privileges.
* @hide
diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java
index 0d6b31d349e1..4cace2fecdf7 100644
--- a/telephony/java/android/telephony/ims/ImsReasonInfo.java
+++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java
@@ -889,6 +889,13 @@ public final class ImsReasonInfo implements Parcelable {
*/
public static final int CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION = 1623;
+ /**
+ * Call failed because of network congestion, resource is not available,
+ * or no circuit or channel available, etc.
+ * @hide
+ */
+ public static final int CODE_NETWORK_CONGESTION = 1624;
+
/**
* The dialed RTT call should be retried without RTT
* @hide
@@ -1075,6 +1082,7 @@ public final class ImsReasonInfo implements Parcelable {
CODE_REJECT_VT_AVPF_NOT_ALLOWED,
CODE_REJECT_ONGOING_ENCRYPTED_CALL,
CODE_REJECT_ONGOING_CS_CALL,
+ CODE_NETWORK_CONGESTION,
CODE_RETRY_ON_IMS_WITHOUT_RTT,
CODE_OEM_CAUSE_1,
CODE_OEM_CAUSE_2,
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index b70937cee8a1..363d6f57b603 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -2138,6 +2138,11 @@ interface ITelephony {
*/
int setImsProvisioningString(int subId, int key, String value);
+ /**
+ * Start emergency callback mode for testing.
+ */
+ void startEmergencyCallbackMode();
+
/**
* Update Emergency Number List for Test Mode.
*/