summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt15
-rw-r--r--api/system-current.txt3
-rw-r--r--api/test-current.txt1
-rw-r--r--cmds/statsd/src/StatsLogProcessor.h3
-rw-r--r--cmds/statsd/src/atoms.proto58
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.h3
-rw-r--r--cmds/statsd/src/metrics/GaugeMetricProducer.cpp9
-rw-r--r--cmds/statsd/src/metrics/GaugeMetricProducer.h2
-rw-r--r--cmds/statsd/src/metrics/MetricProducer.cpp3
-rw-r--r--cmds/statsd/src/metrics/MetricProducer.h6
-rw-r--r--cmds/statsd/src/metrics/MetricsManager.h3
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.cpp14
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.h2
-rw-r--r--cmds/statsd/src/metrics/metrics_manager_util.cpp8
-rw-r--r--cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp216
-rw-r--r--cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp103
-rw-r--r--cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp12
-rw-r--r--cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp23
-rw-r--r--core/java/android/app/ActivityThread.java5
-rw-r--r--core/java/android/app/DownloadManager.java96
-rw-r--r--core/java/android/app/KeyguardManager.java5
-rw-r--r--core/java/android/app/Notification.java42
-rw-r--r--core/java/android/app/role/RoleControllerManager.java3
-rw-r--r--core/java/android/content/Context.java4
-rw-r--r--core/java/android/content/pm/PackageManager.java17
-rw-r--r--core/java/android/net/DhcpResults.java8
-rw-r--r--core/java/android/os/Environment.java23
-rw-r--r--core/java/android/os/INetworkManagementService.aidl12
-rw-r--r--core/java/android/os/StrictMode.java6
-rw-r--r--core/java/android/os/storage/StorageManager.java46
-rw-r--r--core/java/android/permission/PermissionControllerManager.java3
-rw-r--r--core/java/android/util/ArrayMap.java32
-rw-r--r--core/java/android/util/ArraySet.java16
-rw-r--r--core/java/android/util/LongSparseArray.java28
-rw-r--r--core/java/android/util/LongSparseLongArray.java14
-rw-r--r--core/java/android/util/SparseArray.java25
-rw-r--r--core/java/android/util/SparseBooleanArray.java21
-rw-r--r--core/java/android/util/SparseIntArray.java21
-rw-r--r--core/java/android/util/SparseLongArray.java14
-rw-r--r--core/java/android/util/UtilConfig.java30
-rw-r--r--core/java/android/view/DisplayAddress.java38
-rw-r--r--core/proto/android/server/jobscheduler.proto13
-rw-r--r--core/res/res/values-af/strings.xml9
-rw-r--r--core/res/res/values-am/strings.xml9
-rw-r--r--core/res/res/values-ar/strings.xml9
-rw-r--r--core/res/res/values-as/strings.xml12
-rw-r--r--core/res/res/values-az/strings.xml9
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml9
-rw-r--r--core/res/res/values-be/strings.xml9
-rw-r--r--core/res/res/values-bg/strings.xml9
-rw-r--r--core/res/res/values-bn/strings.xml9
-rw-r--r--core/res/res/values-bs/strings.xml11
-rw-r--r--core/res/res/values-ca/strings.xml9
-rw-r--r--core/res/res/values-cs/strings.xml9
-rw-r--r--core/res/res/values-da/strings.xml9
-rw-r--r--core/res/res/values-de/strings.xml9
-rw-r--r--core/res/res/values-el/strings.xml9
-rw-r--r--core/res/res/values-en-rAU/strings.xml9
-rw-r--r--core/res/res/values-en-rCA/strings.xml9
-rw-r--r--core/res/res/values-en-rGB/strings.xml9
-rw-r--r--core/res/res/values-en-rIN/strings.xml9
-rw-r--r--core/res/res/values-es-rUS/strings.xml9
-rw-r--r--core/res/res/values-es/strings.xml9
-rw-r--r--core/res/res/values-et/strings.xml9
-rw-r--r--core/res/res/values-eu/strings.xml9
-rw-r--r--core/res/res/values-fa/strings.xml9
-rw-r--r--core/res/res/values-fi/strings.xml9
-rw-r--r--core/res/res/values-fr-rCA/strings.xml11
-rw-r--r--core/res/res/values-fr/strings.xml9
-rw-r--r--core/res/res/values-gl/strings.xml27
-rw-r--r--core/res/res/values-gu/strings.xml9
-rw-r--r--core/res/res/values-hi/strings.xml21
-rw-r--r--core/res/res/values-hr/strings.xml9
-rw-r--r--core/res/res/values-hu/strings.xml9
-rw-r--r--core/res/res/values-hy/strings.xml9
-rw-r--r--core/res/res/values-in/strings.xml9
-rw-r--r--core/res/res/values-is/strings.xml9
-rw-r--r--core/res/res/values-it/strings.xml9
-rw-r--r--core/res/res/values-iw/strings.xml9
-rw-r--r--core/res/res/values-ja/strings.xml11
-rw-r--r--core/res/res/values-ka/strings.xml9
-rw-r--r--core/res/res/values-kk/strings.xml9
-rw-r--r--core/res/res/values-km/strings.xml9
-rw-r--r--core/res/res/values-kn/strings.xml9
-rw-r--r--core/res/res/values-ko/strings.xml11
-rw-r--r--core/res/res/values-ky/strings.xml9
-rw-r--r--core/res/res/values-lo/strings.xml9
-rw-r--r--core/res/res/values-lt/strings.xml9
-rw-r--r--core/res/res/values-lv/strings.xml9
-rw-r--r--core/res/res/values-mk/strings.xml9
-rw-r--r--core/res/res/values-ml/strings.xml9
-rw-r--r--core/res/res/values-mn/strings.xml9
-rw-r--r--core/res/res/values-mr/strings.xml9
-rw-r--r--core/res/res/values-ms/strings.xml9
-rw-r--r--core/res/res/values-my/strings.xml9
-rw-r--r--core/res/res/values-nb/strings.xml9
-rw-r--r--core/res/res/values-ne/strings.xml9
-rw-r--r--core/res/res/values-nl/strings.xml11
-rw-r--r--core/res/res/values-or/strings.xml12
-rw-r--r--core/res/res/values-pa/strings.xml9
-rw-r--r--core/res/res/values-pl/strings.xml9
-rw-r--r--core/res/res/values-pt-rBR/strings.xml9
-rw-r--r--core/res/res/values-pt-rPT/strings.xml9
-rw-r--r--core/res/res/values-pt/strings.xml9
-rw-r--r--core/res/res/values-ro/strings.xml9
-rw-r--r--core/res/res/values-ru/strings.xml9
-rw-r--r--core/res/res/values-si/strings.xml9
-rw-r--r--core/res/res/values-sk/strings.xml9
-rw-r--r--core/res/res/values-sl/strings.xml9
-rw-r--r--core/res/res/values-sq/strings.xml9
-rw-r--r--core/res/res/values-sr/strings.xml9
-rw-r--r--core/res/res/values-sv/strings.xml9
-rw-r--r--core/res/res/values-sw/strings.xml9
-rw-r--r--core/res/res/values-ta/strings.xml280
-rw-r--r--core/res/res/values-te/strings.xml9
-rw-r--r--core/res/res/values-th/strings.xml9
-rw-r--r--core/res/res/values-tl/strings.xml9
-rw-r--r--core/res/res/values-tr/strings.xml9
-rw-r--r--core/res/res/values-uk/strings.xml9
-rw-r--r--core/res/res/values-ur/strings.xml9
-rw-r--r--core/res/res/values-uz/strings.xml9
-rw-r--r--core/res/res/values-vi/strings.xml9
-rw-r--r--core/res/res/values-zh-rCN/strings.xml9
-rw-r--r--core/res/res/values-zh-rHK/strings.xml11
-rw-r--r--core/res/res/values-zh-rTW/strings.xml9
-rw-r--r--core/res/res/values-zu/strings.xml9
-rw-r--r--core/res/res/values/attrs.xml16
-rw-r--r--core/res/res/values/attrs_manifest.xml16
-rw-r--r--core/res/res/values/config.xml11
-rw-r--r--core/res/res/values/symbols.xml3
-rw-r--r--data/etc/privapp-permissions-platform.xml6
-rw-r--r--media/java/android/media/AudioPlaybackConfiguration.java6
-rw-r--r--media/java/android/media/MediaCodec.java24
-rw-r--r--media/java/android/media/MediaCodecInfo.java87
-rw-r--r--media/java/android/media/session/ISessionManager.aidl3
-rw-r--r--media/java/android/media/session/MediaSessionManager.java4
-rw-r--r--packages/CaptivePortalLogin/AndroidManifest.xml1
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java19
-rw-r--r--packages/NetworkStack/AndroidManifestBase.xml1
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpPacket.java36
-rw-r--r--packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java49
-rw-r--r--packages/PackageInstaller/TEST_MAPPING2
-rw-r--r--packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml10
-rw-r--r--packages/SettingsLib/res/values-lo/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml12
-rw-r--r--packages/SettingsLib/res/values/strings.xml2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java16
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java24
-rw-r--r--packages/SystemUI/res-keyguard/values-gl/strings.xml2
-rw-r--r--packages/SystemUI/res-keyguard/values-sw320dp/dimens.xml26
-rw-r--r--packages/SystemUI/res-keyguard/values-sw360dp/dimens.xml25
-rw-r--r--packages/SystemUI/res-keyguard/values-ta/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values/dimens.xml4
-rw-r--r--packages/SystemUI/res/layout-land/volume_dialog.xml2
-rw-r--r--packages/SystemUI/res/layout/volume_dialog.xml2
-rw-r--r--packages/SystemUI/res/layout/volume_dialog_row.xml2
-rw-r--r--packages/SystemUI/res/values-af/strings.xml3
-rw-r--r--packages/SystemUI/res/values-am/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml27
-rw-r--r--packages/SystemUI/res/values-as/strings.xml27
-rw-r--r--packages/SystemUI/res/values-az/strings.xml5
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml3
-rw-r--r--packages/SystemUI/res/values-be/strings.xml27
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml3
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml27
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml3
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml27
-rw-r--r--packages/SystemUI/res/values-da/strings.xml3
-rw-r--r--packages/SystemUI/res/values-de/strings.xml27
-rw-r--r--packages/SystemUI/res/values-el/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml2
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml27
-rw-r--r--packages/SystemUI/res/values-es/strings.xml3
-rw-r--r--packages/SystemUI/res/values-et/strings.xml3
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml37
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml27
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml27
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml27
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml27
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml27
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml7
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml3
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml27
-rw-r--r--packages/SystemUI/res/values-in/strings.xml3
-rw-r--r--packages/SystemUI/res/values-is/strings.xml3
-rw-r--r--packages/SystemUI/res/values-it/strings.xml3
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml3
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml27
-rw-r--r--packages/SystemUI/res/values-km/strings.xml3
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml27
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml27
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml3
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml3
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml3
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml3
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml27
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml27
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml3
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml27
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml27
-rw-r--r--packages/SystemUI/res/values-my/strings.xml3
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml27
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-or/strings.xml27
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml27
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml3
-rw-r--r--packages/SystemUI/res/values-si/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml27
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml27
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml27
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml27
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml46
-rw-r--r--packages/SystemUI/res/values-te/strings.xml30
-rw-r--r--packages/SystemUI/res/values-th/strings.xml3
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml29
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml27
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml29
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml17
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml3
-rw-r--r--packages/SystemUI/res/values/dimens.xml10
-rw-r--r--packages/SystemUI/res/values/styles.xml4
-rw-r--r--packages/SystemUI/src/com/android/keyguard/CarrierTextController.java46
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java8
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java37
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java55
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java67
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarEdgePanel.java748
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java240
-rw-r--r--packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java42
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java42
-rw-r--r--packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml2
-rw-r--r--services/accessibility/java/com/android/server/accessibility/TouchExplorer.java11
-rw-r--r--services/backup/java/com/android/server/backup/UserBackupManagerService.java18
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java51
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java22
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java18
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java16
-rw-r--r--services/core/java/com/android/server/am/OomAdjProfiler.java24
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java13
-rw-r--r--services/core/java/com/android/server/connectivity/DnsManager.java6
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java24
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java6
-rw-r--r--services/core/java/com/android/server/job/controllers/QuotaController.java57
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java93
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java4
-rw-r--r--services/core/java/com/android/server/media/MediaSessionServiceImpl.java5
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java5
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java35
-rw-r--r--services/core/java/com/android/server/pm/permission/TEST_MAPPING3
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java6
-rw-r--r--services/core/java/com/android/server/wm/RootActivityContainer.java68
-rw-r--r--services/core/java/com/android/server/wm/TaskPositioner.java5
-rw-r--r--services/core/java/com/android/server/wm/TaskRecord.java20
-rw-r--r--services/net/Android.bp11
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/IIpMemoryStore.aidl9
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/IIpMemoryStoreCallbacks.aidl4
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/Blob.aidl4
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl4
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl4
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl4
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl4
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnStatusListener.aidl4
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/NetworkAttributesParcelable.aidl8
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl6
-rw-r--r--services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/StatusParcelable.aidl4
-rw-r--r--services/net/aidl/networkstack/2/android/net/DhcpResultsParcelable.aidl9
-rw-r--r--services/net/aidl/networkstack/2/android/net/INetworkMonitor.aidl24
-rw-r--r--services/net/aidl/networkstack/2/android/net/INetworkMonitorCallbacks.aidl8
-rw-r--r--services/net/aidl/networkstack/2/android/net/INetworkStackConnector.aidl7
-rw-r--r--services/net/aidl/networkstack/2/android/net/INetworkStackStatusCallback.aidl4
-rw-r--r--services/net/aidl/networkstack/2/android/net/InitialConfigurationParcelable.aidl7
-rw-r--r--services/net/aidl/networkstack/2/android/net/NattKeepalivePacketDataParcelable.aidl7
-rw-r--r--services/net/aidl/networkstack/2/android/net/PrivateDnsConfigParcel.aidl5
-rw-r--r--services/net/aidl/networkstack/2/android/net/ProvisioningConfigurationParcelable.aidl15
-rw-r--r--services/net/aidl/networkstack/2/android/net/TcpKeepalivePacketDataParcelable.aidl13
-rw-r--r--services/net/aidl/networkstack/2/android/net/dhcp/DhcpServingParamsParcel.aidl11
-rw-r--r--services/net/aidl/networkstack/2/android/net/dhcp/IDhcpServer.aidl10
-rw-r--r--services/net/aidl/networkstack/2/android/net/dhcp/IDhcpServerCallbacks.aidl4
-rw-r--r--services/net/aidl/networkstack/2/android/net/ip/IIpClient.aidl15
-rw-r--r--services/net/aidl/networkstack/2/android/net/ip/IIpClientCallbacks.aidl16
-rw-r--r--services/net/java/android/net/DhcpResultsParcelable.aidl3
-rw-r--r--services/net/java/android/net/NattKeepalivePacketData.java (renamed from core/java/android/net/NattKeepalivePacketData.java)19
-rw-r--r--services/net/java/android/net/NattKeepalivePacketDataParcelable.aidl25
-rw-r--r--services/net/java/android/net/shared/IpConfigurationParcelableUtil.java2
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java244
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java47
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfig.java106
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfigTest.java16
-rw-r--r--services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java255
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java18
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java37
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java109
-rw-r--r--telephony/java/com/android/internal/telephony/TelephonyProperties.java7
-rw-r--r--tests/net/Android.bp1
-rw-r--r--tests/net/common/Android.bp1
-rw-r--r--tests/net/common/java/android/net/LinkAddressTest.java (renamed from tests/net/java/android/net/LinkAddressTest.java)0
-rw-r--r--tests/net/common/java/android/net/LinkPropertiesTest.java (renamed from tests/net/java/android/net/LinkPropertiesTest.java)0
-rw-r--r--tests/net/common/java/android/net/NetworkCapabilitiesTest.java (renamed from tests/net/java/android/net/NetworkCapabilitiesTest.java)0
-rw-r--r--tests/net/common/java/android/net/NetworkTest.java (renamed from tests/net/java/android/net/NetworkTest.java)0
-rw-r--r--tests/net/common/java/android/net/RouteInfoTest.java (renamed from tests/net/java/android/net/RouteInfoTest.java)0
-rw-r--r--tests/net/common/java/android/net/StaticIpConfigurationTest.java (renamed from tests/net/java/android/net/StaticIpConfigurationTest.java)0
-rw-r--r--tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java (renamed from tests/net/java/android/net/apf/ApfCapabilitiesTest.java)3
-rw-r--r--tests/net/java/android/net/shared/InitialConfigurationTest.java3
-rw-r--r--tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java12
-rw-r--r--tests/net/java/android/net/shared/ProvisioningConfigurationTest.java3
-rw-r--r--tests/net/java/com/android/server/ConnectivityServiceTest.java14
-rw-r--r--tests/net/util/Android.bp30
-rw-r--r--tests/net/util/java/com/android/internal/util/ParcelableTestUtil.java (renamed from tests/net/java/android/net/shared/ParcelableTestUtil.java)2
-rw-r--r--tests/net/util/java/com/android/internal/util/TestUtils.java (renamed from tests/net/java/com/android/internal/util/TestUtils.java)5
-rw-r--r--tools/aapt2/ResourceParser.cpp11
-rw-r--r--tools/aapt2/ResourceParser_test.cpp5
338 files changed, 4643 insertions, 2002 deletions
diff --git a/api/current.txt b/api/current.txt
index f62c689943d8..81069c59bb40 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -4622,8 +4622,8 @@ package android.app {
}
public class DownloadManager {
- method public long addCompletedDownload(String, String, boolean, String, String, long, boolean);
- method public long addCompletedDownload(String, String, boolean, String, String, long, boolean, android.net.Uri, android.net.Uri);
+ method @Deprecated public long addCompletedDownload(String, String, boolean, String, String, long, boolean);
+ method @Deprecated public long addCompletedDownload(String, String, boolean, String, String, long, boolean, android.net.Uri, android.net.Uri);
method public long enqueue(android.app.DownloadManager.Request);
method public static Long getMaxBytesOverMobile(android.content.Context);
method public String getMimeTypeForDownloadedFile(long);
@@ -4680,7 +4680,7 @@ package android.app {
public static class DownloadManager.Request {
ctor public DownloadManager.Request(android.net.Uri);
method public android.app.DownloadManager.Request addRequestHeader(String, String);
- method public void allowScanningByMediaScanner();
+ method @Deprecated public void allowScanningByMediaScanner();
method public android.app.DownloadManager.Request setAllowedNetworkTypes(int);
method public android.app.DownloadManager.Request setAllowedOverMetered(boolean);
method public android.app.DownloadManager.Request setAllowedOverRoaming(boolean);
@@ -4694,7 +4694,7 @@ package android.app {
method public android.app.DownloadManager.Request setRequiresDeviceIdle(boolean);
method @Deprecated public android.app.DownloadManager.Request setShowRunningNotification(boolean);
method public android.app.DownloadManager.Request setTitle(CharSequence);
- method public android.app.DownloadManager.Request setVisibleInDownloadsUi(boolean);
+ method @Deprecated public android.app.DownloadManager.Request setVisibleInDownloadsUi(boolean);
field public static final int NETWORK_MOBILE = 1; // 0x1
field public static final int NETWORK_WIFI = 2; // 0x2
field public static final int VISIBILITY_HIDDEN = 2; // 0x2
@@ -5502,8 +5502,6 @@ package android.app {
method @DimenRes public int getDesiredHeightResId();
method @NonNull public android.graphics.drawable.Icon getIcon();
method @NonNull public android.app.PendingIntent getIntent();
- method @Deprecated public boolean getSuppressInitialNotification();
- method @Deprecated public boolean getSuppressNotification();
method public boolean isNotificationSuppressed();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.Notification.BubbleMetadata> CREATOR;
@@ -5518,7 +5516,6 @@ package android.app {
method @NonNull public android.app.Notification.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setIcon(@NonNull android.graphics.drawable.Icon);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setIntent(@NonNull android.app.PendingIntent);
- method @Deprecated @NonNull public android.app.Notification.BubbleMetadata.Builder setSuppressInitialNotification(boolean);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setSuppressNotification(boolean);
}
@@ -34429,8 +34426,8 @@ package android.os {
ctor public Environment();
method public static java.io.File getDataDirectory();
method public static java.io.File getDownloadCacheDirectory();
- method public static java.io.File getExternalStorageDirectory();
- method public static java.io.File getExternalStoragePublicDirectory(String);
+ method @Deprecated public static java.io.File getExternalStorageDirectory();
+ method @Deprecated public static java.io.File getExternalStoragePublicDirectory(String);
method public static String getExternalStorageState();
method public static String getExternalStorageState(java.io.File);
method @NonNull public static java.io.File getRootDirectory();
diff --git a/api/system-current.txt b/api/system-current.txt
index 80412f18e1f9..2ce1ee15d98d 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -1655,6 +1655,7 @@ package android.content.pm {
field public static final String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock";
field public static final int FLAG_PERMISSION_APPLY_RESTRICTION = 16384; // 0x4000
field public static final int FLAG_PERMISSION_GRANTED_BY_DEFAULT = 32; // 0x20
+ field public static final int FLAG_PERMISSION_GRANTED_BY_ROLE = 32768; // 0x8000
field public static final int FLAG_PERMISSION_POLICY_FIXED = 4; // 0x4
field public static final int FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT = 2048; // 0x800
field public static final int FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT = 4096; // 0x1000
@@ -1728,7 +1729,7 @@ package android.content.pm {
method public void onPermissionsChanged(int);
}
- @IntDef(prefix={"FLAG_PERMISSION_"}, value={android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET, android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE, android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED, android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT, android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT, android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT, android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PackageManager.PermissionFlags {
+ @IntDef(prefix={"FLAG_PERMISSION_"}, value={android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET, android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE, android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED, android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT, android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT, android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT, android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_ROLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PackageManager.PermissionFlags {
}
public class PermissionGroupInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
diff --git a/api/test-current.txt b/api/test-current.txt
index 39020b43109c..77c3a94f1d10 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -712,6 +712,7 @@ package android.content.pm {
field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage";
field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption";
field public static final int FLAG_PERMISSION_APPLY_RESTRICTION = 16384; // 0x4000
+ field public static final int FLAG_PERMISSION_GRANTED_BY_ROLE = 32768; // 0x8000
field public static final int FLAG_PERMISSION_POLICY_FIXED = 4; // 0x4
field public static final int FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT = 2048; // 0x800
field public static final int FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT = 4096; // 0x1000
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index f4db0af29cef..6178a4bdf136 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -235,9 +235,12 @@ private:
FRIEND_TEST(GaugeMetricE2eTest, TestMultipleFieldsForPushedEvent);
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents);
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm);
+ FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsWithActivation);
+ FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsNoCondition);
FRIEND_TEST(GaugeMetricE2eTest, TestConditionChangeToTrueSamplePulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
+ FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation);
FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_NoLink_OR_CombinationCondition);
FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_Link_OR_CombinationCondition);
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 68a88162a1bb..2bd429976d4c 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -281,6 +281,8 @@ message Atom {
IntelligenceEventReported intelligence_event_reported =
188 [(log_from_module) = "intelligence"];
ThermalThrottlingSeverityStateChanged thermal_throttling_severity_state_changed = 189;
+ RoleRequestResultReported role_request_result_reported =
+ 190 [(log_from_module) = "permissioncontroller"];
}
// Pulled events will start at field 10000.
@@ -3519,6 +3521,62 @@ message SystemServerWatchdogOccurred {
message TombStoneOccurred {
}
+/*
+ * Information about a role request
+ *
+ * Logged from:
+ * packages/apps/PermissionController/src/com/android/packageinstaller/role/ui/RequestRoleFragment.java
+ */
+message RoleRequestResultReported {
+ // UID of application requesting the role
+ optional int32 requesting_uid = 1;
+
+ // Package name of application requesting the role
+ optional string requesting_package_name = 2;
+
+ // The role to be granted
+ optional string role_name = 3;
+
+ // The count of applications qualifying for the role
+ optional int32 qualifying_count = 4;
+
+ // UID of application current granted the role
+ optional int32 current_uid = 5;
+
+ // Package name of application current granted the role
+ optional string current_package_name = 6;
+
+ // UID of another application that user chose to grant the role to, instead of the requesting
+ // application
+ optional int32 granted_another_uid = 7;
+
+ // Package name of another application that user chose to grant the role to, instead of the
+ // requesting application
+ optional string granted_another_package_name = 8;
+
+ enum Result {
+ UNDEFINED = 0;
+ // role request was ignored
+ IGNORED = 1;
+ // role request was ignored because it's already granted
+ IGNORED_ALREADY_GRANTED = 2;
+ // role request was ignored because the application isn't qualified
+ IGNORED_NOT_QUALIFIED = 3;
+ // role request was ignored because user said it should be always denied
+ IGNORED_USER_ALWAYS_DENIED = 4;
+ // role was granted by user action
+ USER_GRANTED = 5;
+ // role was denied by user action
+ USER_DENIED = 6;
+ // role was denied by user granting another application the role
+ USER_DENIED_GRANTED_ANOTHER = 7;
+ // role was denied and set to be always denied by the user
+ USER_DENIED_WITH_ALWAYS = 8;
+ }
+ // The result of the role request
+ optional Result result = 9;
+}
+
//////////////////////////////////////////////////////////////////////
// Pulled atoms below this line //
//////////////////////////////////////////////////////////////////////
diff --git a/cmds/statsd/src/external/StatsPullerManager.h b/cmds/statsd/src/external/StatsPullerManager.h
index 45f6b3568143..4ea1386bf78a 100644
--- a/cmds/statsd/src/external/StatsPullerManager.h
+++ b/cmds/statsd/src/external/StatsPullerManager.h
@@ -120,8 +120,11 @@ private:
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents);
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm);
+ FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsWithActivation);
+ FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsNoCondition);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
+ FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation);
};
} // namespace statsd
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index 2f9afa5d5c19..49fe7ef31a30 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -141,9 +141,6 @@ GaugeMetricProducer::GaugeMetricProducer(
// Adjust start for partial bucket
mCurrentBucketStartTimeNs = startTimeNs;
- if (mIsPulled && mSamplingType == GaugeMetric::RANDOM_ONE_SAMPLE) {
- pullAndMatchEventsLocked(startTimeNs);
- }
VLOG("Gauge metric %lld created. bucket size %lld start_time: %lld sliced %d",
(long long)metric.id(), (long long)mBucketSizeNs, (long long)mTimeBaseNs,
@@ -315,6 +312,12 @@ void GaugeMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs,
}
}
+void GaugeMetricProducer::prepareFistBucketLocked() {
+ if (mIsActive && mIsPulled && mSamplingType == GaugeMetric::RANDOM_ONE_SAMPLE) {
+ pullAndMatchEventsLocked(mCurrentBucketStartTimeNs);
+ }
+}
+
void GaugeMetricProducer::pullAndMatchEventsLocked(const int64_t timestampNs) {
bool triggerPuller = false;
switch(mSamplingType) {
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
index 9b99fb1fee99..d3007c8a6778 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h
@@ -122,6 +122,8 @@ private:
void flushCurrentBucketLocked(const int64_t& eventTimeNs,
const int64_t& nextBucketStartTimeNs) override;
+ void prepareFistBucketLocked() override;
+
void pullAndMatchEventsLocked(const int64_t timestampNs);
const int mWhatMatcherIndex;
diff --git a/cmds/statsd/src/metrics/MetricProducer.cpp b/cmds/statsd/src/metrics/MetricProducer.cpp
index 5ed95edc0299..e22b85370052 100644
--- a/cmds/statsd/src/metrics/MetricProducer.cpp
+++ b/cmds/statsd/src/metrics/MetricProducer.cpp
@@ -25,6 +25,9 @@ namespace statsd {
using std::map;
void MetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, const LogEvent& event) {
+ if (!mIsActive) {
+ return;
+ }
int64_t eventTimeNs = event.GetElapsedTimestampNs();
// this is old event, maybe statsd restarted?
if (eventTimeNs < mTimeBaseNs) {
diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h
index 70fbd4762344..750566dd8e64 100644
--- a/cmds/statsd/src/metrics/MetricProducer.h
+++ b/cmds/statsd/src/metrics/MetricProducer.h
@@ -250,6 +250,11 @@ public:
mActivationType = activationType;
}
+ void prepareFistBucket() {
+ std::lock_guard<std::mutex> lock(mMutex);
+ prepareFistBucketLocked();
+ }
+
void flushIfExpire(int64_t elapsedTimestampNs);
protected:
@@ -281,6 +286,7 @@ protected:
void setActiveLocked(int64_t currentTimeNs, int64_t remainingTtlNs);
+ virtual void prepareFistBucketLocked() {};
/**
* Flushes the current bucket if the eventTime is after the current bucket's end time. This will
also flush the current partial bucket in memory.
diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h
index 00ae3b7028d9..d05bb8b164e8 100644
--- a/cmds/statsd/src/metrics/MetricsManager.h
+++ b/cmds/statsd/src/metrics/MetricsManager.h
@@ -266,9 +266,12 @@ private:
FRIEND_TEST(GaugeMetricE2eTest, TestMultipleFieldsForPushedEvent);
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents);
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm);
+ FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsWithActivation);
+ FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsNoCondition);
FRIEND_TEST(GaugeMetricE2eTest, TestConditionChangeToTrueSamplePulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
+ FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation);
FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_NoLink_OR_CombinationCondition);
FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_Link_OR_CombinationCondition);
FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_OR_CombinationCondition);
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index c44ea8aa8ed0..0bd6e624e25f 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -144,6 +144,9 @@ ValueMetricProducer::ValueMetricProducer(
mSliceByPositionALL = HasPositionALL(metric.dimensions_in_what()) ||
HasPositionALL(metric.dimensions_in_condition());
+ int64_t numBucketsForward = calcBucketsForwardCount(startTimeNs);
+ mCurrentBucketNum += numBucketsForward;
+
flushIfNeededLocked(startTimeNs);
if (mIsPulled) {
@@ -156,10 +159,6 @@ ValueMetricProducer::ValueMetricProducer(
// Adjust start for partial bucket
mCurrentBucketStartTimeNs = startTimeNs;
mConditionTimer.newBucketStart(mCurrentBucketStartTimeNs);
- // Kicks off the puller immediately if condition is true and diff based.
- if (mIsPulled && mCondition == ConditionState::kTrue && mUseDiff) {
- pullAndMatchEventsLocked(startTimeNs, mCondition);
- }
VLOG("value metric %lld created. bucket size %lld start_time: %lld", (long long)metric.id(),
(long long)mBucketSizeNs, (long long)mTimeBaseNs);
}
@@ -171,6 +170,13 @@ ValueMetricProducer::~ValueMetricProducer() {
}
}
+void ValueMetricProducer::prepareFistBucketLocked() {
+ // Kicks off the puller immediately if condition is true and diff based.
+ if (mIsActive && mIsPulled && mCondition == ConditionState::kTrue && mUseDiff) {
+ pullAndMatchEventsLocked(mCurrentBucketStartTimeNs, mCondition);
+ }
+}
+
void ValueMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
const int64_t eventTime) {
VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId);
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h
index 8c1999518ea6..1821dea34975 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.h
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.h
@@ -113,6 +113,8 @@ private:
void flushCurrentBucketLocked(const int64_t& eventTimeNs,
const int64_t& nextBucketStartTimeNs) override;
+ void prepareFistBucketLocked() override;
+
void dropDataLocked(const int64_t dropTimeNs) override;
// Calculate previous bucket end time based on current time.
diff --git a/cmds/statsd/src/metrics/metrics_manager_util.cpp b/cmds/statsd/src/metrics/metrics_manager_util.cpp
index 082382cbdb0d..31b424e8792e 100644
--- a/cmds/statsd/src/metrics/metrics_manager_util.cpp
+++ b/cmds/statsd/src/metrics/metrics_manager_util.cpp
@@ -760,6 +760,12 @@ bool initMetricActivations(const ConfigKey& key, const StatsdConfig& config,
return true;
}
+void prepareFistBucket(const vector<sp<MetricProducer>>& allMetricProducers) {
+ for (const auto& metric: allMetricProducers) {
+ metric->prepareFistBucket();
+ }
+}
+
bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, UidMap& uidMap,
const sp<StatsPullerManager>& pullerManager,
const sp<AlarmMonitor>& anomalyAlarmMonitor,
@@ -817,6 +823,8 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, UidMap&
return false;
}
+ prepareFistBucket(allMetricProducers);
+
return true;
}
diff --git a/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp b/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp
index 946eccfc3943..f01ad0609295 100644
--- a/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp
+++ b/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp
@@ -28,7 +28,10 @@ namespace statsd {
namespace {
-StatsdConfig CreateStatsdConfig(const GaugeMetric::SamplingType sampling_type) {
+const int64_t metricId = 123456;
+
+StatsdConfig CreateStatsdConfig(const GaugeMetric::SamplingType sampling_type,
+ bool useCondition = true) {
StatsdConfig config;
config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
auto atomMatcher = CreateSimpleAtomMatcher("TestMatcher", android::util::SUBSYSTEM_SLEEP_STATE);
@@ -40,9 +43,11 @@ StatsdConfig CreateStatsdConfig(const GaugeMetric::SamplingType sampling_type) {
*config.add_predicate() = screenIsOffPredicate;
auto gaugeMetric = config.add_gauge_metric();
- gaugeMetric->set_id(123456);
+ gaugeMetric->set_id(metricId);
gaugeMetric->set_what(atomMatcher.id());
- gaugeMetric->set_condition(screenIsOffPredicate.id());
+ if (useCondition) {
+ gaugeMetric->set_condition(screenIsOffPredicate.id());
+ }
gaugeMetric->set_sampling_type(sampling_type);
gaugeMetric->mutable_gauge_fields_filter()->set_include_all(true);
*gaugeMetric->mutable_dimensions_in_what() =
@@ -158,7 +163,7 @@ TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents) {
EXPECT_EQ(1, data.bucket_info(1).atom_size());
EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs + 1,
data.bucket_info(1).elapsed_timestamp_nanos(0));
- EXPECT_EQ(configAddedTimeNs + 55, data.bucket_info(0).elapsed_timestamp_nanos(0));
+ EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs + 1, data.bucket_info(1).elapsed_timestamp_nanos(0));
EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(1).start_bucket_elapsed_nanos());
EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(1).end_bucket_elapsed_nanos());
EXPECT_TRUE(data.bucket_info(1).atom(0).subsystem_sleep_state().subsystem_name().empty());
@@ -400,6 +405,209 @@ TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm) {
EXPECT_GT(data.bucket_info(2).atom(0).subsystem_sleep_state().time_millis(), 0);
}
+TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsWithActivation) {
+ auto config = CreateStatsdConfig(GaugeMetric::RANDOM_ONE_SAMPLE, /*useCondition=*/false);
+
+ int64_t baseTimeNs = getElapsedRealtimeNs();
+ int64_t configAddedTimeNs = 10 * 60 * NS_PER_SEC + baseTimeNs;
+ int64_t bucketSizeNs =
+ TimeUnitToBucketSizeInMillis(config.gauge_metric(0).bucket()) * 1000000;
+
+ auto batterySaverStartMatcher = CreateBatterySaverModeStartAtomMatcher();
+ *config.add_atom_matcher() = batterySaverStartMatcher;
+ const int64_t ttlNs = 2 * bucketSizeNs; // Two buckets.
+ auto metric_activation = config.add_metric_activation();
+ metric_activation->set_metric_id(metricId);
+ metric_activation->set_activation_type(MetricActivation::ACTIVATE_IMMEDIATELY);
+ auto event_activation = metric_activation->add_event_activation();
+ event_activation->set_atom_matcher_id(batterySaverStartMatcher.id());
+ event_activation->set_ttl_seconds(ttlNs / 1000000000);
+
+ ConfigKey cfgKey;
+ auto processor = CreateStatsLogProcessor(
+ baseTimeNs, configAddedTimeNs, config, cfgKey);
+ EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+ processor->mPullerManager->ForceClearPullerCache();
+
+ int startBucketNum = processor->mMetricsManagers.begin()->second->
+ mAllMetricProducers[0]->getCurrentBucketNum();
+ EXPECT_GT(startBucketNum, (int64_t)0);
+ EXPECT_FALSE(processor->mMetricsManagers.begin()->second->mAllMetricProducers[0]->isActive());
+
+ // When creating the config, the gauge metric producer should register the alarm at the
+ // end of the current bucket.
+ EXPECT_EQ((size_t)1, processor->mPullerManager->mReceivers.size());
+ EXPECT_EQ(bucketSizeNs,
+ processor->mPullerManager->mReceivers.begin()->second.front().intervalNs);
+ int64_t& nextPullTimeNs =
+ processor->mPullerManager->mReceivers.begin()->second.front().nextPullTimeNs;
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + bucketSizeNs, nextPullTimeNs);
+
+ // Pulling alarm arrives on time and reset the sequential pulling alarm.
+ // Event should not be kept.
+ processor->informPullAlarmFired(nextPullTimeNs + 1);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 2 * bucketSizeNs, nextPullTimeNs);
+ EXPECT_FALSE(processor->mMetricsManagers.begin()->second->mAllMetricProducers[0]->isActive());
+
+ const int64_t activationNs = configAddedTimeNs + bucketSizeNs + (2 * 1000 * 1000); // 2 millis.
+ auto batterySaverOnEvent = CreateBatterySaverOnEvent(activationNs);
+ processor->OnLogEvent(batterySaverOnEvent.get());
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->mAllMetricProducers[0]->isActive());
+
+ // This event should be kept. 1 total.
+ processor->informPullAlarmFired(nextPullTimeNs + 1);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 3 * bucketSizeNs,
+ nextPullTimeNs);
+
+ // This event should be kept. 2 total.
+ processor->informPullAlarmFired(nextPullTimeNs + 2);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 4 * bucketSizeNs, nextPullTimeNs);
+
+ // Create random event to deactivate metric.
+ auto deactivationEvent = CreateScreenBrightnessChangedEvent(50, activationNs + ttlNs + 1);
+ processor->OnLogEvent(deactivationEvent.get());
+ EXPECT_FALSE(processor->mMetricsManagers.begin()->second->mAllMetricProducers[0]->isActive());
+
+ // Event should not be kept. 2 total.
+ processor->informPullAlarmFired(nextPullTimeNs + 3);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 5 * bucketSizeNs, nextPullTimeNs);
+
+ processor->informPullAlarmFired(nextPullTimeNs + 2);
+
+ ConfigMetricsReportList reports;
+ vector<uint8_t> buffer;
+ processor->onDumpReport(cfgKey, configAddedTimeNs + 7 * bucketSizeNs + 10, false, true,
+ ADB_DUMP, FAST, &buffer);
+ EXPECT_TRUE(buffer.size() > 0);
+ EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+ backfillDimensionPath(&reports);
+ backfillStringInReport(&reports);
+ backfillStartEndTimestamp(&reports);
+ EXPECT_EQ(1, reports.reports_size());
+ EXPECT_EQ(1, reports.reports(0).metrics_size());
+ StatsLogReport::GaugeMetricDataWrapper gaugeMetrics;
+ sortMetricDataByDimensionsValue(
+ reports.reports(0).metrics(0).gauge_metrics(), &gaugeMetrics);
+ EXPECT_GT((int)gaugeMetrics.data_size(), 0);
+
+ auto data = gaugeMetrics.data(0);
+ EXPECT_EQ(android::util::SUBSYSTEM_SLEEP_STATE, data.dimensions_in_what().field());
+ EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size());
+ EXPECT_EQ(1 /* subsystem name field */,
+ data.dimensions_in_what().value_tuple().dimensions_value(0).field());
+ EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty());
+ EXPECT_EQ(2, data.bucket_info_size());
+
+ EXPECT_EQ(1, data.bucket_info(0).atom_size());
+ EXPECT_EQ(1, data.bucket_info(0).elapsed_timestamp_nanos_size());
+ EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs + 1, data.bucket_info(0).elapsed_timestamp_nanos(0));
+ EXPECT_EQ(0, data.bucket_info(0).wall_clock_timestamp_nanos_size());
+ EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos());
+ EXPECT_EQ(baseTimeNs + 5 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos());
+ EXPECT_TRUE(data.bucket_info(0).atom(0).subsystem_sleep_state().subsystem_name().empty());
+ EXPECT_GT(data.bucket_info(0).atom(0).subsystem_sleep_state().time_millis(), 0);
+
+ EXPECT_EQ(1, data.bucket_info(1).atom_size());
+ EXPECT_EQ(1, data.bucket_info(1).elapsed_timestamp_nanos_size());
+ EXPECT_EQ(baseTimeNs + 5 * bucketSizeNs + 2, data.bucket_info(1).elapsed_timestamp_nanos(0));
+ EXPECT_EQ(0, data.bucket_info(1).wall_clock_timestamp_nanos_size());
+ EXPECT_EQ(MillisToNano(NanoToMillis(baseTimeNs + 5 * bucketSizeNs)),
+ data.bucket_info(1).start_bucket_elapsed_nanos());
+ EXPECT_EQ(MillisToNano(NanoToMillis(activationNs + ttlNs + 1)),
+ data.bucket_info(1).end_bucket_elapsed_nanos());
+ EXPECT_TRUE(data.bucket_info(1).atom(0).subsystem_sleep_state().subsystem_name().empty());
+ EXPECT_GT(data.bucket_info(1).atom(0).subsystem_sleep_state().time_millis(), 0);
+}
+
+TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsNoCondition) {
+ auto config = CreateStatsdConfig(GaugeMetric::RANDOM_ONE_SAMPLE, /*useCondition=*/false);
+
+ int64_t baseTimeNs = getElapsedRealtimeNs();
+ int64_t configAddedTimeNs = 10 * 60 * NS_PER_SEC + baseTimeNs;
+ int64_t bucketSizeNs =
+ TimeUnitToBucketSizeInMillis(config.gauge_metric(0).bucket()) * 1000000;
+
+ ConfigKey cfgKey;
+ auto processor = CreateStatsLogProcessor(
+ baseTimeNs, configAddedTimeNs, config, cfgKey);
+ EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+ processor->mPullerManager->ForceClearPullerCache();
+
+ int startBucketNum = processor->mMetricsManagers.begin()->second->
+ mAllMetricProducers[0]->getCurrentBucketNum();
+ EXPECT_GT(startBucketNum, (int64_t)0);
+
+ // When creating the config, the gauge metric producer should register the alarm at the
+ // end of the current bucket.
+ EXPECT_EQ((size_t)1, processor->mPullerManager->mReceivers.size());
+ EXPECT_EQ(bucketSizeNs,
+ processor->mPullerManager->mReceivers.begin()->second.front().intervalNs);
+ int64_t& nextPullTimeNs =
+ processor->mPullerManager->mReceivers.begin()->second.front().nextPullTimeNs;
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + bucketSizeNs, nextPullTimeNs);
+
+ // Pulling alarm arrives on time and reset the sequential pulling alarm.
+ processor->informPullAlarmFired(nextPullTimeNs + 1);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 2 * bucketSizeNs, nextPullTimeNs);
+
+ processor->informPullAlarmFired(nextPullTimeNs + 4);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 3 * bucketSizeNs,
+ nextPullTimeNs);
+
+ ConfigMetricsReportList reports;
+ vector<uint8_t> buffer;
+ processor->onDumpReport(cfgKey, configAddedTimeNs + 7 * bucketSizeNs + 10, false, true,
+ ADB_DUMP, FAST, &buffer);
+ EXPECT_TRUE(buffer.size() > 0);
+ EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+ backfillDimensionPath(&reports);
+ backfillStringInReport(&reports);
+ backfillStartEndTimestamp(&reports);
+ EXPECT_EQ(1, reports.reports_size());
+ EXPECT_EQ(1, reports.reports(0).metrics_size());
+ StatsLogReport::GaugeMetricDataWrapper gaugeMetrics;
+ sortMetricDataByDimensionsValue(
+ reports.reports(0).metrics(0).gauge_metrics(), &gaugeMetrics);
+ EXPECT_GT((int)gaugeMetrics.data_size(), 0);
+
+ auto data = gaugeMetrics.data(0);
+ EXPECT_EQ(android::util::SUBSYSTEM_SLEEP_STATE, data.dimensions_in_what().field());
+ EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size());
+ EXPECT_EQ(1 /* subsystem name field */,
+ data.dimensions_in_what().value_tuple().dimensions_value(0).field());
+ EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty());
+ EXPECT_EQ(3, data.bucket_info_size());
+
+ EXPECT_EQ(1, data.bucket_info(0).atom_size());
+ EXPECT_EQ(1, data.bucket_info(0).elapsed_timestamp_nanos_size());
+ EXPECT_EQ(configAddedTimeNs, data.bucket_info(0).elapsed_timestamp_nanos(0));
+ EXPECT_EQ(0, data.bucket_info(0).wall_clock_timestamp_nanos_size());
+ EXPECT_EQ(baseTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos());
+ EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos());
+ EXPECT_TRUE(data.bucket_info(0).atom(0).subsystem_sleep_state().subsystem_name().empty());
+ EXPECT_GT(data.bucket_info(0).atom(0).subsystem_sleep_state().time_millis(), 0);
+
+ EXPECT_EQ(1, data.bucket_info(1).atom_size());
+ EXPECT_EQ(1, data.bucket_info(1).elapsed_timestamp_nanos_size());
+ EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs + 1, data.bucket_info(1).elapsed_timestamp_nanos(0));
+ EXPECT_EQ(0, data.bucket_info(1).wall_clock_timestamp_nanos_size());
+ EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(1).start_bucket_elapsed_nanos());
+ EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(1).end_bucket_elapsed_nanos());
+ EXPECT_TRUE(data.bucket_info(1).atom(0).subsystem_sleep_state().subsystem_name().empty());
+ EXPECT_GT(data.bucket_info(1).atom(0).subsystem_sleep_state().time_millis(), 0);
+
+ EXPECT_EQ(1, data.bucket_info(2).atom_size());
+ EXPECT_EQ(1, data.bucket_info(2).elapsed_timestamp_nanos_size());
+ EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs + 4, data.bucket_info(2).elapsed_timestamp_nanos(0));
+ EXPECT_EQ(0, data.bucket_info(2).wall_clock_timestamp_nanos_size());
+ EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(2).start_bucket_elapsed_nanos());
+ EXPECT_EQ(baseTimeNs + 5 * bucketSizeNs, data.bucket_info(2).end_bucket_elapsed_nanos());
+ EXPECT_TRUE(data.bucket_info(2).atom(0).subsystem_sleep_state().subsystem_name().empty());
+ EXPECT_GT(data.bucket_info(2).atom(0).subsystem_sleep_state().time_millis(), 0);
+}
+
#else
GTEST_LOG_(INFO) << "This test does nothing.\n";
#endif
diff --git a/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp b/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp
index b316562c5236..e967eb34ab2e 100644
--- a/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp
@@ -28,7 +28,9 @@ namespace statsd {
namespace {
-StatsdConfig CreateStatsdConfig() {
+const int64_t metricId = 123456;
+
+StatsdConfig CreateStatsdConfig(bool useCondition = true) {
StatsdConfig config;
config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
auto pulledAtomMatcher =
@@ -41,9 +43,11 @@ StatsdConfig CreateStatsdConfig() {
*config.add_predicate() = screenIsOffPredicate;
auto valueMetric = config.add_value_metric();
- valueMetric->set_id(123456);
+ valueMetric->set_id(metricId);
valueMetric->set_what(pulledAtomMatcher.id());
- valueMetric->set_condition(screenIsOffPredicate.id());
+ if (useCondition) {
+ valueMetric->set_condition(screenIsOffPredicate.id());
+ }
*valueMetric->mutable_value_field() =
CreateDimensions(android::util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
*valueMetric->mutable_dimensions_in_what() =
@@ -263,6 +267,99 @@ TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm) {
EXPECT_EQ(1, data.bucket_info(2).values_size());
}
+TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation) {
+ auto config = CreateStatsdConfig(false);
+ int64_t baseTimeNs = getElapsedRealtimeNs();
+ int64_t configAddedTimeNs = 10 * 60 * NS_PER_SEC + baseTimeNs;
+ int64_t bucketSizeNs =
+ TimeUnitToBucketSizeInMillis(config.value_metric(0).bucket()) * 1000000;
+
+ auto batterySaverStartMatcher = CreateBatterySaverModeStartAtomMatcher();
+ *config.add_atom_matcher() = batterySaverStartMatcher;
+ const int64_t ttlNs = 2 * bucketSizeNs; // Two buckets.
+ auto metric_activation = config.add_metric_activation();
+ metric_activation->set_metric_id(metricId);
+ metric_activation->set_activation_type(MetricActivation::ACTIVATE_IMMEDIATELY);
+ auto event_activation = metric_activation->add_event_activation();
+ event_activation->set_atom_matcher_id(batterySaverStartMatcher.id());
+ event_activation->set_ttl_seconds(ttlNs / 1000000000);
+
+ ConfigKey cfgKey;
+ auto processor = CreateStatsLogProcessor(
+ baseTimeNs, configAddedTimeNs, config, cfgKey);
+ EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+ processor->mPullerManager->ForceClearPullerCache();
+
+ int startBucketNum = processor->mMetricsManagers.begin()->second->
+ mAllMetricProducers[0]->getCurrentBucketNum();
+ EXPECT_GT(startBucketNum, (int64_t)0);
+ EXPECT_FALSE(processor->mMetricsManagers.begin()->second->mAllMetricProducers[0]->isActive());
+
+ // When creating the config, the value metric producer should register the alarm at the
+ // end of the current bucket.
+ EXPECT_EQ((size_t)1, processor->mPullerManager->mReceivers.size());
+ EXPECT_EQ(bucketSizeNs,
+ processor->mPullerManager->mReceivers.begin()->second.front().intervalNs);
+ int64_t& expectedPullTimeNs =
+ processor->mPullerManager->mReceivers.begin()->second.front().nextPullTimeNs;
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + bucketSizeNs, expectedPullTimeNs);
+
+ // Pulling alarm arrives on time and reset the sequential pulling alarm.
+ processor->informPullAlarmFired(expectedPullTimeNs + 1);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 2 * bucketSizeNs, expectedPullTimeNs);
+
+ const int64_t activationNs = configAddedTimeNs + bucketSizeNs + (2 * 1000 * 1000); // 2 millis.
+ auto batterySaverOnEvent = CreateBatterySaverOnEvent(activationNs);
+ processor->OnLogEvent(batterySaverOnEvent.get());
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->mAllMetricProducers[0]->isActive());
+
+ processor->informPullAlarmFired(expectedPullTimeNs + 1);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 3 * bucketSizeNs, expectedPullTimeNs);
+
+ processor->informPullAlarmFired(expectedPullTimeNs + 1);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 4 * bucketSizeNs, expectedPullTimeNs);
+
+ // Create random event to deactivate metric.
+ auto deactivationEvent = CreateScreenBrightnessChangedEvent(50, activationNs + ttlNs + 1);
+ processor->OnLogEvent(deactivationEvent.get());
+ EXPECT_FALSE(processor->mMetricsManagers.begin()->second->mAllMetricProducers[0]->isActive());
+
+ processor->informPullAlarmFired(expectedPullTimeNs + 1);
+ EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 5 * bucketSizeNs, expectedPullTimeNs);
+
+ processor->informPullAlarmFired(expectedPullTimeNs + 1);
+
+ ConfigMetricsReportList reports;
+ vector<uint8_t> buffer;
+ processor->onDumpReport(cfgKey, configAddedTimeNs + 7 * bucketSizeNs + 10, false, true,
+ ADB_DUMP, FAST, &buffer);
+ EXPECT_TRUE(buffer.size() > 0);
+ EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+ backfillDimensionPath(&reports);
+ backfillStringInReport(&reports);
+ backfillStartEndTimestamp(&reports);
+ EXPECT_EQ(1, reports.reports_size());
+ EXPECT_EQ(1, reports.reports(0).metrics_size());
+ StatsLogReport::ValueMetricDataWrapper valueMetrics;
+ sortMetricDataByDimensionsValue(
+ reports.reports(0).metrics(0).value_metrics(), &valueMetrics);
+ EXPECT_GT((int)valueMetrics.data_size(), 0);
+
+ auto data = valueMetrics.data(0);
+ EXPECT_EQ(android::util::SUBSYSTEM_SLEEP_STATE, data.dimensions_in_what().field());
+ EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size());
+ EXPECT_EQ(1 /* subsystem name field */,
+ data.dimensions_in_what().value_tuple().dimensions_value(0).field());
+ EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty());
+ // We have 1 full bucket, the two surrounding the activation are dropped.
+ EXPECT_EQ(1, data.bucket_info_size());
+
+ EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos());
+ EXPECT_EQ(baseTimeNs + 5 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos());
+ EXPECT_EQ(1, data.bucket_info(0).values_size());
+}
+
#else
GTEST_LOG_(INFO) << "This test does nothing.\n";
#endif
diff --git a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
index 62868232d8e7..b9a586752712 100644
--- a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
@@ -79,6 +79,8 @@ TEST(GaugeMetricProducerTest, TestFirstBucket) {
logEventMatcherIndex, eventMatcherWizard,
-1, -1, tagId, 5, 600 * NS_PER_SEC + NS_PER_SEC / 2,
pullerManager);
+ gaugeProducer.prepareFistBucket();
+
EXPECT_EQ(600500000000, gaugeProducer.mCurrentBucketStartTimeNs);
EXPECT_EQ(10, gaugeProducer.mCurrentBucketNum);
@@ -124,6 +126,8 @@ TEST(GaugeMetricProducerTest, TestPulledEventsNoCondition) {
tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ gaugeProducer.prepareFistBucket();
+
vector<shared_ptr<LogEvent>> allData;
allData.clear();
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1);
@@ -207,6 +211,7 @@ TEST(GaugeMetricProducerTest, TestPushedEventsWithUpgrade) {
logEventMatcherIndex, eventMatcherWizard,
-1 /* -1 means no pulling */, -1, tagId, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
+ gaugeProducer.prepareFistBucket();
sp<AnomalyTracker> anomalyTracker = gaugeProducer.addAnomalyTracker(alert, alarmMonitor);
EXPECT_TRUE(anomalyTracker != nullptr);
@@ -298,6 +303,7 @@ TEST(GaugeMetricProducerTest, TestPulledWithUpgrade) {
GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
logEventMatcherIndex, eventMatcherWizard, tagId, -1, tagId,
bucketStartTimeNs, bucketStartTimeNs, pullerManager);
+ gaugeProducer.prepareFistBucket();
vector<shared_ptr<LogEvent>> allData;
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1);
@@ -364,6 +370,7 @@ TEST(GaugeMetricProducerTest, TestPulledWithAppUpgradeDisabled) {
logEventMatcherIndex, eventMatcherWizard,
tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ gaugeProducer.prepareFistBucket();
vector<shared_ptr<LogEvent>> allData;
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1);
@@ -424,6 +431,7 @@ TEST(GaugeMetricProducerTest, TestPulledEventsWithCondition) {
GaugeMetricProducer gaugeProducer(kConfigKey, metric, 1, wizard,
logEventMatcherIndex, eventMatcherWizard, tagId, -1, tagId,
bucketStartTimeNs, bucketStartTimeNs, pullerManager);
+ gaugeProducer.prepareFistBucket();
gaugeProducer.onConditionChanged(true, bucketStartTimeNs + 8);
EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
@@ -521,6 +529,7 @@ TEST(GaugeMetricProducerTest, TestPulledEventsWithSlicedCondition) {
GaugeMetricProducer gaugeProducer(kConfigKey, metric, 1, wizard,
logEventMatcherIndex, eventMatcherWizard, tagId, -1, tagId,
bucketStartTimeNs, bucketStartTimeNs, pullerManager);
+ gaugeProducer.prepareFistBucket();
gaugeProducer.onSlicedConditionMayChange(true, bucketStartTimeNs + 8);
@@ -574,6 +583,7 @@ TEST(GaugeMetricProducerTest, TestPulledEventsAnomalyDetection) {
logEventMatcherIndex, eventMatcherWizard,
tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ gaugeProducer.prepareFistBucket();
Alert alert;
alert.set_id(101);
@@ -682,6 +692,7 @@ TEST(GaugeMetricProducerTest, TestPullOnTrigger) {
logEventMatcherIndex, eventMatcherWizard,
tagId, triggerId, tagId, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ gaugeProducer.prepareFistBucket();
vector<shared_ptr<LogEvent>> allData;
@@ -766,6 +777,7 @@ TEST(GaugeMetricProducerTest, TestRemoveDimensionInOutput) {
logEventMatcherIndex, eventMatcherWizard,
tagId, triggerId, tagId, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ gaugeProducer.prepareFistBucket();
vector<shared_ptr<LogEvent>> allData;
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index 43a3c7b0b2ea..0e82bad0f27b 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -105,6 +105,7 @@ class ValueMetricProducerTestHelper {
kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
logEventMatcherIndex, eventMatcherWizard, tagId,
bucketStartTimeNs, bucketStartTimeNs, pullerManager);
+ valueProducer->prepareFistBucket();
return valueProducer;
}
@@ -124,6 +125,7 @@ class ValueMetricProducerTestHelper {
new ValueMetricProducer(kConfigKey, metric, 1, wizard, logEventMatcherIndex,
eventMatcherWizard, tagId, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
+ valueProducer->prepareFistBucket();
valueProducer->mCondition = ConditionState::kFalse;
return valueProducer;
}
@@ -167,6 +169,7 @@ TEST(ValueMetricProducerTest, TestCalcPreviousBucketEndTime) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
logEventMatcherIndex, eventMatcherWizard, -1, startTimeBase,
22, pullerManager);
+ valueProducer.prepareFistBucket();
EXPECT_EQ(startTimeBase, valueProducer.calcPreviousBucketEndTime(60 * NS_PER_SEC + 10));
EXPECT_EQ(startTimeBase, valueProducer.calcPreviousBucketEndTime(60 * NS_PER_SEC + 10));
@@ -196,6 +199,7 @@ TEST(ValueMetricProducerTest, TestFirstBucket) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
logEventMatcherIndex, eventMatcherWizard, -1, 5,
600 * NS_PER_SEC + NS_PER_SEC / 2, pullerManager);
+ valueProducer.prepareFistBucket();
EXPECT_EQ(600500000000, valueProducer.mCurrentBucketStartTimeNs);
EXPECT_EQ(10, valueProducer.mCurrentBucketNum);
@@ -377,6 +381,7 @@ TEST(ValueMetricProducerTest, TestPulledEventsWithFiltering) {
kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
logEventMatcherIndex, eventMatcherWizard, tagId,
bucketStartTimeNs, bucketStartTimeNs, pullerManager);
+ valueProducer->prepareFistBucket();
vector<shared_ptr<LogEvent>> allData;
allData.clear();
@@ -665,6 +670,7 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithUpgrade) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ valueProducer.prepareFistBucket();
shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event1->write(1);
@@ -722,6 +728,7 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, tagId, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
+ valueProducer.prepareFistBucket();
vector<shared_ptr<LogEvent>> allData;
allData.clear();
@@ -772,6 +779,7 @@ TEST(ValueMetricProducerTest, TestPulledWithAppUpgradeDisabled) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, tagId, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
+ valueProducer.prepareFistBucket();
vector<shared_ptr<LogEvent>> allData;
allData.clear();
@@ -846,6 +854,7 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ valueProducer.prepareFistBucket();
shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event1->write(1);
@@ -888,6 +897,7 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithCondition) {
ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, logEventMatcherIndex,
eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ valueProducer.prepareFistBucket();
valueProducer.mCondition = ConditionState::kFalse;
shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
@@ -962,6 +972,7 @@ TEST(ValueMetricProducerTest, TestAnomalyDetection) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
logEventMatcherIndex, eventMatcherWizard, -1 /*not pulled*/,
bucketStartTimeNs, bucketStartTimeNs, pullerManager);
+ valueProducer.prepareFistBucket();
sp<AnomalyTracker> anomalyTracker = valueProducer.addAnomalyTracker(alert, alarmMonitor);
@@ -1258,6 +1269,7 @@ TEST(ValueMetricProducerTest, TestPushedAggregateMin) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ valueProducer.prepareFistBucket();
shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event1->write(1);
@@ -1302,6 +1314,7 @@ TEST(ValueMetricProducerTest, TestPushedAggregateMax) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ valueProducer.prepareFistBucket();
shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event1->write(1);
@@ -1348,6 +1361,7 @@ TEST(ValueMetricProducerTest, TestPushedAggregateAvg) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ valueProducer.prepareFistBucket();
shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event1->write(1);
@@ -1398,6 +1412,7 @@ TEST(ValueMetricProducerTest, TestPushedAggregateSum) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ valueProducer.prepareFistBucket();
shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event1->write(1);
@@ -1443,6 +1458,7 @@ TEST(ValueMetricProducerTest, TestSkipZeroDiffOutput) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ valueProducer.prepareFistBucket();
shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event1->write(1);
@@ -1516,6 +1532,7 @@ TEST(ValueMetricProducerTest, TestSkipZeroDiffOutputMultiValue) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
pullerManager);
+ valueProducer.prepareFistBucket();
shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event1->write(1);
@@ -2064,7 +2081,7 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) {
ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, logEventMatcherIndex,
eventMatcherWizard, tagId, bucket2StartTimeNs,
bucket2StartTimeNs, pullerManager);
-
+ valueProducer.prepareFistBucket();
valueProducer.mCondition = ConditionState::kFalse;
// Event should be skipped since it is from previous bucket.
@@ -2845,6 +2862,7 @@ TEST(ValueMetricProducerTest, TestPullNeededFastDump) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, tagId, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
+ valueProducer.prepareFistBucket();
ProtoOutputStream output;
std::set<string> strSet;
@@ -2887,6 +2905,7 @@ TEST(ValueMetricProducerTest, TestFastDumpWithoutCurrentBucket) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, tagId, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
+ valueProducer.prepareFistBucket();
vector<shared_ptr<LogEvent>> allData;
allData.clear();
@@ -2950,6 +2969,7 @@ TEST(ValueMetricProducerTest, TestPullNeededNoTimeConstraints) {
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
eventMatcherWizard, tagId, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
+ valueProducer.prepareFistBucket();
ProtoOutputStream output;
std::set<string> strSet;
@@ -2961,7 +2981,6 @@ TEST(ValueMetricProducerTest, TestPullNeededNoTimeConstraints) {
EXPECT_EQ(1, report.value_metrics().data_size());
EXPECT_EQ(1, report.value_metrics().data(0).bucket_info_size());
EXPECT_EQ(2, report.value_metrics().data(0).bucket_info(0).values(0).value_long());
- EXPECT_EQ(10, report.value_metrics().data(0).bucket_info(0).condition_true_nanos());
}
TEST(ValueMetricProducerTest, TestPulledData_noDiff_withoutCondition) {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 583103c19ab9..134ab1043904 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -140,6 +140,7 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.util.SuperNotCalledException;
+import android.util.UtilConfig;
import android.util.proto.ProtoOutputStream;
import android.view.Choreographer;
import android.view.ContextThemeWrapper;
@@ -6078,6 +6079,10 @@ public final class ActivityThread extends ClientTransactionHandler {
AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
+ // Let the util.*Array classes maintain "undefined" for apps targeting Pie or earlier.
+ UtilConfig.setThrowExceptionForUpperArrayOutOfBounds(
+ data.appInfo.targetSdkVersion >= Build.VERSION_CODES.Q);
+
Message.updateCheckRecycle(data.appInfo.targetSdkVersion);
// Prior to P, internal calls to decode Bitmaps used BitmapFactory,
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index 49ba65f7c348..be281c2a3efe 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -30,6 +30,7 @@ import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.CursorWrapper;
+import android.database.DatabaseUtils;
import android.net.ConnectivityManager;
import android.net.NetworkPolicyManager;
import android.net.Uri;
@@ -591,7 +592,15 @@ public class DownloadManager {
/**
* If the file to be downloaded is to be scanned by MediaScanner, this method
* should be called before {@link DownloadManager#enqueue(Request)} is called.
+ *
+ * @deprecated Starting in Q, this value is ignored. Files downloaded to
+ * public Downloads directory (as returned by
+ * {@link Environment#getExternalStoragePublicDirectory(String)} with
+ * {@link Environment#DIRECTORY_DOWNLOADS}) will be scanned by MediaScanner
+ * and files downloaded to directories owned by applications
+ * (e.g. {@link Context#getExternalFilesDir(String)}) will not be scanned.
*/
+ @Deprecated
public void allowScanningByMediaScanner() {
mScannable = true;
}
@@ -773,7 +782,15 @@ public class DownloadManager {
* default.
* @param isVisible whether to display this download in the Downloads UI
* @return this object
+ *
+ * @deprecated Starting in Q, this value is ignored. Files downloaded to
+ * public Downloads directory (as returned by
+ * {@link Environment#getExternalStoragePublicDirectory(String)} with
+ * {@link Environment#DIRECTORY_DOWNLOADS}) will be visible in system's Downloads UI
+ * and files downloaded to directories owned by applications
+ * (e.g. {@link Context#getExternalFilesDir(String)}) will not be visible.
*/
+ @Deprecated
public Request setVisibleInDownloadsUi(boolean isVisible) {
mIsVisibleInDownloadsUi = isVisible;
return this;
@@ -1258,55 +1275,50 @@ public class DownloadManager {
throw new SecurityException(displayName + " is not a valid filename");
}
- Query query = new Query().setFilterById(id);
- Cursor cursor = null;
- String oldDisplayName = null;
- String mimeType = null;
- try {
- cursor = query(query);
+ final String filePath;
+ final Query query = new Query().setFilterById(id);
+ try (Cursor cursor = query(query)) {
if (cursor == null) {
- return false;
+ throw new IllegalStateException("Missing cursor for download id=" + id);
}
if (cursor.moveToFirst()) {
- int status = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_STATUS));
- if (DownloadManager.STATUS_SUCCESSFUL != status) {
- return false;
+ final int status = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_STATUS));
+ if (status != DownloadManager.STATUS_SUCCESSFUL) {
+ throw new IllegalStateException("Download is not completed yet: "
+ + DatabaseUtils.dumpCurrentRowToString(cursor));
}
- oldDisplayName = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TITLE));
- mimeType = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_MEDIA_TYPE));
- }
- } finally {
- if (cursor != null) {
- cursor.close();
+ filePath = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_LOCAL_FILENAME));
+ if (filePath == null) {
+ throw new IllegalStateException("Download doesn't have a valid file path: "
+ + DatabaseUtils.dumpCurrentRowToString(cursor));
+ } else if (!new File(filePath).exists()) {
+ throw new IllegalStateException("Downloaded file doesn't exist anymore: "
+ + DatabaseUtils.dumpCurrentRowToString(cursor));
+ }
+ } else {
+ throw new IllegalStateException("Missing download id=" + id);
}
}
- if (oldDisplayName == null || mimeType == null) {
- throw new IllegalStateException(
- "Document with id " + id + " does not exist");
- }
-
- final File parent = Environment.getExternalStoragePublicDirectory(
- Environment.DIRECTORY_DOWNLOADS);
-
- final File before = new File(parent, oldDisplayName);
- final File after = new File(parent, displayName);
+ final File before = new File(filePath);
+ final File after = new File(before.getParentFile(), displayName);
if (after.exists()) {
- throw new IllegalStateException("Already exists " + after);
+ throw new IllegalStateException("File already exists: " + after);
}
if (!before.renameTo(after)) {
- throw new IllegalStateException("Failed to rename to " + after);
+ throw new IllegalStateException(
+ "Failed to rename file from " + before + " to " + after);
}
- ContentValues values = new ContentValues();
+ final ContentValues values = new ContentValues();
values.put(Downloads.Impl.COLUMN_TITLE, displayName);
values.put(Downloads.Impl._DATA, after.toString());
values.putNull(Downloads.Impl.COLUMN_MEDIAPROVIDER_URI);
- long[] ids = {id};
+ final long[] ids = { id };
- return (mResolver.update(mBaseUri, values, getWhereClauseForIds(ids),
- getWhereArgsForIds(ids)) == 1);
+ return mResolver.update(
+ mBaseUri, values, getWhereClauseForIds(ids), getWhereArgsForIds(ids)) == 1;
}
/**
@@ -1370,7 +1382,12 @@ public class DownloadManager {
* @param showNotification true if a notification is to be sent, false otherwise
* @return an ID for the download entry added to the downloads app, unique across the system
* This ID is used to make future calls related to this download.
+ *
+ * @deprecated Apps should instead contribute files to
+ * {@link android.provider.MediaStore.Downloads} collection to make them available to user
+ * as part of Downloads.
*/
+ @Deprecated
public long addCompletedDownload(String title, String description,
boolean isMediaScannerScannable, String mimeType, String path, long length,
boolean showNotification) {
@@ -1411,7 +1428,12 @@ public class DownloadManager {
* @param referer the HTTP Referer for the download
* @return an ID for the download entry added to the downloads app, unique across the system
* This ID is used to make future calls related to this download.
+ *
+ * @deprecated Apps should instead contribute files to
+ * {@link android.provider.MediaStore.Downloads} collection to make them available to user
+ * as part of Downloads.
*/
+ @Deprecated
public long addCompletedDownload(String title, String description,
boolean isMediaScannerScannable, String mimeType, String path, long length,
boolean showNotification, Uri uri, Uri referer) {
@@ -1430,8 +1452,13 @@ public class DownloadManager {
* {@link Environment#getExternalStoragePublicDirectory(String)} with
* {@link Environment#DIRECTORY_DOWNLOADS}).
*
+ * @deprecated Apps should instead contribute files to
+ * {@link android.provider.MediaStore.Downloads} collection to make them available to user
+ * as part of Downloads.
+ *
* {@hide}
*/
+ @Deprecated
public long addCompletedDownload(String title, String description,
boolean isMediaScannerScannable, String mimeType, String path, long length,
boolean showNotification, boolean allowWrite) {
@@ -1451,7 +1478,12 @@ public class DownloadManager {
* {@link Environment#DIRECTORY_DOWNLOADS}).
*
* {@hide}
+ *
+ * @deprecated Apps should instead contribute files to
+ * {@link android.provider.MediaStore.Downloads} collection to make them available to user
+ * as part of Downloads.
*/
+ @Deprecated
public long addCompletedDownload(String title, String description,
boolean isMediaScannerScannable, String mimeType, String path, long length,
boolean showNotification, boolean allowWrite, Uri uri, Uri referer) {
diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java
index bcd43a209e60..667758755c99 100644
--- a/core/java/android/app/KeyguardManager.java
+++ b/core/java/android/app/KeyguardManager.java
@@ -125,15 +125,14 @@ public class KeyguardManager {
public static final int RESULT_ALTERNATE = 1;
/**
- * @deprecated see {@link BiometricPrompt.Builder#setDeviceCredentialAllowed(boolean)}
- *
* Get an intent to prompt the user to confirm credentials (pin, pattern, password or biometrics
* if enrolled) for the current user of the device. The caller is expected to launch this
* activity using {@link android.app.Activity#startActivityForResult(Intent, int)} and check for
* {@link android.app.Activity#RESULT_OK} if the user successfully completes the challenge.
*
* @return the intent for launching the activity or null if no password is required.
- **/
+ * @deprecated see {@link BiometricPrompt.Builder#setDeviceCredentialAllowed(boolean)}
+ */
@Deprecated
@RequiresFeature(PackageManager.FEATURE_SECURE_LOCK_SCREEN)
public Intent createConfirmDeviceCredentialIntent(CharSequence title,
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index d0361b7e1118..15b571ffcd72 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -8642,27 +8642,6 @@ public class Notification implements Parcelable
}
/**
- * @return whether this bubble should suppress the initial notification when it is posted.
- *
- * @see BubbleMetadata.Builder#setSuppressInitialNotification(boolean)
- * @deprecated TO BE REMOVED, use {@link #isNotificationSuppressed()} instead.
- */
- @Deprecated
- public boolean getSuppressInitialNotification() {
- return isNotificationSuppressed();
- }
-
- /**
- * @return whether this bubble should suppress the notification when it is posted.
- *
- * @see BubbleMetadata.Builder#setSuppressNotification(boolean)
- * @deprecated TO BE REMOVED, use {@link #isNotificationSuppressed()} instead.
- */
- public boolean getSuppressNotification() {
- return isNotificationSuppressed();
- }
-
- /**
* @return whether this bubble should suppress the notification when it is posted.
*
* @see BubbleMetadata.Builder#setSuppressNotification(boolean)
@@ -8818,27 +8797,6 @@ public class Notification implements Parcelable
}
/**
- * If set and the app creating the bubble is in the foreground, the bubble will be
- * posted <b>without</b> the associated notification in the notification shade.
- * Subsequent update notifications to this bubble will post a notification in the shade.
- *
- * <p>If the app creating the bubble is not in the foreground this flag has no effect.
- * </p>
- *
- * <p>Generally this flag should only be set if the user has performed an action to
- * request or create a bubble.</p>
- *
- * @deprecated TO BE REMOVED, use {@link #setSuppressNotification(boolean)} instead.
- */
- @Deprecated
- @NonNull
- public BubbleMetadata.Builder setSuppressInitialNotification(
- boolean shouldSupressNotif) {
- setFlag(FLAG_SUPPRESS_NOTIFICATION, shouldSupressNotif);
- return this;
- }
-
- /**
* If set and the app posting the bubble is in the foreground, the bubble will be
* posted <b>without</b> the associated notification in the notification shade.
*
diff --git a/core/java/android/app/role/RoleControllerManager.java b/core/java/android/app/role/RoleControllerManager.java
index 9186b3d5e15a..668dbd4537ff 100644
--- a/core/java/android/app/role/RoleControllerManager.java
+++ b/core/java/android/app/role/RoleControllerManager.java
@@ -22,6 +22,7 @@ import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
import android.annotation.UserIdInt;
+import android.app.ActivityThread;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -93,7 +94,7 @@ public class RoleControllerManager {
int userId = context.getUserId();
RemoteService remoteService = sRemoteServices.get(userId);
if (remoteService == null) {
- remoteService = new RemoteService(context.getApplicationContext(),
+ remoteService = new RemoteService(ActivityThread.currentApplication(),
remoteServiceComponentName, handler, userId);
sRemoteServices.put(userId, remoteService);
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 00238bfe0ee3..3dd510c6a6e6 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3015,7 +3015,8 @@ public abstract class Context {
* specify an explicit component name.
* @param flags Operation options for the binding as per {@link #bindService}.
* @param instanceName Unique identifier for the service instance. Each unique
- * name here will result in a different service instance being created.
+ * name here will result in a different service instance being created. Identifiers
+ * must only contain ASCII letters, digits, underscores, and periods.
* @return Returns success of binding as per {@link #bindService}.
* @param executor Callbacks on ServiceConnection will be called on executor.
* Must use same instance for the same instance of ServiceConnection.
@@ -3023,6 +3024,7 @@ public abstract class Context {
* This must be a valid ServiceConnection object; it must not be null.
*
* @throws SecurityException If the caller does not have permission to access the service
+ * @throws IllegalArgumentException If the instanceName is invalid.
*
* @see #bindService
*/
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 5f3e0570840a..a95e094ce54c 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -3143,6 +3143,14 @@ public abstract class PackageManager {
@SystemApi
public static final int FLAG_PERMISSION_APPLY_RESTRICTION = 1 << 14;
+ /**
+ * Permission flag: The permission is granted because the application holds a role.
+ *
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ public static final int FLAG_PERMISSION_GRANTED_BY_ROLE = 1 << 15;
/**
* Permission flags: Bitwise or of all permission flags allowing an
@@ -3183,7 +3191,8 @@ public abstract class PackageManager {
| FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT
| FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT
| FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT
- | FLAG_PERMISSION_APPLY_RESTRICTION;
+ | FLAG_PERMISSION_APPLY_RESTRICTION
+ | FLAG_PERMISSION_GRANTED_BY_ROLE;
/**
* Injected activity in app that forwards user to setting activity of that app.
@@ -3947,7 +3956,8 @@ public abstract class PackageManager {
FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT,
FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT,
FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT,
- FLAG_PERMISSION_APPLY_RESTRICTION
+ FLAG_PERMISSION_APPLY_RESTRICTION,
+ FLAG_PERMISSION_GRANTED_BY_ROLE
})
@Retention(RetentionPolicy.SOURCE)
public @interface PermissionFlags {}
@@ -7030,7 +7040,8 @@ public abstract class PackageManager {
case FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT: return "RESTRICTION_INSTALLER_EXEMPT";
case FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT: return "RESTRICTION_SYSTEM_EXEMPT";
case FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT: return "RESTRICTION_UPGRADE_EXEMPT";
- case FLAG_PERMISSION_APPLY_RESTRICTION: return "FLAG_PERMISSION_APPLY_RESTRICTION";
+ case FLAG_PERMISSION_APPLY_RESTRICTION: return "APPLY_RESTRICTION";
+ case FLAG_PERMISSION_GRANTED_BY_ROLE: return "GRANTED_BY_ROLE";
default: return Integer.toString(flag);
}
}
diff --git a/core/java/android/net/DhcpResults.java b/core/java/android/net/DhcpResults.java
index 2e52f72d981e..97be51a30641 100644
--- a/core/java/android/net/DhcpResults.java
+++ b/core/java/android/net/DhcpResults.java
@@ -64,6 +64,8 @@ public final class DhcpResults implements Parcelable {
@UnsupportedAppUsage
public int mtu;
+ public String serverHostName;
+
public DhcpResults() {
super();
}
@@ -97,6 +99,7 @@ public final class DhcpResults implements Parcelable {
vendorInfo = source.vendorInfo;
leaseDuration = source.leaseDuration;
mtu = source.mtu;
+ serverHostName = source.serverHostName;
}
}
@@ -129,6 +132,7 @@ public final class DhcpResults implements Parcelable {
vendorInfo = null;
leaseDuration = 0;
mtu = 0;
+ serverHostName = null;
}
@Override
@@ -139,6 +143,7 @@ public final class DhcpResults implements Parcelable {
str.append(" Vendor info ").append(vendorInfo);
str.append(" lease ").append(leaseDuration).append(" seconds");
if (mtu != 0) str.append(" MTU ").append(mtu);
+ str.append(" Servername ").append(serverHostName);
return str.toString();
}
@@ -154,6 +159,7 @@ public final class DhcpResults implements Parcelable {
return toStaticIpConfiguration().equals(target.toStaticIpConfiguration())
&& Objects.equals(serverAddress, target.serverAddress)
&& Objects.equals(vendorInfo, target.vendorInfo)
+ && Objects.equals(serverHostName, target.serverHostName)
&& leaseDuration == target.leaseDuration
&& mtu == target.mtu;
}
@@ -179,6 +185,7 @@ public final class DhcpResults implements Parcelable {
dest.writeInt(mtu);
InetAddressUtils.parcelInetAddress(dest, serverAddress, flags);
dest.writeString(vendorInfo);
+ dest.writeString(serverHostName);
}
@Override
@@ -193,6 +200,7 @@ public final class DhcpResults implements Parcelable {
dhcpResults.mtu = in.readInt();
dhcpResults.serverAddress = (Inet4Address) InetAddressUtils.unparcelInetAddress(in);
dhcpResults.vendorInfo = in.readString();
+ dhcpResults.serverHostName = in.readString();
return dhcpResults;
}
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 45946e331ef9..3716b3edaed4 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -24,8 +24,10 @@ import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.content.Intent;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
+import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
@@ -529,7 +531,8 @@ public class Environment {
* <p>
* Writing to this path requires the
* {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} permission,
- * and starting in {@link android.os.Build.VERSION_CODES#KITKAT}, read access requires the
+ * and starting in {@link android.os.Build.VERSION_CODES#KITKAT}, read
+ * access requires the
* {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} permission,
* which is automatically granted if you hold the write permission.
* <p>
@@ -551,7 +554,16 @@ public class Environment {
*
* @see #getExternalStorageState()
* @see #isExternalStorageRemovable()
+ * @deprecated To improve user privacy, direct access to shared/external
+ * storage devices is deprecated. When an app targets
+ * {@link android.os.Build.VERSION_CODES#Q}, the path returned
+ * from this method is no longer directly accessible to apps.
+ * Apps can continue to access content stored on shared/external
+ * storage by migrating to alternatives such as
+ * {@link Context#getExternalFilesDir(String)},
+ * {@link MediaStore}, or {@link Intent#ACTION_OPEN_DOCUMENT}.
*/
+ @Deprecated
public static File getExternalStorageDirectory() {
throwIfUserRequired();
return sCurrentUser.getExternalDirs()[0];
@@ -827,7 +839,16 @@ public class Environment {
* @return Returns the File path for the directory. Note that this directory
* may not yet exist, so you must make sure it exists before using
* it such as with {@link File#mkdirs File.mkdirs()}.
+ * @deprecated To improve user privacy, direct access to shared/external
+ * storage devices is deprecated. When an app targets
+ * {@link android.os.Build.VERSION_CODES#Q}, the path returned
+ * from this method is no longer directly accessible to apps.
+ * Apps can continue to access content stored on shared/external
+ * storage by migrating to alternatives such as
+ * {@link Context#getExternalFilesDir(String)},
+ * {@link MediaStore}, or {@link Intent#ACTION_OPEN_DOCUMENT}.
*/
+ @Deprecated
public static File getExternalStoragePublicDirectory(String type) {
throwIfUserRequired();
return sCurrentUser.buildExternalStoragePublicDirs(type)[0];
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index db23cfab8563..7f60b9cec284 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -363,18 +363,6 @@ interface INetworkManagementService
boolean isNetworkActive();
/**
- * Setup a new physical network.
- * @param permission PERMISSION_NONE if no permissions required to access this network.
- * PERMISSION_NETWORK or PERMISSION_SYSTEM to set respective permission.
- */
- void createPhysicalNetwork(int netId, int permission);
-
- /**
- * Setup a new VPN.
- */
- void createVirtualNetwork(int netId, boolean secure);
-
- /**
* Add an interface to a network.
*/
void addInterfaceToNetwork(String iface, int netId);
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 94cca30d9e6c..c707ba839336 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -1284,13 +1284,15 @@ public final class StrictMode {
return oldPolicyMask;
}
- private static ThreadPolicy allowThreadViolations() {
+ /** @hide */
+ public static ThreadPolicy allowThreadViolations() {
ThreadPolicy oldPolicy = getThreadPolicy();
setThreadPolicyMask(0);
return oldPolicy;
}
- private static VmPolicy allowVmViolations() {
+ /** @hide */
+ public static VmPolicy allowVmViolations() {
VmPolicy oldPolicy = getVmPolicy();
sVmPolicy = VmPolicy.LAX;
return oldPolicy;
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 080ff7301ed2..b9fc186e1c1e 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -18,6 +18,7 @@ package android.os.storage;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
+import static android.app.AppOpsManager.OP_LEGACY_STORAGE;
import static android.app.AppOpsManager.OP_READ_EXTERNAL_STORAGE;
import static android.app.AppOpsManager.OP_READ_MEDIA_AUDIO;
import static android.app.AppOpsManager.OP_READ_MEDIA_IMAGES;
@@ -1721,6 +1722,33 @@ public class StorageManager {
return checkPermissionAndAppOp(mContext, enforce, pid, uid, packageName, permission, op);
}
+ private boolean noteAppOpAllowingLegacy(boolean enforce,
+ int pid, int uid, String packageName, int op) {
+ final int mode = mAppOps.noteOpNoThrow(op, uid, packageName);
+ switch (mode) {
+ case AppOpsManager.MODE_ALLOWED:
+ return true;
+ case AppOpsManager.MODE_DEFAULT:
+ case AppOpsManager.MODE_IGNORED:
+ case AppOpsManager.MODE_ERRORED:
+ // Legacy apps technically have the access granted by this op,
+ // even when the op is denied
+ if ((mAppOps.checkOpNoThrow(OP_LEGACY_STORAGE, uid,
+ packageName) == AppOpsManager.MODE_ALLOWED)) return true;
+
+ if (enforce) {
+ throw new SecurityException("Op " + AppOpsManager.opToName(op) + " "
+ + AppOpsManager.modeToName(mode) + " for package " + packageName);
+ } else {
+ return false;
+ }
+ default:
+ throw new IllegalStateException(
+ AppOpsManager.opToName(op) + " has unknown mode "
+ + AppOpsManager.modeToName(mode));
+ }
+ }
+
// Callers must hold both the old and new permissions, so that we can
// handle obscure cases like when an app targets Q but was installed on
// a device that was originally running on P before being upgraded to Q.
@@ -1730,8 +1758,7 @@ public class StorageManager {
int pid, int uid, String packageName) {
if (!checkPermissionAndAppOp(enforce, pid, uid, packageName,
READ_EXTERNAL_STORAGE, OP_READ_EXTERNAL_STORAGE)) return false;
- mAppOps.noteOpNoThrow(OP_READ_MEDIA_AUDIO, uid, packageName);
- return true;
+ return noteAppOpAllowingLegacy(enforce, pid, uid, packageName, OP_READ_MEDIA_AUDIO);
}
/** {@hide} */
@@ -1739,8 +1766,7 @@ public class StorageManager {
int pid, int uid, String packageName) {
if (!checkPermissionAndAppOp(enforce, pid, uid, packageName,
WRITE_EXTERNAL_STORAGE, OP_WRITE_EXTERNAL_STORAGE)) return false;
- mAppOps.noteOpNoThrow(OP_WRITE_MEDIA_AUDIO, uid, packageName);
- return true;
+ return noteAppOpAllowingLegacy(enforce, pid, uid, packageName, OP_WRITE_MEDIA_AUDIO);
}
/** {@hide} */
@@ -1748,8 +1774,7 @@ public class StorageManager {
int pid, int uid, String packageName) {
if (!checkPermissionAndAppOp(enforce, pid, uid, packageName,
READ_EXTERNAL_STORAGE, OP_READ_EXTERNAL_STORAGE)) return false;
- mAppOps.noteOpNoThrow(OP_READ_MEDIA_VIDEO, uid, packageName);
- return true;
+ return noteAppOpAllowingLegacy(enforce, pid, uid, packageName, OP_READ_MEDIA_VIDEO);
}
/** {@hide} */
@@ -1757,8 +1782,7 @@ public class StorageManager {
int pid, int uid, String packageName) {
if (!checkPermissionAndAppOp(enforce, pid, uid, packageName,
WRITE_EXTERNAL_STORAGE, OP_WRITE_EXTERNAL_STORAGE)) return false;
- mAppOps.noteOpNoThrow(OP_WRITE_MEDIA_VIDEO, uid, packageName);
- return true;
+ return noteAppOpAllowingLegacy(enforce, pid, uid, packageName, OP_WRITE_MEDIA_VIDEO);
}
/** {@hide} */
@@ -1766,8 +1790,7 @@ public class StorageManager {
int pid, int uid, String packageName) {
if (!checkPermissionAndAppOp(enforce, pid, uid, packageName,
READ_EXTERNAL_STORAGE, OP_READ_EXTERNAL_STORAGE)) return false;
- mAppOps.noteOpNoThrow(OP_READ_MEDIA_IMAGES, uid, packageName);
- return true;
+ return noteAppOpAllowingLegacy(enforce, pid, uid, packageName, OP_READ_MEDIA_IMAGES);
}
/** {@hide} */
@@ -1775,8 +1798,7 @@ public class StorageManager {
int pid, int uid, String packageName) {
if (!checkPermissionAndAppOp(enforce, pid, uid, packageName,
WRITE_EXTERNAL_STORAGE, OP_WRITE_EXTERNAL_STORAGE)) return false;
- mAppOps.noteOpNoThrow(OP_WRITE_MEDIA_IMAGES, uid, packageName);
- return true;
+ return noteAppOpAllowingLegacy(enforce, pid, uid, packageName, OP_WRITE_MEDIA_IMAGES);
}
/** {@hide} */
diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java
index be8973751bf8..6e83e5a1f8b6 100644
--- a/core/java/android/permission/PermissionControllerManager.java
+++ b/core/java/android/permission/PermissionControllerManager.java
@@ -39,6 +39,7 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
+import android.app.ActivityThread;
import android.app.admin.DevicePolicyManager.PermissionGrantState;
import android.content.ComponentName;
import android.content.Context;
@@ -232,7 +233,7 @@ public final class PermissionControllerManager {
intent.setPackage(context.getPackageManager().getPermissionControllerPackageName());
ResolveInfo serviceInfo = context.getPackageManager().resolveService(intent, 0);
- remoteService = new RemoteService(context.getApplicationContext(),
+ remoteService = new RemoteService(ActivityThread.currentApplication(),
serviceInfo.getComponentInfo().getComponentName(), handler,
context.getUser());
sRemoteServices.put(key, remoteService);
diff --git a/core/java/android/util/ArrayMap.java b/core/java/android/util/ArrayMap.java
index e2af6f5ed102..7653c77c47e1 100644
--- a/core/java/android/util/ArrayMap.java
+++ b/core/java/android/util/ArrayMap.java
@@ -449,11 +449,17 @@ public final class ArrayMap<K, V> implements Map<K, V> {
/**
* Return the key at the given index in the array.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
+ *
* @param index The desired index, must be between 0 and {@link #size()}-1.
* @return Returns the key stored at the given index.
*/
public K keyAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -462,11 +468,17 @@ public final class ArrayMap<K, V> implements Map<K, V> {
/**
* Return the value at the given index in the array.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
+ *
* @param index The desired index, must be between 0 and {@link #size()}-1.
* @return Returns the value stored at the given index.
*/
public V valueAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -475,12 +487,18 @@ public final class ArrayMap<K, V> implements Map<K, V> {
/**
* Set the value at a given index in the array.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
+ *
* @param index The desired index, must be between 0 and {@link #size()}-1.
* @param value The new value to store at this index.
* @return Returns the previous value at the given index.
*/
public V setValueAt(int index, V value) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -673,11 +691,17 @@ public final class ArrayMap<K, V> implements Map<K, V> {
/**
* Remove the key/value mapping at the given index.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
+ *
* @param index The desired index, must be between 0 and {@link #size()}-1.
* @return Returns the value that was stored at this index.
*/
public V removeAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java
index 4bd43d05ae61..610641d6f962 100644
--- a/core/java/android/util/ArraySet.java
+++ b/core/java/android/util/ArraySet.java
@@ -356,11 +356,17 @@ public final class ArraySet<E> implements Collection<E>, Set<E> {
/**
* Return the value at the given index in the array.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
+ *
* @param index The desired index, must be between 0 and {@link #size()}-1.
* @return Returns the value stored at the given index.
*/
public E valueAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -527,11 +533,17 @@ public final class ArraySet<E> implements Collection<E>, Set<E> {
/**
* Remove the key/value mapping at the given index.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
+ *
* @param index The desired index, must be between 0 and {@link #size()}-1.
* @return Returns the value that was stored at this index.
*/
public E removeAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
diff --git a/core/java/android/util/LongSparseArray.java b/core/java/android/util/LongSparseArray.java
index e4de7045721b..698b5b03f06e 100644
--- a/core/java/android/util/LongSparseArray.java
+++ b/core/java/android/util/LongSparseArray.java
@@ -142,9 +142,14 @@ public class LongSparseArray<E> implements Cloneable {
/**
* Removes the mapping at the specified index.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public void removeAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -235,9 +240,14 @@ public class LongSparseArray<E> implements Cloneable {
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
* smallest key and <code>keyAt(size()-1)</code> will return the largest
* key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public long keyAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -258,10 +268,15 @@ public class LongSparseArray<E> implements Cloneable {
* <code>valueAt(0)</code> will return the value associated with the
* smallest key and <code>valueAt(size()-1)</code> will return the value
* associated with the largest key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
@SuppressWarnings("unchecked")
public E valueAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -276,9 +291,14 @@ public class LongSparseArray<E> implements Cloneable {
* Given an index in the range <code>0...size()-1</code>, sets a new
* value for the <code>index</code>th key-value mapping that this
* LongSparseArray stores.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public void setValueAt(int index, E value) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
diff --git a/core/java/android/util/LongSparseLongArray.java b/core/java/android/util/LongSparseLongArray.java
index f167f009a942..b7c3e180ea06 100644
--- a/core/java/android/util/LongSparseLongArray.java
+++ b/core/java/android/util/LongSparseLongArray.java
@@ -170,9 +170,14 @@ public class LongSparseLongArray implements Cloneable {
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
* smallest key and <code>keyAt(size()-1)</code> will return the largest
* key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public long keyAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -189,9 +194,14 @@ public class LongSparseLongArray implements Cloneable {
* <code>valueAt(0)</code> will return the value associated with the
* smallest key and <code>valueAt(size()-1)</code> will return the value
* associated with the largest key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public long valueAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
diff --git a/core/java/android/util/SparseArray.java b/core/java/android/util/SparseArray.java
index 67dfb02a0b95..7a8c780d665a 100644
--- a/core/java/android/util/SparseArray.java
+++ b/core/java/android/util/SparseArray.java
@@ -169,10 +169,12 @@ public class SparseArray<E> implements Cloneable {
* Removes the mapping at the specified index.
*
* <p>For indices outside of the range <code>0...size()-1</code>,
- * the behavior is undefined.</p>
+ * the behavior is undefined for apps targeting {@link android.os.Build.VERSION_CODES#P} and
+ * earlier, and an {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public void removeAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -281,10 +283,12 @@ public class SparseArray<E> implements Cloneable {
* key.</p>
*
* <p>For indices outside of the range <code>0...size()-1</code>,
- * the behavior is undefined.</p>
+ * the behavior is undefined for apps targeting {@link android.os.Build.VERSION_CODES#P} and
+ * earlier, and an {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public int keyAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -307,11 +311,13 @@ public class SparseArray<E> implements Cloneable {
* associated with the largest key.</p>
*
* <p>For indices outside of the range <code>0...size()-1</code>,
- * the behavior is undefined.</p>
+ * the behavior is undefined for apps targeting {@link android.os.Build.VERSION_CODES#P} and
+ * earlier, and an {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
@SuppressWarnings("unchecked")
public E valueAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -327,10 +333,13 @@ public class SparseArray<E> implements Cloneable {
* value for the <code>index</code>th key-value mapping that this
* SparseArray stores.
*
- * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined.</p>
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public void setValueAt(int index, E value) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
diff --git a/core/java/android/util/SparseBooleanArray.java b/core/java/android/util/SparseBooleanArray.java
index 03fa1c996027..557404764aed 100644
--- a/core/java/android/util/SparseBooleanArray.java
+++ b/core/java/android/util/SparseBooleanArray.java
@@ -166,9 +166,14 @@ public class SparseBooleanArray implements Cloneable {
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
* smallest key and <code>keyAt(size()-1)</code> will return the largest
* key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public int keyAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -185,9 +190,14 @@ public class SparseBooleanArray implements Cloneable {
* <code>valueAt(0)</code> will return the value associated with the
* smallest key and <code>valueAt(size()-1)</code> will return the value
* associated with the largest key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public boolean valueAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -196,9 +206,14 @@ public class SparseBooleanArray implements Cloneable {
/**
* Directly set the value at a particular index.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public void setValueAt(int index, boolean value) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
diff --git a/core/java/android/util/SparseIntArray.java b/core/java/android/util/SparseIntArray.java
index c68dc4edcfb7..84f92690b3cf 100644
--- a/core/java/android/util/SparseIntArray.java
+++ b/core/java/android/util/SparseIntArray.java
@@ -170,9 +170,14 @@ public class SparseIntArray implements Cloneable {
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
* smallest key and <code>keyAt(size()-1)</code> will return the largest
* key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public int keyAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -189,9 +194,14 @@ public class SparseIntArray implements Cloneable {
* <code>valueAt(0)</code> will return the value associated with the
* smallest key and <code>valueAt(size()-1)</code> will return the value
* associated with the largest key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public int valueAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -200,9 +210,14 @@ public class SparseIntArray implements Cloneable {
/**
* Directly set the value at a particular index.
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public void setValueAt(int index, int value) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
diff --git a/core/java/android/util/SparseLongArray.java b/core/java/android/util/SparseLongArray.java
index 37a92024f374..00e39a9223d5 100644
--- a/core/java/android/util/SparseLongArray.java
+++ b/core/java/android/util/SparseLongArray.java
@@ -180,9 +180,14 @@ public class SparseLongArray implements Cloneable {
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
* smallest key and <code>keyAt(size()-1)</code> will return the largest
* key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public int keyAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
@@ -199,9 +204,14 @@ public class SparseLongArray implements Cloneable {
* <code>valueAt(0)</code> will return the value associated with the
* smallest key and <code>valueAt(size()-1)</code> will return the value
* associated with the largest key.</p>
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
+ * apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
+ * {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q} and later.</p>
*/
public long valueAt(int index) {
- if (index >= mSize) {
+ if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
throw new ArrayIndexOutOfBoundsException(index);
}
diff --git a/core/java/android/util/UtilConfig.java b/core/java/android/util/UtilConfig.java
new file mode 100644
index 000000000000..7658c408ae80
--- /dev/null
+++ b/core/java/android/util/UtilConfig.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.util;
+
+/**
+ * Class to configure several of the util classes.
+ *
+ * @hide
+ */
+public class UtilConfig {
+ static boolean sThrowExceptionForUpperArrayOutOfBounds = true;
+
+ public static void setThrowExceptionForUpperArrayOutOfBounds(boolean check) {
+ sThrowExceptionForUpperArrayOutOfBounds = check;
+ }
+}
diff --git a/core/java/android/view/DisplayAddress.java b/core/java/android/view/DisplayAddress.java
index 13608150babe..c8b7e25e59fb 100644
--- a/core/java/android/view/DisplayAddress.java
+++ b/core/java/android/view/DisplayAddress.java
@@ -32,13 +32,12 @@ public abstract class DisplayAddress implements Parcelable {
* A physical display ID is stable if the display can be identified using EDID information.
*
* @param physicalDisplayId A physical display ID.
- * @return The {@link Physical} address, or {@code null} if the ID is not stable.
+ * @return The {@link Physical} address.
* @see SurfaceControl#getPhysicalDisplayIds
*/
- @Nullable
+ @NonNull
public static Physical fromPhysicalDisplayId(long physicalDisplayId) {
- final Physical address = new Physical(physicalDisplayId);
- return address.getModel() == 0 ? null : address;
+ return new Physical(physicalDisplayId);
}
/**
@@ -59,9 +58,12 @@ public abstract class DisplayAddress implements Parcelable {
* of a display. The port, located in the least significant byte, uniquely identifies a physical
* connector on the device for display output like eDP or HDMI. The model, located in the upper
* bits, uniquely identifies a display model across manufacturers by encoding EDID information.
+ * While the port is always stable, the model may not be available if EDID identification is not
+ * supported by the platform, in which case the address is not unique.
*/
public static final class Physical extends DisplayAddress {
- private static final int PHYSICAL_DISPLAY_ID_MODEL_SHIFT = 8;
+ private static final long UNKNOWN_MODEL = 0;
+ private static final int MODEL_SHIFT = 8;
private static final int PORT_MASK = 0xFF;
private final long mPhysicalDisplayId;
@@ -75,9 +77,13 @@ public abstract class DisplayAddress implements Parcelable {
/**
* Model identifier unique across manufacturers.
+ *
+ * @return The model ID, or {@code null} if the model cannot be identified.
*/
- public long getModel() {
- return mPhysicalDisplayId >>> PHYSICAL_DISPLAY_ID_MODEL_SHIFT;
+ @Nullable
+ public Long getModel() {
+ final long model = mPhysicalDisplayId >>> MODEL_SHIFT;
+ return model == UNKNOWN_MODEL ? null : model;
}
@Override
@@ -88,11 +94,15 @@ public abstract class DisplayAddress implements Parcelable {
@Override
public String toString() {
- return new StringBuilder("{")
- .append("port=").append(getPort() & PORT_MASK)
- .append(", model=0x").append(Long.toHexString(getModel()))
- .append("}")
- .toString();
+ final StringBuilder builder = new StringBuilder("{")
+ .append("port=").append(getPort() & PORT_MASK);
+
+ final Long model = getModel();
+ if (model != null) {
+ builder.append(", model=0x").append(Long.toHexString(model));
+ }
+
+ return builder.append("}").toString();
}
@Override
@@ -109,7 +119,7 @@ public abstract class DisplayAddress implements Parcelable {
mPhysicalDisplayId = physicalDisplayId;
}
- public static final @android.annotation.NonNull Parcelable.Creator<Physical> CREATOR =
+ public static final @NonNull Parcelable.Creator<Physical> CREATOR =
new Parcelable.Creator<Physical>() {
@Override
public Physical createFromParcel(Parcel in) {
@@ -153,7 +163,7 @@ public abstract class DisplayAddress implements Parcelable {
mMacAddress = macAddress;
}
- public static final @android.annotation.NonNull Parcelable.Creator<Network> CREATOR =
+ public static final @NonNull Parcelable.Creator<Network> CREATOR =
new Parcelable.Creator<Network>() {
@Override
public Network createFromParcel(Parcel in) {
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index dc2e6d5d2d41..0df2c833fd9d 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -459,6 +459,7 @@ message StateControllerProto {
optional bool is_charging = 1;
optional bool is_in_parole = 2;
+ optional int64 elapsed_realtime = 6;
// List of UIDs currently in the foreground.
repeated int32 foreground_uids = 3;
@@ -478,6 +479,16 @@ message StateControllerProto {
}
repeated TrackedJob tracked_jobs = 4;
+ message AlarmListener {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Whether the listener is waiting for an alarm or not.
+ optional bool is_waiting = 1;
+ // The time at which the alarm should go off, in the elapsed realtime timebase. Only
+ // valid if is_waiting is true.
+ optional int64 trigger_time_elapsed = 2;
+ }
+
message ExecutionStats {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -567,6 +578,8 @@ message StateControllerProto {
repeated TimingSession saved_sessions = 3;
repeated ExecutionStats execution_stats = 4;
+
+ optional AlarmListener in_quota_alarm_listener = 5;
}
repeated PackageStats package_stats = 5;
}
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 347c7c9e9350..e4dd53fd70cf 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Laat program toe om metodes te benut om gesigtemplate vir gebruik by te voeg en uit te vee."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gebruik gesigstawinghardeware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Laat die program toe om gesigstawinghardeware vir stawing te gebruik"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Gesigstawing"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Skryf jou gesig weer in"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Skryf asseblief jou gesig weer in om herkenning te verbeter"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Kon nie gesigdata akkuraat vasvang nie. Probeer weer."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Te helder. Probeer sagter beligting."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Te donker. Probeer helderder beligting."</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index eb52ad96e648..f3bc422e1573 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"የፊት ማረጋገጫ ሃርድዌር ይጠቀሙ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"መተግበሪያው የማረጋገጫ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"በመልክ ማረጋገጥ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"የእርስዎን ፊት ዳግመኛ ያስመዝግቡ"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ማንነትን ለይቶ ማወቅን ለማሻሻል፣ እባክዎ የእርስዎን ፊት ዳግም ያስመዝግቡ"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"ትክክለኛ የፊት ውሂብ ማንሳት አልተቻለም። እንደገና ይሞክሩ።"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"ከልክ በላይ ፈካ ያለ። ይበልጥ ረጋ ያለ ብርሃን አጠቃቀምን ይሞክሩ።"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"ከልክ በላይ ጨለማ ነው። ከዚህ ፈካ ያለ ብርሃን አጠቃቀምን ይሞክሩ።"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 6d725b77a67d..ed64ad80b5ea 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -565,12 +565,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"السماح للتطبيق باستدعاء طرق لإضافة نماذج من الوجوه وحذفها"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"استخدام أجهزة مصادقة الوجه"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"السماح للتطبيق باستخدام أجهزة مصادقة الوجه"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"المصادقة بالوجه"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"إعادة تسجيل وجهك"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"لتحسين قدرة الجهاز على معرفة وجهك، يُرجى إعادة تسجيل الوجه."</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"تعذّر تسجيل بيانات دقيقة للوجه. حاول مرة أخرى."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"ساطع للغاية. تجربة مستوى سطوع أقلّ."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"الصورة معتمة للغاية. يُرجى زيادة السطوع."</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index c51764aa2788..6a219f3193f7 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"মুখমণ্ডলৰ টেম্প্লেট যোগ কৰাৰ বা মচাৰ পদ্ধতি কামত লগাবলৈ আহ্বান কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্যৱহাৰ কৰক"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"বিশ্বাসযোগ্য়তা প্ৰমাণীকৰণৰ বাবে এপক মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰিবলৈ অনুমতি দিয়ে"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"মুখমণ্ডলৰ বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ণ কৰক"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"চিনাক্তকৰণৰ সুবিধাটো উন্নত কৰিবলৈ, অনুগ্ৰহ কৰি আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"সঠিক মুখমণ্ডলৰ ডেটা কেপচাৰ নহ’ল। আকৌ চেষ্টা কৰক।"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"অতি উজ্জ্বল। ইয়াতকৈ কম পোহৰৰ উৎস ব্যৱহাৰ কৰক।"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"অতি আন্ধাৰ। উজ্জ্বল লাইট ব্যৱহাৰ কৰক।"</string>
@@ -1366,8 +1363,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"আপোনাৰ প্ৰশাসকে এই ডিভাইচটোৰ সমস্যা সমাধানৰ বাবে বাগ সম্পৰ্কীয় অভিযোগ বিচাৰিছে। এপ্ আৰু ডেটা শ্বেয়াৰ কৰা হ\'ব পাৰে।"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"শ্বেয়াৰ কৰক"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"প্ৰত্যাখ্যান কৰক"</string>
- <!-- no translation found for select_input_method (4653387336791222978) -->
- <skip />
+ <string name="select_input_method" msgid="4653387336791222978">"ইনপুট পদ্ধতি বাছনি কৰক"</string>
<string name="show_ime" msgid="2506087537466597099">"কায়িক কীব’ৰ্ড সক্ৰিয় হৈ থাকোঁতে ইয়াক স্ক্ৰীণত ৰাখিব"</string>
<string name="hardware" msgid="194658061510127999">"ভাৰ্শ্বুৱল কীব\'ৰ্ড দেখুৱাওক"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"কায়িক কীব’ৰ্ড কনফিগাৰ কৰক"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index e046eca42552..bca244f08cfb 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Proqramdan istifadə üçün barmaq izi şablonlarını əlavə etmək və silmək məqsədilə üsullara müraciət etməyə imkan verir."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"üz identifikasiyası proqramından istifadə edin"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tətbiqin üz identifikasiyası proqramından identifikasiya zamanı istifadə etməsinə icazə verir"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Üz identifikasiyası"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Üzünüzü yenidən qeydiyyatdan keçirin"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Tanınmanı təkmilləşdirmək üçün üzünüzü yenidən qeydiyyatdan keçirin"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Dəqiq üz datası əldə edilmədi. Yenidən cəhd edin."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Çox işıqlıdır. Daha az işıqlı şəkli sınayın."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Çox qaranlıqdır. Parlaq işıqdan istifadə edin."</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 2e6f11c363c4..d4be6e7a7d32 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -556,12 +556,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Dozvoljava da aplikacija aktivira metode za dodavanje i brisanje šablona lica radi korišćenja."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"korišćenje hardv. za potvrdu identiteta pomoću lica"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Dozvoljava da aplikacija koristi hardver za potvrdu identiteta pomoću lica"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Potvrda identiteta licem"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Ponovo registrujte lice"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Da biste poboljšali prepoznavanje, ponovo registrujte lice"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Snimanje lica nije uspelo. Probajte ponovo."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Previše je svetlo. Probajte sa slabijim osvetljenjem."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Pretamno je. Probajte sa jačim osvetljenjem."</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index f6c18a70c0a3..4fa91789fa4f 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -559,12 +559,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Праграма зможа дадаваць і выдаляць шаблоны твару."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"карыстацца абсталяваннем для распазнавання твару"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Праграма зможа выкарыстоўваць абсталяванне распазнавання твару для аўтэнтыфікацыі"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Распазнаванне твару"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Паўтарыце рэгістрацыю твару"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Каб палепшыць распазнавальнасць, яшчэ раз выканайце рэгістрацыю твару"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Не атрымалася распазнаць твар. Паўтарыце спробу."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Занадта светла. Прыглушыце асвятленне."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Занадта цёмна. Павялічце асвятленне."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index f2f928fb35bf..aa4ca4cb46a5 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Разрешава на прил. да извиква методи за добавяне и изтриване на лицеви шаблони за ползване"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"използване на хардуера за удостоверяване с лице"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Разрешава на приложението при необходимост да използва хардуера за удостоверяване с лице"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Удостоверяване с лице"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Регистрирайте отново лицето си"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"С цел подобряване на разпознаването регистрирайте отново лицето си"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Лицето не бе заснето точно. Опитайте отново."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Твърде светло е. Опитайте при по-слабо осветление."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Твърде тъмно е. Опитайте при по-силно осветление."</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 04f8102425a9..d412268d211e 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ব্যবহার করার জন্য ফেস টেম্পলেট যোগ করা এবং মোছার পদ্ধতি গ্রহণ করতে অ্যাপটিকে অনুমতি দেয়৷"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করুন"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"প্রমাণীকরণের জন্য ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করার অনুমতি অ্যাপটিকে দেয়"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ফেস যাচাইকরণ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"আপনার ফেস আবার এনরোল করুন"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"শনাক্তকরণের উন্নতি করতে আপনার ফেস আবার এনরোল করুন"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"মুখের সঠিক ডেটা পাওয়া যায়নি। আবার চেষ্টা করুন।"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"খুব উজ্জ্বল। আলো কমিয়ে চেষ্টা করে দেখুন।"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"খুব অন্ধকার। আরও উজ্জ্বল আলো ব্যবহার করে দেখুন।"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index bc47decef7d1..bfb52e10757b 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -556,12 +556,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Omogućava aplikaciji korištenje metoda za dodavanje i brisanje šablona lica za upotrebu."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"upotreba hardvera za autentifikaciju licem"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Omogućava aplikaciji da za autentifikaciju koristi hardver za autentifikaciju licem"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autentifikacija licem"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Ponovo registrirajte lice"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ponovo registrirajte lice da poboljšate prepoznavanje"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Lice nije snimljeno precizno. Pokušajte ponovo."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Previše svijetlo. Probajte s blažim osvjetljenjem."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Previše je tamno. Pokušajte s jačim osvjetljenjem."</string>
@@ -1231,7 +1228,7 @@
<string name="new_app_description" msgid="5894852887817332322">"Aplikacija <xliff:g id="OLD_APP">%1$s</xliff:g> će se zatvoriti bez pohranjivanja"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> premašuje ograničenje memorije"</string>
<string name="dump_heap_ready_notification" msgid="1162196579925048701">"Snimak dinamičkog dijela memorije procesa <xliff:g id="PROC">%1$s</xliff:g> je spreman"</string>
- <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Snimak dinamičkog stanja memorije je napravljen. Dodirnite za dijeljenje."</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Snimak dinamičkog dijela memorije je napravljen. Dodirnite za dijeljenje."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Želite li dijeliti snimak dinamičkog dijela memorije?"</string>
<string name="dump_heap_text" msgid="8546022920319781701">"Proces <xliff:g id="PROC">%1$s</xliff:g> je premašio ograničenje memorije od <xliff:g id="SIZE">%2$s</xliff:g>. Snimak dinamičkog dijela memorije vam je dostupan i možete ga dijeliti s njegovim programerom. Budite oprezni: ovaj snimak dinamičkog dijela memorije može sadržavati vaše lične podatke kojima aplikacija ima pristup."</string>
<string name="dump_heap_system_text" msgid="3236094872980706024">"Proces <xliff:g id="PROC">%1$s</xliff:g> je premašio ograničenje memorije od <xliff:g id="SIZE">%2$s</xliff:g>. Snimak dinamičkog dijela memorije vam je dostupan i možete ga dijeliti. Budite oprezni: ovaj snimak dinamičkog dijela memorije može sadržavati osjetljive lične podatke kojima ovaj proces ima pristup i mogu uključivati stvari koje ste unijeli."</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 4206ed21f512..7b8d34c61534 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permet que l\'aplicació afegeixi i suprimeixi plantilles de cares que es puguin fer servir."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilitza el maquinari d\'autenticació facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permet que l\'aplicació faci servir maquinari d\'autenticació facial"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticació facial"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Torna a registrar la cara"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Per millorar el reconeixement, torna a registrar la cara"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"No es reconeix la teva cara. Torna-ho a provar."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Massa brillant Prova una il·luminació més suau."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Massa fosc. Prova una il·luminació més brillant."</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 4815ba727450..9b2b569d2f59 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -559,12 +559,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Umožňuje aplikaci volat metody k přidání a smazání šablon obličeje, které budou použity."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"použití hardwaru k ověření obličeje"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Umožňuje aplikaci provést ověření pomocí hardwaru k ověření obličeje"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ověřování obličejem"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Zaznamenejte obličej znovu"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Chcete-li rozpoznání zdokonalit, zaznamenejte obličej znovu"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Obličej se nepodařilo zachytit. Zkuste to znovu."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Je příliš světlo. Zmírněte osvětlení."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Je moc velká tma. Přejděte na světlo."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 93a381351296..91db9ef30e46 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Tillader, at appen kan bruge metoder til at tilføje og slette ansigtsskabeloner."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"brug hardware til ansigtsgenkendelse"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tillader, at appen bruger ansigtsgenkendelseshardware til godkendelse"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ansigtsgodkendelse"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registrer dit ansigt igen"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Registrer dit ansigt igen for at forbedre genkendelsen af det"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Der blev ikke registreret ansigtsdata. Prøv igen."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Der er for lyst. Prøv en mere dæmpet belysning."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"For mørkt. Prøv med mere belysning."</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 1a53e6117c83..9ff6cbf1370c 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Ermöglicht der App, Gesichtsvorlagen hinzuzufügen oder zu entfernen."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"Gesichtserkennungshardware verwenden"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Ermöglicht der App, für die Authentifizierung Gesichtserkennungshardware zu verwenden"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Gesichtserkennung"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Gesicht neu scannen"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Für bessere Erkennung Gesicht neu scannen"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Gesichtsdaten nicht gut erfasst. Erneut versuchen."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Zu hell. Schwächere Beleuchtung ausprobieren."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Zu dunkel. Probier eine hellere Beleuchtung aus."</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 4177a154c131..cdd14d1250b7 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους προσθήκης/διαγραφής προτύπων για χρήση."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"χρήση υλικολογισμικού ελέγχου ταυτότητας προσώπου"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί υλικολογισμικό για έλεγχο ταυτότητας"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Έλεγχος ταυτότητας προσώπου"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Εγγράψτε ξανά το πρόσωπό σας"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Για να βελτιώσετε την αναγνώριση, εγγράψτε ξανά το πρόσωπό σας"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Αδύνατη λήψη ακριβών δεδομ. προσώπου. Επανάληψη."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Υπερβολικά έντονος φωτισμός. Δοκιμάστε πιο ήπιο."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Πολύ σκοτεινό περιβάλλον. Φροντίστε τον φωτισμό."</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 798293e820c2..12d633c44288 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Face Authentication"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Re-enrol your face"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"To improve recognition, please re-enrol your face"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Couldn’t capture accurate face data. Try again."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Too bright. Try gentler lighting."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Too dark. Try brighter lighting."</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index b27e7090af89..065d8455ad5b 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Face Authentication"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Re-enrol your face"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"To improve recognition, please re-enrol your face"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Couldn’t capture accurate face data. Try again."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Too bright. Try gentler lighting."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Too dark. Try brighter lighting."</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 798293e820c2..12d633c44288 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Face Authentication"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Re-enrol your face"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"To improve recognition, please re-enrol your face"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Couldn’t capture accurate face data. Try again."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Too bright. Try gentler lighting."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Too dark. Try brighter lighting."</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 798293e820c2..12d633c44288 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Face Authentication"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Re-enrol your face"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"To improve recognition, please re-enrol your face"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Couldn’t capture accurate face data. Try again."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Too bright. Try gentler lighting."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Too dark. Try brighter lighting."</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index e7edfe18b9fe..d9cb0c7d6ee7 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar el hardware de autenticación facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que la app use el hardware de autenticación facial para reconocerte"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticación facial"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Vuelve a registrar tu rostro"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para mejorar el reconocimiento, vuelve a registrar tu rostro"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Datos faciales imprecisos. Vuelve a intentarlo."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Demasiado brillante. Prueba con menos iluminación."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Demasiado oscuro. Prueba con más iluminación."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 31c655f93dfa..8a0f34bc7f5b 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que la app use métodos para añadir y suprimir plantillas de caras para su uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar el hardware de autenticación facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que la aplicación utilice el hardware de autenticación facial para autenticarte"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticación facial"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Volver a registrar la cara"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para mejorar el reconocimiento, vuelve a registrar tu cara"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Datos faciales no reconocidos. Vuelve a intentarlo."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Hay demasiada luz. Busca un sitio menos iluminado."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Demasiado oscuro. Prueba en un lugar con más luz."</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index c8c17bd40306..6ac6c2e7126a 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Lubab rakendusel tühistada meetodid kasutatavate näomallide lisamiseks ja kustutamiseks."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"kasutada näo autentimise riistvara"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Võimaldab rakendusel autentimiseks kasutada näo autentimise riistvara"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Näo autentimine"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registreerige oma nägu uuesti"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Tuvastamise parandamiseks registreerige oma nägu uuesti"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Näoandmeid ei saanud jäädvustada. Proovige uuesti."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Liiga ere. Proovige hämaramat valgust."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Liiga pime. Proovige parema valgustusega kohas."</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index d368a54bba9c..1437fa5d1cd9 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Aurpegi-txantiloiak gehitu eta ezabatzeko metodoei dei egitea baimentzen dio aplikazioari."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"erabili aurpegi bidez autentifikatzeko hardwarea"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aurpegi bidez autentifikatzeko hardwarea erabiltzea baimentzen dio aplikazioari"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Aurpegi bidezko autentifikazioa"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Erregistratu aurpegia berriro"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ezagutzea hobetzeko, erregistratu aurpegia berriro"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Ezin izan dira bildu argazkiaren datu zehatzak. Saiatu berriro."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Argi gehiegi dago. Joan toki ilunago batera."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Ilunegi dago. Erabili argi gehiago."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index f09a15ed5d6a..406fd1b14f63 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"به برنامه امکان می‌دهد روش‌هایی را برای افزودن و حذف الگوهای چهره جهت استفاده فرابخواند."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"استفاده از سخت‌افزار احراز هویت با چهره"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"به برنامه امکان می‌دهد از سخت‌افزار احراز هویت با چهره برای احراز هویت استفاده کند"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"احراز هویت با چهره"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ثبت مجدد چهره"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"برای بهبود تشخیص، لطفاً چهره‌تان را دوباره ثبت کنید"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"داده‌های دقیق چهره ضبط نشد. دوباره امتحان کنید."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"خیلی روشن است. روشنایی‌اش را ملایم‌تر کنید."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"خیلی تاریک است. تصویر را روشن‌تر کنید."</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 3014a0b6815e..321228dc7ac1 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Sallii sovelluksen käyttää menetelmiä, joilla voidaan lisätä tai poistaa kasvomalleja."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"käyttää kasvojentodennuslaitteistoa"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Sallii sovelluksen käyttää todennuslaitteistoa todennukseen"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Kasvojentunnistus"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Lisää kasvot uudelleen"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Lisää kasvosi uudelleen tunnistamisen parantamiseksi"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Tarkan kasvodatan tallennus epäonnistui. Yritä uudelleen."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Liian kirkasta. Kokeile pehmeämpää valaistusta."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Liian pimeää. Kokeile kirkkaampaa valaistusta."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index f713efb09361..6dd740108cdf 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -296,7 +296,7 @@
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"enregistrer des fichiers audio"</string>
<string name="permgrouprequest_microphone" msgid="9167492350681916038">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&amp;gt à enregistrer l\'audio?"</string>
- <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Activités physiques"</string>
+ <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"données d\'activité physique"</string>
<string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"accéder à vos activités physiques"</string>
<string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à vos activités physiques?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string>
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permet à l\'appli d\'employer des méthodes d\'aj. et de suppr. de modèles de reconn. visage."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utiliser le matériel d\'authentification de visage"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permet à l\'appli d\'utiliser du matériel de reconnaissance du visage pour l\'authentification"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Authentification du visage"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Inscrivez votre visage à nouveau"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Imposs. capt. données visage précises. Réessayez."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Trop lumineux. Essayez un éclairage plus faible."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Trop sombre. Essayez avec un éclairage plus fort."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index fb7b88fbbe97..c3285d62f3b7 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Autorise l\'appli à invoquer des méthodes pour ajouter et supprimer des modèles de visages."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utiliser le matériel d\'authentification faciale"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Autorise l\'appli à utiliser le matériel d\'authentification faciale pour l\'authentification"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Authentification faciale"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Enregistrer à nouveau votre visage"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Capture du visage impossible. Réessayez."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Trop lumineux. Essayez de baisser la lumière."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Trop sombre. Essayez une éclairage plus lumineux."</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 8c8bcd93db56..e71be822bf51 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -275,40 +275,40 @@
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="8836124313744349203">"Cambiar ao perfil persoal"</string>
<string name="managed_profile_label" msgid="8947929265267690522">"Cambiar ao perfil de traballo"</string>
- <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
+ <string name="permgrouplab_contacts" msgid="3657758145679177612">"contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder aos teus contactos"</string>
<string name="permgrouprequest_contacts" msgid="6032805601881764300">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda aos teus contactos?"</string>
- <string name="permgrouplab_location" msgid="7275582855722310164">"Localización"</string>
+ <string name="permgrouplab_location" msgid="7275582855722310164">"localización"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder á localización deste dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda á localización deste dispositivo?"</string>
<string name="permgrouprequestdetail_location" msgid="1347189607421252902">"A aplicación só terá acceso á localización mentres a esteas utilizando"</string>
<string name="permgroupbackgroundrequest_location" msgid="5039063878675613235">"Queres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda á localización deste dispositivo &lt;b&gt;sempre&lt;/b&gt;?"</string>
<string name="permgroupbackgroundrequestdetail_location" msgid="4597006851453417387">"Actualmente, a aplicación pode acceder á localización só mentres a utilices"</string>
- <string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder ao teu calendario"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda ao teu calendario?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar e consultar mensaxes de SMS"</string>
<string name="permgrouprequest_sms" msgid="7168124215838204719">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envíe e vexa mensaxes SMS?"</string>
- <string name="permgrouplab_storage" msgid="1971118770546336966">"Almacenamento"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"almacenamento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acceder a fotos, contido multimedia e ficheiros no teu dispositivo"</string>
<string name="permgrouprequest_storage" msgid="7885942926944299560">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a fotos, contido multimedia e ficheiros no teu dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"gravar audio"</string>
<string name="permgrouprequest_microphone" msgid="9167492350681916038">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; grave audio?"</string>
- <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Actividade física"</string>
+ <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"actividade física"</string>
<string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"acceder á túa actividade física"</string>
<string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Queres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda á túa actividade física?"</string>
- <string name="permgrouplab_camera" msgid="4820372495894586615">"Cámara"</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"cámara"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tirar fotos e gravar vídeos"</string>
<string name="permgrouprequest_camera" msgid="1299833592069671756">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; realice fotos e grave vídeos?"</string>
- <string name="permgrouplab_calllog" msgid="8798646184930388160">"Rexistros de chamadas"</string>
+ <string name="permgrouplab_calllog" msgid="8798646184930388160">"rexistros de chamadas"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"ler e editar o rexistro de chamadas do teléfono"</string>
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"Queres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda aos rexistros de chamadas do teléfono?"</string>
- <string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
+ <string name="permgrouplab_phone" msgid="5229115638567440675">"teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"facer e xestionar chamadas telefónicas"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; realice e xestione chamadas telefónicas?"</string>
- <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensores corporais"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder aos datos dos sensores sobre as túas constantes vitais"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda aos datos dos sensores sobre as túas constantes vitais?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar contido da ventá"</string>
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que a aplicación invoque métodos para engadir e eliminar modelos faciais de uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticación facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que a aplicación utilice hardware facial para a autenticación"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticación facial"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Volve inscribir a túa cara"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para mellorar o recoñecemento, inscribe de novo a túa cara"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Sen datos faciais exactos. Téntao de novo."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Hai demasiada iluminación. Proba cunha máis suave."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Hai demasiada escuridade. Proba con máis luz."</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 3c429a3ea281..f708b7c96e04 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ઍપને ઉપયોગ માટે ચહેરાના નમૂના ઉમેરવા અને ડિલીટ કરવાની પદ્ધતિને રદ કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરો"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ઍપને પ્રમાણીકરણ માટે ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ચહેરાનું પ્રમાણીકરણ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"તમારા ચહેરાની ફરી નોંધણી કરાવો"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ઓળખવાની પ્રક્રિયાને બહેતર બનાવવા માટે કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"ચહેરાનો સચોટ ડેટા કૅપ્ચર ન થયો. ફરી પ્રયાસ કરો."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"અતિશય પ્રકાશિત. થોડો હળવો પ્રકાશ અજમાવી જુઓ."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"અતિશય ઘેરી. વધુ ઝળહળતો પ્રકાશ અજમાવો"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 96b07dbc00fb..1646812d208c 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -508,7 +508,7 @@
<string name="permlab_useBiometric" msgid="8837753668509919318">"बायोमीट्रिक हार्डवेयर इस्तेमाल करने दें"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"पुष्टि के लिए, ऐप्लिकेशन को बायोमीट्रिक हार्डवेयर इस्तेमाल करने की मंज़ूरी दें"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"उंगली की छाप के लिए हार्डवेयर को प्रबंधित करें"</string>
- <string name="permdesc_manageFingerprint" msgid="178208705828055464">"उंगली की छाप वाले टेम्पलेट का उपयोग करने के लिए जोड़ने और हटाने हेतु ऐप को विधियां प्रारंभ करने देती है."</string>
+ <string name="permdesc_manageFingerprint" msgid="178208705828055464">"उंगली की छाप वाले टेम्पलेट का उपयोग करने के लिए जोड़ने और हटाने के लिए ऐप को विधियां प्रारंभ करने देती है."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"उंगली की छाप के लिए हार्डवेयर का उपयोग करें"</string>
<string name="permdesc_useFingerprint" msgid="9165097460730684114">"ऐप के प्रमाणीकरण के लिए उंगली की छाप हार्डवेयर का उपयोग करने देती है"</string>
<string name="permlab_audioWrite" msgid="2661772059799779292">"अपने संगीत संग्रह में बदलाव करने की अनुमति दें"</string>
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ऐप्लिकेशन को चेहरे के टेम्पलेट इस्तेमाल के तरीके जोड़ने और मिटाने की मंज़ूरी मिलती है."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"चेहरे की पुष्टि करने वाला हार्डवेयर इस्तेमाल करें"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ऐप्लिकेशन को चेहरे की पुष्टि करने वाले हार्डवेयर का इस्तेमाल करने की मंज़ूरी मिलती है"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"चेहरे की पहचान"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"अपना चेहरा फिर से दर्ज करें"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"कृपया अपना चेहरा फिर से दर्ज करें ताकि आपको बेहतर तरीके से पहचाना जा सके"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"चेहरे से जुड़ा सटीक डेटा कैप्चर नहीं किया जा सका. फिर से कोशिश करें."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"बहुत रोशनी है. हल्की रोशनी आज़माएं."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"बहुत अंधेरा है. बेहतर रोशनी में आज़माएं."</string>
@@ -913,8 +910,8 @@
<string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nक्या आप वाकई इस पेज से दूर नेविगेट करना चाहते हैं?"</string>
<string name="save_password_label" msgid="6860261758665825069">"दुबारा पूछें"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"सलाह: ज़ूम इन और आउट करने के लिए दो बार छूएं."</string>
- <string name="autofill_this_form" msgid="4616758841157816676">"स्‍वत: भरण"</string>
- <string name="setup_autofill" msgid="7103495070180590814">"स्वत: भरण सेट करें"</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"अपने आप भरने की सुविधा"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"अपने आप भरें जाना सेट करें"</string>
<string name="autofill_window_title" msgid="4107745526909284887">"<xliff:g id="SERVICENAME">%1$s</xliff:g> के साथ अपने आप जानकारी भरने की सुविधा"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
@@ -1199,7 +1196,7 @@
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> में से <xliff:g id="NUMBER_0">%1$d</xliff:g> ऐप्स अनुकूलित हो रहा है."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> तैयार हो रहा है."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ऐप्स प्रारंभ होने वाले हैं"</string>
- <string name="android_upgrading_complete" msgid="1405954754112999229">"बूट समाप्‍त हो रहा है."</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"बूट खत्म हो रहा है."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चल रही है"</string>
<string name="heavy_weight_notification_detail" msgid="2304833848484424985">"गेम पर वापस जाने के लिए टैप करें"</string>
<string name="heavy_weight_switcher_title" msgid="387882830435195342">"गेम चुनें"</string>
@@ -1558,7 +1555,7 @@
<string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"वाई-फ़ाई की सीमा से ज़्यादा डेटा खर्च"</string>
<string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"अाप अपनी तय सीमा से <xliff:g id="SIZE">%s</xliff:g> ज़्यादा डेटा इस्तेमाल कर चुके हैं"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"पृष्ठभूमि डेटा प्रतिबंधित है"</string>
- <string name="data_usage_restricted_body" msgid="469866376337242726">"प्रतिबंध निकालने हेतु टैप करें."</string>
+ <string name="data_usage_restricted_body" msgid="469866376337242726">"प्रतिबंध निकालने के लिए टैप करें."</string>
<string name="data_usage_rapid_title" msgid="1809795402975261331">"माेबाइल डेटा का ज़्यादा इस्तेमाल"</string>
<string name="data_usage_rapid_body" msgid="6897825788682442715">"आपके एेप्लिकेशन ने आम तौर पर इस्तेमाल होने वाले डेटा से ज़्यादा डेटा खर्च कर दिया है"</string>
<string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ने आम तौर पर इस्तेमाल होने वाले डेटा से ज़्यादा डेटा खर्च कर दिया है"</string>
@@ -1905,7 +1902,7 @@
<string name="user_encrypted_message" msgid="4923292604515744267">"अनलॉक करने के लिए टैप करें"</string>
<string name="user_encrypted_detail" msgid="5708447464349420392">"उपयोगकर्ता डेटा लॉक किया गया"</string>
<string name="profile_encrypted_detail" msgid="3700965619978314974">"कार्य प्रोफ़ाइल लॉक है"</string>
- <string name="profile_encrypted_message" msgid="6964994232310195874">"कार्य प्रोफाइल अनलॉक करने हेतु टैप करें"</string>
+ <string name="profile_encrypted_message" msgid="6964994232310195874">"कार्य प्रोफाइल अनलॉक करने के लिए टैप करें"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> से कनेक्ट किया गया"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"फ़ाइलें देखने के लिए टैप करें"</string>
<string name="app_info" msgid="6856026610594615344">"ऐप्लिकेशन की जानकारी"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 8bfcd1735aa1..79c0f822e3ff 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -556,12 +556,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Aplikaciji omogućuje pozivanje načina za dodavanje i brisanje predložaka lica za upotrebu."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"upotrebljavati hardver za autentifikaciju lica"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aplikaciji omogućuje upotrebu hardvera za autentifikaciju lica radi autentifikacije"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autentifikacija licem"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Ponovo registrirajte svoje lice"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Za poboljšanje prepoznavanja ponovo registrirajte svoje lice"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Podaci o licu nisu točni. Pokušajte ponovo."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Presvijetlo je. Pokušajte sa slabijim svjetlom."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Pretamno je. Pokušajte s jačim osvjetljenjem."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 4af3e0b250a5..d8c807131b67 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Engedélyezi, hogy az alkalmazás arcsablon-hozzáadási és -törlési metódusokat hívjon."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"arcfelismerő hardver használata"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcfelismerő hardvert"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Arcfelismerés"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Rögzítsen újra képet az arcáról"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"A felismerés javítása érdekében rögzítsen újra az arcáról készített képet"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Sikertelen az arc pontos rögzítése. Próbálja újra."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Túl világos. Próbálja kevésbé erős világítással."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Túl sötét. Próbálja jobb megvilágítás mellett."</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index da024b54eda0..64013e79f4c0 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Հավելվածին թույլ է տալիս ավելացնել և հեռացնել դեմքի նմուշներ:"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"օգտագործել դեմքի ճանաչման սարքը"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Հավելվածին թույլ է տալիս օգտագործել նույնականացման համար նախատեսված սարքը"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Նույնականացում դեմքի միջոցով"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Նորից գրանցեք ձեր դեմքը"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ճանաչումը լավացնելու համար նորից գրանցեք ձեր դեմքը"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Չհաջողվեց գրանցել դեմքի ճշգրիտ տվյալները։ Կրկնեք։"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Շատ լուսավոր է։ Փորձեք ավելի թեթև լուսավորություն։"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Շատ մութ է։ Փորձեք ավելի պայծառ լուսավորություն։"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index b4355cbf7345..c435324bdd12 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Mengizinkan apl memicu metode untuk menambah &amp; menghapus template wajah untuk digunakan."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gunakan hardware autentikasi wajah"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Mengizinkan aplikasi untuk menggunakan hardware autentikasi wajah untuk autentikasi"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autentikasi Wajah"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Daftarkan kembali wajah Anda"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Untuk menyempurnakan pengenalan wajah, daftarkan kembali wajah Anda"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Tidak bisa mengambil data wajah akurat. Coba lagi."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Terlalu terang. Coba cahaya yang lebih lembut."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Terlalu gelap. Coba pencahayaan yang lebih cerah."</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 30c36aba73e8..a34d115202f8 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Leyfir forritinu að beita aðferðum til að bæta við og eyða andlitssniðmátum til notkunar."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"nota vélbúnað andlitsgreiningar"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Leyfir forritinu að nota andlitsgreiningarvélbúnað til auðkenningar"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Andlitsgreining"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Skráðu andlitið þitt aftur"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Skráðu andlitið þitt til að bæta kennsl"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Nákvæm andlitsgögn fengust ekki. Reyndu aftur."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Of bjart. Prófaðu mýkri lýsingu."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Of dimmt. Prófaðu sterkari lýsingu."</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 724e0aa4ed24..3d4c2bde580f 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilizza l\'hardware per l\'autenticazione dei volti"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Consente all\'app di utilizzare hardware per l\'autenticazione dei volti"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticazione volti"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registra di nuovo il volto"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Per migliorare il riconoscimento, registra di nuovo il tuo volto"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Impossibile acquisire dati viso accurati. Riprova."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Troppa luce. Prova con una luce più soft."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Troppo buio. Prova con più luce."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 616591028759..5aaba62c3d09 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -559,12 +559,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"שימוש בחומרה של זיהוי פנים לצורך אימות"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"מאפשרת לאפליקציה להשתמש בחומרה של זיהוי פנים לצורך אימות"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"אימות פנים"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"יש לבצע רישום מחדש של הפנים שלך"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"לשיפור הזיהוי יש לבצע רישום מחדש של הפנים שלך"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"בהיר מדי. צריך תאורה עדינה יותר."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"התמונה חשוכה מדי. צריך תאורה חזקה יותר."</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index c14b99b3f40d..3a6415b94a34 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"使用する顔テンプレートの追加や削除を行うメソッドの呼び出しをアプリに許可します。"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"顔認証ハードウェアの使用"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"顔認証ハードウェアを認証に使用することをアプリに許可します"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"顔認証"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"顔の再登録"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"認識を改善するには、顔を再登録してください"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"顔を認識できませんでした。もう一度お試しください。"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"明るすぎます。もっと暗い場所でお試しください。"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"暗すぎます。もっと明るい場所でお試しください。"</string>
@@ -1803,7 +1800,7 @@
<string name="package_deleted_device_owner" msgid="2307122077550236438">"管理者により削除されています"</string>
<string name="confirm_battery_saver" msgid="639106420541753635">"OK"</string>
<string name="battery_saver_description_with_learn_more" msgid="2108984221113106294">"バッテリー セーバーを有効にすると、電池を長持ちさせるようバックグラウンド アクティビティ、一部の視覚効果など、電力消費量の多い機能が制限されます。"<annotation id="url">"詳細"</annotation></string>
- <string name="battery_saver_description" msgid="6413346684861241431">"バッテリー セーバーを有効にすると、電池を長持ちさせるようバックグラウンド アクティビティ、一部の視覚効果など、電力消費量の多い機能が制限されます。"</string>
+ <string name="battery_saver_description" msgid="6413346684861241431">"バッテリー セーバーを有効にすると、電池を長持ちさせるため、バックグラウンド アクティビティや一部の視覚効果など、電力消費量の多い機能が制限されます。"</string>
<string name="data_saver_description" msgid="6015391409098303235">"データセーバーは、一部のアプリによるバックグラウンドでのデータ送受信を停止することでデータ使用量を抑制します。使用中のアプリからデータにアクセスすることはできますが、その頻度は低くなる場合があります。この影響として、たとえば画像はタップしないと表示されないようになります。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"データセーバーを ON にしますか?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ON にする"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index d43588150dcc..beb5e283f742 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"საშუალებას აძლევს აპს, დაამატოს და წაშალოს სახეების შაბლონები."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"სახის ამოცნობის აპარატურის გამოყენება"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"საშუალებას აძლევს აპს, ავტორიზაციისთვის გამოიყენოს სახის ამოცნობის აპარატურა"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"სახის ამოცნობა"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"დაარეგისტრირეთ თქვენი სახე ხელახლა"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ამოცნობის გასაუმჯობესებლად, გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"სახის ზუსტი მონაცემები არ აღიბეჭდა. ცადეთ ხელახლა."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"მეტისმეტად ნათელია. ცადეთ უფრო სუსტი განათება."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"მეტისმეტად ბნელია. ცადეთ უფრო ძლიერი განათება."</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 2b78e1ba4087..924c2a2d41eb 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Қолданбаға пайдаланатын бет үлгілерін енгізу және жою әдістерін шақыруға мүмкіндік береді."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"бетті тану жабдығын пайдалану"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Қолданбаға бетті тану жабдығын қолдануға рұқсат етеді"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Бетті тану"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Бетті қайта тіркеу"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Құрылғы жүзіңізді жақсырақ тануы үшін, бетіңізді қайта тіркеңіз"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Бет деректері дұрыс алынбады. Әрекетті қайталаңыз."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Тым ашық. Күңгірттеу жарық керек."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Тым қараңғы. Молырақ жарық керек."</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 3f885deae48c..f0333ab1b5d2 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"អនុញ្ញាតឱ្យកម្មវិធីប្រើវិធីសាស្ត្រដើម្បី​បញ្ចូល និងលុបទម្រង់​គំរូ​ផ្ទៃមុខសម្រាប់ប្រើប្រាស់។"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ប្រើ​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃ​មុខ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"អនុញ្ញាត​ឱ្យ​កម្មវិធី​ប្រើ​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃមុខ​សម្រាប់​ការផ្ទៀងផ្ទាត់"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ការផ្ទៀងផ្ទាត់មុខ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ដើម្បី​ធ្វើឱ្យ​ការសម្គាល់មុខ​ប្រសើរជាងមុន សូមស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"មិនអាច​ថត​ទិន្នន័យទម្រង់មុខ​បាន​ត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"ភ្លឺពេក។ សូមសាកល្បង​ប្រើ​ពន្លឺស្រាលជាងនេះ។"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"ងងឹតជ្រុល។ សូមសាកល្បង​ប្រើ​ពន្លឺភ្លឺជាងនេះ។"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 88c0c97a365b..aac9b05de0b6 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ಬಳಕೆಗೆ ಮುಖದ ಟೆಂಪ್ಲೇಟ್‌ಗಳನ್ನು ಸೇರಿಸಲು ಮತ್ತು ಅಳಿಸಲು ವಿಧಾನಗಳನ್ನು ಮನವಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್‌ವೇರ್‌ ಅನ್ನು ಬಳಸಿ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ಧೃಡೀಕರಣಕ್ಕಾಗಿ ಮುಖದ ಹಾರ್ಡ್‌ವೇರ್ ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ಮುಖ ಗುರುತಿಸುವಿಕೆ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ಗುರುತಿಸುವಿಕೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"ಸರಿಯಾಗಿ ಮುಖ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಲಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"ತುಂಬಾ ಪ್ರಕಾಶಮಾನವಾಗಿದೆ ಮಂದ ಪ್ರಕಾಶಮಾನವಿರುವ ಲೈಟ್ ಬಳಸಿ"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"ತುಂಬಾ ಕಪ್ಪು ಛಾಯೆಯಿದೆ. ಪ್ರಕಾಶಮಾನವಾದ ಲೈಟಿಂಗ್ ಬಳಸಿ."</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 04fcc88d58a7..22e9d0356025 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"사용할 얼굴 템플릿의 추가 및 삭제 메서드를 앱에서 호출하도록 허용합니다."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"얼굴 인증 하드웨어 사용"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"앱에서 얼굴 인증 하드웨어를 인증에 사용하도록 허용합니다."</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"얼굴 인증"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"얼굴 재등록 필요"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"인식률을 개선하려면 얼굴을 다시 등록하세요."</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"정확한 얼굴 데이터를 캡처하지 못했습니다. 다시 시도하세요."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"너무 밝습니다. 조명 밝기를 조금 낮춰보세요."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"너무 어둡습니다. 조명을 밝게 해 보세요."</string>
@@ -1803,7 +1800,7 @@
<string name="package_deleted_device_owner" msgid="2307122077550236438">"관리자에 의해 삭제되었습니다."</string>
<string name="confirm_battery_saver" msgid="639106420541753635">"확인"</string>
<string name="battery_saver_description_with_learn_more" msgid="2108984221113106294">"절전 모드에서는 백그라운드 활동을 사용 중지하거나 제한합니다. 배터리 수명을 늘리기 위해 일부 시각 효과 및 기타 배터리 소모가 큰 기능이 제한됩니다. "<annotation id="url">"자세히 알아보기"</annotation></string>
- <string name="battery_saver_description" msgid="6413346684861241431">"절전 모드에서는 백그라운드 활동을 사용 중지하거나 제한합니다. 배터리 수명을 늘리기 위해 일부 시각 효과 및 기타 배터리 소모가 큰 기능이 제한됩니다."</string>
+ <string name="battery_saver_description" msgid="6413346684861241431">"절전 모드에서는 배터리 수명을 늘리기 위해 백그라운드 활동, 일부 시각 효과 및 기타 배터리 소모가 큰 기능을 사용 중지하거나 제한합니다."</string>
<string name="data_saver_description" msgid="6015391409098303235">"데이터 사용량을 줄이기 위해 데이터 절약 모드는 일부 앱이 백그라운드에서 데이터를 전송하거나 수신하지 못하도록 합니다. 현재 사용 중인 앱에서 데이터에 액세스할 수 있지만 빈도가 줄어듭니다. 예를 들면, 이미지를 탭하기 전에는 이미지가 표시되지 않습니다."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"데이터 절약 모드를 사용할까요?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"사용 설정"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 92c057ad00d0..9b51336f2339 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Колдонмого пайдалануу үчүн жүздүн үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"жүздүн аныктыгын текшерүүчү аппараттык камсыздоону колдонуу"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Колдонмого аныктыгын текшерүү үчүн жүздүн аныктыгын текшерүүчү аппараттык камсыздоону пайдалануу мүмкүндүгүн берет"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Жүздүн аныктыгын текшерүү"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Жүзүңүздү кайра таанытыңыз."</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Мыкты таануу үчүн, жүзүңүздү кайра таанытыңыз"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Жүзүңүз жакшы тартылган жок. Кайра аракет кылыңыз."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Өтө жарык. Жарыктыкты азайтып көрүңүз."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Өтө караңгы. Жарыгыраак жерден тартып көрүңүз."</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 9dae27a5aeb6..5b7c72244177 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ອະນຸຍາດໃຫ້ແອັບເປີດວິທີການຕ່າງໆເພື່ອເພີ່ມ ແລະ ລຶບແມ່ແບບໃບໜ້າສຳລັບການນຳໃຊ້."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າສຳລັບການກວດສອບຄວາມຖືກຕ້ອງ"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ການພິສູດຢືນຢັນດ້ວຍໃບໜ້າ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ເພື່ອປັບປຸງການຈຳແນກ, ກະລຸນາລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່."</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າທີ່ຖືກຕ້ອງໄດ້. ກະລຸນາລອງໃໝ່."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"ແຈ້ງເກີນໄປ. ລອງຄ່ອຍແສງໄຟລົງ."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"ມືດເກີນ. ກະລຸນາລອງໃຊ້ສະພາບແສງທີ່ແຈ້ງຂຶ້ນ."</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index c221e86ac507..6095e563cbb1 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -559,12 +559,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Programai leidžiama aktyv. metodus, norint pridėti ir ištrinti naudojamus veidų šablonus."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"naudoti veido autentifikavimo aparatinę įrangą"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Programai leidžiama naudoti veido autentifikavimo aparatinę įrangą tapatybei nustatyti"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Veido autentifikavimas"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Pakartotinis veido registravimas"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Kad patobulintumėte atpažinimą, iš naujo užregistruokite veidą"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Neužfiks. tikslūs veido duom. Bandykite dar kartą."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Per šviesu. Išbandykite mažesnį apšvietimą."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Per tamsu. Išbandykite šviesesnį apšvietimą."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 94693a60342f..b5722a594acd 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -556,12 +556,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Atļauj lietotnei izsaukt metodes izmantojamo sejas veidņu pievienošanai un dzēšanai."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"izmantot sejas autentifikācijas aparatūru"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Atļauj lietotnei izmantot sejas autentifikācijas aparatūru autentificēšanai"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Sejas autentificēšana"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Atkārtoti reģistrējiet seju"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Lai uzlabotu atpazīšanu, lūdzu, atkārtoti reģistrējiet savu seju"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Neizdevās tvert sejas datus. Mēģiniet vēlreiz."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Pārāk spilgts. Izmēģiniet maigāku apgaismojumu."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Pārāk tumšs. Izmēģiniet spožāku apgaismojumu."</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 60144436d319..91620c453dbf 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Дозволува апликац. да повика начини за додавање и бришење шаблони на лице за користење."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"користи хардвер за проверка на лице"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Дозволува апликацијата да користи хардвер за лице за проверка"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Проверка на лик"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Повторно регистрирајте го ликот"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"За да се подобри препознавањето, повторно регистрирајте го ликот"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Не се сними прецизна слика. Обидете се повторно."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Премногу светла. Пробајте со послабо осветлување."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Премногу темна. Пробајте со посилно осветлување."</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index ba4beee7ae95..44fe171f290b 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ഉപയോഗിക്കാനായി, മുഖത്തിന്റെ ടെംപ്ലേറ്റുകൾ ചേർക്കാനും ഇല്ലാതാക്കാനുമുള്ള രീതികൾ അഭ്യർത്ഥിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ ഉപയോഗിക്കുക"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"പരിശോധിച്ചുറപ്പിക്കലിനായി മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ ഉപയോഗിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"മുഖം പരിശോധിച്ചുറപ്പിക്കൽ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യൂ"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"തിരിച്ചറിയൽ മെച്ചപ്പെടുത്താൻ, നിങ്ങളുടെ മുഖം ദയവായി വീണ്ടും എൻറോൾ ചെയ്യൂ"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"കൃത്യ മുഖ ഡാറ്റ എടുക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"വളരെയധികം തെളിച്ചം. സൗമ്യതയേറിയ പ്രകാശം ശ്രമിക്കൂ."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"വളരെ ഇരുണ്ടത്. തിളക്കമേറിയ ലൈറ്റിംഗ് പരീക്ഷിക്കുക."</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 42943b8fe037..9c1c4ee1211b 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Аппад царайны загварыг ашиглахын тулд нэмэх эсвэл устгах аргыг идэвхжүүлэхийг зөвшөөрдөг."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"царай танилтын техник хангамжийг ашиглах"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Аппад царай танилтын техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Царайн нотолгоо"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Царайгаа дахин бүртгүүлнэ үү"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Танилтыг сайжруулахын тулд царайгаа дахин бүртгүүлнэ үү"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Царайн өгөгдлийг зөв авч чадсангүй. Дахин оролдоно уу."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Хэт цайвар байна. Гэрэл багатай газар оролдоно уу."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Хэт харанхуй байна. Гэрэлтэй орчинд туршина уу."</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 789ed86b6543..b49f0d1cb778 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"अॅपला वापरासाठी चेहरा टेम्पलेट जोडण्याच्या आणि हटवण्याच्या पद्धती जारी करू देते."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"चेहरा ऑथेंटिकेशन हार्डवेअर वापरा"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"अॅपला चेहरा ऑथेंटिकेशनसाठी ऑथेंटिकेशन हार्डवेअर वापरू देते"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"फेस ऑथेंटिकेशन"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"तुमच्या चेहऱ्याची पुन्हा नोंदणी करा"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ओळखण्यामध्ये सुधारणा करण्यासाठी, कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"अचूक फेस डेटा कॅप्चर करता आला नाही. पुन्हा करा."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"खूप प्रखर. आणखी सौम्य प्रकाश वापरून पहा."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"खूप गडद. आणखी प्रखर प्रकाश वापरून पहा."</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index f3cb1beef2ab..1faf01d238bf 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Membenarkan apl menggunakan kaedah untuk menambahkan dan memadamkan templat wajah untuk digunakan."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gunakan perkakasan pengesahan wajah"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Membenarkan apl menggunakan perkakasan pengesahan wajah untuk pengesahan"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Pengesahan Wajah"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Daftarkan semula wajah anda"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Untuk meningkatkan pengecaman, sila daftarkan semula wajah anda"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Gagal menangkap data wajah dgn tepat. Cuba lagi."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Terlalu terang. Cuba pencahayaan yang lebih lembut."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Terlalu gelap. Cuba pencahayaan yang lebih cerah."</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 011eb9aa37d0..a2a924c2666d 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"အသုံးပြုရန်အတွက် မျက်နှာပုံစံထည့်ရန် (သို့) ဖျက်ရန်နည်းလမ်းကို အက်ပ်အား သုံးခွင့်ပြုသည်။"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို သုံးပါ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"မျက်နှာ စိစစ်ခြင်း"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ပိုမှတ်မိစေရန် သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"မျက်နှာဒေတာ အမှန် မရိုက်ယူနိုင်ပါ၊ ထပ်စမ်းကြည့်ပါ။"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"အလွန် လင်းသည်။ အလင်းလျှော့ကြည့်ပါ။"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"အလွန်မှောင်သည်။ ပိုလင်းအောင် လုပ်ကြည့်ပါ။"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 025571ce1e60..ff38caeebfdb 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Lar appen bruke metoder for å legge til og slette ansiktmaler for bruk."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"bruke maskinvare for ansiktsautentisering"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Lar appen bruke maskinvare for ansiktsautentisering til autentisering"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ansiktsautentisering"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registrer ansiktet ditt på nytt"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"For å forbedre gjenkjennelse, registrer ansiktet ditt på nytt"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Kunne ikke ta opp nøyaktige ansiktsdata Prøv igjen"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"For lyst. Prøv svakere belysning."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"For mørkt. Prøv sterkere belysning."</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index d8fc560afcb0..09fe51cea4be 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"अनुप्रयोगलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"अनुहार प्रमाणिकरण हार्डवेयर प्रयोग गर्नुहोस्"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"अनुप्रयोगलाई प्रमाणीकरणका लागि अनुहार प्रमाणीकरण हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"अनुहार प्रमाणीकरण"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"अनुहार पहिचानको गुणस्तर सुधार गर्न कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"अनुहारको सटीक डेटा खिच्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"ज्यादै चम्किलो। अझ मधुरो प्रकाश प्रयोग गरी हेर्नु…"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"ज्यादै अँध्यारो छ। अझ बढी प्रकाशमा गई हेर्नुहोस्"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 8dc5cfcb8082..ff6e31053aa8 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Hiermee kan de app methoden aanroepen om gezichtstemplates toe te voegen en te verwijderen voor gebruik."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"hardware voor gezichtsherkenning gebruiken"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Hiermee kan de app hardware voor gezichtsherkenning gebruiken voor verificatie"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Gezichtsherkenning"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Je gezicht opnieuw registreren"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Registreer je gezicht opnieuw om de herkenning te verbeteren"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Geen accurate gegevens. Probeer het nog eens."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Overbelicht. Probeer een minder felle belichting."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Te donker. Probeer een fellere verlichting."</string>
@@ -1211,7 +1208,7 @@
<string name="dump_heap_ready_notification" msgid="1162196579925048701">"Heap dump van <xliff:g id="PROC">%1$s</xliff:g> is klaar"</string>
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump verzameld. Tik om te delen."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Heap dump delen?"</string>
- <string name="dump_heap_text" msgid="8546022920319781701">"Het proces van <xliff:g id="PROC">%1$s</xliff:g> heeft de geheugenlimiet van <xliff:g id="SIZE">%2$s</xliff:g> overschreden. Er is een heap dump beschikbaar die je met de ontwikkelaar kunt delen. Let op: Deze heap dump kan persoonsgegevens bevatten waartoe de app toegang heeft."</string>
+ <string name="dump_heap_text" msgid="8546022920319781701">"Het proces van <xliff:g id="PROC">%1$s</xliff:g> heeft de geheugenlimiet van <xliff:g id="SIZE">%2$s</xliff:g> overschreden. Er is een heap dump beschikbaar die je met de ontwikkelaar kunt delen. Let op: Deze heap dump kan persoonlijke informatie bevatten waartoe de app toegang heeft."</string>
<string name="dump_heap_system_text" msgid="3236094872980706024">"Het proces <xliff:g id="PROC">%1$s</xliff:g> overschrijdt de geheugenlimiet van <xliff:g id="SIZE">%2$s</xliff:g>. Er is een heap dump beschikbaar die je kunt delen. Let op: Deze heap dump kan gevoelige persoonlijke informatie bevatten waartoe het proces toegang heeft. Dit omvat mogelijk wat je hebt getypt."</string>
<string name="dump_heap_ready_text" msgid="1778041771455343067">"Er is een heap dump beschikbaar van het proces van <xliff:g id="PROC">%1$s</xliff:g>. Deze kun je delen. Let op: Deze heap dump bevat mogelijk gevoelige persoonlijke informatie waartoe het proces toegang heeft. Dit omvat mogelijk wat je hebt getypt."</string>
<string name="sendText" msgid="5209874571959469142">"Een actie voor tekst selecteren"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 44d721c4d195..c66fba17c727 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ବ୍ୟବହାର ପାଇଁ ଆପ୍‍କୁ ଫେସିଆଲ୍‍ ଟେମ୍ପଲେଟ୍‍ ଯୋଡିବା ଓ ଡିଲିଟ୍‍ ର ପଦ୍ଧତି ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ର ପ୍ରମାଣ ପାଇଁ ଆପ୍‍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ମୁହଁ ପ୍ରାମାଣିକତା"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ଚିହ୍ନଟକରଣକୁ ଉନ୍ନତ କରିବା ପାଇଁ, ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ।"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"ମୁହଁର ଡାଟା କ୍ୟାପଚର୍ ହେଲାନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"ଅତ୍ୟଧିକ ଉଜ୍ଵଳ। କମ୍ ଉଜ୍ବଳକରଣରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"ଅତ୍ୟଧିକ ଅନ୍ଧକାର। ଉଜ୍ବଳ ଲାଇଟ୍ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
@@ -1366,8 +1363,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ଏହି ଡିଭାଇସ୍‌ର ସମସ୍ୟା ସମାଧାନ କରିବା ପାଇଁ ଆପଣଙ୍କର ଆଡମିନ୍‌ ଏକ ବଗ୍‍ ରିପୋର୍ଟ ମାଗିଛନ୍ତି। ଆପ୍‍ ଓ ଡାଟା ଶେୟର୍‌ କରାଯାଇପାରେ।"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ସେୟାର୍‌ କରନ୍ତୁ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ପ୍ରତ୍ୟାଖ୍ୟାନ କରନ୍ତୁ"</string>
- <!-- no translation found for select_input_method (4653387336791222978) -->
- <skip />
+ <string name="select_input_method" msgid="4653387336791222978">"ଇନପୁଟ୍ ପଦ୍ଧତି ବାଛନ୍ତୁ"</string>
<string name="show_ime" msgid="2506087537466597099">"ଫିଜିକାଲ୍‌ କୀ’ବୋର୍ଡ ସକ୍ରିୟ ଥିବାବେଳେ ଏହାକୁ ସ୍କ୍ରୀନ୍‌ ଉପରେ ରଖନ୍ତୁ"</string>
<string name="hardware" msgid="194658061510127999">"ଭର୍ଚୁଆଲ୍ କୀ’ବୋର୍ଡ ଦେଖାନ୍ତୁ"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ଫିଜିକଲ୍ କୀ\'ବୋର୍ଡ କନଫିଗର୍‍ କରନ୍ତୁ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 6662ad890660..6aaad08cac40 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ਐਪ ਨੂੰ ਵਰਤਣ ਲਈ ਚਿਹਰਾ ਟੈਮਪਲੇਟ ਸ਼ਾਮਲ ਕਰਨ ਜਾਂ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦਿੰਦੀ ਹੈ।"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤੋ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ਆਪਣਾ ਚਿਹਰਾ ਮੁੜ-ਦਰਜ ਕਰੋ"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ਪਛਾਣ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਚਿਹਰੇ ਨੂੰ ਮੁੜ-ਦਰਜ ਕਰੋ"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"ਸਟੀਕ ਚਿਹਰਾ ਡਾਟਾ ਕੈਪਚਰ ਨਹੀਂ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਚਮਕ। ਹਲਕੀ ਚਮਕ ਵਰਤ ਕੇ ਦੇਖੋ।"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"ਬਹੁਤ ਗੂੜ੍ਹਾ। ਤੇਜ਼ ਰੋਸ਼ਨੀ ਕਰਕੇ ਦੇਖੋ।"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 1b096da5618e..8a77fd0a5c67 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -559,12 +559,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Zezwala na aktywowanie przez aplikację metody dodawania i usuwania szablonów twarzy."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"używanie sprzętu do uwierzytelniania za pomocą twarzy"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Zezwala na używanie przez aplikację sprzętu do analizy twarzy na potrzeby uwierzytelniania"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Uwierzytelnianie twarzą"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Zarejestruj swoją twarz ponownie"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Aby poprawić rozpoznawanie, ponownie zarejestruj swoją twarz"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Nie udało się zarejestrować danych twarzy. Spróbuj ponownie."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Zbyt jasno. Spróbuj przy słabszym świetle."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Zbyt ciemno. Spróbuj w jaśniejszym świetle."</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index d3cc969bb703..b57259156cb9 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticação facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que o app use o hardware de autenticação facial para autenticação"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticação facial"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registre seu rosto novamente"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para melhorar o reconhecimento, registre seu rosto novamente"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Dados precisos não capturados. Tente novamente."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Muito iluminado. Diminua a iluminação."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Muito escuro. Use uma iluminação mais clara."</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 8bd1054c1e23..22257671219c 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite à aplicação invocar métodos para adicionar e eliminar modelos faciais para uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilizar hardware de autenticação facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que a aplicação utilize hardware de autenticação facial para autenticação."</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticação facial"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Volte a inscrever o seu rosto"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para melhorar o reconhecimento, volte a inscrever o seu rosto."</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Imp. capt. dados rosto precisos. Tente novamente."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Demasiado clara. Experimente uma luz mais suave."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Demasiado escura. Experimente local com mais luz."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index d3cc969bb703..b57259156cb9 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticação facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que o app use o hardware de autenticação facial para autenticação"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticação facial"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registre seu rosto novamente"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para melhorar o reconhecimento, registre seu rosto novamente"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Dados precisos não capturados. Tente novamente."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Muito iluminado. Diminua a iluminação."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Muito escuro. Use uma iluminação mais clara."</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 62a090bef4e6..ad7e6726f3ce 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -556,12 +556,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite aplicației să invoce metode pentru a adăuga și a șterge șabloane faciale pentru utilizare."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"să folosească hardware de autentificare facială"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite aplicației să folosească hardware de autentificare facială pentru autentificare"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autentificare facială"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Reînregistrați-vă chipul"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Pentru a îmbunătăți recunoașterea, reînregistrați-vă chipul"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Nu s-a putut fotografia fața cu precizie. Încercați din nou."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Prea luminos. Încercați o lumină mai slabă."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Prea întunecat. Încercați o lumină mai puternică."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 7b7c547709d7..7c63a6b088f6 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -559,12 +559,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Приложение сможет добавлять и удалять шаблоны лиц."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"Использовать оборудование для распознавания лиц"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Приложение сможет использовать распознающее оборудование для аутентификации."</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Распознавание лица"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Зарегистрируйте лицо ещё раз"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Чтобы улучшить распознавание лица, зарегистрируйте его ещё раз"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Не удалось собрать данные. Повторите попытку."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Слишком светло. Сделайте освещение менее ярким."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Слишком темно. Сделайте освещение ярче."</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 70740b962388..2991f6307995 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"මුහුණු අච්චු එකතු කිරීමට සහ ඉවත් කිරීමට අදාළ ක්‍රම භාවිතය සඳහා මෙම යෙදුමට ඉඩ දෙයි."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"මුහුණු සත්‍යාපක දෘඪාංග භාවිතා කරන්න"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"සත්‍යාපනය සඳහා සත්‍යාපක දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"මුහුණු සත්‍යාපනය"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"හඳුනා ගැනීම වැඩිදියුණු කිරීමට, ඔබේ මුහුණ යළි-ලියාපදිංචි කරන්න"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"නිරවද්‍ය මුහුණු දත්ත ගත නොහැකි විය. නැවත උත්සාහ කරන්න."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"දීප්තිය වැඩියි. තවත් මඳ ආලෝකය උත්සාහ කරන්න."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"ඉතා අඳුරුයි. තවත් දීප්තිමත් ආලෝකය උත්සාහ කරන්න."</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 43a67449d985..630b799804d6 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -559,12 +559,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Umožňuje aplikácii vyvolať metódy, ktoré pridávajú a odstraňujú šablóny tvárí."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"používanie hardvéru na overenie tváre"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Umožňuje aplikácii používať na overenie totožnosti hardvér na overenie tváre"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Overenie tváre"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Znova zaregistrujte svoju tvár"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Znova zaregistrujte svoju tvár, aby sa zlepšilo rozpoznávanie"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Nepodarilo sa nasnímať presné údaje o tvári. Skúste to znova."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Príliš veľa svetla. Skúste jemnejšie osvetlenie."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Príliš veľká tma. Skúste lepšie osvetlenie."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 904ad3cfb28b..a20edcb48e8b 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -559,12 +559,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Aplikaciji omogoča sprožanje načinov za dodajanje in brisanje predlog z obrazi za uporabo."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"uporaba strojne opreme za preverjanje pristnosti obraza"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aplikaciji omogoča uporabo strojne opreme za preverjanje pristnosti obraza"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Preverjanje pristnosti z obrazom"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Znova prijavite obraz"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Za izboljšanje prepoznavanja znova prijavite svoj obraz"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Točnih podatkov o obrazu ni bilo mogoče zajeti. Poskusite znova."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Presvetlo. Poskusite z blažjo osvetlitvijo."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Pretemno. Poskusite z močnejšo osvetlitvijo."</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index ad5835270622..37bff1a5a366 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Lejon aplikacionin të aktivizojë mënyra për shtim e fshirje të shablloneve të përdorura."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"përdor harduerin për vërtetimin e fytyrës"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Lejon aplikacionin të përdorë harduer vërtetimi të fytyrës për procesin e vërtetimit"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Vërtetimi me fytyrë"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Regjistro përsëri fytyrën tënde"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Për të përmirësuar njohjen, regjistro përsëri fytyrën tënde"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"S\'mund të regjistroheshin të dhëna të sakta të fytyrës. Provo përsëri."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Me shumë ndriçim. Provo një ndriçim më të butë."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Shumë i errët. Provo një ndriçim më të fortë."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index abe1809bf5df..a32f27962277 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -556,12 +556,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Дозвољава да апликација активира методе за додавање и брисање шаблона лица ради коришћења."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"коришћење хардв. за потврду идентитета помоћу лица"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Дозвољава да апликација користи хардвер за потврду идентитета помоћу лица"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Потврда идентитета лицем"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Поново региструјте лице"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Да бисте побољшали препознавање, поново региструјте лице"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Снимање лица није успело. Пробајте поново."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Превише је светло. Пробајте са слабијим осветљењем."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Претамно је. Пробајте са јачим осветљењем."</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 3a84c8a0cbca..d2812617344a 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Tillåter att appen anropar metoder för att lägga till och radera ansiktsmallar."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"använda maskinvara för ansiktsautentisering"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tillåter att appen använder maskinvara för ansiktsigenkänning vid autentisering"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ansiktsautentisering"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registrera ansiktet på nytt"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Gör om registreringen av ansiktet så att ansiktsigenkänningen ska fungera bättre"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Det gick inte att fånga ansiktsdata. Försök igen."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Det är för ljust. Testa lägre belysning."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Det är för mörkt. Testa med bättre belysning."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 1f7f1ac83c64..f03629626b36 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Huruhusu programu iombe njia za kuongeza na kufuta violezo vya uso vitakavyotumiwa."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"tumia maunzi ya kuthibistiha uso"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Huruhusu programu ithibitishe uso kwa kutumia maunzi ya kuthibitisha"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Utambuzi wa Uso"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Sajili uso wako tena"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ili kuimarisha utambuzi, tafadhali sajili uso wako tena"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Imeshindwa kunasa data sahihi ya uso. Jaribu tena."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Inang\'aa mno. Jaribu mwangaza hafifu"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Hakuna mwangaza wa kutosha. Jaribu kuongeza mwangaza."</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 5a24e4a82e1d..40e281603e4f 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -183,13 +183,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"உங்கள் பணிக் கணக்கு நிர்வாகி கண்காணிக்கிறார்"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> இன் படி"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"பணிக் கணக்கு நீக்கப்பட்டது"</string>
- <string name="work_profile_deleted_details" msgid="6307630639269092360">"பணிக் கணக்கு நிர்வாகிப் பயன்பாடு இல்லை அல்லது அது சிதைந்துள்ளது. இதன் விளைவாக, உங்கள் பணிக் கணக்குமும் அதனுடன் தொடர்புடைய தரவும் நீக்கப்பட்டன. உதவிக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
+ <string name="work_profile_deleted_details" msgid="6307630639269092360">"பணிக் கணக்கு நிர்வாகி ஆப்ஸ் இல்லை அல்லது அது சிதைந்துள்ளது. இதன் விளைவாக, உங்கள் பணிக் கணக்குமும் அதனுடன் தொடர்புடைய தரவும் நீக்கப்பட்டன. உதவிக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"இந்தச் சாதனத்தில் இனி பணிக் கணக்கு கிடைக்காது"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"கடவுச்சொல்லை அதிக முறை தவறாக முயற்சித்துவிட்டீர்கள்"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"சாதனம் நிர்வகிக்கப்படுகிறது"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"உங்கள் நிறுவனம் இந்தச் சாதனத்தை நிர்வகிக்கும், அத்துடன் அது நெட்வொர்க் ட்ராஃபிக்கைக் கண்காணிக்கலாம். விவரங்களுக்கு, தட்டவும்."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"சாதனத் தரவு அழிக்கப்படும்"</string>
- <string name="factory_reset_message" msgid="9024647691106150160">"நிர்வாகிப் பயன்பாட்டை உபயோகிக்க முடியாது. இப்போது, உங்கள் சாதனம் ஆரம்ப நிலைக்கு மீட்டமைக்கப்படும்.\n\nஏதேனும் கேள்விகள் இருப்பின், உங்கள் நிறுவனத்தின் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"நிர்வாகி ஆப்ஸை உபயோகிக்க முடியாது. இப்போது, உங்கள் சாதனம் ஆரம்ப நிலைக்கு மீட்டமைக்கப்படும்.\n\nஏதேனும் கேள்விகள் இருப்பின், உங்கள் நிறுவனத்தின் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"பிரிண்ட் செய்வதை <xliff:g id="OWNER_APP">%s</xliff:g> தடுத்துள்ளது."</string>
<string name="me" msgid="6545696007631404292">"நான்"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"டேப்லெட் விருப்பங்கள்"</string>
@@ -265,9 +265,9 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"விழிப்பூட்டல்கள்"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"விற்பனையாளர் டெமோ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB இணைப்பு"</string>
- <string name="notification_channel_heavy_weight_app" msgid="6218742927792852607">"பயன்பாடு இயங்குகிறது"</string>
+ <string name="notification_channel_heavy_weight_app" msgid="6218742927792852607">"ஆப்ஸ் இயங்குகிறது"</string>
<string name="notification_channel_foreground_service" msgid="3931987440602669158">"பேட்டரியைப் பயன்படுத்தும் பயன்பாடுகள்"</string>
- <string name="foreground_service_app_in_background" msgid="1060198778219731292">"<xliff:g id="APP_NAME">%1$s</xliff:g> பயன்பாடு பேட்டரியைப் பயன்படுத்துகிறது"</string>
+ <string name="foreground_service_app_in_background" msgid="1060198778219731292">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் பேட்டரியைப் பயன்படுத்துகிறது"</string>
<string name="foreground_service_apps_in_background" msgid="7175032677643332242">"<xliff:g id="NUMBER">%1$d</xliff:g> பயன்பாடுகள் பேட்டரியைப் பயன்படுத்துகின்றன"</string>
<string name="foreground_service_tap_for_details" msgid="372046743534354644">"பேட்டரி மற்றும் டேட்டா உபயோக விவரங்களைக் காண, தட்டவும்"</string>
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
@@ -286,7 +286,7 @@
<string name="permgroupbackgroundrequestdetail_location" msgid="4597006851453417387">"நீங்கள் ஆப்ஸை உபயோகிக்கும்போது மட்டுமே அது இருப்பிடத்தை அணுக முடியும்"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"கேலெண்டர்"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"கேலெண்டரை அணுகலாம்"</string>
- <string name="permgrouprequest_calendar" msgid="289900767793189421">"கேலெண்டரை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"கேலெண்டரை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS அனுப்பலாம், வந்த SMSகளைப் பார்க்கலாம்"</string>
<string name="permgrouprequest_sms" msgid="7168124215838204719">"மெசேஜ்களை அனுப்பவும், பார்க்கவும் &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
@@ -310,7 +310,7 @@
<string name="permgrouprequest_phone" msgid="9166979577750581037">"மொபைல் அழைப்புகள் செய்யவும், அவற்றை நிர்வகிக்கவும், &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
<string name="permgrouplab_sensors" msgid="4838614103153567532">"உடல் சென்சார்கள்"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"உங்கள் உடல் இயக்கம் பற்றி உணர்விகள் கூறும் தகவலைப் பார்க்கலாம்"</string>
- <string name="permgrouprequest_sensors" msgid="6349806962814556786">"உங்கள் உடலியக்கக் குறிகள் பற்றிய சென்சார் தரவை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"உங்கள் உடலியக்கக் குறிகள் பற்றிய சென்சார் தரவை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"சாளர உள்ளடக்கத்தைப் பெறும்"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"நீங்கள் பணியாற்றிக் கொண்டிருக்கும் சாளரத்தின் உள்ளடக்கத்தைப் பார்க்கலாம்."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"தொடுவதன் மூலம் அறிவதை இயக்கும்"</string>
@@ -324,83 +324,83 @@
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"கைரேகை சைகைகள்"</string>
<string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"சாதனத்தின் கைரேகை சென்சார்மேல் செய்யப்படும் சைகைகளைக் கேப்ட்சர் செய்ய முடியும்."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"நிலைப் பட்டியை முடக்குதல் அல்லது மாற்றுதல்"</string>
- <string name="permdesc_statusBar" msgid="8434669549504290975">"நிலைப் பட்டியை முடக்க அல்லது முறைமையில் ஐகான்களைச் சேர்க்க மற்றும் அகற்ற பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"நிலைப் பட்டியை முடக்க அல்லது முறைமையில் ஐகான்களைச் சேர்க்க மற்றும் அகற்ற ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"நிலைப் பட்டியில் இருக்கும்"</string>
- <string name="permdesc_statusBarService" msgid="716113660795976060">"நிலைப் பட்டியில் இருக்க பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"நிலைப் பட்டியில் இருக்க ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"நிலைப் பட்டியை விரிவாக்குதல்/சுருக்குதல்"</string>
- <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"நிலைப் பட்டியை விரிவாக்க அல்லது சுருக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"நிலைப் பட்டியை விரிவாக்க அல்லது சுருக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_install_shortcut" msgid="4279070216371564234">"குறுக்குவழிகளை நிறுவுதல்"</string>
- <string name="permdesc_install_shortcut" msgid="8341295916286736996">"பயனரின் அனுமதி இல்லாமல் முகப்புத்திரையின் குறுக்குவழிகளைச் சேர்க்கப் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_install_shortcut" msgid="8341295916286736996">"பயனரின் அனுமதி இல்லாமல் முகப்புத்திரையின் குறுக்குவழிகளைச் சேர்க்கப் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"குறுக்குவழிகளை நிறுவல் நீக்குதல்"</string>
- <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"பயனரின் அனுமதி இல்லாமல் முகப்புத்திரையின் குறுக்குவழிகளை அகற்ற பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"பயனரின் அனுமதி இல்லாமல் முகப்புத்திரையின் குறுக்குவழிகளை அகற்ற ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"வெளிச்செல்லும் அழைப்புகளுக்கு மீண்டும் வழிகாட்டுதல்"</string>
- <string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"மற்றொரு எண்ணிற்கு அழைப்பைத் திருப்பிவிடு அல்லது அழைப்பை முழுமையாக ரத்துசெய் என்னும் விருப்பத்துடன், வெளிச்செல்லும் அழைப்பை மேற்கொள்ளும்போது டயல் செய்யப்படுகின்ற எண்ணைப் பார்க்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"மற்றொரு எண்ணிற்கு அழைப்பைத் திருப்பிவிடு அல்லது அழைப்பை முழுமையாக ரத்துசெய் என்னும் விருப்பத்துடன், வெளிச்செல்லும் அழைப்பை மேற்கொள்ளும்போது டயல் செய்யப்படுகின்ற எண்ணைப் பார்க்க, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ஃபோன் அழைப்புகளுக்குப் பதிலளி"</string>
- <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"உள்வரும் ஃபோன் அழைப்பிற்குப் பதிலளிக்க, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"உள்வரும் ஃபோன் அழைப்பிற்குப் பதிலளிக்க, ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"உரைச் செய்திகளை (SMS) பெறுதல்"</string>
- <string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS செய்திகளைப் பெற, செயற்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிப்பதற்கு அல்லது நீக்குவதற்குப் பயன்பாட்டால் முடியும் என்பதாகும்."</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS செய்திகளைப் பெற, செயற்படுத்தப் ஆப்ஸை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிப்பதற்கு அல்லது நீக்குவதற்குப் பயன்பாட்டால் முடியும் என்பதாகும்."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"உரைச் செய்திகளை (MMS) பெறுதல்"</string>
- <string name="permdesc_receiveMms" msgid="533019437263212260">"MMS செய்திகளைப் பெற, செயற்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்கவோ, நீக்கவோ பயன்பாட்டால் முடியும் என்பதாகும்."</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"MMS செய்திகளைப் பெற, செயற்படுத்தப் ஆப்ஸை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்கவோ, நீக்கவோ பயன்பாட்டால் முடியும் என்பதாகும்."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"செல் அலைபரப்புச் செய்திகளைப் படித்தல்"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"உங்கள் சாதனத்தில் பெறப்படும் செல் அலைபரப்புச் செய்திகளைப் படிப்பதற்குப் பயன்பாட்டை அனுமதிக்கிறது. அவசரநிலை சூழ்நிலைகளை உங்களுக்கு எச்சரிக்கைச் செய்வதற்கு சில இடங்களில் செல் அலைபரப்பு விழிப்பூட்டல்கள் வழங்கப்படும். அவசரநிலை மொபைல் அலைபரப்புப் பெறப்படும்போது உங்கள் சாதனத்தின் செயல்திறன் அல்லது செயல்பாட்டுடன் தீங்கிழைக்கும் பயன்பாடுகள் அதைத் தடுக்கலாம்."</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"உங்கள் சாதனத்தில் பெறப்படும் செல் அலைபரப்புச் செய்திகளைப் படிப்பதற்குப் ஆப்ஸை அனுமதிக்கிறது. அவசரநிலை சூழ்நிலைகளை உங்களுக்கு எச்சரிக்கைச் செய்வதற்கு சில இடங்களில் செல் அலைபரப்பு விழிப்பூட்டல்கள் வழங்கப்படும். அவசரநிலை மொபைல் அலைபரப்புப் பெறப்படும்போது உங்கள் சாதனத்தின் செயல்திறன் அல்லது செயல்பாட்டுடன் தீங்கிழைக்கும் பயன்பாடுகள் அதைத் தடுக்கலாம்."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"குழுசேர்ந்த ஊட்டங்களைப் படித்தல்"</string>
- <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"தற்போது ஒத்திசைந்த ஊட்டங்களைப் பற்றிய விவரங்களைப் பெற பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"தற்போது ஒத்திசைந்த ஊட்டங்களைப் பற்றிய விவரங்களைப் பெற ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS செய்திகளை அனுப்புதல் மற்றும் பார்த்தல்"</string>
- <string name="permdesc_sendSms" msgid="7094729298204937667">"SMS செய்திகளை அனுப்ப பயன்பாட்டை அனுமதிக்கிறது. இதற்கு எதிர்பாராத பேமெண்ட்கள் விதிக்கப்படலாம். தீங்கு விளைவிக்கும் பயன்பாடுகள் உங்களின் உறுதிப்படுத்தல் எதுவுமின்றி செய்திகளை அனுப்பி உங்களுக்குக் கட்டணம் விதிக்கலாம்."</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"SMS செய்திகளை அனுப்ப ஆப்ஸை அனுமதிக்கிறது. இதற்கு எதிர்பாராத பேமெண்ட்கள் விதிக்கப்படலாம். தீங்கு விளைவிக்கும் பயன்பாடுகள் உங்களின் உறுதிப்படுத்தல் எதுவுமின்றி செய்திகளை அனுப்பி உங்களுக்குக் கட்டணம் விதிக்கலாம்."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"உங்கள் உரைச் செய்திகளை (SMS அல்லது MMS) படித்தல்"</string>
<string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"இந்த ஆப்ஸ் உங்கள் டேப்லெட்டில் சேமிக்கப்பட்டுள்ள எல்லா SMS (உரை) செய்திகளையும் படிக்கலாம்."</string>
<string name="permdesc_readSms" product="tv" msgid="5796670395641116592">"இந்த ஆப்ஸ் உங்கள் டிவியில் சேமிக்கப்பட்டுள்ள எல்லா SMS (உரை) செய்திகளையும் படிக்கலாம்."</string>
<string name="permdesc_readSms" product="default" msgid="6826832415656437652">"இந்த ஆப்ஸ் உங்கள் மொபைலில் சேமிக்கப்பட்டுள்ள எல்லா SMS (உரை) செய்திகளையும் படிக்கலாம்."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"உரைச் செய்திகளைப் (WAP) பெறுதல்"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP செய்திகளைப் பெற, செயற்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது. உங்களுக்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்க அல்லது நீக்குவதற்கான திறன் இந்த அனுமதியில் உள்ளடங்கும்."</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP செய்திகளைப் பெற, செயற்படுத்தப் ஆப்ஸை அனுமதிக்கிறது. உங்களுக்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்க அல்லது நீக்குவதற்கான திறன் இந்த அனுமதியில் உள்ளடங்கும்."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"இயங்கும் பயன்பாடுகளை மீட்டெடுத்தல்"</string>
- <string name="permdesc_getTasks" msgid="7454215995847658102">"நடப்பில் மற்றும் சமீபத்தில் இயங்கும் காரியங்களின் தகவலைப் பெற பயன்பாட்டை அனுமதிக்கிறது. சாதனத்தில் எந்தப் பயன்பாடுகள் பயன்படுத்தப்படுகின்றன என்பது குறித்த தகவலைக் கண்டறிய பயன்பாட்டை இது அனுமதிக்கலாம்."</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"நடப்பில் மற்றும் சமீபத்தில் இயங்கும் காரியங்களின் தகவலைப் பெற ஆப்ஸை அனுமதிக்கிறது. சாதனத்தில் எந்தப் பயன்பாடுகள் பயன்படுத்தப்படுகின்றன என்பது குறித்த தகவலைக் கண்டறிய ஆப்ஸை இது அனுமதிக்கலாம்."</string>
<string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"சுயவிவரத்தையும் சாதன உரிமையாளர்களையும் நிர்வகித்தல்"</string>
<string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"சுயவிவர உரிமையாளர்களையும் சாதன உரிமையாளரையும் அமைக்க, பயன்பாடுகளை அனுமதிக்கிறது."</string>
<string name="permlab_reorderTasks" msgid="2018575526934422779">"இயங்கும் பயன்பாடுகளை மறுவரிசைப்படுத்தல்"</string>
- <string name="permdesc_reorderTasks" msgid="7734217754877439351">"பின்புலத்திலும், முன்புலத்திலும் காரியங்களை நகர்த்த பயன்பாட்டை அனுமதிக்கிறது. உங்கள் உள்ளீடு இல்லாமலே பயன்பாடு இதைச் செய்யலாம்."</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"பின்புலத்திலும், முன்புலத்திலும் காரியங்களை நகர்த்த ஆப்ஸை அனுமதிக்கிறது. உங்கள் உள்ளீடு இல்லாமலே ஆப்ஸ் இதைச் செய்யலாம்."</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"கார் பயன்முறையை இயக்குதல்"</string>
- <string name="permdesc_enableCarMode" msgid="4853187425751419467">"கார் முறையை இயக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"கார் முறையை இயக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"பிற பயன்பாடுகளை மூடுதல்"</string>
- <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"பிற பயன்பாடுகளின் பின்புலச் செயல்முறைகளை நிறுத்த பயன்பாட்டை அனுமதிக்கிறது. இதனால் பிற பயன்பாடுகள் இயங்குவதை நிறுத்தலாம்."</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"பிற பயன்பாடுகளின் பின்புலச் செயல்முறைகளை நிறுத்த ஆப்ஸை அனுமதிக்கிறது. இதனால் பிற பயன்பாடுகள் இயங்குவதை நிறுத்தலாம்."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"இந்த ஆப்ஸ் பிற பயன்பாடுகளின் மேலே தோன்றலாம்"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"இந்த ஆப்ஸ் பிற பயன்பாடுகளின் மேலே அல்லது திரையின் பிற பகுதிகளில் தோன்றலாம். இது வழக்கமான பயன்பாட்டு உபயோகத்தில் குறுக்கிட்டு, பிற பயன்பாடுகள் தோன்றும் விதத்தை மாற்றக்கூடும்."</string>
<string name="permlab_runInBackground" msgid="7365290743781858803">"பின்னணியில் இயக்கு"</string>
<string name="permdesc_runInBackground" msgid="7370142232209999824">"இந்த ஆப்ஸ், பின்னணியில் இயங்கலாம். இதனால் பேட்டரி விரைவாகத் தீர்ந்துவிடக்கூடும்."</string>
<string name="permlab_useDataInBackground" msgid="8694951340794341809">"பின்னணியில் தரவைப் பயன்படுத்து"</string>
<string name="permdesc_useDataInBackground" msgid="6049514223791806027">"இந்த ஆப்ஸ், பின்னணியில் டேட்டாவை உபயோகிக்கலாம். இதனால் டேட்டா உபயோகம் அதிகரிக்கக்கூடும்."</string>
- <string name="permlab_persistentActivity" msgid="8841113627955563938">"பயன்பாட்டை எப்போதும் இயங்குமாறு செய்தல்"</string>
- <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"நினைவகத்தில் நிலையாக இருக்கும் தன்னுடைய பகுதிகளை உருவாக்கப் பயன்பாட்டை அனுமதிக்கிறது. இதனால பிற பயன்பாடுகளுக்குக் கிடைக்கும் நினைவகம் வரையறுக்கப்பட்டு, டேப்லெட்டின் வேகத்தைக் குறைக்கலாம்."</string>
- <string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"பயன்பாடு தனது உள்ளடக்கத்தை நினைவகத்தில் தொடர்ந்து வைத்திருக்க, அனுமதிக்கிறது. பிற பயன்பாடுகளுக்கென இருக்கும் நினைவகத்தை இது கட்டுப்படுத்தி, டிவியின் செயல்திறனைக் குறைக்கலாம்."</string>
- <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"நினைவகத்தில் நிலையாக இருக்கும் தன்னுடைய பகுதிகளை உருவாக்கப் பயன்பாட்டை அனுமதிக்கிறது. இதனால பிற பயன்பாடுகளுக்குக் கிடைக்கும் நினைவகம் வரையறுக்கப்பட்டு, மொபைலின் வேகத்தைக் குறைக்கலாம்"</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"ஆப்ஸை எப்போதும் இயங்குமாறு செய்தல்"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"நினைவகத்தில் நிலையாக இருக்கும் தன்னுடைய பகுதிகளை உருவாக்கப் ஆப்ஸை அனுமதிக்கிறது. இதனால பிற பயன்பாடுகளுக்குக் கிடைக்கும் நினைவகம் வரையறுக்கப்பட்டு, டேப்லெட்டின் வேகத்தைக் குறைக்கலாம்."</string>
+ <string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"ஆப்ஸ் தனது உள்ளடக்கத்தை நினைவகத்தில் தொடர்ந்து வைத்திருக்க, அனுமதிக்கிறது. பிற ஆப்ஸ்களுக்கென இருக்கும் நினைவகத்தை இது கட்டுப்படுத்தி, டிவியின் செயல்திறனைக் குறைக்கலாம்."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"நினைவகத்தில் நிலையாக இருக்கும் தன்னுடைய பகுதிகளை உருவாக்கப் ஆப்ஸை அனுமதிக்கிறது. இதனால பிற பயன்பாடுகளுக்குக் கிடைக்கும் நினைவகம் வரையறுக்கப்பட்டு, மொபைலின் வேகத்தைக் குறைக்கலாம்"</string>
<string name="permlab_foregroundService" msgid="3310786367649133115">"முன்புலத்தில் இயங்கும் சேவையை இயக்குதல்"</string>
- <string name="permdesc_foregroundService" msgid="6471634326171344622">"முன்புலத்தில் இயங்கும் சேவைகளை உபயோகிக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"முன்புலத்தில் இயங்கும் சேவைகளை உபயோகிக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"பயன்பாட்டுச் சேமிப்பு இடத்தை அளவிடல்"</string>
- <string name="permdesc_getPackageSize" msgid="3921068154420738296">"பயன்பாடு, அதன் குறியீடு, தரவு, மற்றும் தற்காலிகச் சேமிப்பு அளவுகளை மீட்டெடுக்க அனுமதிக்கிறது"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"ஆப்ஸ், அதன் குறியீடு, தரவு, மற்றும் தற்காலிகச் சேமிப்பு அளவுகளை மீட்டெடுக்க அனுமதிக்கிறது"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"சாதன அமைப்புகளை மாற்றுதல்"</string>
- <string name="permdesc_writeSettings" msgid="7775723441558907181">"முறைமையின் அமைப்பு தரவைத் திருத்த, பயன்பாட்டை அனுமதிக்கிறது. தீங்குவிளைவிக்கும் பயன்பாடுகள், முறைமையின் உள்ளமைவைச் சிதைக்கலாம்."</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"முறைமையின் அமைப்பு தரவைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. தீங்குவிளைவிக்கும் பயன்பாடுகள், முறைமையின் உள்ளமைவைச் சிதைக்கலாம்."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"தொடக்கத்தில் இயக்குதல்"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"மறுஇயக்கம் முடிந்தது, விரைவில் தானாகவே தொடங்க, பயன்பாட்டை அனுமதிக்கிறது. இதனால் டேப்லெட் நீண்ட நேரம் கழித்து தொடங்கும் மற்றும் எப்போதும் இயங்குகின்ற டேப்லெட்டின் ஒட்டுமொத்தச் செயல்பாட்டையும் தாமதமாகும்."</string>
- <string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"சாதனம் தொடங்குவது முடிந்தவுடன், பயன்பாடு தானாகவே விரைவில் தொடங்க அனுமதிக்கிறது. இது டிவி தொடங்குவதற்கான நேரத்தைத் தாமதமாக்குவதோடு, எப்போதும் இயங்கிக்கொண்டிருப்பதன் மூலம் ஒட்டுமொத்த டேப்லெட்டின் வேகத்தைக் குறைக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"மறுஇயக்கம் முடிந்தது, விரைவில் தானாகவே தொடங்க, பயன்பாட்டை அனுமதிக்கிறது. இதனால் மொபைல் நீண்ட நேரம் கழித்து தொடங்கும் மற்றும் எப்போதும் இயங்குகின்ற மொபைலின் ஒட்டுமொத்தச் செயல்பாட்டையும் தாமதமாகும்."</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"மறுஇயக்கம் முடிந்தது, விரைவில் தானாகவே தொடங்க, ஆப்ஸை அனுமதிக்கிறது. இதனால் டேப்லெட் நீண்ட நேரம் கழித்து தொடங்கும் மற்றும் எப்போதும் இயங்குகின்ற டேப்லெட்டின் ஒட்டுமொத்தச் செயல்பாட்டையும் தாமதமாகும்."</string>
+ <string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"சாதனம் தொடங்குவது முடிந்தவுடன், ஆப்ஸ் தானாகவே விரைவில் தொடங்க அனுமதிக்கிறது. இது டிவி தொடங்குவதற்கான நேரத்தைத் தாமதமாக்குவதோடு, எப்போதும் இயங்கிக்கொண்டிருப்பதன் மூலம் ஒட்டுமொத்த டேப்லெட்டின் வேகத்தைக் குறைக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"மறுஇயக்கம் முடிந்தது, விரைவில் தானாகவே தொடங்க, ஆப்ஸை அனுமதிக்கிறது. இதனால் மொபைல் நீண்ட நேரம் கழித்து தொடங்கும் மற்றும் எப்போதும் இயங்குகின்ற மொபைலின் ஒட்டுமொத்தச் செயல்பாட்டையும் தாமதமாகும்."</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"தொடர்ந்து அணுகத்தக்க வலைபரப்பை அனுப்புதல்"</string>
- <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"வலைபரப்பு முடிந்த பின்னும் இருக்கும், தொடர்ந்து அணுகத்தக்க வலைபரப்பை அனுப்பப் பயன்பாட்டை அனுமதிக்கிறது. அதிகமாகப் பயன்படுத்தினால், டேப்லெட்டானது நினைவகத்தை மிக அதிகமாகப் பயன்படுத்துவதால் வேகம் குறைந்ததாகவும், நிலையற்றதாகவும் ஆகலாம்."</string>
- <string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"அலைபரப்பு முடிந்த பின்னரும் தங்கிவிடும் ஸ்டிக்கி அலைபரப்புகளை அனுப்ப, பயன்பாட்டை அனுமதிக்கிறது. அளவுக்கதிகமான உபயோகமானது, டிவியின் வேகத்தைக் குறைக்கலாம் அல்லது அதிகமான நினைவகம் பயன்பட்டால் நிலையற்றதாகலாம்."</string>
- <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"அலைபரப்பு முடிந்த பின்னும் இருக்கும், தொடர்ந்து அணுகத்தக்க அலைபரப்பை அனுப்பப் பயன்பாட்டை அனுமதிக்கிறது. அதிகமாகப் பயன்படுத்தினால், மொபைலானது நினைவகத்தை மிக அதிகமாகப் பயன்படுத்துவதால் வேகம் குறைந்ததாகவும், நிலையற்றதாகவும் ஆகலாம்."</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"வலைபரப்பு முடிந்த பின்னும் இருக்கும், தொடர்ந்து அணுகத்தக்க வலைபரப்பை அனுப்பப் ஆப்ஸை அனுமதிக்கிறது. அதிகமாகப் பயன்படுத்தினால், டேப்லெட்டானது நினைவகத்தை மிக அதிகமாகப் பயன்படுத்துவதால் வேகம் குறைந்ததாகவும், நிலையற்றதாகவும் ஆகலாம்."</string>
+ <string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"அலைபரப்பு முடிந்த பின்னரும் தங்கிவிடும் ஸ்டிக்கி அலைபரப்புகளை அனுப்ப, ஆப்ஸை அனுமதிக்கிறது. அளவுக்கதிகமான உபயோகமானது, டிவியின் வேகத்தைக் குறைக்கலாம் அல்லது அதிகமான நினைவகம் பயன்பட்டால் நிலையற்றதாகலாம்."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"அலைபரப்பு முடிந்த பின்னும் இருக்கும், தொடர்ந்து அணுகத்தக்க அலைபரப்பை அனுப்பப் ஆப்ஸை அனுமதிக்கிறது. அதிகமாகப் பயன்படுத்தினால், மொபைலானது நினைவகத்தை மிக அதிகமாகப் பயன்படுத்துவதால் வேகம் குறைந்ததாகவும், நிலையற்றதாகவும் ஆகலாம்."</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"உங்கள் தொடர்புகளைப் படித்தல்"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"குறிப்பிட்டவர்களுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உட்பட, உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது. இந்த அனுமதி, உங்கள் தொடர்பு தரவைச் சேமிக்க பயன்பாடுகளை அனுமதிக்கிறது, மேலும் தீங்கிழைக்கும் பயன்பாடுகள் உங்களுக்குத் தெரியாமல் தொடர்பு தரவைப் பகிரலாம்."</string>
- <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"உங்கள் டிவியில் சேமிக்கப்பட்ட தொடர்புகள் பற்றிய தரவைப் படிக்க, பயன்பாட்டை அனுமதிக்கிறது, இதில் குறிப்பிட்ட தனிநபர் எண்ணை எத்தனைமுறை அழைத்தீர்கள், மின்னஞ்சல் செய்தீர்கள் அல்லது பிறவழிகளில் தொடர்புகொண்டீர்கள் என்பதும் அடங்கும். இந்த அனுமதியானது உங்கள் தொடர்புத் தரவைச் சேமிக்கப் பயன்பாட்டை அனுமதிக்கிறது மற்றும் தீங்குவிளைவிக்கும் பயன்பாடுகள் உங்கள் அனுமதியின்றி தொடர்புத் தரவைப் பகிரலாம்."</string>
- <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"குறிப்பிட்டவர்களுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்ட எண்ணிக்கை உட்பட, உங்கள் மொபைலில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது. இந்த அனுமதி, உங்கள் தொடர்பு தரவைச் சேமிக்க பயன்பாடுகளை அனுமதிக்கிறது, மேலும் தீங்கிழைக்கும் பயன்பாடுகள் உங்களுக்குத் தெரியாமல் தொடர்பு தரவைப் பகிரலாம்."</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"குறிப்பிட்டவர்களுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உட்பட, உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைப் படிக்க ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதி, உங்கள் தொடர்பு தரவைச் சேமிக்க பயன்பாடுகளை அனுமதிக்கிறது, மேலும் தீங்கிழைக்கும் பயன்பாடுகள் உங்களுக்குத் தெரியாமல் தொடர்பு தரவைப் பகிரலாம்."</string>
+ <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"உங்கள் டிவியில் சேமிக்கப்பட்ட தொடர்புகள் பற்றிய தரவைப் படிக்க, ஆப்ஸை அனுமதிக்கிறது, இதில் குறிப்பிட்ட தனிநபர் எண்ணை எத்தனைமுறை அழைத்தீர்கள், மின்னஞ்சல் செய்தீர்கள் அல்லது பிறவழிகளில் தொடர்புகொண்டீர்கள் என்பதும் அடங்கும். இந்த அனுமதியானது உங்கள் தொடர்புத் தரவைச் சேமிக்கப் ஆப்ஸை அனுமதிக்கிறது மற்றும் தீங்குவிளைவிக்கும் பயன்பாடுகள் உங்கள் அனுமதியின்றி தொடர்புத் தரவைப் பகிரலாம்."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"குறிப்பிட்டவர்களுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்ட எண்ணிக்கை உட்பட, உங்கள் மொபைலில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைப் படிக்க ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதி, உங்கள் தொடர்பு தரவைச் சேமிக்க பயன்பாடுகளை அனுமதிக்கிறது, மேலும் தீங்கிழைக்கும் பயன்பாடுகள் உங்களுக்குத் தெரியாமல் தொடர்பு தரவைப் பகிரலாம்."</string>
<string name="permlab_writeContacts" msgid="5107492086416793544">"உங்கள் தொடர்புகளை மாற்றுதல்"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"குறிப்பிட்ட தொடர்புகளுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உள்பட, உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைத் திருத்த பயன்பாட்டை அனுமதிக்கிறது. இந்த அனுமதியானது தொடர்புத் தரவை நீக்கப் பயன்பாடுகளை அனுமதிக்கிறது."</string>
- <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"உங்கள் டிவியில் சேமிக்கப்பட்ட தொடர்புகள் பற்றிய தரவை மாற்ற, பயன்பாட்டை அனுமதிக்கிறது, இதில் குறிப்பிட்ட தொடர்பை எத்தனைமுறை அழைத்தீர்கள், மின்னஞ்சல் செய்தீர்கள் அல்லது பிறவழிகளில் தொடர்புகொண்டீர்கள் என்பதும் அடங்கும். இது தொடர்புத் தரவை நீக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"குறிப்பிட்ட தொடர்புகளுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உள்பட, உங்கள் மொபைலில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைத் திருத்த பயன்பாட்டை அனுமதிக்கிறது. இந்த அனுமதியானது தொடர்புத் தரவை நீக்கப் பயன்பாடுகளை அனுமதிக்கிறது."</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"குறிப்பிட்ட தொடர்புகளுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உள்பட, உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதியானது தொடர்புத் தரவை நீக்கப் பயன்பாடுகளை அனுமதிக்கிறது."</string>
+ <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"உங்கள் டிவியில் சேமிக்கப்பட்ட தொடர்புகள் பற்றிய தரவை மாற்ற, ஆப்ஸை அனுமதிக்கிறது, இதில் குறிப்பிட்ட தொடர்பை எத்தனைமுறை அழைத்தீர்கள், மின்னஞ்சல் செய்தீர்கள் அல்லது பிறவழிகளில் தொடர்புகொண்டீர்கள் என்பதும் அடங்கும். இது தொடர்புத் தரவை நீக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"குறிப்பிட்ட தொடர்புகளுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உள்பட, உங்கள் மொபைலில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதியானது தொடர்புத் தரவை நீக்கப் பயன்பாடுகளை அனுமதிக்கிறது."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"அழைப்புப் பதிவைப் படித்தல்"</string>
<string name="permdesc_readCallLog" msgid="3204122446463552146">"இந்த ஆப்ஸ் உங்கள் அழைப்பு வரலாற்றைப் படிக்கலாம்."</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"அழைப்புப் பதிவை எழுதுதல்"</string>
- <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்பட உங்கள் டேப்லெட்டின் அழைப்புப் பதிவைத் திருத்துவதற்குப் பயன்பாட்டை அனுமதிக்கிறது. உங்கள் அழைப்பின் பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
- <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்ளிட்ட உங்கள் டிவியின் அழைப்பு பதிவைத் திருத்த, பயன்பாட்டை அனுமதிக்கிறது. உங்கள் அழைப்பு பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
- <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்பட உங்கள் மொபைல் அழைப்புப் பதிவைத் திருத்துவதற்குப் பயன்பாட்டை அனுமதிக்கிறது. உங்கள் அழைப்பின் பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்பட உங்கள் டேப்லெட்டின் அழைப்புப் பதிவைத் திருத்துவதற்குப் ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பின் பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
+ <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்ளிட்ட உங்கள் டிவியின் அழைப்பு பதிவைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பு பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்பட உங்கள் மொபைல் அழைப்புப் பதிவைத் திருத்துவதற்குப் ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பின் பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
<string name="permlab_bodySensors" msgid="4683341291818520277">"உடல் உணர்விகளை (இதயத் துடிப்பு மானிட்டர்கள் போன்றவை) அணுகுதல்"</string>
<string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"உங்கள் இதயத்துடிப்பு விகிதம் போன்ற உங்கள் உடல்நிலையைக் கண்காணிக்கும் உணர்விகளில் இருந்து தரவை அணுக பயன்பாடுகளை அனுமதிக்கும்."</string>
<string name="permlab_readCalendar" msgid="6716116972752441641">"கேலெண்டர் நிகழ்வுகளையும் விவரங்களையும் படிக்கலாம்"</string>
@@ -412,7 +412,7 @@
<string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"இந்த ஆப்ஸ் உங்கள் டிவியில் கேலெண்டர் நிகழ்வுகளைச் சேர்க்கலாம், அகற்றலாம் அல்லது மாற்றலாம். இந்த ஆப்ஸ் கேலெண்டர் உரிமையாளர்கள் அனுப்பியது போல் தோன்றும் செய்திகளை அனுப்பலாம் அல்லது உரிமையாளர்களிடம் தெரிவிக்காமலே கேலெண்டரில் நிகழ்வுகளை மாற்றலாம்."</string>
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"இந்த ஆப்ஸ் உங்கள் மொபைலில் கேலெண்டர் நிகழ்வுகளைச் சேர்க்கலாம், அகற்றலாம் அல்லது மாற்றலாம். இந்த ஆப்ஸ் கேலெண்டர் உரிமையாளர்கள் அனுப்பியது போல் தோன்றும் செய்திகளை அனுப்பலாம் அல்லது உரிமையாளர்களிடம் தெரிவிக்காமலே கேலெண்டரில் நிகழ்வுகளை மாற்றலாம்."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"கூடுதல் இட வழங்குநரின் கட்டளைகளின் அணுகல்"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"கூடுதல் இட வழங்குநர் கட்டளைகளை அணுகப் பயன்பாட்டை அனுமதிக்கிறது. இது, GPS அல்லது பிற இருப்பிட மூலங்களின் செயல்பாட்டை இடைமறிக்க பயன்பாட்டை அனுமதிக்கலாம்."</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"கூடுதல் இட வழங்குநர் கட்டளைகளை அணுகப் ஆப்ஸை அனுமதிக்கிறது. இது, GPS அல்லது பிற இருப்பிட மூலங்களின் செயல்பாட்டை இடைமறிக்க ஆப்ஸை அனுமதிக்கலாம்."</string>
<string name="permlab_accessFineLocation" msgid="6265109654698562427">"முன்புலத்தில் இயங்கும்போது மட்டும் துல்லியமான இருப்பிடத்தைக் கண்டறிதல்"</string>
<string name="permdesc_accessFineLocation" msgid="3520508381065331098">"இந்த ஆப்ஸ் முன்புலத்தில் இயங்கும்போது மட்டுமே நீங்கள் இருக்கும் இடத்தைத் துல்லியமாகக் கண்டறியும். உங்கள் மொபைலில், இருப்பிடச் சேவைகளை ஆப்ஸ் பயன்படுத்துவதற்கு வசதியாக, அவை ஆன் செய்யப்பட்டிருக்க வேண்டும். இதனால் பேட்டரி அதிகம் பயன்படுத்தப்படலாம்."</string>
<string name="permlab_accessCoarseLocation" msgid="3707180371693213469">"முன்புலத்தில் இயங்கும்போது மட்டும் தோராயமான இருப்பிடத்தைக் கண்டறிதல் (நெட்வொர்க் அடிப்படையில்)"</string>
@@ -422,95 +422,95 @@
<string name="permlab_accessBackgroundLocation" msgid="3965397804300661062">"பின்புலத்தில் இருப்பிடத்தை அணுகுதல்"</string>
<string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"தோராயமான அல்லது துல்லியமான \'இருப்பிட அணுகலுடன்\' சேர்ந்து இதற்கும் அனுமதி வழங்கப்பட்டால், ஆப்ஸ் பின்புலத்தில் இயங்கினாலும் இருப்பிடத்தை அணுக இயலும்."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"எனது ஆடியோ அமைப்புகளை மாற்றுதல்"</string>
- <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ஒலியளவு மற்றும் வெளியீட்டிற்கு ஸ்பீக்கர்கள் பயன்படுத்தப்படுவது போன்ற ஒட்டுமொத்த ஆடியோ அமைப்புகளைக் கட்டுப்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ஒலியளவு மற்றும் வெளியீட்டிற்கு ஸ்பீக்கர்கள் பயன்படுத்தப்படுவது போன்ற ஒட்டுமொத்த ஆடியோ அமைப்புகளைக் கட்டுப்படுத்தப் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ஆடியோவைப் பதிவுசெய்தல்"</string>
<string name="permdesc_recordAudio" msgid="4245930455135321433">"இந்த ஆப்ஸ் எப்போது வேண்டுமானாலும் மைக்ரோஃபோனைப் பயன்படுத்தி ஆடியோவை ரெக்கார்டு செய்யலாம்."</string>
<string name="permlab_sim_communication" msgid="2935852302216852065">"கட்டளைகளை சிம்மிற்கு அனுப்புதல்"</string>
- <string name="permdesc_sim_communication" msgid="5725159654279639498">"சிம் க்குக் கட்டளைகளை அனுப்ப பயன்பாட்டை அனுமதிக்கிறது. இது மிகவும் ஆபத்தானதாகும்."</string>
+ <string name="permdesc_sim_communication" msgid="5725159654279639498">"சிம் க்குக் கட்டளைகளை அனுப்ப ஆப்ஸை அனுமதிக்கிறது. இது மிகவும் ஆபத்தானதாகும்."</string>
<string name="permlab_activityRecognition" msgid="3634590230567608356">"உடல் செயல்பாட்டைக் கண்டறிதல்"</string>
<string name="permdesc_activityRecognition" msgid="3143453925156552894">"உங்கள் உடல் செயல்பாட்டை இந்த ஆப்ஸால் கண்டறிய முடியும்."</string>
<string name="permlab_camera" msgid="3616391919559751192">"படங்கள் மற்றும் வீடியோக்களை எடுத்தல்"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"இந்த ஆப்ஸ் எப்போது வேண்டுமானாலும் கேமராவைப் பயன்படுத்தி படங்களை எடுக்கலாம், வீடியோக்களை ரெக்கார்டு செய்யலாம்."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"அதிர்வைக் கட்டுப்படுத்துதல்"</string>
- <string name="permdesc_vibrate" msgid="6284989245902300945">"அதிர்வைக் கட்டுப்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"அதிர்வைக் கட்டுப்படுத்தப் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"தொலைபேசி எண்களை நேரடியாக அழைத்தல்"</string>
- <string name="permdesc_callPhone" msgid="3740797576113760827">"உங்கள் தலையீட்டின்றி மொபைல் எண்களை அழைக்கப் பயன்பாட்டை அனுமதிக்கிறது. இதன் விளைவாக எதிர்பாராத கட்டணங்களோ அழைப்புகளோ ஏற்படலாம். அவசரகால எண்களை அழைக்க இது பயன்பாட்டை அனுமதிக்காது என்பதை நினைவில்கொள்ளவும். தீங்கிழைக்கும் பயன்பாடுகள், உங்கள் உறுதிப்படுத்தல் இன்றி அழைப்புகளைச் செய்வதால் உங்களுக்குச் செலவு ஏற்படக்கூடும்."</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"உங்கள் தலையீட்டின்றி மொபைல் எண்களை அழைக்கப் ஆப்ஸை அனுமதிக்கிறது. இதன் விளைவாக எதிர்பாராத கட்டணங்களோ அழைப்புகளோ ஏற்படலாம். அவசரகால எண்களை அழைக்க இது ஆப்ஸை அனுமதிக்காது என்பதை நினைவில்கொள்ளவும். தீங்கிழைக்கும் பயன்பாடுகள், உங்கள் உறுதிப்படுத்தல் இன்றி அழைப்புகளைச் செய்வதால் உங்களுக்குச் செலவு ஏற்படக்கூடும்."</string>
<string name="permlab_accessImsCallService" msgid="3574943847181793918">"IMS அழைப்புச் சேவையை அணுகுதல்"</string>
- <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"உங்கள் குறுக்கீடின்றி IMS சேவையைப் பயன்படுத்தி அழைப்பதற்கு, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"உங்கள் குறுக்கீடின்றி IMS சேவையைப் பயன்படுத்தி அழைப்பதற்கு, ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"மொபைல் நிலை மற்றும் அடையாளத்தைப் படித்தல்"</string>
- <string name="permdesc_readPhoneState" msgid="1639212771826125528">"சாதனத்தின் மொபைல் அம்சங்களை அணுகப் பயன்பாட்டை அனுமதிக்கிறது. மொபைல் மற்றும் சாதன ஐடிகள், அழைப்பு செயலில் உள்ளதா மற்றும் அழைப்பு மூலம் இணைக்கப்பட்ட தொலைக் கட்டுப்பாட்டு எண் ஆகியவற்றைத் தீர்மானிக்க இந்த அனுமதி பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"சாதனத்தின் மொபைல் அம்சங்களை அணுகப் ஆப்ஸை அனுமதிக்கிறது. மொபைல் மற்றும் சாதன ஐடிகள், அழைப்பு செயலில் உள்ளதா மற்றும் அழைப்பு மூலம் இணைக்கப்பட்ட தொலைக் கட்டுப்பாட்டு எண் ஆகியவற்றைத் தீர்மானிக்க இந்த அனுமதி ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"சிஸ்டம் மூலம் அழைப்புகளை ரூட் செய்தல்"</string>
- <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"அழைக்கும் அனுபவத்தை மேம்படுத்தும் பொருட்டு, சிஸ்டம் மூலம் தனது அழைப்புகளை ரூட் செய்ய பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"அழைக்கும் அனுபவத்தை மேம்படுத்தும் பொருட்டு, சிஸ்டம் மூலம் தனது அழைப்புகளை ரூட் செய்ய ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_callCompanionApp" msgid="3599252979411970473">"சிஸ்டம் மூலமாக அழைப்புகளைப் பார்த்தலும் கட்டுப்படுத்துதலும்."</string>
<string name="permdesc_callCompanionApp" msgid="4567344683275099090">"செயலில் உள்ள அழைப்புகளைச் சாதனத்தில் பார்க்கவும் கட்டுப்படுத்தவும் ஆப்ஸை அனுமதிக்கிறது. அழைப்பு எண்கள் மற்றும் அழைப்புகளின் நிலை போன்ற தகவல்களும் இதில் அடங்கும்."</string>
<string name="permlab_acceptHandover" msgid="2661534649736022409">"மற்றொரு பயன்பாட்டிலிருந்து அழைப்பைத் தொடருதல்"</string>
- <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"மற்றொரு பயன்பாட்டில் தொடங்கப்பட்ட அழைப்பைத் தொடருவதற்கு, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"மற்றொரு பயன்பாட்டில் தொடங்கப்பட்ட அழைப்பைத் தொடருவதற்கு, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ஃபோன் எண்களைப் படித்தல்"</string>
- <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"சாதனத்தின் ஃபோன் எண்களை அணுக, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"சாதனத்தின் ஃபோன் எண்களை அணுக, ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"டேப்லெட் உறக்க நிலைக்குச் செல்வதைத் தடுத்தல்"</string>
<string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"டிவி உறக்கநிலைக்குச் செல்வதைத் தடுத்தல்"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"தொலைபேசி உறக்கநிலைக்குச் செல்வதைத் தடுத்தல்"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"உறக்கநிலைக்குச் செல்லாமல் டேப்லெட்டைத் தடுக்க பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_wakeLock" product="tv" msgid="3208534859208996974">"டிவி உறக்க நிலைக்குச் செல்வதைத் தடுக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"உறக்கநிலைக்குச் செல்லாமல் மொபைலைத் தடுக்க பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"உறக்கநிலைக்குச் செல்லாமல் டேப்லெட்டைத் தடுக்க ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_wakeLock" product="tv" msgid="3208534859208996974">"டிவி உறக்க நிலைக்குச் செல்வதைத் தடுக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"உறக்கநிலைக்குச் செல்லாமல் மொபைலைத் தடுக்க ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"டிரான்ஸ்மிட் அகச்சிவப்பு"</string>
- <string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"டேப்லெட்டின் அகச்சிவப்பு டிரான்ஸ்மிட்டரைப் பயன்படுத்த, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_transmitIr" product="tv" msgid="3926790828514867101">"டிவியின் அகச்சிவப்பு டிரான்ஸ்மிட்டரைப் பயன்படுத்த, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"தொலைபேசியின் அகச்சிவப்பு டிரான்ஸ்மிட்டரைப் பயன்படுத்த, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"டேப்லெட்டின் அகச்சிவப்பு டிரான்ஸ்மிட்டரைப் பயன்படுத்த, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_transmitIr" product="tv" msgid="3926790828514867101">"டிவியின் அகச்சிவப்பு டிரான்ஸ்மிட்டரைப் பயன்படுத்த, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"தொலைபேசியின் அகச்சிவப்பு டிரான்ஸ்மிட்டரைப் பயன்படுத்த, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"வால்பேப்பரை அமைத்தல்"</string>
- <string name="permdesc_setWallpaper" msgid="7373447920977624745">"முறைமை வால்பேப்பரை அமைக்க பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"முறைமை வால்பேப்பரை அமைக்க ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_setWallpaperHints" msgid="3278608165977736538">"உங்கள் வால்பேப்பர் அளவைத் திருத்துதல்"</string>
- <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"முறைமை வால்பேப்பர் அளவுக் குறிப்புகளை அமைக்க பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"முறைமை வால்பேப்பர் அளவுக் குறிப்புகளை அமைக்க ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"நேர மண்டலத்தை அமைத்தல்"</string>
- <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"டேப்லெட்டின் நேர மண்டலத்தை மாற்ற, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_setTimeZone" product="tv" msgid="888864653946175955">"டிவியின் நேர மண்டலத்தை மாற்ற, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"மொபைலின் நேர மண்டலத்தை மாற்ற, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"டேப்லெட்டின் நேர மண்டலத்தை மாற்ற, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_setTimeZone" product="tv" msgid="888864653946175955">"டிவியின் நேர மண்டலத்தை மாற்ற, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"மொபைலின் நேர மண்டலத்தை மாற்ற, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"சாதனத்தில் கணக்குகளைக் கண்டறிதல்"</string>
- <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"டேப்லெட் மூலம் அறியப்பட்ட கணக்குகளின் பட்டியலைப் பெற பயன்பாட்டை அனுமதிக்கிறது. நீங்கள் நிறுவிய பயன்பாடுகள் மூலம் உருவாக்கப்பட்ட எல்லா கணக்குகளும் இதில் உள்ளடங்கலாம்."</string>
- <string name="permdesc_getAccounts" product="tv" msgid="4190633395633907543">"டிவி அறிந்த கணக்குகளின் பட்டியலைப் பெற, பயன்பாட்டை அனுமதிக்கிறது. இதில் நிறுவிய பயன்பாடுகளினால் உருவாக்கப்பட்ட எல்லா கணக்குகளும் அடங்கலாம்."</string>
- <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"மொபைல் மூலம் அறியப்பட்ட கணக்குகளின் பட்டியலைப் பெற பயன்பாட்டை அனுமதிக்கிறது. நீங்கள் நிறுவிய பயன்பாடுகள் மூலம் உருவாக்கப்பட்ட எல்லா கணக்குகளும் இதில் உள்ளடங்கலாம்."</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"டேப்லெட் மூலம் அறியப்பட்ட கணக்குகளின் பட்டியலைப் பெற ஆப்ஸை அனுமதிக்கிறது. நீங்கள் நிறுவிய பயன்பாடுகள் மூலம் உருவாக்கப்பட்ட எல்லா கணக்குகளும் இதில் உள்ளடங்கலாம்."</string>
+ <string name="permdesc_getAccounts" product="tv" msgid="4190633395633907543">"டிவி அறிந்த கணக்குகளின் பட்டியலைப் பெற, ஆப்ஸை அனுமதிக்கிறது. இதில் நிறுவிய பயன்பாடுகளினால் உருவாக்கப்பட்ட எல்லா கணக்குகளும் அடங்கலாம்."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"மொபைல் மூலம் அறியப்பட்ட கணக்குகளின் பட்டியலைப் பெற ஆப்ஸை அனுமதிக்கிறது. நீங்கள் நிறுவிய பயன்பாடுகள் மூலம் உருவாக்கப்பட்ட எல்லா கணக்குகளும் இதில் உள்ளடங்கலாம்."</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"நெட்வொர்க் இணைப்புகளைக் காட்டு"</string>
- <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"தற்போது இருக்கும் நெட்வொர்க்குகள் எவை மற்றும் இணைக்கப்பட்டுள்ளவை எவை போன்ற நெட்வொர்க் இணைப்புகள் குறித்த தகவலைப் பார்க்கப் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"தற்போது இருக்கும் நெட்வொர்க்குகள் எவை மற்றும் இணைக்கப்பட்டுள்ளவை எவை போன்ற நெட்வொர்க் இணைப்புகள் குறித்த தகவலைப் பார்க்கப் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_createNetworkSockets" msgid="7934516631384168107">"முழுமையான நெட்வொர்க் அணுகலைக் கொண்டிருக்கும்"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"நெட்வொர்க் சாக்கெட்டுகளை உருவாக்கவும் மற்றும் தனிப்பயன் நெட்வொர்க் நெறிமுறைகளைப் பயன்படுத்தவும் பயன்பாட்டை அனுமதிக்கிறது. இணையத்தில் தரவை அனுப்ப உலாவியும், பிற பயன்பாடுகளும் இருப்பதால், இணையத்திற்குத் தரவை அனுப்ப இந்த அனுமதி தேவையில்லை."</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"நெட்வொர்க் சாக்கெட்டுகளை உருவாக்கவும் மற்றும் தனிப்பயன் நெட்வொர்க் நெறிமுறைகளைப் பயன்படுத்தவும் ஆப்ஸை அனுமதிக்கிறது. இணையத்தில் தரவை அனுப்ப உலாவியும், பிற பயன்பாடுகளும் இருப்பதால், இணையத்திற்குத் தரவை அனுப்ப இந்த அனுமதி தேவையில்லை."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"பிணைய இணைப்புத்தன்மையை மாற்றுதல்"</string>
- <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"நெட்வொர்க் இணைப்பின் நிலையை மாற்ற, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"நெட்வொர்க் இணைப்பின் நிலையை மாற்ற, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"இணைக்கப்பட்ட இணைப்புநிலையை மாற்றுதல்"</string>
- <string name="permdesc_changeTetherState" msgid="1524441344412319780">"இணைக்கப்பட்ட நெட்வொர்க் இணைப்பின் நிலையை மாற்ற, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"இணைக்கப்பட்ட நெட்வொர்க் இணைப்பின் நிலையை மாற்ற, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_accessWifiState" msgid="5202012949247040011">"வைஃபை இணைப்புகளைக் காட்டு"</string>
- <string name="permdesc_accessWifiState" msgid="5002798077387803726">"வைஃபை இயக்கப்பட்டுள்ளதா என்பதையும், இணைக்கப்பட்ட வைஃபை சாதனங்களின் பெயர் போன்ற வைஃபை நெட்வொர்க் குறித்த தகவலைப் பார்க்கவும் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"வைஃபை இயக்கப்பட்டுள்ளதா என்பதையும், இணைக்கப்பட்ட வைஃபை சாதனங்களின் பெயர் போன்ற வைஃபை நெட்வொர்க் குறித்த தகவலைப் பார்க்கவும் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"வைஃபை உடன் இணைக்கவும் மற்றும் அதனுடனான தொடர்பைத் துண்டித்தல்"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"வைஃபை ஆக்சஸ் பாயிண்ட்களில் இணைக்கவும், அவற்றிலிருந்து துண்டிக்கவும் மற்றும் வைஃபை நெட்வொர்க்குகளுக்கான சாதன உள்ளமைவில் மாற்றங்களைச் செய்யவும் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"வைஃபை ஆக்சஸ் பாயிண்ட்களில் இணைக்கவும், அவற்றிலிருந்து துண்டிக்கவும் மற்றும் வைஃபை நெட்வொர்க்குகளுக்கான சாதன உள்ளமைவில் மாற்றங்களைச் செய்யவும் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"வைஃபை பலமுகவரி பெறுதலை இயக்குதல்"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"உங்கள் டேப்லெட் மட்டுமல்லாமல், பலமுகவரி பயன்முறையின் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் எல்லா சாதனங்களுக்கும் அனுப்பிய தொகுப்பைப் பெற பயன்பாட்டை அனுமதிக்கிறது. பலமுகவரியற்ற பயன்முறையை விட இது அதிகமான சக்தியைப் பயன்படுத்துகிறது."</string>
- <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"உங்கள் டிவிக்கு மட்டுமல்லாமல், மல்டிகாஸ்ட் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் உள்ள எல்லா சாதனங்களுக்கும் அனுப்பப்பட்ட தொகுப்புகளைப் பெற, பயன்பாட்டை அனுமதிக்கிறது. இது மல்டிகாஸ்ட் அல்லாத பயன்முறைக்கான ஆற்றலை விட அதிகமாக பயன்படுத்துகிறது."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"உங்கள் மொபைல் மட்டுமல்லாமல், பலமுகவரி பயன்முறையின் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் எல்லா சாதனங்களுக்கும் அனுப்பிய தொகுப்பைப் பெற பயன்பாட்டை அனுமதிக்கிறது. பலமுகவரியற்ற பயன்முறையை விட இது அதிகமான சக்தியைப் பயன்படுத்துகிறது."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"உங்கள் டேப்லெட் மட்டுமல்லாமல், பலமுகவரி பயன்முறையின் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் எல்லா சாதனங்களுக்கும் அனுப்பிய தொகுப்பைப் பெற ஆப்ஸை அனுமதிக்கிறது. பலமுகவரியற்ற பயன்முறையை விட இது அதிகமான சக்தியைப் பயன்படுத்துகிறது."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"உங்கள் டிவிக்கு மட்டுமல்லாமல், மல்டிகாஸ்ட் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் உள்ள எல்லா சாதனங்களுக்கும் அனுப்பப்பட்ட தொகுப்புகளைப் பெற, ஆப்ஸை அனுமதிக்கிறது. இது மல்டிகாஸ்ட் அல்லாத பயன்முறைக்கான ஆற்றலை விட அதிகமாக பயன்படுத்துகிறது."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"உங்கள் மொபைல் மட்டுமல்லாமல், பலமுகவரி பயன்முறையின் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் எல்லா சாதனங்களுக்கும் அனுப்பிய தொகுப்பைப் பெற ஆப்ஸை அனுமதிக்கிறது. பலமுகவரியற்ற பயன்முறையை விட இது அதிகமான சக்தியைப் பயன்படுத்துகிறது."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"புளூடூத் அமைப்புகளை அணுகுதல்"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"டேப்லெட்டில் அக புளூடூத் ஐ உள்ளமைக்க, தொலைநிலை சாதனங்களைக் கண்டறிந்து இணைக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"அக புளூடூத் டிவியை உள்ளமைக்க மற்றும் தொலைநிலை சாதனங்களைக் கண்டறிந்து இணைக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"மொபைலில் அக புளூடூத் ஐ உள்ளமைக்க, தொலைநிலை சாதனங்களைக் கண்டறிந்து இணைக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"டேப்லெட்டில் அக புளூடூத் ஐ உள்ளமைக்க, தொலைநிலை சாதனங்களைக் கண்டறிந்து இணைக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"அக புளூடூத் டிவியை உள்ளமைக்க மற்றும் தொலைநிலை சாதனங்களைக் கண்டறிந்து இணைக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"மொபைலில் அக புளூடூத் ஐ உள்ளமைக்க, தொலைநிலை சாதனங்களைக் கண்டறிந்து இணைக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX உடன் இணை மற்றும் அதனுடனான தொடர்பைத் துண்டி"</string>
- <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"WiMAX இணைக்கப்பட்டுள்ளதா என்பதையும், இணைக்கப்பட்டுள்ள WiMAX நெட்வொர்க்குகள் ஏதேனும் குறித்த தகவலைத் தீர்மானிக்கவும் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"WiMAX இணைக்கப்பட்டுள்ளதா என்பதையும், இணைக்கப்பட்டுள்ள WiMAX நெட்வொர்க்குகள் ஏதேனும் குறித்த தகவலைத் தீர்மானிக்கவும் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_changeWimaxState" msgid="340465839241528618">"WiMAX நிலையை மாற்றுதல்"</string>
- <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"WiMAX நெட்வொர்க்குகளில் டேப்லெட்டை இணைக்கவும், அவற்றிலிருந்து துண்டிக்கவும் பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_changeWimaxState" product="tv" msgid="6022307083934827718">"டிவியுடன் இணைக்க மற்றும் WiMAX நெட்வொர்க்குகளிலிருந்து டிவியைத் துண்டிக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"WiMAX நெட்வொர்க்குகளில் மொபைலை இணைக்கவும், அவற்றிலிருந்து துண்டிக்கவும் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"WiMAX நெட்வொர்க்குகளில் டேப்லெட்டை இணைக்கவும், அவற்றிலிருந்து துண்டிக்கவும் ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_changeWimaxState" product="tv" msgid="6022307083934827718">"டிவியுடன் இணைக்க மற்றும் WiMAX நெட்வொர்க்குகளிலிருந்து டிவியைத் துண்டிக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"WiMAX நெட்வொர்க்குகளில் மொபைலை இணைக்கவும், அவற்றிலிருந்து துண்டிக்கவும் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_bluetooth" msgid="6127769336339276828">"புளூடூத் சாதனங்களுடன் இணைத்தல்"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"டேப்லெட்டில் புளூடூத் இன் உள்ளமைவைப் பார்க்க மற்றும் இணைந்த சாதனங்களுடன் இணைப்புகளை ஏற்படுத்த மற்றும் ஏற்க பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"டிவியில் உள்ள புளூடூத்தின் உள்ளமைவைப் பார்க்க மற்றும் இணைக்கப்பட்ட சாதனங்களுடன் இணைப்பை உருவாக்க, ஏற்றுக்கொள்ள பயன்பாட்டை அனுமதிக்கிறது."</string>
- <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"மொபைலில் புளூடூத் இன் உள்ளமைவைப் பார்க்க மற்றும் இணைந்த சாதனங்களுடன் இணைப்புகளை ஏற்படுத்த மற்றும் ஏற்க பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"டேப்லெட்டில் புளூடூத் இன் உள்ளமைவைப் பார்க்க மற்றும் இணைந்த சாதனங்களுடன் இணைப்புகளை ஏற்படுத்த மற்றும் ஏற்க ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"டிவியில் உள்ள புளூடூத்தின் உள்ளமைவைப் பார்க்க மற்றும் இணைக்கப்பட்ட சாதனங்களுடன் இணைப்பை உருவாக்க, ஏற்றுக்கொள்ள ஆப்ஸை அனுமதிக்கிறது."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"மொபைலில் புளூடூத் இன் உள்ளமைவைப் பார்க்க மற்றும் இணைந்த சாதனங்களுடன் இணைப்புகளை ஏற்படுத்த மற்றும் ஏற்க ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"குறுகிய இடைவெளி தகவல்பரிமாற்றத்தைக் கட்டுப்படுத்துதல்"</string>
- <string name="permdesc_nfc" msgid="7120611819401789907">"குறுகிய இடைவெளி தகவல்பரிமாற்றம் (NFC), குறிகள், கார்டுகள் மற்றும் ரீடர்கள் ஆகியவற்றுடன் தொடர்புகொள்ள, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"குறுகிய இடைவெளி தகவல்பரிமாற்றம் (NFC), குறிகள், கார்டுகள் மற்றும் ரீடர்கள் ஆகியவற்றுடன் தொடர்புகொள்ள, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"உங்கள் திரைப் பூட்டை முடக்குதல்"</string>
- <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"விசைப்பூட்டையும், தொடர்புடைய கடவுச்சொல் பாதுகாப்பையும் முடக்கப் பயன்பாட்டை அனுமதிக்கிறது. எடுத்துக்காட்டாக, உள்வரும் மொபைல் அழைப்பைப் பெறும்போது மொபைல் விசைப்பூட்டை முடக்குகிறது, பிறகு அழைப்பு முடிந்தவுடன் விசைப்பூட்டை மீண்டும் இயக்குகிறது."</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"விசைப்பூட்டையும், தொடர்புடைய கடவுச்சொல் பாதுகாப்பையும் முடக்கப் ஆப்ஸை அனுமதிக்கிறது. எடுத்துக்காட்டாக, உள்வரும் மொபைல் அழைப்பைப் பெறும்போது மொபைல் விசைப்பூட்டை முடக்குகிறது, பிறகு அழைப்பு முடிந்தவுடன் விசைப்பூட்டை மீண்டும் இயக்குகிறது."</string>
<string name="permlab_requestPasswordComplexity" msgid="202650535669249674">"திரைப் பூட்டு தொடர்பான சிக்கலைத் தீர்க்க அனுமதி கோருதல்"</string>
<string name="permdesc_requestPasswordComplexity" msgid="4730994229754212347">"திரைப் பூட்டு தொடர்பான சிக்கலின் தன்மையை (அதிகம், நடுத்தரம், குறைவு அல்லது ஏதுமில்லை) அறிந்துகொள்ள ஆப்ஸை அனுமதிக்கிறது. இதன் மூலம் திரைப் பூட்டின் அளவு வரம்பையும் வகையையும் தெரிந்துகொள்ளலாம். மேலும் திரைப் பூட்டைக் குறிப்பிட்ட நிலைக்கு மாற்றிக் கொள்ளலாம் என்பதையும் பயனர்களுக்கு ஆப்ஸ் பரிந்துரைக்க முடியும். ஆனால் தங்கள் விருப்பப்படி அவற்றைப் பயனர்கள் நிராகரிக்கவோ ஏற்கவோ இயலும். கவனத்திற்கு: திரைப் பூட்டு எளிய உரையிலானதாக சேமிக்கப்படுவதில்லை என்பதால் சரியான கடவுச்சொல்லை ஆப்ஸால் அறிய இயலாது."</string>
<string name="permlab_useBiometric" msgid="8837753668509919318">"பயோமெட்ரிக் வன்பொருளைப் பயன்படுத்து"</string>
- <string name="permdesc_useBiometric" msgid="8389855232721612926">"பயோமெட்ரிக் வன்பொருளைப் பயன்படுத்தி அங்கீகரிப்பதற்கு, பயன்பாட்டை அனுமதிக்கும்"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"பயோமெட்ரிக் வன்பொருளைப் பயன்படுத்தி அங்கீகரிப்பதற்கு, ஆப்ஸை அனுமதிக்கும்"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"கைரேகை வன்பொருளை நிர்வகி"</string>
- <string name="permdesc_manageFingerprint" msgid="178208705828055464">"பயன்படுத்துவதற்காக, கைரேகை டெம்ப்ளேட்களைச் சேர்க்க மற்றும் நீக்குவதற்கான செயல்முறைகளை இயக்குவதற்குப் பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_manageFingerprint" msgid="178208705828055464">"பயன்படுத்துவதற்காக, கைரேகை டெம்ப்ளேட்களைச் சேர்க்க மற்றும் நீக்குவதற்கான செயல்முறைகளை இயக்குவதற்குப் ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"கைரேகை வன்பொருளைப் பயன்படுத்து"</string>
- <string name="permdesc_useFingerprint" msgid="9165097460730684114">"அங்கீகரிப்பதற்கு, கைரேகை வன்பொருளைப் பயன்படுத்த, பயன்பாட்டை அனுமதிக்கும்"</string>
+ <string name="permdesc_useFingerprint" msgid="9165097460730684114">"அங்கீகரிப்பதற்கு, கைரேகை வன்பொருளைப் பயன்படுத்த, ஆப்ஸை அனுமதிக்கும்"</string>
<string name="permlab_audioWrite" msgid="2661772059799779292">"இசைத் தொகுப்பை மாற்றுதல்"</string>
<string name="permdesc_audioWrite" msgid="8888544708166230494">"உங்களின் இசைத் தொகுப்பை மாற்ற ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_videoWrite" msgid="128769316366746446">"வீடியோ தொகுப்பை மாற்றுதல்"</string>
@@ -596,61 +596,61 @@
</string-array>
<string name="face_icon_content_description" msgid="4024817159806482191">"முக ஐகான்"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ஒத்திசைவு அமைப்புகளைப் படித்தல்"</string>
- <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"கணக்கிற்கான ஒத்திசைவு அமைப்புகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது. எடுத்துக்காட்டாக, பீப்பிள் பயன்பாடு கணக்குடன் ஒத்திசைக்கப்பட்டுள்ளதா என்பதை இது தீர்மானிக்கலாம்."</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"கணக்கிற்கான ஒத்திசைவு அமைப்புகளைப் படிக்க ஆப்ஸை அனுமதிக்கிறது. எடுத்துக்காட்டாக, பீப்பிள் ஆப்ஸ் கணக்குடன் ஒத்திசைக்கப்பட்டுள்ளதா என்பதை இது தீர்மானிக்கலாம்."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ஒத்திசைவை இயக்குவதையும், முடக்குவதையும் மாற்றுதல்"</string>
- <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"கணக்கிற்கான ஒத்திசைவு அமைப்புகளைத் திருத்த பயன்பாட்டை அனுமதிக்கிறது. எடுத்துக்காட்டாக, பீப்பிள் பயன்பாட்டைக் கணக்குடன் ஒத்திசைவை இயக்குவதற்கு இது பயன்படுத்தப்படலாம்."</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"கணக்கிற்கான ஒத்திசைவு அமைப்புகளைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. எடுத்துக்காட்டாக, பீப்பிள் ஆப்ஸைக் கணக்குடன் ஒத்திசைவை இயக்குவதற்கு இது பயன்படுத்தப்படலாம்."</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"ஒத்திசைவு புள்ளிவிவரங்களைப் படித்தல்"</string>
- <string name="permdesc_readSyncStats" msgid="1510143761757606156">"நிகழ்வுகள் ஒத்திசைவின் வரலாறு மற்றும் ஒத்திசைக்கப்பட்ட தரவு எவ்வளவு ஆகியன உட்பட, கணக்கிற்கான ஒத்திசைவு புள்ளிவிவரங்களைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"நிகழ்வுகள் ஒத்திசைவின் வரலாறு மற்றும் ஒத்திசைக்கப்பட்ட தரவு எவ்வளவு ஆகியன உட்பட, கணக்கிற்கான ஒத்திசைவு புள்ளிவிவரங்களைப் படிக்க ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_sdcardRead" msgid="1438933556581438863">"பகிர்ந்த சேமிப்பகத்தின் உள்ளடக்கங்களைப் பார்த்தல்"</string>
<string name="permdesc_sdcardRead" msgid="1804941689051236391">"பகிர்ந்த சேமிப்பகத்தின் உள்ளடக்கங்களைப் பார்க்க ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_sdcardWrite" msgid="9220937740184960897">"பகிர்ந்த சேமிப்பகத்தின் உள்ளடக்கங்களை மாற்றும் அல்லது நீக்கும்"</string>
<string name="permdesc_sdcardWrite" msgid="2834431057338203959">"பகிர்ந்த சேமிப்பகத்தின் உள்ளடக்கத்தில் மாற்றங்களைச் செய்ய அனுமதிக்கும்."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP அழைப்புகளைச் செய்தல்/பெறுதல்"</string>
- <string name="permdesc_use_sip" msgid="2297804849860225257">"SIP அழைப்புகளைச் செய்ய/பெற, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_use_sip" msgid="2297804849860225257">"SIP அழைப்புகளைச் செய்ய/பெற, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_register_sim_subscription" msgid="3166535485877549177">"புதிய நிறுவன சிம் இணைப்புகளைப் பதிவுசெய்தல்"</string>
- <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"புதிய நிறுவன சிம் இணைப்புகளைப் பதிவுசெய்ய, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"புதிய நிறுவன சிம் இணைப்புகளைப் பதிவுசெய்ய, ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_register_call_provider" msgid="108102120289029841">"புதிய நிறுவன இணைப்புகளைப் பதிவுசெய்தல்"</string>
- <string name="permdesc_register_call_provider" msgid="7034310263521081388">"புதிய தொலைத்தொடர்பு இணைப்புகளைப் பதிவுசெய்ய, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"புதிய தொலைத்தொடர்பு இணைப்புகளைப் பதிவுசெய்ய, ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"தொலைத்தொடர்பு இணைப்புகளை நிர்வகி"</string>
- <string name="permdesc_connection_manager" msgid="5925480810356483565">"தொலைத்தொடர்பு இணைப்புகளை நிர்வகிக்க, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"தொலைத்தொடர்பு இணைப்புகளை நிர்வகிக்க, ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"உள்வரும் அழைப்பிற்கான திரையுடன் ஊடாடுதல்"</string>
- <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"உள்வரும் அழைப்பிற்கான திரையைப் பயனர் எப்போது மற்றும் எப்படிக் காணவேண்டும் என்பதைக் கட்டுப்படுத்துவதற்குப் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"உள்வரும் அழைப்பிற்கான திரையைப் பயனர் எப்போது மற்றும் எப்படிக் காணவேண்டும் என்பதைக் கட்டுப்படுத்துவதற்குப் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_bind_connection_service" msgid="3557341439297014940">"டெலிஃபோனி சேவைகளுடனான ஊடாடல்"</string>
- <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"அழைப்புகளைச் செய்ய/பெற, டெலிஃபோனி சேவைகளுடன் ஊடாட பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"அழைப்புகளைச் செய்ய/பெற, டெலிஃபோனி சேவைகளுடன் ஊடாட ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_control_incall_experience" msgid="9061024437607777619">"அழைப்பின் பயனர் அனுபவத்தை வழங்குதல்"</string>
- <string name="permdesc_control_incall_experience" msgid="915159066039828124">"அழைப்பின் பயனர் அனுபவத்தை வழங்க பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"அழைப்பின் பயனர் அனுபவத்தை வழங்க ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"பிணைய பயன்பாட்டு வரலாற்றைப் படித்தல்"</string>
- <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"குறிப்பிட்ட நெட்வொர்க்குகள் மற்றும் பயன்பாடுகளுக்கான நெட்வொர்க் பயன்பாட்டின் வரலாற்றைப் படிக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"குறிப்பிட்ட நெட்வொர்க்குகள் மற்றும் பயன்பாடுகளுக்கான நெட்வொர்க் பயன்பாட்டின் வரலாற்றைப் படிக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"பிணைய கொள்கையை நிர்வகித்தல்"</string>
- <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"நெட்வொர்க் கொள்கைகளை நிர்வகிக்க மற்றும் பயன்பாடு சார்ந்த விதிகளை வரையறுக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"நெட்வொர்க் கொள்கைகளை நிர்வகிக்க மற்றும் ஆப்ஸ் சார்ந்த விதிகளை வரையறுக்க, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"பிணைய பயன்பாட்டு கணக்கிடுதலை மாற்றுதல்"</string>
- <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"பயன்பாடுகளுக்கு எதிராக நெட்வொர்க் பயன்பாடு எவ்வாறு கணக்கிடப்படுகிறது என்பதை மாற்ற பயன்பாட்டை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளால் பயன்படுத்தப்படுவதற்காக அல்ல."</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ஆப்ஸ்களுக்கு எதிராக நெட்வொர்க் ஆப்ஸ் எவ்வாறு கணக்கிடப்படுகிறது என்பதை மாற்ற ஆப்ஸை அனுமதிக்கிறது. இயல்பான ஆப்ஸ்களால் பயன்படுத்தப்படுவதற்காக அல்ல."</string>
<string name="permlab_accessNotifications" msgid="7673416487873432268">"அறிவிப்புகளின் அணுகல்"</string>
- <string name="permdesc_accessNotifications" msgid="458457742683431387">"பிற பயன்பாடுகளால் இடுகையிடப்பட்ட அறிவிப்புகள் உள்பட எல்லா அறிவிப்புகளையும் பெற, பார்க்க மற்றும் அழிக்கப் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"பிற பயன்பாடுகளால் இடுகையிடப்பட்ட அறிவிப்புகள் உள்பட எல்லா அறிவிப்புகளையும் பெற, பார்க்க மற்றும் அழிக்கப் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"அறிவிப்புகளைக் கண்காணிக்கும் சேவையுடன் இணைத்தல்"</string>
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"அறிவிப்புகளைக் கண்காணிக்கும் சேவையின் உயர் நிலை இடைமுகத்துடன் இணைப்பதற்கு ஹோல்டரை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"நிபந்தனை வழங்குநர் சேவையுடன் இணைத்தல்"</string>
<string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"நிபந்தனை வழங்குநர் சேவையின் உயர் நிலை இடைமுகத்துடன் இணைப்பதற்கு ஹோல்டரை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
<string name="permlab_bindDreamService" msgid="4153646965978563462">"டிரீம் சேவையுடன் இணை"</string>
<string name="permdesc_bindDreamService" msgid="7325825272223347863">"டிரீம் சேவையின் உயர் நிலை இடைமுகத்துடன் இணைப்பதற்கு ஹோல்டரை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
- <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"மொபைல் நிறுவனம் வழங்கிய உள்ளமைவு பயன்பாட்டை செயலாக்குதல்"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"மொபைல் நிறுவனம் வழங்கிய உள்ளமைவு ஆப்ஸை செயலாக்குதல்"</string>
<string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"மொபைல் நிறுவனம் வழங்கிய உள்ளமைவு பயன்பாட்டைச் செயல்படுத்த ஹோல்டரை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"பிணைய நிலைகள் பற்றிய அறிவிப்புகளைக் கவனித்தல்"</string>
- <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"பிணைய நிலைகள் பற்றிய அறிவிப்புகளைக் கவனிக்க பயன்பாட்டை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"பிணைய நிலைகள் பற்றிய அறிவிப்புகளைக் கவனிக்க ஆப்ஸை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
<string name="permlab_setInputCalibration" msgid="4902620118878467615">"உள்ளீட்டுச் சாதனத்தின் அளவுத்திருத்தத்தை மாற்றுதல்"</string>
- <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"தொடுதல் திரையின் அளவு திருத்த அளபுருக்களை மாற்ற, பயன்பாட்டை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்குத் தேவைப்படாது."</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"தொடுதல் திரையின் அளவு திருத்த அளபுருக்களை மாற்ற, ஆப்ஸை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்குத் தேவைப்படாது."</string>
<string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM சான்றிதழ்களை அணுகுதல்"</string>
- <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM சான்றிதழ்களை வழங்க மற்றும் பயன்படுத்த, பயன்பாட்டை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்கு எப்போதும் தேவைப்படாது."</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM சான்றிதழ்களை வழங்க மற்றும் பயன்படுத்த, ஆப்ஸை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்கு எப்போதும் தேவைப்படாது."</string>
<string name="permlab_handoverStatus" msgid="7820353257219300883">"Android பீம் பரிமாற்ற நிலையைப் பெறுதல்"</string>
- <string name="permdesc_handoverStatus" msgid="4788144087245714948">"நடப்பு Android பீம் பரிமாற்றங்கள் குறித்த தகவலைப் பெற, பயன்பாட்டை அனுமதிக்கிறது"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"நடப்பு Android பீம் பரிமாற்றங்கள் குறித்த தகவலைப் பெற, ஆப்ஸை அனுமதிக்கிறது"</string>
<string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM சான்றிதழ்களை அகற்று"</string>
- <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM சான்றிதழ்களை அகற்ற, பயன்பாட்டை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM சான்றிதழ்களை அகற்ற, ஆப்ஸை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
<string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"மொபைல் நிறுவனச் செய்தியிடல் சேவையுடன் இணைத்தல்"</string>
<string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"மொபைல் நிறுவனச் செய்தியிடல் சேவையின் உயர்-நிலை இடைமுகத்துடன் ஹோல்டரை இணைக்க அனுமதிக்கும். இயல்பான பயன்பாடுகளுக்குத் தேவைப்படாது."</string>
<string name="permlab_bindCarrierServices" msgid="3233108656245526783">"மொபைல் நிறுவன சேவைகளுடன் இணைத்தல்"</string>
<string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"மொபைல் நிறுவன சேவைகளுடன் இணைக்க, ஹோல்டரை அனுமதிக்கும். சாதாரணப் பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
<string name="permlab_access_notification_policy" msgid="4247510821662059671">"தொந்தரவு செய்ய வேண்டாம் அம்சத்தை அணுகுதல்"</string>
- <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"தொந்தரவு செய்ய வேண்டாம் உள்ளமைவைப் படிக்கவும் எழுதவும், பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"தொந்தரவு செய்ய வேண்டாம் உள்ளமைவைப் படிக்கவும் எழுதவும், ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"கடவுச்சொல் விதிகளை அமைக்கவும்"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"திரைப் பூட்டின் கடவுச்சொற்கள் மற்றும் பின்களில் அனுமதிக்கப்படும் நீளத்தையும் எழுத்துக்குறிகளையும் கட்டுப்படுத்தும்."</string>
<string name="policylab_watchLogin" msgid="5091404125971980158">"திரையைத் திறப்பதற்கான முயற்சிகளைக் கண்காணி"</string>
@@ -795,7 +795,7 @@
<string name="sipAddressTypeHome" msgid="6093598181069359295">"வீடு"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"அலுவலகம்"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"மற்றவை"</string>
- <string name="quick_contacts_not_available" msgid="746098007828579688">"இதைப் பார்ப்பதற்குகந்த பயன்பாடு எதுவும் நிறுவப்படவில்லை."</string>
+ <string name="quick_contacts_not_available" msgid="746098007828579688">"இதைப் பார்ப்பதற்குகந்த ஆப்ஸ் எதுவும் நிறுவப்படவில்லை."</string>
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"பின் குறியீட்டை உள்ளிடவும்"</string>
<string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK மற்றும் புதிய பின் குறியீட்டை உள்ளிடவும்"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK குறியீடு"</string>
@@ -933,17 +933,17 @@
<string name="autofill_area" msgid="3547409050889952423">"பகுதி"</string>
<string name="autofill_emirate" msgid="2893880978835698818">"எமிரேட்"</string>
<string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"உங்கள் இணையப் புத்தக்கக்குறிகள் மற்றும் வரலாற்றைப் படித்தல்"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"உலாவி மூலம் பார்வையிட்ட எல்லா URLகளின் வரலாற்றையும், உலாவியில் குறிக்கப்பட்ட எல்லா புத்தகக்குறிகளையும் படிக்கப் பயன்பாட்டை அனுமதிக்கிறது. குறிப்பு: மூன்றாம் தரப்பு உலாவிகள் அல்லது இணைய உலாவல் திறன்களுடன் கூடிய பிற பயன்பாடுகளால் இந்த அனுமதி செயற்படுத்தப்படாமல் போகலாம்."</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"உலாவி மூலம் பார்வையிட்ட எல்லா URLகளின் வரலாற்றையும், உலாவியில் குறிக்கப்பட்ட எல்லா புத்தகக்குறிகளையும் படிக்கப் ஆப்ஸை அனுமதிக்கிறது. குறிப்பு: மூன்றாம் தரப்பு உலாவிகள் அல்லது இணைய உலாவல் திறன்களுடன் கூடிய பிற பயன்பாடுகளால் இந்த அனுமதி செயற்படுத்தப்படாமல் போகலாம்."</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"இணையப் புத்தகக்குறிகளையும், வரலாற்றையும் எழுதுதல்"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த பயன்பாட்டை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்கவோ, திருத்தவோ பயன்பாட்டை அனுமதிக்கலாம். குறிப்பு: இணைய உலாவல் செயல்திறன்கள் மூலம் மூன்றாம் தரப்பு உலாவிகள் அல்லது பிற பயன்பாடுகள் இந்த அனுமதியைச் செயற்படுத்த முடியாது."</string>
- <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"டிவியில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த, பயன்பாட்டை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்க அல்லது திருத்த பயன்பாட்டை அனுமதிக்கலாம். குறிப்பு: இந்த அனுமதி, மூன்றாம் தரப்பு உலாவிகள் அல்லது இணைய உலாவல் திறன்களுடன் கூடிய பிற பயன்பாடுகள் போன்றவற்றில் செயல்படாமல் போகலாம்."</string>
- <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"உங்கள் மொபைலில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த பயன்பாட்டை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்கவோ, திருத்தவோ பயன்பாட்டை அனுமதிக்கலாம். குறிப்பு: இணைய உலாவல் செயல்திறன்கள் மூலம் மூன்றாம் தரப்பு உலாவிகள் அல்லது பிற பயன்பாடுகள் இந்த அனுமதியைச் செயற்படுத்த முடியாது."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்கவோ, திருத்தவோ ஆப்ஸை அனுமதிக்கலாம். குறிப்பு: இணைய உலாவல் செயல்திறன்கள் மூலம் மூன்றாம் தரப்பு உலாவிகள் அல்லது பிற பயன்பாடுகள் இந்த அனுமதியைச் செயற்படுத்த முடியாது."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"டிவியில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்க அல்லது திருத்த ஆப்ஸை அனுமதிக்கலாம். குறிப்பு: இந்த அனுமதி, மூன்றாம் தரப்பு உலாவிகள் அல்லது இணைய உலாவல் திறன்களுடன் கூடிய பிற பயன்பாடுகள் போன்றவற்றில் செயல்படாமல் போகலாம்."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"உங்கள் மொபைலில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்கவோ, திருத்தவோ ஆப்ஸை அனுமதிக்கலாம். குறிப்பு: இணைய உலாவல் செயல்திறன்கள் மூலம் மூன்றாம் தரப்பு உலாவிகள் அல்லது பிற பயன்பாடுகள் இந்த அனுமதியைச் செயற்படுத்த முடியாது."</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"அலாரத்தை அமைத்தல்"</string>
- <string name="permdesc_setAlarm" msgid="316392039157473848">"நிறுவிய அலார கடிகாரப் பயன்பாட்டில் அலாரத்தை அமைக்க, பயன்பாட்டை அனுமதிக்கிறது. சில அலார கடிகார பயன்பாடுகளில் இந்த அம்சம் இல்லாமல் இருக்கலாம்."</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"நிறுவிய அலார கடிகாரப் பயன்பாட்டில் அலாரத்தை அமைக்க, ஆப்ஸை அனுமதிக்கிறது. சில அலார கடிகார பயன்பாடுகளில் இந்த அம்சம் இல்லாமல் இருக்கலாம்."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"குரலஞ்சலைச் சேர்த்தல்"</string>
- <string name="permdesc_addVoicemail" msgid="6604508651428252437">"குரலஞ்சல் இன்பாக்ஸில் செய்திகளைச் சேர்க்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"குரலஞ்சல் இன்பாக்ஸில் செய்திகளைச் சேர்க்க, ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"உலாவியின் புவியியல் இருப்பிடம் சார்ந்த அனுமதிகளைத் திருத்துதல்"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"உலாவியின் புவியியல் இருப்பிடம் சார்ந்த அனுமதிகளைத் திருத்த, பயன்பாட்டை அனுமதிக்கிறது. இடத் தகவலை தன்னிச்சையான இணையதளங்களுக்கு அனுப்புவதை அனுமதிக்க, தீங்குவிளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"உலாவியின் புவியியல் இருப்பிடம் சார்ந்த அனுமதிகளைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. இடத் தகவலை தன்னிச்சையான இணையதளங்களுக்கு அனுப்புவதை அனுமதிக்க, தீங்குவிளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
<string name="save_password_message" msgid="767344687139195790">"இந்தக் கடவுச்சொல்லை உலாவி நினைவில்கொள்ள விரும்புகிறீர்களா?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"இப்போது இல்லை"</string>
<string name="save_password_remember" msgid="6491879678996749466">"நினைவில்கொள்"</string>
@@ -1115,7 +1115,7 @@
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"சில அமைப்பு செயல்பாடுகள் வேலை செய்யாமல் போகலாம்"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"முறைமையில் போதுமான சேமிப்பகம் இல்லை. 250மெ.பை. அளவு காலி இடவசதி இருப்பதை உறுதிசெய்து மீண்டும் தொடங்கவும்."</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> இயக்குகிறது"</string>
- <string name="app_running_notification_text" msgid="1197581823314971177">"மேலும் தகவலுக்கு அல்லது பயன்பாட்டை நிறுத்த, தட்டவும்."</string>
+ <string name="app_running_notification_text" msgid="1197581823314971177">"மேலும் தகவலுக்கு அல்லது ஆப்ஸை நிறுத்த, தட்டவும்."</string>
<string name="ok" msgid="5970060430562524910">"சரி"</string>
<string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string>
<string name="yes" msgid="5362982303337969312">"சரி"</string>
@@ -1158,12 +1158,12 @@
<string name="aerr_process" msgid="6201597323218674729">"<xliff:g id="PROCESS">%1$s</xliff:g> செயலிழந்தது"</string>
<string name="aerr_application_repeated" msgid="3146328699537439573">"<xliff:g id="APPLICATION">%1$s</xliff:g> தொடர்ந்து செயலிழக்கிறது"</string>
<string name="aerr_process_repeated" msgid="6235302956890402259">"<xliff:g id="PROCESS">%1$s</xliff:g> தொடர்ந்து செயலிழக்கிறது"</string>
- <string name="aerr_restart" msgid="7581308074153624475">"பயன்பாட்டை மீண்டும் திற"</string>
+ <string name="aerr_restart" msgid="7581308074153624475">"ஆப்ஸை மீண்டும் திற"</string>
<string name="aerr_report" msgid="5371800241488400617">"கருத்து தெரிவி"</string>
<string name="aerr_close" msgid="2991640326563991340">"மூடு"</string>
<string name="aerr_mute" msgid="1974781923723235953">"சாதனம் மீண்டும் தொடங்கும் வரை முடக்கு"</string>
<string name="aerr_wait" msgid="3199956902437040261">"காத்திரு"</string>
- <string name="aerr_close_app" msgid="3269334853724920302">"பயன்பாட்டை மூடு"</string>
+ <string name="aerr_close_app" msgid="3269334853724920302">"ஆப்ஸை மூடு"</string>
<string name="anr_title" msgid="4351948481459135709"></string>
<string name="anr_activity_application" msgid="8493290105678066167">"<xliff:g id="APPLICATION">%2$s</xliff:g> பதிலளிக்கவில்லை"</string>
<string name="anr_activity_process" msgid="1622382268908620314">"<xliff:g id="ACTIVITY">%1$s</xliff:g> பதிலளிக்கவில்லை"</string>
@@ -1173,7 +1173,7 @@
<string name="report" msgid="4060218260984795706">"புகாரளி"</string>
<string name="wait" msgid="7147118217226317732">"காத்திரு"</string>
<string name="webpage_unresponsive" msgid="3272758351138122503">"இந்தப் பக்கம் செயல்படாததாக மாறிவிட்டது.\n\nஇதை மூட நினைக்கிறீர்களா?"</string>
- <string name="launch_warning_title" msgid="1547997780506713581">"பயன்பாடு திசைதிருப்பப்பட்டது"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"ஆப்ஸ் திசைதிருப்பப்பட்டது"</string>
<string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> இப்போது இயங்குகிறது."</string>
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> உண்மையாக வெளியிடப்பட்டது."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"அளவு"</string>
@@ -1184,7 +1184,7 @@
<string name="unsupported_compile_sdk_message" msgid="4253168368781441759">"<xliff:g id="APP_NAME">%1$s</xliff:g> பயன்பாடானது, இந்தச் சாதனத்தின் Android OSக்கு இணக்கமற்ற பதிப்பிற்காக உருவாக்கப்பட்டதால், இதில் சரியாகச் செயல்படாது. இந்தப் பயன்பாட்டின் புதுப்பிக்கப்பட்ட பதிப்பானது தற்போது கிடைக்கக்கூடும்."</string>
<string name="unsupported_compile_sdk_show" msgid="2681877855260970231">"எப்போதும் காட்டு"</string>
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"புதுப்பிப்பு உள்ளதா எனப் பார்"</string>
- <string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> பயன்பாடு (செயல்முறை <xliff:g id="PROCESS">%2$s</xliff:g>), தனது சுய-செயலாக்க StrictMode கொள்கையை மீறியது."</string>
+ <string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> ஆப்ஸ் (செயல்முறை <xliff:g id="PROCESS">%2$s</xliff:g>), தனது சுய-செயலாக்க StrictMode கொள்கையை மீறியது."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> செயல்முறை, தனது சுய-செயலாக்க StrictMode கொள்கையை மீறியது."</string>
<string name="android_upgrading_title" product="default" msgid="7513829952443484438">"மொபைல் புதுப்பிக்கப்படுகிறது…"</string>
<string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"டேப்லெட் புதுப்பிக்கப்படுகிறது…"</string>
@@ -1196,7 +1196,7 @@
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"சேமிப்பகத்தை உகந்ததாக்குகிறது."</string>
<string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"சிஸ்டம் புதுப்பிப்பை நிறைவுசெய்கிறது…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g>ஐ மேம்படுத்துகிறது…"</string>
- <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g> பயன்பாட்டை ஒருங்கிணைக்கிறது."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g> ஆப்ஸை ஒருங்கிணைக்கிறது."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g>ஐத் தயார்செய்கிறது."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"பயன்பாடுகள் தொடங்கப்படுகின்றன."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"துவக்குதலை முடிக்கிறது."</string>
@@ -1288,8 +1288,8 @@
<!-- no translation found for wifi_watchdog_network_disabled_detailed (4917472096696322767) -->
<skip />
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"இணைப்பை அனுமதிக்கவா?"</string>
- <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%2$s வைஃபை நெட்வொர்க்குடன், %1$s பயன்பாடு இணைக்க விரும்புகிறது"</string>
- <string name="wifi_connect_default_application" msgid="7143109390475484319">"ஒரு பயன்பாடு"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%2$s வைஃபை நெட்வொர்க்குடன், %1$s ஆப்ஸ் இணைக்க விரும்புகிறது"</string>
+ <string name="wifi_connect_default_application" msgid="7143109390475484319">"ஒரு ஆப்ஸ்"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"வைஃபை டைரக்ட்"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"வைஃபை Direct ஐத் தொடங்குக. இது வைஃபை க்ளையண்ட்/ஹாட்ஸ்பாட்டை முடக்கும்."</string>
<string name="wifi_p2p_failed_message" msgid="3763669677935623084">"வைஃபை Direct ஐத் தொடங்க முடியவில்லை."</string>
@@ -1308,7 +1308,7 @@
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> உடன் மொபைல் இணைக்கப்படும்போது, வைஃபையிலிருந்து தற்காலிகமாகத் துண்டிக்கப்படும்."</string>
<string name="select_character" msgid="3365550120617701745">"எழுத்துக்குறியைச் செருகு"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS குறுந்தகவல்களை அனுப்புகிறது"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"அதிக எண்ணிக்கையிலான SMS குறுஞ்செய்திகளை &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; அனுப்புகிறது. செய்திகளை அனுப்புவதைத் தொடர இந்தப் பயன்பாட்டை அனுமதிக்க விரும்புகிறீர்களா?"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"அதிக எண்ணிக்கையிலான SMS குறுஞ்செய்திகளை &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; அனுப்புகிறது. செய்திகளை அனுப்புவதைத் தொடர இந்த ஆப்ஸை அனுமதிக்க விரும்புகிறீர்களா?"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"அனுமதி"</string>
<string name="sms_control_no" msgid="625438561395534982">"நிராகரி"</string>
<string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; க்குச் செய்தியை அனுப்ப விரும்புகிறது."</string>
@@ -1421,15 +1421,15 @@
<string name="ext_media_status_missing" msgid="5638633895221670766">"செருகப்படவில்லை"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"பொருந்தும் செயல்பாடுகள் கண்டறியப்படவில்லை."</string>
<string name="permlab_route_media_output" msgid="6243022988998972085">"மீடியா அவுட்புட்டை ரூட் செய்தல்"</string>
- <string name="permdesc_route_media_output" msgid="4932818749547244346">"மீடியாவைப் பிற வெளிப்புறச் சாதனங்களுக்கு வெளியீடாக வழிகாட்ட பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"மீடியாவைப் பிற வெளிப்புறச் சாதனங்களுக்கு வெளியீடாக வழிகாட்ட ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_readInstallSessions" msgid="3713753067455750349">"நிறுவல் அமர்வுகளைப் படித்தல்"</string>
- <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"நிறுவல் அமர்வுகளைப் படிக்க, பயன்பாட்டை அனுமதிக்கிறது. இது செயல்படும் தொகுப்பு நிறுவல்களைப் பற்றிய விவரங்களைப் பார்க்க அனுமதிக்கிறது."</string>
+ <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"நிறுவல் அமர்வுகளைப் படிக்க, ஆப்ஸை அனுமதிக்கிறது. இது செயல்படும் தொகுப்பு நிறுவல்களைப் பற்றிய விவரங்களைப் பார்க்க அனுமதிக்கிறது."</string>
<string name="permlab_requestInstallPackages" msgid="5782013576218172577">"நிறுவல் தொகுப்புகளைக் கோருதல்"</string>
- <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"தொகுப்புகளின் நிறுவலைக் கோர, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"தொகுப்புகளின் நிறுவலைக் கோர, ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_requestDeletePackages" msgid="1703686454657781242">"தொகுப்புகளை நீக்க கோரு"</string>
- <string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"தொகுப்புகளை நீக்க கோர, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"தொகுப்புகளை நீக்க கோர, ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"பேட்டரி மேம்படுத்தல்களைப் புறக்கணிப்பதற்கான அனுமதியைக் கோரு"</string>
- <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"பயன்பாட்டிற்கான பேட்டரி மேம்படுத்தல்களைப் புறக்கணிப்பதற்கான அனுமதியைக் கோர, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"பயன்பாட்டிற்கான பேட்டரி மேம்படுத்தல்களைப் புறக்கணிப்பதற்கான அனுமதியைக் கோர, ஆப்ஸை அனுமதிக்கும்."</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"அளவை மாற்றுவதற்கான கட்டுப்பாட்டிற்கு, இருமுறை தட்டவும்"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"விட்ஜெட்டைச் சேர்க்க முடியவில்லை."</string>
<string name="ime_action_go" msgid="8320845651737369027">"செல்"</string>
@@ -1677,7 +1677,7 @@
<string name="owner_name" msgid="2716755460376028154">"உரிமையாளர்"</string>
<string name="error_message_title" msgid="4510373083082500195">"பிழை"</string>
<string name="error_message_change_not_allowed" msgid="1238035947357923497">"உங்கள் நிர்வாகி இந்த மாற்றத்தை அனுமதிக்கவில்லை"</string>
- <string name="app_not_found" msgid="3429141853498927379">"இந்தச் செயலைச் செய்ய பயன்பாடு எதுவுமில்லை"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"இந்தச் செயலைச் செய்ய ஆப்ஸ் எதுவுமில்லை"</string>
<string name="revoke" msgid="5404479185228271586">"திரும்பப்பெறு"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
<string name="mediasize_iso_a1" msgid="3333060421529791786">"ISO A1"</string>
@@ -1973,14 +1973,14 @@
<string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"சிம் <xliff:g id="SIMNUMBER">%d</xliff:g> அனுமதிக்கப்படவில்லை"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"பாப்அப் சாளரம்"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"பயன்பாடு முந்தையப் பதிப்பிற்கு மாற்றப்பட்டது, அல்லது இந்த ஷார்ட்கட் வேலை செய்யவில்லை"</string>
- <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"காப்புப் பிரதி மற்றும் மீட்டமைவைப் பயன்பாடு ஆதரிக்காத காரணத்தால், ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ஆப்ஸ் முந்தையப் பதிப்பிற்கு மாற்றப்பட்டது, அல்லது இந்த ஷார்ட்கட் வேலை செய்யவில்லை"</string>
+ <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"காப்புப் பிரதி மற்றும் மீட்டமைவைப் ஆப்ஸ் ஆதரிக்காத காரணத்தால், ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"பயன்பாட்டுச் சான்றுகள் பொருந்தாத காரணத்தினால், ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"ஷார்ட்கட் முடக்கப்பட்டுள்ளது"</string>
<string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"நிறுவல் நீக்கு"</string>
<string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"பரவாயில்லை, திற"</string>
- <string name="harmful_app_warning_title" msgid="8982527462829423432">"தீங்கிழைக்கும் பயன்பாடு உள்ளது"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"தீங்கிழைக்கும் ஆப்ஸ் உள்ளது"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க, <xliff:g id="APP_0">%1$s</xliff:g> அனுமதி கேட்கிறது"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"திருத்து"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு அதிரும்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 312e61563fb5..87dfa95c5ae9 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"వినియోగం కోసం ముఖ టెంప్లేట్‌లను జోడించే మరియు తొలగించే పద్ధతులను అమలు చేయడానికి యాప్‌ను అనుమతిస్తుంది."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ముఖ ప్రమాణీకరణ హార్డ్‌వేర్‌ను వాడండి"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ప్రమాణీకరణ కోసం ముఖ ప్రామాణీకరణ హార్డ్‌వేర్‌ను ఉపయోగించడానికి యాప్‌ని అనుమతిస్తుంది"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ముఖ ప్రామాణీకరణ"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"మీ ముఖాన్ని తిరిగి నమోదు చేయండి"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"గుర్తింపును మెరుగుపరచడానికి, దయచేసి మీ ముఖంను తిరిగి నమోదు చేసుకోండి"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"ముఖం డేటా సరిగ్గా రాలేదు. మళ్లీ ప్రయత్నించండి."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"వెలుతురు అధికంగా ఉంది. తక్కువ ఉండేలా చూడండి."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"చాలా చీకటిగా ఉంది. బాగా వెలుతురులో ప్రయత్నించండి."</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 500e9c334b10..86a08d4733ad 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"อนุญาตให้แอปเรียกใช้วิธีเพิ่มและลบเทมเพลตใบหน้าสำหรับการใช้งาน"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"อนุญาตให้แอปใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้าเพื่อตรวจสอบสิทธิ์"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"การตรวจสอบสิทธิ์ด้วยใบหน้า"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ลงทะเบียนใบหน้าอีกครั้ง"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"โปรดลงทะเบียนใบหน้าอีกครั้งเพื่อปรับปรุงการจดจำ"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"บันทึกข้อมูลใบหน้าที่ถูกต้องไม่ได้ ลองอีกครั้ง"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"สว่างเกินไป ลองหาตำแหน่งที่แสงน้อยกว่านี้"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"มืดเกินไป ลองหาตำแหน่งที่สว่างขึ้น"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index efa6339ba8ce..3adc3f2f00a7 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Pumapayag na mag-invoke ang app ng paraang magdagdag at mag-delete ng template ng mukha."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gumamit ng hardware sa pag-authenticate ng mukha"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Pumapayag na gumamit ng face authentication hardware ang app para sa pag-authenticate"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Pag-authenticate ng Mukha"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"I-enroll ulit ang iyong mukha"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para mapahusay ang pagkilala, paki-enroll ulit ang iyong mukha"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Hindi makakuha ng tamang face data. Subukang muli."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Masyadong maliwanag. Subukang bawasan ang liwanag."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Masyadong madilim. Subukan sa mas maliwanag."</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 50c51686a1aa..9d99bc75c1cb 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Uygulamanın, kullanılacak yüz şablonlarını ekleme ve silme yöntemlerini başlatmasına izin verir."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"yüz kimlik doğrulaması donanımını kullanma"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Uygulamanın yüz kimlik doğrulaması donanımı kullanmasına izin verir"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Yüzle Kimlik Doğrulama"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Yüzünüzü yeniden kaydedin"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Daha iyi tanınmasını sağlamak için lütfen yüzünüzü yeniden kaydedin"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Doğru yüz verileri yakalanamadı. Tekrar deneyin."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Çok parlak. Parlaklığı daha az bir ışıklandırma deneyin."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Çok karanlık. Daha parlak ışıkta deneyin."</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index f39a0effee81..e99e9e5b10ba 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -559,12 +559,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Додаток може активувати способи додавання й видалення шаблонів облич."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"застосовувати обладнання для автентифікації облич"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Додаток може застосовувати обладнання для автентифікації облич"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Автентифікація за обличчям"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Повторно проскануйте обличчя"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Повторно проскануйте обличчя для ефективнішого розпізнавання"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Не вдалося чітко зняти обличчя. Повторіть спробу."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Занадто яскраво. Потрібно менше світла."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Занадто темно. Потрібно більше світла."</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 64379c967193..fc0ae978ff17 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ایپ کو چہرے کی تمثیلات شامل اور حذف کرنے کے طریقوں کو کالعدم قرار دینے کی اجازت دیتا ہے۔"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"چہرے کی توثیق کا ہارڈویئر استعمال کریں"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ایپ کو توثیق کیلئے چہرے کا ہارڈ ویئر استعمال کرنے کی اجازت دیتا ہے"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"چہرے سے تصدیق"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"اپنے چہرے کو دوبارہ مندرج کریں"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"شناخت کو بہتر بنانے کے لیے براہ کرم اپنے چہرے کو دوبارہ مندرج کریں"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"چہرے کا درست ڈيٹا کیپچر نہیں ہو سکا۔ پھر آزمائيں۔"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"کافی روشنی ہے۔ ہلکی روشنی میں آزمائیں۔"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"کافی اندھیرا ہے۔ تیز روشنی میں آزمائیں۔"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index c91ba57b6e5f..1bacf6e18c8e 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Ilova foydalanish uchun yuz namunalarini qo‘shish va o‘chirish usullarini tatbiq qilishi mumkin."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"yuzni aniqlash qurilmasidan foydalanish"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Haqiqiylikni tekshirish uchun skanerdan foydalanish imkonini beradi"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Yuz tekshiruvi"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Yuzingizni yana roʻyxatdan oʻtkazing"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Yuzingizni tanishni yaxshilash uchun yuzingizni yana bir marta roʻyxatdan oʻtkazing"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Yuz ravshan suratga olinmadi. Qaytadan urining."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Juda yorqin. Biroz soyaroq joy tanlang."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Juda qorongʻi. Atrofingizni yoriting."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 0ba50b3a2bb8..6b1323473a24 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Cho phép ứng dụng gọi ra các phương pháp để thêm và xóa mẫu khuôn mặt sử dụng."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"sử dụng phần cứng xác thực khuôn mặt"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Cho phép ứng dụng sử dụng phần cứng xác thực khuôn mặt để tiến hành xác thực"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Xác thực khuôn mặt"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Đăng ký lại khuôn mặt của bạn"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Để cải thiện khả năng nhận dạng, hãy đăng ký lại khuôn mặt của bạn"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Không thể ghi lại đúng dữ liệu mặt. Hãy thử lại."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Quá sáng. Hãy thử giảm độ sáng."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Quá tối. Hãy thử tăng độ sáng."</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index a8fb4f1bf331..8dfbea9d6c24 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"允许该应用调用方法来添加和删除可用的人脸模板。"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用人脸身份验证硬件"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允许该应用使用人脸身份验证硬件进行身份验证"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"面孔身份验证"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"重新注册您的面孔"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"要提升识别精确度,请重新注册您的面孔"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"无法捕获准确的人脸数据,请重试。"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"亮度过高,请尝试使用较柔和的亮度。"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"亮度不足,请尝试将光线调亮。"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 81913e9d1088..cb62339223f5 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"允許應用程式調用方法,以加入和刪除可用的臉孔範本。"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用臉孔驗證硬件"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允許應用程式使用臉孔驗證硬件來驗證"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"臉孔驗證"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"重新註冊臉孔"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"如要提高識別能力,請重新註冊您的臉孔"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"無法擷取準確的臉容資料。請再試一次。"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"影像太亮。請嘗試在更暗的環境下使用。"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"影像太暗。請嘗試在更明亮的環境下使用。"</string>
@@ -1464,7 +1461,7 @@
<string name="vpn_text_long" msgid="4907843483284977618">"已連線至 <xliff:g id="SESSION">%s</xliff:g>,輕按一下即可管理網絡。"</string>
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在連線至永久連線的 VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"已連線至永久連線的 VPN"</string>
- <string name="vpn_lockdown_disconnected" msgid="735805531187559719">"永遠開啟的 VPN 已中斷連線"</string>
+ <string name="vpn_lockdown_disconnected" msgid="735805531187559719">"保持開啟的 VPN 已中斷連線"</string>
<string name="vpn_lockdown_error" msgid="3133844445659711681">"無法連接永久連線的 VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"變更網絡或 VPN 設定"</string>
<string name="upload_file" msgid="2897957172366730416">"選擇檔案"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index a0324ab53ef7..70bc10d82eba 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"允許應用程式呼叫方法來新增及移除可用的臉孔範本。"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用臉孔驗證硬體"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允許應用程式使用臉孔驗證硬體進行驗證"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"臉孔驗證"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"請重新註冊你的臉孔"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"為提升辨識精準度,請重新註冊你的臉孔"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"無法擷取精準臉孔資料,請再試一次。"</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"亮度過高,請嘗試使用較柔和的照明方式。"</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"亮度不足,請嘗試使用較明亮的照明方式。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 268cab1e27bf..933bd4149cdf 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -553,12 +553,9 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Ivumela uhlelo lokusebenza ukuthi luhoxise izindlela zokungeza nokususa amathempulethi obuso azosetshenziswa."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"sebenzisa izingxenyekazi zekhompuyutha zokufakazela ubuqiniso kobuso"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Ivumela uhlelo lokusebenza ukuthi lusebenzise ukufakazela ubuqiniso bobuso bezingxenyekazi ukuze kufakazelwe ubuqiniso"</string>
- <!-- no translation found for face_recalibrate_notification_name (3976629945250435054) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_title (4087620069451499365) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (5530308842361499835) -->
- <skip />
+ <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ukufakazela ubuqiniso bobuso"</string>
+ <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Phinda ubhalise ubuso bakho"</string>
+ <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ukuze uthuthukise ukubonwa, sicela uphinde ubhalise ubuso bakho"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"Ayikwazanga ukuthwebula idatha enembile yobuso. Zama futhi."</string>
<string name="face_acquired_too_bright" msgid="5005650874582450967">"Kukhanya kakhulu. Zama ukukhanya okuthambile."</string>
<string name="face_acquired_too_dark" msgid="1966194696381394616">"Kumnyama kakhulu Zama ukukhanyisa okukhanyayo."</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 4c7f503ceb0f..489a08ac9399 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2380,6 +2380,12 @@
<!-- ============================= -->
<eat-comment />
+ <!-- Removed View attributes without a specified format (b/131100106) -->
+ <attr name="__removed3" />
+ <attr name="__removed4" />
+ <attr name="__removed5" />
+ <attr name="__removed6" />
+
<!-- Attributes that can be used with {@link android.view.View} or
any of its subclasses. Also see {@link #ViewGroup_Layout} for
attributes that are processed by the view's parent. -->
@@ -4722,7 +4728,7 @@
<!-- Style (normal, bold, italic, bold|italic) for the text. -->
<attr name="textStyle" />
<!-- Weight for the font used in the TextView. -->
- <attr name="textFontWeight" />
+ <attr name="textFontWeight" format="integer"/>
<!-- Font family (named by string or as a font resource reference) for the text. -->
<attr name="fontFamily" />
<!-- Specifies the {@link android.os.LocaleList} for the text in this TextView.
@@ -8018,7 +8024,7 @@
<attr name="supportsAmbientMode" format="boolean" />
<!-- Uri that specifies a settings Slice for this wallpaper. -->
- <attr name="settingsSliceUri" />
+ <attr name="settingsSliceUri" format="string"/>
<!-- Indicates that this wallpaper service can support multiple engines to render on each
surface independently. An example use case is a multi-display set-up where the
@@ -8242,7 +8248,7 @@
<!-- The activity to launch when the setting is clicked on. -->
<attr name="settingsActivity"/>
<!-- The user restriction for this preference. -->
- <attr name="userRestriction"/>
+ <attr name="userRestriction" format="string"/>
</declare-styleable>
<!-- =============================== -->
@@ -8900,7 +8906,7 @@
<attr name="layout_ignoreOffset" format="boolean" />
<attr name="layout_gravity" />
<attr name="layout_hasNestedScrollIndicator" format="boolean" />
- <attr name="layout_maxHeight" />
+ <attr name="layout_maxHeight" format="dimension"/>
</declare-styleable>
<!-- @hide -->
@@ -9110,4 +9116,6 @@
<attr name="magnifierHorizontalOffset" format="dimension" />
<attr name="magnifierColorOverlay" format="color" />
</declare-styleable>
+
+ <attr name="autoSizePresetSizes" />
</resources>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 26a9f570a6d2..f9c9c53475a8 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -1690,14 +1690,14 @@
<attr name="usesNonSdkApi" />
<!-- If {@code true} the user is prompted to keep the app's data on uninstall -->
- <attr name="hasFragileUserData" />
+ <attr name="hasFragileUserData" format="boolean"/>
<attr name="zygotePreloadName" />
<!-- If {@code true} the system will clear app's data if a restore operation fails.
This flag is turned on by default. <em>This attribute is usable only by system apps.
</em> -->
- <attr name="allowClearUserDataOnFailedRestore"/>
+ <attr name="allowClearUserDataOnFailedRestore" format="boolean"/>
<!-- If {@code true} the app's non sensitive audio can be captured by other apps with
{@link android.media.AudioPlaybackCaptureConfiguration} and a
{@link android.media.projection.MediaProjection}.
@@ -1755,7 +1755,7 @@
<attr name="banner" />
<attr name="logo" />
<attr name="permissionGroup" />
- <attr name="backgroundPermission" />
+ <attr name="backgroundPermission" format="string"/>
<attr name="description" />
<attr name="request" />
<attr name="protectionLevel" />
@@ -1785,10 +1785,10 @@
<attr name="banner" />
<attr name="logo" />
<attr name="description" />
- <attr name="request" />
- <attr name="requestDetail" />
- <attr name="backgroundRequest" />
- <attr name="backgroundRequestDetail" />
+ <attr name="request" format="string"/>
+ <attr name="requestDetail" format="string"/>
+ <attr name="backgroundRequest" format="string"/>
+ <attr name="backgroundRequestDetail" format="string"/>
<attr name="permissionGroupFlags" />
<attr name="priority" />
</declare-styleable>
@@ -2254,7 +2254,7 @@
<attr name="path" />
<attr name="pathPrefix" />
<attr name="pathPattern" />
- <attr name="pathAdvancedPattern" />
+ <attr name="pathAdvancedPattern" format="string"/>
<attr name="permission" />
<attr name="readPermission" />
<attr name="writePermission" />
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 21a8f4c7ff89..ad3203ed96eb 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2542,9 +2542,10 @@
mirror the content of the default display. -->
<bool name="config_localDisplaysMirrorContent">true</bool>
- <!-- Indicates whether local non-default displays are private.
- {@see android.view.Display#FLAG_PRIVATE} -->
- <bool name="config_localDisplaysPrivate">false</bool>
+ <!-- Controls if local secondary displays should be private or not. Value specified in the array
+ represents physical port address of each display and display in this list will be marked
+ as private. {@see android.view.Display#FLAG_PRIVATE} -->
+ <integer-array translatable="false" name="config_localPrivateDisplayPorts"></integer-array>
<!-- The default mode for the default display. One of the following values (See Display.java):
0 - COLOR_MODE_DEFAULT
@@ -3862,6 +3863,10 @@
{@see android.view.Display#FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS} -->
<string name="config_secondaryHomeComponent" translatable="false">com.android.launcher3/com.android.launcher3.SecondaryDisplayLauncher</string>
+ <!-- Force secondary home launcher specified in config_secondaryHomeComponent always. If this is
+ not set, secondary home launcher can be replaced by user. -->
+ <bool name ="config_useSystemProvidedLauncherForSecondary">false</bool>
+
<!-- If device supports corner radius on windows.
This should be turned off on low-end devices to improve animation performance. -->
<bool name="config_supportsRoundedCornersOnWindows">true</bool>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 7cf03feaf889..085ce56292c6 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -394,7 +394,7 @@
<java-symbol type="bool" name="config_supportsInsecureLockScreen" />
<java-symbol type="bool" name="config_guestUserEphemeral" />
<java-symbol type="bool" name="config_localDisplaysMirrorContent" />
- <java-symbol type="bool" name="config_localDisplaysPrivate" />
+ <java-symbol type="array" name="config_localPrivateDisplayPorts" />
<java-symbol type="integer" name="config_defaultDisplayDefaultColorMode" />
<java-symbol type="bool" name="config_enableAppWidgetService" />
<java-symbol type="string" name="config_defaultPictureInPictureScreenEdgeInsets" />
@@ -3678,6 +3678,7 @@
<!-- For Secondary Launcher -->
<java-symbol type="string" name="config_secondaryHomeComponent" />
+ <java-symbol type="bool" name="config_useSystemProvidedLauncherForSecondary" />
<java-symbol type="string" name="battery_saver_notification_channel_name" />
<java-symbol type="string" name="battery_saver_sticky_disabled_notification_title" />
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index dbbe1b4ca574..485add9fa11f 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -35,6 +35,11 @@ applications that come with the platform
<permission name="android.permission.CRYPT_KEEPER"/>
</privapp-permissions>
+ <privapp-permissions package="com.android.captiveportallogin">
+ <permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"/>
+ <permission name="android.permission.NETWORK_BYPASS_PRIVATE_DNS"/>
+ </privapp-permissions>
+
<privapp-permissions package="com.android.cellbroadcastreceiver">
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MANAGE_USERS"/>
@@ -213,6 +218,7 @@ applications that come with the platform
<permission name="android.permission.LOCAL_MAC_ADDRESS"/>
<permission name="android.permission.MANAGE_SUBSCRIPTION_PLANS"/>
<permission name="android.permission.MANAGE_USB"/>
+ <permission name="android.permission.NETWORK_BYPASS_PRIVATE_DNS"/>
<permission name="android.permission.PACKET_KEEPALIVE_OFFLOAD"/>
<permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
<permission name="android.permission.READ_PRECISE_PHONE_STATE"/>
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index b2ebfa934178..ab80b3af9fc8 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -16,6 +16,9 @@
package android.media;
+import static android.media.AudioAttributes.ALLOW_CAPTURE_BY_ALL;
+import static android.media.AudioAttributes.ALLOW_CAPTURE_BY_NONE;
+
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.SystemApi;
@@ -235,6 +238,9 @@ public final class AudioPlaybackConfiguration implements Parcelable {
.setUsage(in.mPlayerAttr.getUsage())
.setContentType(in.mPlayerAttr.getContentType())
.setFlags(in.mPlayerAttr.getFlags())
+ .setAllowedCapturePolicy(
+ in.mPlayerAttr.getAllowedCapturePolicy() == ALLOW_CAPTURE_BY_ALL
+ ? ALLOW_CAPTURE_BY_ALL : ALLOW_CAPTURE_BY_NONE)
.build();
// anonymized data
anonymCopy.mPlayerType = PLAYER_TYPE_UNKNOWN;
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index c6c2fdd00674..c09bd79e9732 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -89,15 +89,33 @@ import java.util.concurrent.locks.ReentrantLock;
<h4>Raw Audio Buffers</h4>
<p>
Raw audio buffers contain entire frames of PCM audio data, which is one sample for each channel
- in channel order. Each sample is a {@linkplain AudioFormat#ENCODING_PCM_16BIT 16-bit signed
- integer in native byte order}.
+ in channel order. Each PCM audio sample is either a 16 bit signed integer or a float,
+ in native byte order.
+ Raw audio buffers in the float PCM encoding are only possible
+ if the MediaFormat's {@linkplain MediaFormat#KEY_PCM_ENCODING}
+ is set to {@linkplain AudioFormat#ENCODING_PCM_FLOAT} during MediaCodec
+ {@link #configure configure(&hellip;)}
+ and confirmed by {@link #getOutputFormat} for decoders
+ or {@link #getInputFormat} for encoders.
+ A sample method to check for float PCM in the MediaFormat is as follows:
<pre class=prettyprint>
+ static boolean isPcmFloat(MediaFormat format) {
+ return format.getInteger(MediaFormat.KEY_PCM_ENCODING, AudioFormat.ENCODING_PCM_16BIT)
+ == AudioFormat.ENCODING_PCM_FLOAT;
+ }</pre>
+
+ In order to extract, in a short array,
+ one channel of a buffer containing 16 bit signed integer audio data,
+ the following code may be used:
+
+ <pre class=prettyprint>
+ // Assumes the buffer PCM encoding is 16 bit.
short[] getSamplesForChannel(MediaCodec codec, int bufferId, int channelIx) {
ByteBuffer outputBuffer = codec.getOutputBuffer(bufferId);
MediaFormat format = codec.getOutputFormat(bufferId);
ShortBuffer samples = outputBuffer.order(ByteOrder.nativeOrder()).asShortBuffer();
- int numChannels = formet.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
+ int numChannels = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
if (channelIx &lt; 0 || channelIx &gt;= numChannels) {
return null;
}
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index 9c9e28ee50fa..a56e7f583094 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -3136,6 +3136,93 @@ public final class MediaCodecInfo {
maxBlocks, maxBlocksPerSecond,
8 /* blockWidth */, 8 /* blockHeight */,
1 /* widthAlignment */, 1 /* heightAlignment */);
+ } else if (mime.equalsIgnoreCase(MediaFormat.MIMETYPE_VIDEO_AV1)) {
+ maxBlocksPerSecond = 829440;
+ maxBlocks = 36864;
+ maxBps = 200000;
+ int maxDim = 512;
+
+ // Sample rate, Picture Size, Bit rate and luma dimension for AV1 Codec,
+ // corresponding to the definitions in
+ // "AV1 Bitstream & Decoding Process Specification", Annex A
+ // found at https://aomedia.org/av1-bitstream-and-decoding-process-specification/
+ for (CodecProfileLevel profileLevel: profileLevels) {
+ long SR = 0; // luma sample rate
+ int FS = 0; // luma picture size
+ int BR = 0; // bit rate kbps
+ int D = 0; // luma D
+ switch (profileLevel.level) {
+ case CodecProfileLevel.AV1Level2:
+ SR = 5529600; FS = 147456; BR = 1500; D = 2048; break;
+ case CodecProfileLevel.AV1Level21:
+ case CodecProfileLevel.AV1Level22:
+ case CodecProfileLevel.AV1Level23:
+ SR = 10454400; FS = 278784; BR = 3000; D = 2816; break;
+
+ case CodecProfileLevel.AV1Level3:
+ SR = 24969600; FS = 665856; BR = 6000; D = 4352; break;
+ case CodecProfileLevel.AV1Level31:
+ case CodecProfileLevel.AV1Level32:
+ case CodecProfileLevel.AV1Level33:
+ SR = 39938400; FS = 1065024; BR = 10000; D = 5504; break;
+
+ case CodecProfileLevel.AV1Level4:
+ SR = 77856768; FS = 2359296; BR = 12000; D = 6144; break;
+ case CodecProfileLevel.AV1Level41:
+ case CodecProfileLevel.AV1Level42:
+ case CodecProfileLevel.AV1Level43:
+ SR = 155713536; FS = 2359296; BR = 20000; D = 6144; break;
+
+ case CodecProfileLevel.AV1Level5:
+ SR = 273715200; FS = 8912896; BR = 30000; D = 8192; break;
+ case CodecProfileLevel.AV1Level51:
+ SR = 547430400; FS = 8912896; BR = 40000; D = 8192; break;
+ case CodecProfileLevel.AV1Level52:
+ SR = 1094860800; FS = 8912896; BR = 60000; D = 8192; break;
+ case CodecProfileLevel.AV1Level53:
+ SR = 1176502272; FS = 8912896; BR = 60000; D = 8192; break;
+
+ case CodecProfileLevel.AV1Level6:
+ SR = 1176502272; FS = 35651584; BR = 60000; D = 16384; break;
+ case CodecProfileLevel.AV1Level61:
+ SR = 2189721600L; FS = 35651584; BR = 100000; D = 16384; break;
+ case CodecProfileLevel.AV1Level62:
+ SR = 4379443200L; FS = 35651584; BR = 160000; D = 16384; break;
+ case CodecProfileLevel.AV1Level63:
+ SR = 4706009088L; FS = 35651584; BR = 160000; D = 16384; break;
+
+ default:
+ Log.w(TAG, "Unrecognized level "
+ + profileLevel.level + " for " + mime);
+ errors |= ERROR_UNRECOGNIZED;
+ }
+ switch (profileLevel.profile) {
+ case CodecProfileLevel.AV1ProfileMain8:
+ case CodecProfileLevel.AV1ProfileMain10:
+ case CodecProfileLevel.AV1ProfileMain10HDR10:
+ case CodecProfileLevel.AV1ProfileMain10HDR10Plus:
+ break;
+ default:
+ Log.w(TAG, "Unrecognized profile "
+ + profileLevel.profile + " for " + mime);
+ errors |= ERROR_UNRECOGNIZED;
+ }
+ errors &= ~ERROR_NONE_SUPPORTED;
+ maxBlocksPerSecond = Math.max(SR, maxBlocksPerSecond);
+ maxBlocks = Math.max(FS, maxBlocks);
+ maxBps = Math.max(BR * 1000, maxBps);
+ maxDim = Math.max(D, maxDim);
+ }
+
+ final int blockSize = 8;
+ int maxLengthInBlocks = Utils.divUp(maxDim, blockSize);
+ maxBlocks = Utils.divUp(maxBlocks, blockSize * blockSize);
+ maxBlocksPerSecond = Utils.divUp(maxBlocksPerSecond, blockSize * blockSize);
+ applyMacroBlockLimits(
+ maxLengthInBlocks, maxLengthInBlocks,
+ maxBlocks, maxBlocksPerSecond,
+ blockSize, blockSize,
+ 1 /* widthAlignment */, 1 /* heightAlignment */);
} else {
Log.w(TAG, "Unsupported mime " + mime);
// using minimal bitrate here. should be overriden by
diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl
index e073a4e2f6c8..a67a37eedd27 100644
--- a/media/java/android/media/session/ISessionManager.aidl
+++ b/media/java/android/media/session/ISessionManager.aidl
@@ -16,6 +16,7 @@
package android.media.session;
import android.content.ComponentName;
+import android.content.pm.ParceledListSlice;
import android.media.IRemoteVolumeController;
import android.media.Session2Token;
import android.media.session.IActiveSessionsListener;
@@ -38,7 +39,7 @@ interface ISessionManager {
in Bundle sessionInfo, int userId);
void notifySession2Created(in Session2Token sessionToken);
List<MediaSession.Token> getSessions(in ComponentName compName, int userId);
- List<Session2Token> getSession2Tokens(int userId);
+ ParceledListSlice getSession2Tokens(int userId);
void dispatchMediaKeyEvent(String packageName, boolean asSystemService, in KeyEvent keyEvent,
boolean needWakeLock);
boolean dispatchMediaKeyEventToSessionAsSystemService(String packageName,
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 51e3a4dc8c4b..569d11e1dce6 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -24,6 +24,7 @@ import android.annotation.SystemService;
import android.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.ParceledListSlice;
import android.media.AudioManager;
import android.media.IRemoteVolumeController;
import android.media.MediaSession2;
@@ -218,7 +219,8 @@ public final class MediaSessionManager {
@NonNull
public List<Session2Token> getSession2Tokens(int userId) {
try {
- return mService.getSession2Tokens(userId);
+ ParceledListSlice slice = mService.getSession2Tokens(userId);
+ return slice == null ? new ArrayList<>() : slice.getList();
} catch (RemoteException e) {
Log.e(TAG, "Failed to get session tokens", e);
}
diff --git a/packages/CaptivePortalLogin/AndroidManifest.xml b/packages/CaptivePortalLogin/AndroidManifest.xml
index 355bdd8dfc98..9add24718d8a 100644
--- a/packages/CaptivePortalLogin/AndroidManifest.xml
+++ b/packages/CaptivePortalLogin/AndroidManifest.xml
@@ -26,6 +26,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+ <uses-permission android:name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
<uses-permission android:name="android.permission.NETWORK_BYPASS_PRIVATE_DNS" />
<uses-permission android:name="android.permission.MAINLINE_NETWORK_STACK" />
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index ea29ebb88846..12b41cabd142 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -485,10 +485,7 @@ public class CarStatusBar extends StatusBar implements
mNotificationListAtBottomAtTimeOfTouch = false;
}
- boolean handled = false;
- if (mNotificationListAtBottomAtTimeOfTouch && mNotificationListAtBottom) {
- handled = closeGestureDetector.onTouchEvent(event);
- }
+ boolean handled = closeGestureDetector.onTouchEvent(event);
boolean isTracking = mIsTracking;
Rect rect = mNotificationList.getClipBounds();
float clippedHeight = 0;
@@ -1037,8 +1034,18 @@ public class CarStatusBar extends StatusBar implements
GestureDetector.SimpleOnGestureListener {
@Override
+ public boolean onSingleTapUp(MotionEvent motionEvent) {
+ animateNotificationPanel(DEFAULT_FLING_VELOCITY, true);
+ return false;
+ }
+
+ @Override
public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
float distanceY) {
+ if (!mNotificationListAtBottomAtTimeOfTouch && !mNotificationListAtBottom) {
+ return false;
+ }
+ // should not clip while scroll to the bottom of the list.
if (!mNotificationListAtBottomAtTimeOfTouch) {
return false;
}
@@ -1074,7 +1081,9 @@ public class CarStatusBar extends StatusBar implements
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
-
+ if (!mNotificationListAtBottomAtTimeOfTouch && !mNotificationListAtBottom) {
+ return false;
+ }
if (Math.abs(event1.getX() - event2.getX()) > SWIPE_MAX_OFF_PATH
|| Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY) {
// swipe was not vertical or was not fast enough
diff --git a/packages/NetworkStack/AndroidManifestBase.xml b/packages/NetworkStack/AndroidManifestBase.xml
index 3da566f88659..d00a55143605 100644
--- a/packages/NetworkStack/AndroidManifestBase.xml
+++ b/packages/NetworkStack/AndroidManifestBase.xml
@@ -24,7 +24,6 @@
android:label="NetworkStack"
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true"
- android:persistent="true"
android:usesCleartextTraffic="true">
<service android:name="com.android.server.connectivity.ipmemorystore.RegularMaintenanceJobService"
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpPacket.java b/packages/NetworkStack/src/android/net/dhcp/DhcpPacket.java
index d7ff98b1f501..a15d42381ff0 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpPacket.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpPacket.java
@@ -195,6 +195,18 @@ public abstract class DhcpPacket {
public static final String VENDOR_INFO_ANDROID_METERED = "ANDROID_METERED";
/**
+ * DHCP Optional Type: Option overload option
+ */
+ protected static final byte DHCP_OPTION_OVERLOAD = 52;
+
+ /**
+ * Possible values of the option overload option.
+ */
+ private static final byte OPTION_OVERLOAD_FILE = 1;
+ private static final byte OPTION_OVERLOAD_SNAME = 2;
+ private static final byte OPTION_OVERLOAD_BOTH = 3;
+
+ /**
* DHCP Optional Type: DHCP Requested IP Address
*/
protected static final byte DHCP_REQUESTED_IP = 50;
@@ -309,6 +321,11 @@ public abstract class DhcpPacket {
protected final byte[] mClientMac;
/**
+ * The server host name from server.
+ */
+ protected String mServerHostName;
+
+ /**
* Asks the packet object to create a ByteBuffer serialization of
* the packet for transmission.
*/
@@ -848,6 +865,8 @@ public abstract class DhcpPacket {
Inet4Address ipDst = null;
Inet4Address bcAddr = null;
Inet4Address requestedIp = null;
+ String serverHostName;
+ byte optionOverload = 0;
// The following are all unsigned integers. Internally we store them as signed integers of
// the same length because that way we're guaranteed that they can't be out of the range of
@@ -989,9 +1008,9 @@ public abstract class DhcpPacket {
packet.get(clientMac);
// skip over address padding (16 octets allocated)
- packet.position(packet.position() + (16 - addrLen)
- + 64 // skip server host name (64 chars)
- + 128); // skip boot file name (128 chars)
+ packet.position(packet.position() + (16 - addrLen));
+ serverHostName = readAsciiString(packet, 64, false);
+ packet.position(packet.position() + 128);
// Ensure this is a DHCP packet with a magic cookie, and not BOOTP. http://b/31850211
if (packet.remaining() < 4) {
@@ -1102,6 +1121,11 @@ public abstract class DhcpPacket {
// Embedded nulls are safe as this does not get passed to netd.
vendorInfo = readAsciiString(packet, optionLen, true);
break;
+ case DHCP_OPTION_OVERLOAD:
+ expectedLen = 1;
+ optionOverload = packet.get();
+ optionOverload &= OPTION_OVERLOAD_BOTH;
+ break;
default:
// ignore any other parameters
for (int i = 0; i < optionLen; i++) {
@@ -1192,6 +1216,11 @@ public abstract class DhcpPacket {
newPacket.mT2 = T2;
newPacket.mVendorId = vendorId;
newPacket.mVendorInfo = vendorInfo;
+ if ((optionOverload & OPTION_OVERLOAD_SNAME) == 0) {
+ newPacket.mServerHostName = serverHostName;
+ } else {
+ newPacket.mServerHostName = "";
+ }
return newPacket;
}
@@ -1251,6 +1280,7 @@ public abstract class DhcpPacket {
results.vendorInfo = mVendorInfo;
results.leaseDuration = (mLeaseTime != null) ? mLeaseTime : INFINITE_LEASE;
results.mtu = (mMtu != null && MIN_MTU <= mMtu && mMtu <= MAX_MTU) ? mMtu : 0;
+ results.serverHostName = mServerHostName;
return results;
}
diff --git a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java
index 4d98403bfd4e..a30d3e492406 100644
--- a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java
+++ b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java
@@ -302,8 +302,9 @@ public class DhcpPacketTest {
}
private void assertDhcpResults(String ipAddress, String gateway, String dnsServersString,
- String domains, String serverAddress, String vendorInfo, int leaseDuration,
- boolean hasMeteredHint, int mtu, DhcpResults dhcpResults) throws Exception {
+ String domains, String serverAddress, String serverHostName, String vendorInfo,
+ int leaseDuration, boolean hasMeteredHint, int mtu, DhcpResults dhcpResults)
+ throws Exception {
assertEquals(new LinkAddress(ipAddress), dhcpResults.ipAddress);
assertEquals(v4Address(gateway), dhcpResults.gateway);
@@ -316,6 +317,7 @@ public class DhcpPacketTest {
assertEquals(domains, dhcpResults.domains);
assertEquals(v4Address(serverAddress), dhcpResults.serverAddress);
+ assertEquals(serverHostName, dhcpResults.serverHostName);
assertEquals(vendorInfo, dhcpResults.vendorInfo);
assertEquals(leaseDuration, dhcpResults.leaseDuration);
assertEquals(hasMeteredHint, dhcpResults.hasMeteredHint());
@@ -327,6 +329,7 @@ public class DhcpPacketTest {
// TODO: Turn all of these into golden files. This will probably require using
// androidx.test.InstrumentationRegistry for obtaining a Context object
// to read such golden files, along with an appropriate Android.mk.
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header.
"451001480000000080118849c0a89003c0a89ff7" +
@@ -347,16 +350,18 @@ public class DhcpPacketTest {
// Options
"638253633501023604c0a89003330400001c200104fffff0000304c0a89ffe06080808080808080404" +
"3a0400000e103b040000189cff00000000000000000000"));
+ // CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3);
assertTrue(offerPacket instanceof DhcpOfferPacket); // Implicitly checks it's non-null.
DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("192.168.159.247/20", "192.168.159.254", "8.8.8.8,8.8.4.4",
- null, "192.168.144.3", null, 7200, false, 0, dhcpResults);
+ null, "192.168.144.3", "", null, 7200, false, 0, dhcpResults);
}
@Test
public void testOffer2() throws Exception {
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header.
"450001518d0600004011144dc0a82b01c0a82bf7" +
@@ -366,9 +371,9 @@ public class DhcpPacketTest {
"02010600dfc23d1f0002000000000000c0a82bf7c0a82b0100000000" +
// MAC address.
"30766ff2a90c00000000000000000000" +
- // Server name.
- "0000000000000000000000000000000000000000000000000000000000000000" +
- "0000000000000000000000000000000000000000000000000000000000000000" +
+ // Server name ("dhcp.android.com" plus invalid "AAAA" after null terminator).
+ "646863702e616e64726f69642e636f6d00000000000000000000000000000000" +
+ "0000000000004141414100000000000000000000000000000000000000000000" +
// File.
"0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000" +
@@ -377,13 +382,15 @@ public class DhcpPacketTest {
// Options
"638253633501023604c0a82b01330400000e103a04000007083b0400000c4e0104ffffff00" +
"1c04c0a82bff0304c0a82b010604c0a82b012b0f414e44524f49445f4d455445524544ff"));
+ // CHECKSTYLE:ON Generated code
assertEquals(337, packet.limit());
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3);
assertTrue(offerPacket instanceof DhcpOfferPacket); // Implicitly checks it's non-null.
DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("192.168.43.247/24", "192.168.43.1", "192.168.43.1",
- null, "192.168.43.1", "ANDROID_METERED", 3600, true, 0, dhcpResults);
+ null, "192.168.43.1", "dhcp.android.com", "ANDROID_METERED", 3600, true, 0,
+ dhcpResults);
assertTrue(dhcpResults.hasMeteredHint());
}
@@ -588,11 +595,12 @@ public class DhcpPacketTest {
assertTrue(offerPacket instanceof DhcpOfferPacket); // Implicitly checks it's non-null.
DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("192.168.159.247/20", "192.168.159.254", "8.8.8.8,8.8.4.4",
- null, "192.168.144.3", null, 7200, false, expectedMtu, dhcpResults);
+ null, "192.168.144.3", "", null, 7200, false, expectedMtu, dhcpResults);
}
@Test
public void testMtu() throws Exception {
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header.
"451001480000000080118849c0a89003c0a89ff7" +
@@ -613,6 +621,7 @@ public class DhcpPacketTest {
// Options
"638253633501023604c0a89003330400001c200104fffff0000304c0a89ffe06080808080808080404" +
"3a0400000e103b040000189cff00000000"));
+ // CHECKSTYLE:ON Generated code
checkMtu(packet, 0, null);
checkMtu(packet, 0, mtuBytes(1501));
@@ -629,6 +638,7 @@ public class DhcpPacketTest {
@Test
public void testBadHwaddrLength() throws Exception {
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header.
"450001518d0600004011144dc0a82b01c0a82bf7" +
@@ -649,6 +659,7 @@ public class DhcpPacketTest {
// Options
"638253633501023604c0a82b01330400000e103a04000007083b0400000c4e0104ffffff00" +
"1c04c0a82bff0304c0a82b010604c0a82b012b0f414e44524f49445f4d455445524544ff"));
+ // CHECKSTYLE:ON Generated code
String expectedClientMac = "30766FF2A90C";
final int hwAddrLenOffset = 20 + 8 + 2;
@@ -705,6 +716,7 @@ public class DhcpPacketTest {
// store any information in the overloaded fields).
//
// For now, we just check that it parses correctly.
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header.
"b4cef6000000e80462236e300800" +
@@ -727,16 +739,18 @@ public class DhcpPacketTest {
// Options
"638253633501023604010101010104ffff000033040000a8c03401030304ac1101010604ac110101" +
"0000000000000000000000000000000000000000000000ff000000"));
+ // CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
assertTrue(offerPacket instanceof DhcpOfferPacket);
DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("172.17.152.118/16", "172.17.1.1", "172.17.1.1",
- null, "1.1.1.1", null, 43200, false, 0, dhcpResults);
+ null, "1.1.1.1", "", null, 43200, false, 0, dhcpResults);
}
@Test
public void testBug2111() throws Exception {
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header.
"4500014c00000000ff119beac3eaf3880a3f5d04" +
@@ -757,16 +771,18 @@ public class DhcpPacketTest {
// Options.
"638253633501023604c00002fe33040000bfc60104fffff00003040a3f50010608c0000201c0000202" +
"0f0f646f6d61696e3132332e636f2e756b0000000000ff00000000"));
+ // CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3);
assertTrue(offerPacket instanceof DhcpOfferPacket);
DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("10.63.93.4/20", "10.63.80.1", "192.0.2.1,192.0.2.2",
- "domain123.co.uk", "192.0.2.254", null, 49094, false, 0, dhcpResults);
+ "domain123.co.uk", "192.0.2.254", "", null, 49094, false, 0, dhcpResults);
}
@Test
public void testBug2136() throws Exception {
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header.
"bcf5ac000000d0c7890000000800" +
@@ -789,17 +805,19 @@ public class DhcpPacketTest {
// Options.
"6382536335010236040a20ff80330400001c200104fffff00003040a20900106089458413494584135" +
"0f0b6c616e63732e61632e756b000000000000000000ff00000000"));
+ // CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
assertTrue(offerPacket instanceof DhcpOfferPacket);
assertEquals("BCF5AC000000", HexDump.toHexString(offerPacket.getClientMac()));
DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("10.32.158.205/20", "10.32.144.1", "148.88.65.52,148.88.65.53",
- "lancs.ac.uk", "10.32.255.128", null, 7200, false, 0, dhcpResults);
+ "lancs.ac.uk", "10.32.255.128", "", null, 7200, false, 0, dhcpResults);
}
@Test
public void testUdpServerAnySourcePort() throws Exception {
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header.
"9cd917000000001c2e0000000800" +
@@ -823,6 +841,7 @@ public class DhcpPacketTest {
// Options.
"6382536335010236040a0169fc3304000151800104ffff000003040a0fc817060cd1818003d1819403" +
"d18180060f0777766d2e6564751c040a0fffffff000000"));
+ // CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
assertTrue(offerPacket instanceof DhcpOfferPacket);
@@ -830,11 +849,12 @@ public class DhcpPacketTest {
DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("10.15.122.242/16", "10.15.200.23",
"209.129.128.3,209.129.148.3,209.129.128.6",
- "wvm.edu", "10.1.105.252", null, 86400, false, 0, dhcpResults);
+ "wvm.edu", "10.1.105.252", "", null, 86400, false, 0, dhcpResults);
}
@Test
public void testUdpInvalidDstPort() throws Exception {
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header.
"9cd917000000001c2e0000000800" +
@@ -858,6 +878,7 @@ public class DhcpPacketTest {
// Options.
"6382536335010236040a0169fc3304000151800104ffff000003040a0fc817060cd1818003d1819403" +
"d18180060f0777766d2e6564751c040a0fffffff000000"));
+ // CHECKSTYLE:ON Generated code
try {
DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
@@ -867,6 +888,7 @@ public class DhcpPacketTest {
@Test
public void testMultipleRouters() throws Exception {
+ // CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header.
"fc3d93000000" + "081735000000" + "0800" +
@@ -889,13 +911,14 @@ public class DhcpPacketTest {
// Options.
"638253633501023604c0abbd023304000070803a04000038403b04000062700104ffffff00" +
"0308c0a8bd01ffffff0006080808080808080404ff000000000000"));
+ // CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
assertTrue(offerPacket instanceof DhcpOfferPacket);
assertEquals("FC3D93000000", HexDump.toHexString(offerPacket.getClientMac()));
DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("192.168.189.49/24", "192.168.189.1", "8.8.8.8,8.8.4.4",
- null, "192.171.189.2", null, 28800, false, 0, dhcpResults);
+ null, "192.171.189.2", "", null, 28800, false, 0, dhcpResults);
}
@Test
diff --git a/packages/PackageInstaller/TEST_MAPPING b/packages/PackageInstaller/TEST_MAPPING
index 42aa47cab154..5d7b9bb36f75 100644
--- a/packages/PackageInstaller/TEST_MAPPING
+++ b/packages/PackageInstaller/TEST_MAPPING
@@ -1,5 +1,5 @@
{
- "presubmit": [
+ "postsubmit": [
{
"name": "CtsPackageInstallTestCases",
"options": [
diff --git a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml
index d6dc211ad8c4..263c16b0749c 100644
--- a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml
+++ b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml
@@ -15,9 +15,13 @@
limitations under the License.
-->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:paddingMode="stack">
- <item>
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingMode="stack">
+
+ <item
+ android:top="8dp"
+ android:bottom="8dp">
<shape>
<corners
android:radius="20dp"/>
diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml
index d41aa6d1081f..6840f9c7c5f0 100644
--- a/packages/SettingsLib/res/values-lo/arrays.xml
+++ b/packages/SettingsLib/res/values-lo/arrays.xml
@@ -64,7 +64,7 @@
<item msgid="8719029132154020716">"ເປີດໃຊ້ແລ້ວ"</item>
</string-array>
<string-array name="bluetooth_avrcp_versions">
- <item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
+ <item msgid="5347678900838034763">"AVRCP 1.4 (ຄ່າ​ເລີ່ມ​ຕົ້ນ)"</item>
<item msgid="2809759619990248160">"AVRCP 1.3"</item>
<item msgid="6199178154704729352">"AVRCP 1.5"</item>
<item msgid="5172170854953034852">"AVRCP 1.6"</item>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 48bcbd47b2a4..6121f037ff32 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -214,8 +214,8 @@
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM திறத்தலை அனுமதிக்கவா?"</string>
<string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"எச்சரிக்கை: இந்த அமைப்பு இயக்கப்பட்டிருக்கும்போது, சாதன பாதுகாப்பு அம்சங்கள் இந்தச் சாதனத்தில் இயங்காது."</string>
<string name="mock_location_app" msgid="7966220972812881854">"போலி இருப்பிடப் பயன்பாட்டைத் தேர்ந்தெடு"</string>
- <string name="mock_location_app_not_set" msgid="809543285495344223">"போலி இருப்பிடப் பயன்பாடு அமைக்கப்படவில்லை"</string>
- <string name="mock_location_app_set" msgid="8966420655295102685">"போலி இருப்பிடப் பயன்பாடு: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="mock_location_app_not_set" msgid="809543285495344223">"போலி இருப்பிடப் ஆப்ஸ் அமைக்கப்படவில்லை"</string>
+ <string name="mock_location_app_set" msgid="8966420655295102685">"போலி இருப்பிடப் ஆப்ஸ்: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="debug_networking_category" msgid="7044075693643009662">"நெட்வொர்க்கிங்"</string>
<string name="wifi_display_certification" msgid="8611569543791307533">"வயர்லெஸ் காட்சிக்கான சான்றிதழ்"</string>
<string name="wifi_verbose_logging" msgid="4203729756047242344">"வைஃபை அதிவிவர நுழைவை இயக்கு"</string>
@@ -270,17 +270,17 @@
<string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"பெயர்கள் இல்லாத புளூடூத் சாதனங்கள் (MAC முகவரிகள் மட்டும்) காட்டப்படும்"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"மிகவும் அதிகமான ஒலியளவு அல்லது கட்டுப்பாடு இழப்பு போன்ற தொலைநிலைச் சாதனங்களில் ஏற்படும் ஒலி தொடர்பான சிக்கல்கள் இருக்கும் சமயங்களில், புளூடூத் அப்சல்யூட் ஒலியளவு அம்சத்தை முடக்கும்."</string>
<string name="enable_terminal_title" msgid="95572094356054120">"அக முனையம்"</string>
- <string name="enable_terminal_summary" msgid="67667852659359206">"அக ஷெல் அணுகலை வழங்கும் இறுதிப் பயன்பாட்டை இயக்கு"</string>
+ <string name="enable_terminal_summary" msgid="67667852659359206">"அக ஷெல் அணுகலை வழங்கும் இறுதிப் ஆப்ஸை இயக்கு"</string>
<string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP சரிபார்ப்பு"</string>
<string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP சரிபார்க்கும் செயல்பாடுகளை அமை"</string>
<string name="debug_debugging_category" msgid="6781250159513471316">"பிழைதிருத்தம்"</string>
<string name="debug_app" msgid="8349591734751384446">"பிழைத்திருத்தப் பயன்பாட்டைத் தேர்ந்தெடுக்கவும்"</string>
- <string name="debug_app_not_set" msgid="718752499586403499">"பிழைத்திருத்தப் பயன்பாடு அமைக்கப்படவில்லை"</string>
- <string name="debug_app_set" msgid="2063077997870280017">"பிழைதிருத்தும் பயன்பாடு: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="debug_app_not_set" msgid="718752499586403499">"பிழைத்திருத்தப் ஆப்ஸ் அமைக்கப்படவில்லை"</string>
+ <string name="debug_app_set" msgid="2063077997870280017">"பிழைதிருத்தும் ஆப்ஸ்: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="select_application" msgid="5156029161289091703">"பயன்பாட்டைத் தேர்ந்தெடுக்கவும்"</string>
<string name="no_application" msgid="2813387563129153880">"ஒன்றுமில்லை"</string>
<string name="wait_for_debugger" msgid="1202370874528893091">"பிழைதிருத்திக்குக் காத்திருக்கவும்"</string>
- <string name="wait_for_debugger_summary" msgid="1766918303462746804">"பிழைதிருத்தப்பட்ட பயன்பாடு செயல்படுவதற்கு முன்பு பிழைதிருத்தியை இணைப்பதற்குக் காத்திருக்கிறது"</string>
+ <string name="wait_for_debugger_summary" msgid="1766918303462746804">"பிழைதிருத்தப்பட்ட ஆப்ஸ் செயல்படுவதற்கு முன்பு பிழைதிருத்தியை இணைப்பதற்குக் காத்திருக்கிறது"</string>
<string name="debug_input_category" msgid="1811069939601180246">"உள்ளீடு"</string>
<string name="debug_drawing_category" msgid="6755716469267367852">"வரைபொருள்"</string>
<string name="debug_hw_drawing_category" msgid="6220174216912308658">"வன்பொருள் முடுக்கத்துடன் கூடிய காட்சியாக்கம்"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index aad9e7968e0a..4c72f48da87f 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -77,6 +77,8 @@
<!-- Summary for the remembered network. -->
<string name="wifi_remembered">Saved</string>
+ <!-- Summary for the disconnected network. [CHAR LIMIT=40] -->
+ <string name="wifi_disconnected">Disconnected</string>
<!-- Status for networks disabled for unknown reason -->
<string name="wifi_disabled_generic">Disabled</string>
<!-- Status for networked disabled from a DNS or DHCP failure -->
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 34d11b5ecbbc..02bcc099a70d 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -968,6 +968,13 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
public String getSettingsSummary() {
+ return getSettingsSummary(false /*convertSavedAsDisconnected*/);
+ }
+
+ /**
+ * Returns the summary for the AccessPoint.
+ */
+ public String getSettingsSummary(boolean convertSavedAsDisconnected) {
// Update to new summary
StringBuilder summary = new StringBuilder();
@@ -1033,8 +1040,13 @@ public class AccessPoint implements Comparable<AccessPoint> {
R.string.wifi_ap_unable_to_handle_new_sta));
break;
default:
- // "Saved"
- summary.append(mContext.getString(R.string.wifi_remembered));
+ if (convertSavedAsDisconnected) {
+ // Disconnected
+ summary.append(mContext.getString(R.string.wifi_disconnected));
+ } else {
+ // "Saved"
+ summary.append(mContext.getString(R.string.wifi_remembered));
+ }
break;
}
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 8e4027164587..af4704c3618e 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -516,6 +516,30 @@ public class AccessPointTest {
}
@Test
+ public void testSummaryString_showsDisconnected() {
+ AccessPoint ap = createAccessPointWithScanResultCache();
+ ap.update(new WifiConfiguration());
+
+ assertThat(ap.getSettingsSummary(true /*convertSavedAsDisconnected*/))
+ .isEqualTo(mContext.getString(R.string.wifi_disconnected));
+ }
+
+ @Test
+ public void testSummaryString_concatenatedMeteredAndDisconnected() {
+ AccessPoint ap = createAccessPointWithScanResultCache();
+ WifiConfiguration config = new WifiConfiguration();
+ config.meteredHint = true;
+ ap.update(config);
+
+ String expectedString =
+ mContext.getResources().getString(R.string.preference_summary_default_combination,
+ mContext.getString(R.string.wifi_metered_label),
+ mContext.getString(R.string.wifi_disconnected));
+ assertThat(ap.getSettingsSummary(true /*convertSavedAsDisconnected*/))
+ .isEqualTo(expectedString);
+ }
+
+ @Test
public void testSummaryString_showsConnectedViaSuggestionOrSpecifierApp() throws Exception {
final int rssi = -55;
final String appPackageName = "com.test.app";
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 9140d1d5416f..55f84f805964 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -41,7 +41,7 @@
<string name="keyguard_low_battery" msgid="9218432555787624490">"Conecta o cargador."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Preme Menú para desbloquear."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Bloqueada pola rede"</string>
- <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Non hai ningunha tarxeta SIM"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Sen tarxeta SIM"</string>
<string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Non hai ningunha tarxeta SIM na tableta."</string>
<string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Non hai ningunha tarxeta SIM no teléfono."</string>
<string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insire unha tarxeta SIM."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sw320dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw320dp/dimens.xml
deleted file mode 100644
index 91ca5c52c015..000000000000
--- a/packages/SystemUI/res-keyguard/values-sw320dp/dimens.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/assets/res/any/dimens.xml
-**
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
-
- <!-- Height of the sliding KeyguardSecurityContainer
- (includes 2x keyguard_security_view_top_margin) -->
- <dimen name="keyguard_security_height">395dp</dimen>
-
-</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sw360dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw360dp/dimens.xml
deleted file mode 100644
index d7c9975ada41..000000000000
--- a/packages/SystemUI/res-keyguard/values-sw360dp/dimens.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/assets/res/any/dimens.xml
-**
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
-
- <!-- Height of the sliding KeyguardSecurityContainer (includes 2x
- keyguard_security_view_top_margin) -->
- <dimen name="keyguard_security_height">450dp</dimen>
-</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 2a3669486d0b..db23ccced316 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -34,8 +34,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"தவறான பின் குறியீடு."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"செல்லாத சிம் கார்டு."</string>
<string name="keyguard_charged" msgid="3316115607283493413">"முழுவதுமாகச் சார்ஜ் ஆகிவிட்டது"</string>
- <!-- no translation found for keyguard_plugged_in_wireless (8404159927155454732) -->
- <skip />
+ <string name="keyguard_plugged_in_wireless" msgid="8404159927155454732">"<xliff:g id="PERCENTAGE">%s</xliff:g> • வயர்லெஸ் முறையில் சார்ஜாகிறது"</string>
<string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • சார்ஜாகிறது"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • வேகமாகச் சார்ஜாகிறது"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • மெதுவாகச் சார்ஜாகிறது"</string>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index d67c98a337e8..d8f543f1f710 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -27,11 +27,11 @@
<!-- Height of the sliding KeyguardSecurityContainer
(includes 2x keyguard_security_view_top_margin) -->
- <dimen name="keyguard_security_height">450dp</dimen>
+ <dimen name="keyguard_security_height">420dp</dimen>
<!-- Max Height of the sliding KeyguardSecurityContainer
(includes 2x keyguard_security_view_top_margin) -->
- <dimen name="keyguard_security_max_height">505dp</dimen>
+ <dimen name="keyguard_security_max_height">450dp</dimen>
<!-- Margin around the various security views -->
<dimen name="keyguard_security_view_top_margin">8dp</dimen>
diff --git a/packages/SystemUI/res/layout-land/volume_dialog.xml b/packages/SystemUI/res/layout-land/volume_dialog.xml
index c420117073c5..5da7819c3d76 100644
--- a/packages/SystemUI/res/layout-land/volume_dialog.xml
+++ b/packages/SystemUI/res/layout-land/volume_dialog.xml
@@ -22,7 +22,7 @@
android:gravity="right"
android:layout_gravity="right"
android:background="@android:color/transparent"
- android:theme="@style/volume_dialog_theme">
+ android:theme="@style/qs_theme">
<FrameLayout
android:id="@+id/volume_dialog"
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index a90b1eb471ff..7d6547b9cd42 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -22,7 +22,7 @@
android:gravity="right"
android:layout_gravity="right"
android:background="@android:color/transparent"
- android:theme="@style/volume_dialog_theme">
+ android:theme="@style/qs_theme">
<!-- right-aligned to be physically near volume button -->
<LinearLayout
diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml
index b9efc5be70c1..6128da8627a9 100644
--- a/packages/SystemUI/res/layout/volume_dialog_row.xml
+++ b/packages/SystemUI/res/layout/volume_dialog_row.xml
@@ -20,7 +20,7 @@
android:layout_width="@dimen/volume_dialog_panel_width"
android:clipChildren="false"
android:clipToPadding="false"
- android:theme="@style/volume_dialog_theme">
+ android:theme="@style/qs_theme">
<LinearLayout
android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 133b14e2e289..e01870682548 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Maak geluid en wys op aftrekskerm, statusbalk en op sluitskerm."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Hierdie kennisgewings kan nie gewysig word nie."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Hierdie groep kennisgewings kan nie hier opgestel word nie"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Hierdie program gebruik tans die kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Hierdie program gebruik tans die mikrofoon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Hierdie program wys tans bo-oor ander programme op jou skerm."</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 46ede8679376..8a390cbf5155 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -646,7 +646,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"በወደ ታች ተጎታች ዝርዝር ጥላ እና በማያ ገጽ መቆለፊያ ውስጥ ድምፅን እና ማሳያዎችን ፍጠር።"</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"የማሳወቂያዎች ይህ ቡድን እዚህ ላይ ሊዋቀር አይችልም"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"በ<xliff:g id="APP_NAME">%1$s</xliff:g> በኩል"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ይህ መተግበሪያ ካሜራውን እየተጠቀመ ነው።"</string>
<string name="appops_microphone" msgid="741508267659494555">"ይህ መተግበሪያ ማይክሮፎኑን እየተጠቀመ ነው።"</string>
<string name="appops_overlay" msgid="6165912637560323464">"ይህ መተግበሪያ በማያ ገጽዎ ላይ ባሉ ሌሎች መተግበሪያዎች ላይ እያሳየ ነው።"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 7b0102ef1277..84c9332c1efa 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -648,24 +648,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"متابعة إرسال التنبيهات"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"إيقاف الإشعارات"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"هل تريد الاستمرار في تلقي إشعارات من هذا التطبيق؟"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"الإشعارات الهادئة"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"له الأولوية"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"كتم الصوت دائمًا: يظهر هذا الإعداد في خيار منسدل."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"كتم الصوت دائمًا: سيظهر هذا الإعداد في خيار منسدل وفي شريط الحالة."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"كتم الصوت دائمًا: يظهر هذا الاختيار في خيار منسدِل وعلى شاشة التأمين."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"كتم الصوت دائمًا: يظهر هذا الإعداد في خيار منسدل وفي شريط الحالة وفي شاشة التأمين."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"ستسمع صوتًا وسيظهر لك هذا الإعداد في خيار منسدل وفي شريط الحالة وفي شاشة التأمين."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"يتعذّر تعديل هذه الإشعارات."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"يتعذّر ضبط مجموعة الإشعارات هذه هنا."</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"عبر <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"يستخدم هذا التطبيق الكاميرا."</string>
<string name="appops_microphone" msgid="741508267659494555">"يستخدم هذا التطبيق الميكروفون."</string>
<string name="appops_overlay" msgid="6165912637560323464">"يتم عرض هذا التطبيق فوق التطبيقات الأخرى على شاشتك."</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 42708df227f2..b42a2c63ba6b 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"সতৰ্ক কৰি থাকক"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"জাননী অফ কৰক"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"এই এপটোৰ জাননী দেখুওৱাই থাকিব লাগিবনে?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"সাধাৰণ"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"অগ্ৰাধিকাৰপ্ৰাপ্ত"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"সদায় নিৰৱ। পুল ডাউন শ্বেডত প্ৰদর্শন কৰে।"</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"সদায় নিৰৱ। পুল ডাউন শ্বেড &amp; স্থিতিৰ দণ্ডত প্ৰদর্শন কৰে।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"সদায় নিৰৱ। পুল ডাউন শ্বেড &amp; লক স্ক্ৰীণত প্ৰদর্শন কৰে।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"সদায় নিৰৱ। পুল ডাউন শ্বেড, স্থিতি দণ্ড &amp; লক স্ক্ৰীণত প্ৰদর্শন কৰে।"</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"শব্দ কৰে আৰু পুল ডাউন শ্বেড, স্থিতি দণ্ড &amp; লক স্ক্ৰীণত প্ৰদর্শন কৰে।"</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"এই ধৰণৰ জাননীবোৰ ইয়াত কনফিগাৰ কৰিব পৰা নাযায়"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জৰিয়তে"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"এই এপে কেমেৰা ব্য়ৱহাৰ কৰি আছে।"</string>
<string name="appops_microphone" msgid="741508267659494555">"এই এপে মাইক্ৰ\'ফ\'ন ব্য়ৱহাৰ কৰি আছে।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"এই এপটো আপোনাৰ স্ক্ৰীণত থকা অন্য় এপৰ ওপৰত প্ৰদৰ্শিত হৈ আছে।"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 0b9265c57549..a7aaca9b5b5f 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -330,7 +330,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktiv"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Heç bir Wi-Fi şəbəkəsi əlçatan deyil"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Aktiv edilir..."</string>
- <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screen Cast"</string>
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Ekran Paylaşımı"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Yayım"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Yayıma hazırdır"</string>
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Səsli rejimdə aşağı açılan ekran, status paneli və kilid ekranında görünür."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Bu bildirişlər dəyişdirilə bilməz."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Bu bildiriş qrupunu burada konfiqurasiya etmək olmaz"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> vasitəsilə"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Bu tətbiq kameradan istifadə edir."</string>
<string name="appops_microphone" msgid="741508267659494555">"Bu tətbiq mikrofondan istifadə edir."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Bu tətbiqdə ekranda digər tətbiqlərin üzərində göstərilir."</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index e09c7f224a11..2b06e89baa06 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -648,7 +648,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Prikazuje se na padajućoj traci, statusnoj traci i zaključanom ekranu uz zvučno obaveštenje."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Ova obaveštenja ne mogu da se menjaju."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Ova grupa obaveštenja ne može da se konfiguriše ovde"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"preko aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ova aplikacija koristi kameru."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ova aplikacija koristi mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ova aplikacija se prikazuje preko drugih aplikacija na ekranu."</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 967bcbe858da..6d8b5433573b 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -644,24 +644,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Апавяшчаць далей"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Выключыць апавяшчэнні"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Працягваць паказваць апавяшчэнні гэтай праграмы?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Ціхі рэжым"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Прыярытэтныя"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Заўсёды без гуку. Паказваецца на апушчанай шторцы."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Заўсёды без гуку. Паказваецца на апушчанай шторцы і на панэлі стану."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Заўсёды без гуку. Паказваецца на апушчанай шторцы і на экране блакіроўкі."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Заўсёды без гуку. Паказваецца на апушчанай шторцы, панэлі стану і на экране блакіроўкі."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Паказваецца з гукам на апушчанай шторцы, панэлі стану і на экране блакіроўкі."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Гэтыя апавяшчэнні можна змяніць."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Тут канфігурыраваць гэту групу апавяшчэнняў забаронена"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"праз праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Гэта праграма выкарыстоўвае камеру."</string>
<string name="appops_microphone" msgid="741508267659494555">"Гэта праграма выкарыстоўвае мікрафон."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Гэта праграма паказваецца на экране паверх іншых праграм."</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 697e6bf85a52..3c3a2e4df6c0 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Издава звук и се показва в падащия панел, лентата на състоянието и на заключения екран."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Тези известия не могат да бъдат променяни."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Тази група от известия не може да бъде конфигурирана тук"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"чрез <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Това приложение използва камерата."</string>
<string name="appops_microphone" msgid="741508267659494555">"Това приложение използва микрофона."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Това приложение се показва върху други приложения на екрана."</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 630f095eba00..2cd48a31d249 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"বিজ্ঞপ্তি পান"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"বিজ্ঞপ্তি বন্ধ করুন"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"এই অ্যাপের বিজ্ঞপ্তি পরেও দেখে যেতে চান?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"সাইলেন্ট মোডে"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"অগ্রাধিকার দেওয়া হয়েছে"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"সবসময় নীরব। পুল-ডাউন শেডে দেখানো হয়।"</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"সবসময় নীরব। পুল-ডাউন শেড ও স্ট্যাটাস বারে দেখানো হয়।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"সবসময় নীরব। পুল-ডাউন শেড ও লক স্ক্রিনে দেখানো হয়।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"সবসময় নীরব। পুল-ডাউন শেড, স্ট্যাটাস বার ও লক স্ক্রিনে দেখানো হয়।"</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"শব্দ করে এবং পুল-ডাউন শেড, স্ট্যাটাস বার ও লক স্ক্রিনে দেখানো হয়।"</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"এই সমস্ত বিজ্ঞপ্তিকে এখানে কনফিগার করা যাবে না"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর মাধ্যমে"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"এই অ্যাপটি ক্যামেরা ব্যবহার করছে।"</string>
<string name="appops_microphone" msgid="741508267659494555">"এই অ্যাপটি মাইক্রোফোন ব্যবহার করছে।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"এই অ্যাপটি স্ক্রিনে অন্যান্য অ্যাপের উপরে দেখানো হচ্ছে।"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 889c146e168b..8944a47872ec 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -650,7 +650,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Prikazuje se na padajućoj traci, statusnoj traci i zaključanom ekranu uz zvučno obavještenje."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Ta obavještenja se ne mogu izmijeniti."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Ovdje nije moguće konfigurirati ovu grupu obavještenja"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"preko aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ova aplikacija koristi kameru."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ova aplikacija koristi mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ova aplikacija prekriva druge aplikacije na ekranu."</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 50edad91c150..fdf34fa1d436 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Emet un so i es mostra a l\'àrea de notificacions, la barra d\'estat i la pantalla de bloqueig."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Aquestes notificacions no es poden modificar."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Aquest grup de notificacions no es pot configurar aquí"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"mitjançant <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Aquesta aplicació utilitza la càmera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Aquesta aplicació utilitza el micròfon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Aquesta aplicació es mostra sobre altres aplicacions a la pantalla."</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 0486bfcfc07e..9b0ea5c92146 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -642,24 +642,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Dál upozorňovat"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Vypnout oznámení"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Mají se oznámení z této aplikace nadále zobrazovat?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Nenápadná"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Prioritní"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Vždy tichý režim. Zobrazí se na vysouvacím panelu."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Vždy tichý režim. Zobrazí se na vysouvacím panelu a stavovém řádku."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Vždy tichý režim. Zobrazí se na vysouvacím panelu a obrazovce uzamčení."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Vždy tichý režim. Zobrazí se na vysouvacím panelu, stavovém řádku a obrazovce uzamčení."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Vydá zvuk a zobrazí se na vysouvacím panelu, stavovém řádku a obrazovce uzamčení."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Tato oznámení nelze upravit."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Tuto skupinu oznámení tady nelze nakonfigurovat"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"prostřednictvím aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Tato aplikace využívá fotoaparát."</string>
<string name="appops_microphone" msgid="741508267659494555">"Tato aplikace využívá mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Tato aplikace se zobrazuje přes ostatní aplikace na obrazovce."</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 8a43913e078a..53e47bb524a1 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Laver lyd og vises i panelet, der trækkes ned, i statusbjælken og på låseskærmen."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Disse notifikationer kan ikke redigeres."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Du kan ikke konfigurere denne gruppe notifikationer her"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Denne app anvender kameraet."</string>
<string name="appops_microphone" msgid="741508267659494555">"Denne app anvender mikrofonen."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Denne app vises over andre apps på din skærm."</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index ebb22f3550cd..8e2698560404 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -640,24 +640,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Weiterhin Benachrichtigungen senden"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Benachrichtigungen deaktivieren"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Benachrichtigungen dieser App weiterhin anzeigen?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Stumm"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Priorisiert"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Immer lautlos. Benachrichtigungen erscheinen in der Benachrichtigungsleiste."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Immer lautlos. Benachrichtigungen erscheinen in der Benachrichtigungsleiste und der Statusleiste."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Immer lautlos. Benachrichtigungen erscheinen in der Benachrichtigungsleiste und auf dem Sperrbildschirm."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Immer lautlos. Benachrichtigungen erscheinen in der Benachrichtigungsleiste, der Statusleiste und auf dem Sperrbildschirm."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Akustisches Signal ertönt. Benachrichtigungen erscheinen in der Benachrichtigungsleiste, der Statusleiste und auf dem Sperrbildschirm."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Diese Benachrichtigungen können nicht geändert werden."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Die Benachrichtigungsgruppe kann hier nicht konfiguriert werden"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"über <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Diese App verwendet die Kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Diese App verwendet das Mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Diese App wird über anderen Apps auf dem Bildschirm angezeigt."</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 249db683d49a..39ba9a4de387 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Παράγει ήχο και εμφανίζεται στο αναπτυσσόμενο πλαίσιο σκίασης, τη γραμμή κατάστασης και την οθόνη κλειδώματος."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Δεν είναι δυνατή η διαμόρφωση αυτής της ομάδας ειδοποιήσεων εδώ"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"μέσω <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Αυτή η εφαρμογή χρησιμοποιεί την κάμερα."</string>
<string name="appops_microphone" msgid="741508267659494555">"Αυτή η εφαρμογή χρησιμοποιεί το μικρόφωνο."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Αυτή η εφαρμογή εμφανίζεται πάνω σε άλλες εφαρμογές στην οθόνη σας."</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 1811fcf8a828..ec4afedde70f 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Makes sound and displays in pull-down shade, status bar &amp; on lock screen."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"This group of notifications cannot be configured here"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index a767e29ac110..2bc17995d50b 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Makes sound and displays in pull-down shade, status bar &amp; on lock screen."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"This group of notifications cannot be configured here"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 1811fcf8a828..ec4afedde70f 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Makes sound and displays in pull-down shade, status bar &amp; on lock screen."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"This group of notifications cannot be configured here"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 1811fcf8a828..ec4afedde70f 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Makes sound and displays in pull-down shade, status bar &amp; on lock screen."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"This group of notifications cannot be configured here"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index a895189e9ca5..e771489fa07a 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -645,7 +645,7 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‎‏‎Makes sound and displays in pull-down shade, status bar &amp; on lock screen.‎‏‎‎‏‎"</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎These notifications can\'t be modified.‎‏‎‎‏‎"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‎‎This group of notifications cannot be configured here‎‏‎‎‏‎"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎via ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="notification_delegate_header" msgid="2857691673814814270">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎Proxied notification‎‏‎‎‏‎"</string>
<string name="appops_camera" msgid="8100147441602585776">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎This app is using the camera.‎‏‎‎‏‎"</string>
<string name="appops_microphone" msgid="741508267659494555">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‏‏‎This app is using the microphone.‎‏‎‎‏‎"</string>
<string name="appops_overlay" msgid="6165912637560323464">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎This app is displaying over other apps on your screen.‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 35f2f6959101..ba27321b5d0c 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Seguir recibiendo alertas"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Desactivar notificaciones"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"¿Quieres seguir viendo las notificaciones de esta app?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Silenciosa"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Prioritaria"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Siempre en silencio. Se muestra en un banner desplegable."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Siempre en silencio. Se muestra en un banner desplegable y la barra de estado."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Siempre en silencio. Se muestra en un banner desplegable y la pantalla bloqueada."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Siempre en silencio. Se muestra en un banner desplegable, la barra de estado y la pantalla bloqueada."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Reproduce sonido y se muestra en un banner desplegable, la barra de estado y la pantalla bloqueada."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"No se pueden modificar estas notificaciones."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"No se puede configurar aquí este grupo de notificaciones"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"por medio de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Esta app está usando la cámara."</string>
<string name="appops_microphone" msgid="741508267659494555">"Esta app está usando el micrófono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Esta app se muestra sobre otras apps en la pantalla."</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 412dfaf30e26..2788c419d2af 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Emite un sonido y se muestra en el desplegable, en la barra de estado y en la pantalla de bloqueo."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Estas notificaciones no se pueden modificar."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Este grupo de notificaciones no se puede configurar aquí"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"mediante <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Esta aplicación está usando la cámara."</string>
<string name="appops_microphone" msgid="741508267659494555">"Esta aplicación está usando el micrófono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Esta aplicación se está mostrando sobre otras aplicaciones en tu pantalla."</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 8561e016f2e4..8f787182caad 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Kostub heli, kuvatakse allatõmmatavas menüüs, olekuribal ja lukustuskuval."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Neid märguandeid ei saa muuta."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Seda märguannete rühma ei saa siin seadistada"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> kaudu"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"See rakendus kasutab kaamerat."</string>
<string name="appops_microphone" msgid="741508267659494555">"See rakendus kasutab mikrofoni."</string>
<string name="appops_overlay" msgid="6165912637560323464">"See rakendus kuvatakse teie ekraanil muude rakenduste peal."</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 256831267d98..448eb4eb6c2f 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -377,7 +377,7 @@
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Aldatu ikuspegi orokorra"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kargatuta"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Kargatzen"</string>
- <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> falta zaizkio guztiz kargatzeko"</string>
+ <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> falta zaizkio guztiz kargatu arte"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"Ez da kargatzen ari"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Baliteke sarea\nkontrolatuta egotea"</string>
<string name="description_target_search" msgid="3091587249776033139">"Bilatu"</string>
@@ -404,10 +404,10 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Isiltasun\nosoa"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Lehentasunezkoak\nsoilik"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarmak\nsoilik"</string>
- <string name="keyguard_indication_charging_time_wireless" msgid="6959284458466962592">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hari gabe kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> bete arte)"</string>
- <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatzeko)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Bizkor kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatzeko)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mantso kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatzeko)"</string>
+ <string name="keyguard_indication_charging_time_wireless" msgid="6959284458466962592">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hari gabe kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatu arte)"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatu arte)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Bizkor kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatu arte)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mantso kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatu arte)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Aldatu erabiltzailea"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Aldatu erabiltzailez. <xliff:g id="CURRENT_USER_NAME">%s</xliff:g> da saioa hasita duena."</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Uneko erabiltzailea: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Jarraitu jakinarazpenak bidaltzen"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Desaktibatu jakinarazpenak"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Aplikazio honen jakinarazpenak erakusten jarraitzea nahi duzu?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Jakinarazi soinurik gabe"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Lehentasunezkoa"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Beti isilik. Jakinarazpenen panelean bistaratzen da."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Beti isilik. Jakinarazpenen panelean eta egoera-barran bistaratzen da."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Beti isilik. Jakinarazpenen panelean eta pantaila blokeatuan bistaratzen da."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Beti isilik. Jakinarazpenen panelean, egoera-barran eta pantaila blokeatuan bistaratzen da."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Soinua jotzen du, eta jakinarazpenen panelean, egoera-barran eta pantaila blokeatuan bistaratzen da."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Jakinarazpen horiek ezin dira aldatu."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Jakinarazpen talde hau ezin da konfiguratu hemen"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren bidez"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Kamera erabiltzen ari da aplikazioa."</string>
<string name="appops_microphone" msgid="741508267659494555">"Mikrofonoa erabiltzen ari da aplikazioa."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Pantailako beste aplikazioen gainean agertzen da aplikazioa."</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 147eb42a9058..3bfa0515ad9e 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"همچنان اطلاع داده شود"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"خاموش کردن اعلان‌ها"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"نمایش اعلان از این برنامه ادامه یابد؟"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"آرام"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"دراولویت"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"همیشه بی‌صدا. در کشوی اعلان‌های پایین‌کش نشان داده می‌شود."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"همیشه بی‌صدا. در کشوی اعلان‌های پایین‌کش و نوار وضعیت نشان داده می‌شود."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"همیشه بی‌صدا. در کشوی اعلان‌های پایین‌کش و در صفحه قفل نشان داده می‌شود."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"همیشه بی‌صدا. در کشوی اعلان‌های پایین‌کش، نوار وضعیت در صفحه قفل نشان داده می‌شود."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"صدا پخش می‌شود و در کشوی اعلان‌های پایین‌کش، نوار وضعیت و در صفحه قفل نشان داده می‌شود."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"این اعلان‌ها قابل اصلاح نیستند."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"نمی‌توانید این گروه اعلان‌ها را در اینجا پیکربندی کنید"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"ازطریق <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"این برنامه از دوربین استفاده می‌کند."</string>
<string name="appops_microphone" msgid="741508267659494555">"این برنامه از میکروفون استفاده می‌کند."</string>
<string name="appops_overlay" msgid="6165912637560323464">"این برنامه روی برنامه‌های دیگر در صفحه‌نمایش نشان داده می‌شود."</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index af0e7e445984..bdd57694c3c7 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Äänellinen ilmoitus näkyy vedettävällä ilmoitusalueella, tilapalkissa ja lukitusnäytöllä."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Näitä ilmoituksia ei voi muokata"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Tätä ilmoitusryhmää ei voi määrittää tässä"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Tämä sovellus käyttää kameraa."</string>
<string name="appops_microphone" msgid="741508267659494555">"Tämä sovellus käyttää mikrofonia."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Tämä sovellus näkyy näytöllä muiden sovellusten päällä."</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 7a1aecd083f4..0837ddcc8af4 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuer d\'envoyer des alertes"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Désactiver les notifications"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer à afficher les notifications de cette application?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Discrètes"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Priorisées"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Toujours silencieux. S\'affiche dans le volet déroulant."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Toujours silencieux. S\'affiche dans le volet déroulant et dans la barre d\'état."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Toujours silencieux. S\'affiche dans le volet déroulant et sur l\'écran de verrouillage."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Toujours silencieux. S\'affiche dans le volet déroulant, dans la barre d\'état et sur l\'écran de verrouillage."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Émet un son et s\'affiche dans le volet déroulant, dans la barre d\'état et sur l\'écran de verrouillage."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Ces notifications ne peuvent pas être modifiées"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Ce groupe de notifications ne peut pas être configuré ici"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Cette application utilise l\'appareil photo."</string>
<string name="appops_microphone" msgid="741508267659494555">"Cette application utilise le microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Cette application superpose du contenu par-dessus d\'autres applications à l\'écran."</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index a54efdb99df3..94a52222c8f0 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuer de m\'avertir"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Désactiver les notifications"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer d\'afficher les notifications de cette application ?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Discret"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Prioritaire"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Toujours silencieux. S\'affiche dans le volet des notifications."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Toujours silencieux. S\'affiche dans le volet des notifications et dans la barre d\'état."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Toujours silencieux. S\'affiche dans le volet des notifications et sur l\'écran de verrouillage."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Toujours silencieux. S\'affiche dans le volet des notifications, dans la barre d\'état et sur l\'écran de verrouillage."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Émet un son et s\'affiche dans le volet des notifications, dans la barre d\'état et sur l\'écran de verrouillage."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Impossible de modifier ces notifications."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Vous ne pouvez pas configurer ce groupe de notifications ici"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Cette application utilise la caméra."</string>
<string name="appops_microphone" msgid="741508267659494555">"Cette application utilise le micro."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Cette application se superpose aux autres applications sur l\'écran."</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 966a5db99743..76a8dd380bb9 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar recibindo notificacións"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Desactivar notificacións"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Queres seguir mostrando as notificacións desta aplicación?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Discretas"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Prioritarias"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Sempre en silencio. Móstrase na lista despregable."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Sempre en silencio. Móstrase na lista despregable e na barra de estado."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Sempre en silencio. Móstrase na lista despregable e na pantalla de bloqueo."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Sempre en silencio. Móstrase na lista despregable, na barra de estado e na pantalla de bloqueo."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Reproduce un son e móstrase na lista despregable, na barra de estado e na pantalla de bloqueo."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Estas notificacións non se poden modificar."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Aquí non se pode configurar este grupo de notificacións"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"mediante <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Esta aplicación está utilizando a cámara."</string>
<string name="appops_microphone" msgid="741508267659494555">"Esta aplicación está utilizando o micrófono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Esta aplicación móstrase sobre outras aplicacións da pantalla."</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 9c15fdeda974..a832a7b60ca2 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"અલર્ટ કરવાનું ચાલુ રાખો"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"નોટિફિકેશન બંધ કરો"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"આ ઍપમાંથી નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"સામાન્ય નોટિફિકેશન"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"મહત્ત્વના નોટિફિકેશન"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"હંમેશાં સાઇલન્ટ. નીચે દેખાતા શેડમાં બતાવવામાં આવશે."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"હંમેશાં સાઇલન્ટ. નીચે દેખાતા શેડમાં અને સ્ટેટસ બારમાં બતાવવામાં આવશે."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"હંમેશાં સાઇલન્ટ. નીચે દેખાતા શેડમાં અને લૉક સ્ક્રીનમાં બતાવવામાં આવશે."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"હંમેશાં સાઇલન્ટ. નીચે દેખાતા શેડ, સ્ટેટસ બાર અને લૉક સ્ક્રીનમાં બતાવવામાં આવશે."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"અવાજ કરશે અને નીચે દેખાતા શેડ, સ્ટેટસ બાર અને લૉક સ્ક્રીનમાં બતાવવામાં આવશે."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"નોટિફિકેશનના આ ગ્રૂપની ગોઠવણી અહીં કરી શકાશે નહીં"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> મારફતે"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"આ ઍપ કૅમેરાનો ઉપયોગ કરી રહી છે."</string>
<string name="appops_microphone" msgid="741508267659494555">"આ ઍપ માઇક્રોફોનનો ઉપયોગ કરી રહી છે."</string>
<string name="appops_overlay" msgid="6165912637560323464">"આ ઍપ તમારી સ્ક્રીન પરની અન્ય ઍપની ઉપર પ્રદર્શિત થઈ રહી છે."</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index b75b20fc2d2c..74e9cfeeecd3 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -41,7 +41,7 @@
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाई-फ़ाई"</string>
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"स्‍क्रीन अपने आप घुमाना"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"म्यूट करें"</string>
- <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"स्वत:"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ऑटो"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"सूचनाएं"</string>
<string name="bluetooth_tethered" msgid="7094101612161133267">"ब्लूटूथ टीदर किया गया"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"इनपुट का तरीका सेट करें"</string>
@@ -337,7 +337,7 @@
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"कोई डिवाइस उपलब्ध नहीं"</string>
<string name="quick_settings_cast_no_wifi" msgid="2696477881905521882">"वाई-फ़ाई कनेक्ट नहीं है"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"स्क्रीन की रोशनी"</string>
- <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"स्वत:"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ऑटो"</string>
<string name="quick_settings_inversion_label" msgid="8790919884718619648">"रंग उलटें"</string>
<string name="quick_settings_color_space_label" msgid="853443689745584770">"रंग सुधार मोड"</string>
<string name="quick_settings_more_settings" msgid="326112621462813682">"और सेटिंग"</string>
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"सूचना आने पर आवाज़ हाे और नीचे खींचने वाली सूची, स्टेटस बार और लॉक स्क्रीन पर भी दिखाई दे."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"ये सूचनाएं नहीं बदली जा सकती हैं."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"सूचनाओं के इस समूह को यहां कॉन्फ़िगर नहीं किया जा सकता"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> के ज़रिए"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"यह ऐप्लिकेशन कैमरे का इस्तेमाल कर रहा है."</string>
<string name="appops_microphone" msgid="741508267659494555">"यह ऐप्लिकेशन माइक्रोफ़ोन का इस्तेमाल कर रहा है."</string>
<string name="appops_overlay" msgid="6165912637560323464">"यह ऐप्लिकेशन आपकी स्क्रीन पर इस्तेमाल हो रहे दूसरे ऐप्लिकेशन के ऊपर दिखाया जा रहा है."</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 0a749b81da36..6a1b1c2ca96b 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -648,7 +648,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Prikazuje se na zaslonu obavijesti, traci statusa i zaključanom zaslonu uz zvučni signal."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Te se obavijesti ne mogu izmijeniti."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Ta se grupa obavijesti ne može konfigurirati ovdje"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"putem aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ova aplikacija upotrebljava kameru."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ova aplikacija upotrebljava mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ova se aplikacija prikazuje preko drugih aplikacija na zaslonu."</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index f1cde0a6cc70..11e49d162c86 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Hangot ad, és megjelenik a lehúzható értesítési felületen, az állapotsoron és a lezárási képernyőn."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Ezeket az értesítéseket nem lehet módosítani."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Az értesítések jelen csoportját itt nem lehet beállítani"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás használatával"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ez az alkalmazás használja a kamerát."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ez az alkalmazás használja a mikrofont."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ez az alkalmazás a képernyőn lévő egyéb alkalmazások előtt jelenik meg."</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index a441b75acd5b..949a5eb2a06d 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Ծանուցել"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Անջատել ծանուցումները"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Ցուցադրե՞լ ծանուցումներ այս հավելվածից։"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Անձայն"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Առաջնահերթ"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Միշտ անձայն: Ցուցադրվում է իջնող վահանակի վրա:"</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Միշտ անձայն: Ցուցադրվում է իջնող վահանակի վրա և կարգավիճակի գոտում:"</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Միշտ անձայն: Ցուցադրվում է իջնող վահանակի վրա և կողպէկրանին:"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Միշտ անձայն: Ցուցադրվում է իջնող վահանակի վրա, կարգավիճակի գոտում և կողպէկրանին:"</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Ձայն է արձակում և ցուցադրվում է իջնող վահանակի վրա, կարգավիճակի գոտում և կողպէկրանին:"</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Այս ծանուցումները չեն կարող փոփոխվել:"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Ծանուցումների տվյալ խումբը հնարավոր չէ կարգավորել այստեղ"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի միջոցով"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Այս հավելվածն օգտագործում է տեսախցիկը:"</string>
<string name="appops_microphone" msgid="741508267659494555">"Այս հավելվածն օգտագործում է խոսափողը:"</string>
<string name="appops_overlay" msgid="6165912637560323464">"Այս հավելվածը ցուցադրվում է մյուս հավելվածների վրայից:"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index eeda3f91ffc4..7031aab3849c 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Mengeluarkan suara dan ditampilkan di bayangan pull-down, status bar &amp; di layar kunci."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Notifikasi ini tidak dapat diubah."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Grup notifikasi ini tidak dapat dikonfigurasi di sini"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"melalui <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Aplikasi ini sedang menggunakan kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Aplikasi ini sedang menggunakan mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Aplikasi ini ditampilkan di atas aplikasi lain di layar."</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 9d2837a666af..7fe25f81e11c 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Gefur frá sér hljóð og birtist í fellisvæði, á stöðustiku og lásskjá."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Ekki er hægt að breyta þessum tilkynningum."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Ekki er hægt að stilla þessar tilkynningar hér"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"með <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Þetta forrit er að nota myndavélina."</string>
<string name="appops_microphone" msgid="741508267659494555">"Þetta forrit er að nota hljóðnemann."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Þetta forrit er að birta efni yfir öðrum forritum á skjánum þínum."</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 529ccd7d3e10..7248bbb08e2b 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Verranno visualizzate con un suono in area a discesa, barra di stato e schermata di blocco."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Impossibile modificare queste notifiche."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Qui non è possibile configurare questo gruppo di notifiche"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"tramite <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Questa app sta utilizzando la fotocamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Questa app sta utilizzando il microfono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Questa app è visualizzata sopra altre app sullo schermo."</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index dab52828f65c..aeafdc493d1b 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -651,7 +651,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"משמיעה צליל ומוצגת בלוח ההתראות הנפתח, בשורת הסטטוס ובמסך הנעילה."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"לא ניתן לשנות את ההתראות האלה."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"לא ניתן להגדיר כאן את קבוצת ההתראות הזו"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"באמצעות <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"האפליקציה הזו משתמשת במצלמה."</string>
<string name="appops_microphone" msgid="741508267659494555">"האפליקציה הזו משתמשת במיקרופון."</string>
<string name="appops_overlay" msgid="6165912637560323464">"האפליקציה הזו מוצגת מעל אפליקציות אחרות במסך."</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index f81c8f3bd984..37e71f74dd93 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"通知音が鳴り、プルダウン シェード、ステータスバー、ロック画面に表示されます。"</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"これらの通知は変更できません。"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"このグループの通知はここでは設定できません"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> 経由"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"このアプリはカメラを使用しています。"</string>
<string name="appops_microphone" msgid="741508267659494555">"このアプリはマイクを使用しています。"</string>
<string name="appops_overlay" msgid="6165912637560323464">"このアプリは画面上で他のアプリの上に重ねて表示されます。"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 37456aefa4d3..cefdd7398a89 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"გამოსცემს ხმას და გამოჩნდება ჩამოსაწევ ფარდაში, სტატუსის ზოლში და ჩაკეტილ ეკრანზე."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"ამ შეტყობინებების შეცვლა შეუძლებელია."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"შეტყობინებების ამ ჯგუფის კონფიგურირება აქ შეუძლებელია"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-დან"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ეს აპი იყენებს კამერას."</string>
<string name="appops_microphone" msgid="741508267659494555">"ეს აპი იყენებს მიკროფონს."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ეს აპი თქვენს ეკრანზე ფარავს სხვა აპებს."</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index a0a8c384afde..378b30e1dab1 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Хабарландырулар келе берсін"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Хабарландыруларды өшіру"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Осы қолданбаның хабарландырулары көрсетілсін бе?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Дыбыссыз"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Маңызды"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Үнемі дыбыссыз режимде болады. Хабарландыру ашылмалы панельге шығады."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Үнемі дыбыссыз режимде болады. Хабарландырулар ашылмалы панельге және күй жолағына шығады."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Үнемі дыбыссыз режимде болады. Хабарландырулар ашылмалы панельге немесе құлыптаулы экранға шығады."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Үнемі дыбыссыз режимде болады. Ашылмалы панельге, күй жолағына және құлыптаулы экранға шығады."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Дыбыс шығады және хабарландырулар ашылмалы панельге, күй жолағына және құлыптаулы экранға шығады."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Бұл хабарландыруларды өзгерту мүмкін емес."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Мұндай хабарландырулар бұл жерде конфигурацияланбайды."</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> арқылы"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Бұл қолданба камераны пайдалануда."</string>
<string name="appops_microphone" msgid="741508267659494555">"Бұл қолданба микрофонды пайдалануда."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Бұл қолданба экранда басқа қолданбалардың үстінен көрсетіліп тұр."</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 10c72b0f126e..ecdbbe4592d3 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"បញ្ចេញ​សំឡេង និង​បង្ហាញ​នៅក្នុង​ផ្ទាំងជូនដំណឹង​ធ្លាក់ចុះ របារ​ស្ថានភាព និង​នៅលើ​អេក្រង់ចាក់សោ។"</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"មិនអាច​កែប្រែ​ការជូនដំណឹង​ទាំងនេះ​បានទេ។"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"មិនអាច​កំណត់​រចនាសម្ព័ន្ធ​ក្រុមការជូនដំណឹងនេះ​នៅទីនេះ​បានទេ"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"តាមរយៈ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"កម្មវិធីនេះ​កំពុងប្រើ​កាមេរ៉ា។"</string>
<string name="appops_microphone" msgid="741508267659494555">"កម្មវិធីនេះ​កំពុងប្រើ​មីក្រូហ្វូន។"</string>
<string name="appops_overlay" msgid="6165912637560323464">"កម្មវិធីនេះ​កំពុងបង្ហាញ​ពីលើកម្មវិធី​ផ្សេងទៀត​នៅលើអេក្រង់​របស់អ្នក។"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index c024af3129b4..ba5c1edcd27c 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ಎಚ್ಚರಿಸುತ್ತಿರಿ"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಿ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ಈ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"ಸಾಮಾನ್ಯ"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"ಆದ್ಯತೆಗೊಳಿಸಿದ"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"ಯಾವಾಗಲೂ ನಿಶ್ಯಬ್ದ. ಪುಲ್‌-ಡೌನ್ ಶೇಡ್‌ನಲ್ಲಿ ಡಿಸ್‌ಪ್ಲೇ ಆಗುತ್ತದೆ."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"ಯಾವಾಗಲೂ ನಿಶ್ಯಬ್ದ. ಪುಲ್‌-ಡೌನ್ ಶೇಡ್ &amp; ಸ್ಥಿತಿ ಪಟ್ಟಿಯಲ್ಲಿ ಡಿಸ್‌ಪ್ಲೇ ಆಗುತ್ತವೆ."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"ಯಾವಾಗಲೂ ನಿಶ್ಯಬ್ದ. ಪುಲ್‌-ಡೌನ್ ಶೇಡ್ &amp; ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಡಿಸ್‌ಪ್ಲೇ ಆಗುತ್ತವೆ."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"ಯಾವಾಗಲೂ ನಿಶ್ಯಬ್ದ. ಪುಲ್‌-ಡೌನ್ ಶೇಡ್, ಸ್ಥಿತಿ ಪಟ್ಟಿ &amp; ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಡಿಸ್‌ಪ್ಲೇ ಆಗುತ್ತದೆ."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"ಧ್ವನಿ ಮಾಡುತ್ತದೆ ಮತ್ತು ಪುಲ್‌-ಡೌನ್ ಶೇಡ್, ಸ್ಥಿತಿ ಪಟ್ಟಿ &amp; ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಡಿಸ್‌ಪ್ಲೇ ಮಾಡುತ್ತದೆ."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"ಈ ಗುಂಪಿನ ಅಧಿಸೂಚನೆಗಳನ್ನು ಇಲ್ಲಿ ಕಾನ್ಫಿಗರ್‌ ಮಾಡಲಾಗಿರುವುದಿಲ್ಲ"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಮೂಲಕ"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸುತ್ತಿದೆ."</string>
<string name="appops_microphone" msgid="741508267659494555">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತಿದೆ."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಮೇಲಿಂದ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ."</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index feac3cc8d028..886eaa52d2cc 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"계속 알림"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"알림 사용 중지"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"이 앱의 알림을 계속 표시하시겠습니까?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"조용히 표시됨"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"우선순위 지정됨"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"항상 음소거됩니다. 풀다운 창에 표시됩니다."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"항상 음소거됩니다. 풀다운 창 및 상태 표시줄에 표시됩니다."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"항상 음소거됩니다. 풀다운 창 및 잠금 화면에 표시됩니다."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"항상 음소거됩니다. 풀다운 창, 상태 표시줄, 잠금 화면에 표시됩니다."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"풀다운 창, 상태 표시줄, 잠금 화면에 소리와 함께 표시됩니다."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"이 알림은 수정할 수 없습니다."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"이 알림 그룹은 여기에서 설정할 수 없습니다."</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"제공: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"앱이 카메라를 사용 중입니다."</string>
<string name="appops_microphone" msgid="741508267659494555">"앱이 마이크를 사용 중입니다."</string>
<string name="appops_overlay" msgid="6165912637560323464">"앱이 화면의 다른 앱 위에 표시되고 있습니다."</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index fc9b1457e31d..b69dc2449bd5 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Үнү чыгат, ошондой эле тигинен жайгашкан экранда, абал тилкесинде жана кулпуланган экранда чагылдырылат."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Бул билдирмелерди өзгөртүүгө болбойт."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Бул билдирмелердин тобун бул жерде конфигурациялоого болбойт"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> аркылуу"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Бул колдонмо камераны колдонууда."</string>
<string name="appops_microphone" msgid="741508267659494555">"Бул колдонмо микрофонду колдонууда."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Бул колдонмо экрандагы башка терезелердин үстүнөн көрсөтүлүүдө."</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index a97a6e75431c..baeb5519ca14 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"ເປີດສຽງ ແລະ ສະແດງໃນແຖບແບບເລື່ອນລົງ, ແຖບສະຖານະ ແລະ ຢູ່ໜ້າຈໍລັອກ."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"ບໍ່ສາມາດຕັ້ງຄ່າກຸ່ມການແຈ້ງເຕືອນນີ້ຢູ່ບ່ອນນີ້ໄດ້"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"ຜ່ານ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ແອັບນີ້ກຳລັງໃຊ້ກ້ອງຢູ່."</string>
<string name="appops_microphone" msgid="741508267659494555">"ແອັບນີ້ກຳລັງໃຊ້ໄມໂຄຣໂຟນຢູ່."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ແອັບນີ້ກຳລັງສະແດງຜົນບັງແອັບອື່ນຢູ່ໜ້າຈໍຂອງທ່ານ."</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index cd5bcd91605f..3dad73d19f0b 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -651,7 +651,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Leidžiamas garsas ir pateikiama išskleidžiamajame skydelyje, būsenos juostoje bei užrakinimo ekrane."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Šių pranešimų keisti negalima."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Šios grupės pranešimai čia nekonfigūruojami"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"naudojant „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ši programa naudoja fotoaparatą."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ši programa naudoja mikrofoną."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ši programa rodoma ekrane virš kitų programų."</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 7d14fc168828..8893328aa938 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -648,7 +648,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Paziņojumi tiek rādīti nolaižamajā panelī, statusa joslā un bloķēšanas ekrānā ar skaņas signālu."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Šos paziņojumus nevar modificēt."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Šeit nevar konfigurēt šo paziņojumu grupu."</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Šajā lietotnē tiek izmantota kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Šajā lietotnē tiek izmantots mikrofons."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Šī lietotne tiek rādīta ekrānā pāri citām lietotnēm."</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 970777d5aee3..d21d12b4c7c2 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Продолжи да ме предупредуваш"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Исклучи известувања"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Дали да продолжат да се прикажуваат известувања од апликацијава?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Тивко"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Приоритетно"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Секогаш безгласно. Се прикажува во паѓачки список во сенка."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Секогаш безгласно. Се прикажува во паѓачки список во сенка и статусна лента."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Секогаш безгласно. Се прикажува во паѓачки список во сенка и на заклучен екран."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Секогаш безгласно. Се прикажува во паѓачки список во сенка, статусна лента и на заклучен екран."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Пушта звук и се прикажува во паѓачки список во сенка, статусна лента и на заклучен екран."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Овие известувања не може да се изменат"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Оваа група известувања не може да се конфигурира тука"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"преку <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Апликацијава ја користи камерата."</string>
<string name="appops_microphone" msgid="741508267659494555">"Апликацијава го користи микрофонот."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Апликацијава се прикажува врз други апликации на вашиот екран."</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 0f016d7000ac..c363bfa82908 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"മുന്നറിയിപ്പ് നൽകുന്നത് തുടരുക"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"അറിയിപ്പുകൾ ഓഫാക്കുക"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ഈ ആപ്പിൽ നിന്നുള്ള അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"സൗമ്യമായ"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"മുൻഗണനയുള്ള"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"എപ്പോഴും നിശബ്‌ദം. പുൾ ഡൗൺ ഷെയ്‌ഡിൽ പ്രദർശിപ്പിക്കുന്നു."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"എപ്പോഴും നിശബ്‌ദം. പുൾ ഡൗൺ ഷെയ്‌ഡിലും സ്റ്റാറ്റസ് ബാറിലും പ്രദർശിപ്പിക്കുന്നു."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"എപ്പോഴും നിശബ്‌ദം. പുൾ ഡൗൺ ഷെയ്‌ഡിലും ലോക്ക് സ്ക്രീനിലും പ്രദർശിപ്പിക്കുന്നു."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"എപ്പോഴും നിശബ്‌ദം. പുൾ ഡൗൺ ഷെയ്‌ഡിലും സ്റ്റാറ്റസ് ബാറിലും ലോക്ക് സ്ക്രീനിലും പ്രദർശിപ്പിക്കുന്നു."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"ശബ്‌ദം ഉണ്ടാക്കുകയും, പുൾ ഡൗൺ ഷെയ്‌ഡിലും സ്റ്റാറ്റസ് ബാറിലും ലോക്ക് സ്ക്രീനിലും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"അറിയിപ്പുകളുടെ ഈ ഗ്രൂപ്പ് ഇവിടെ കോണ്‍ഫിഗര്‍ ചെയ്യാൻ കഴിയില്ല"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> വഴി"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ഈ ആപ്പ് ക്യാമറ ഉപയോഗിക്കുന്നുണ്ട്."</string>
<string name="appops_microphone" msgid="741508267659494555">"ഈ ആപ്പ് മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ഈ ആപ്പ് നിങ്ങളുടെ സ്‌ക്രീനിലെ മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു."</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 55051a8a3438..5377a595885a 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Дуугарах бөгөөд доош татдаг сүүдэр, статусын хэсэг болон түгжигдсэн дэлгэцэд харагдана."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Эдгээр мэдэгдлийг өөрчлөх боломжгүй."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Энэ бүлэг мэдэгдлийг энд тохируулах боломжгүй байна"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-р"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Энэ апп камерыг ашиглаж байна."</string>
<string name="appops_microphone" msgid="741508267659494555">"Энэ апп микрофоныг ашиглаж байна."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Энэ аппыг таны дэлгэцэд бусад аппын дээр харуулж байна."</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 536bf0c30db7..0a8d008bebdb 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सूचना देत रहा"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"सूचना बंद करा"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"या अ‍ॅपकडील सूचना दाखवणे सुरू ठेवायचे?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"हळू आवाजातील"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"प्राधान्यकृत"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"नेहमी सायलंट. पूल-डाउन शेडमध्ये प्रदर्शित करते."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"नेहमी सायलंट. पूल-डाउन शेड आणि स्टेटस बारमध्ये प्रदर्शित करते."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"नेहमी सायलंट. पूल-डाउन शेडमध्ये आणि लॉक स्क्रीनवर प्रदर्शित करते."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"नेहमी सायलंट. पूल-डाउन शेडमध्ये, स्टेटस बारमध्ये आणि लॉक स्क्रीनवर प्रदर्शित करते."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"आवाज करते आणि पूल-डाउन शेडमध्ये, स्टेटस बारमध्ये आणि लॉक स्क्रीनवर प्रदर्शित करते."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"या सूचनांचा संच येथे कॉन्फिगर केला जाऊ शकत नाही"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> मार्गे"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"हे अ‍ॅप कॅमेरा वापरत आहे."</string>
<string name="appops_microphone" msgid="741508267659494555">"हे अ‍ॅप मायक्रोफोन वापरत आहे."</string>
<string name="appops_overlay" msgid="6165912637560323464">"हे अ‍ॅप स्क्रीनवरील इतर अ‍ॅप्स वर प्रदर्शित होत आहे."</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 7e8e633d7386..d75c97fe30af 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Teruskan memberikan makluman"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Matikan pemberitahuan"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Terus tunjukkan pemberitahuan daripada apl ini?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Lembut"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Diutamakan"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Sentiasa senyap. Dipaparkan dalam bidai tarik turun."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Sentiasa senyap. Dipaparkan dalam bidai tarik turun &amp; bar status."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Sentiasa senyap. Dipaparkan dalam bidai tarik turun &amp; pada skrin kunci."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Sentiasa senyap. Dipaparkan dalam bidai tarik turun, bar status &amp; pada skrin kunci."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Berbunyi dan dipaparkan dalam bidai tarik turun, bar status &amp; pada skrin kunci."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Pemberitahuan ini tidak boleh diubah suai."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Kumpulan pemberitahuan ini tidak boleh dikonfigurasikan di sini"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"melalui <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Apl ini sedang menggunakan kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Apl ini sedang menggunakan mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Apl ini dipaparkan di atas apl lain pada skrin anda."</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index b942a88ee548..22b2c126f348 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"အသံပြုပြီး ဆွဲချသည့်အရိပ်၊ အခြေအနေပြနေရာနှင့် လော့ခ်ချထားချိန် မျက်နှာပြင်တွင် ပြသပါ။"</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"ဤအကြောင်းကြားချက်အုပ်စုကို ဤနေရာတွင် စီစဉ်သတ်မှတ်၍ မရပါ"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> မှတစ်ဆင့်"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ဤအက်ပ်က ကင်မရာကို အသုံးပြုနေသည်။"</string>
<string name="appops_microphone" msgid="741508267659494555">"ဤအက်ပ်က မိုက်ခရိုဖုန်းကို အသုံးပြုနေသည်။"</string>
<string name="appops_overlay" msgid="6165912637560323464">"ဤအက်ပ်က ဖန်သားမျက်နှာပြင်ပေါ်ရှိ အခြားအက်ပ်များ အပေါ်မှ ထပ်ပြီး ပြသနေပါသည်။"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 2403a39ceb32..6faded5b7464 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Lager lyd og vises i nedtrekkspanelet, statusfeltet og på låseskjermen."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Disse varslene kan ikke endres."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Denne varselgruppen kan ikke konfigureres her"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Denne appen bruker kameraet."</string>
<string name="appops_microphone" msgid="741508267659494555">"Denne appen bruker mikrofonen."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Denne appen vises over andre apper på skjermen."</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index e45b106e1a9e..faa917bb393a 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सर्तक गराइरहनुहोस्"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"सूचनाहरू निष्क्रिय पार्नुहोस्"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"यो अनुप्रयोगका सूचनाहरू देखाउने क्रम जारी राख्ने हो?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"मौन"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"प्राथमिकता दिइएको"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"सधैँ मौन। पुल डाउन सेडमा देखिन्छ।"</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"सधैँ मौन। पुल डाउन सेड र वस्तुस्थिति पट्टीमा देखिन्छ।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"सधैँ मौन। पुल डाउन सेड र लक स्क्रिनमा देखिन्छ।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"सधैँ मौन। पुल डाउन सेड, वस्तुस्थिति पट्टी र लक स्क्रिनमा देखिन्छ।"</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"घन्टी बजाउँछ र पुल डाउन सेड, वस्तुस्थिति पट्टी र लक स्क्रिनमा देखिन्छ।"</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"यहाँबाट सूचनाहरूको यो समूह कन्फिगर गर्न सकिँदैन"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> मार्फत"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"यो अनुप्रयोगले क्यामेराको प्रयोग गर्दै छ।"</string>
<string name="appops_microphone" msgid="741508267659494555">"यो अनुप्रयोगले माइक्रोफोनको प्रयोग गर्दै छ।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य अनुप्रयोगहरूमाथि प्रदर्शन गर्दै छ।"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 459c044a6b33..e506a93d9e9e 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Maakt geluid en wordt weergegeven in pull-downvenster, statusbalk en op vergrendelingsscherm."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Deze meldingen kunnen niet worden aangepast."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Deze groep meldingen kan hier niet worden geconfigureerd"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Deze app gebruikt de camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Deze app gebruikt de microfoon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Deze app wordt over andere apps op je scherm heen weergegeven."</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index aaaf873936ea..828827a0f409 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ଆଲର୍ଟ କରିବା ଜାରି ରଖନ୍ତୁ"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"ବିଜ୍ଞପ୍ତି ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ଏହି ଆପ୍‌ରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"ଧିରେ"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"ପ୍ରାଥମିକତା ଭିତ୍ତିକ"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"ସର୍ବଦା ନିରବ। ପୁଲ୍-ଡାଉନ୍ ସେଡ୍‌ରେ ପ୍ରଦର୍ଶିତ କରିଥାଏ।"</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"ସର୍ବଦା ନିରବ। ପୁଲ୍-ଡାଉନ୍ ସେଡ୍ ଏବଂ ସ୍ଥିତି ବାର୍‌ରେ ପ୍ରଦର୍ଶନ କରିଥାଏ।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"ସର୍ବଦା ନିରବ। ପୁଲ୍-ଡାଉନ୍ ସେଡ୍ ଏବଂ ଲକ୍ ସ୍କ୍ରିନ୍‌ରେ ପ୍ରଦର୍ଶିତ କରିଥାଏ।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"ସର୍ବଦା ନିରବ। ପୁଲ୍-ଡାଉନ୍ ସେଡ୍, ସ୍ଥିତି ବାର୍ ଏବଂ ଲକ୍ ସ୍କ୍ରିନ୍‌ରେ ପ୍ରଦର୍ଶନ କରିଥାଏ।"</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"ଶବ୍ଦ କରେ ଏବଂ ପୁଲ୍-ଡାଉନ୍ ସେଡ୍ ସ୍ଥିତି ବାର ଏବଂ ଲକ୍ ସ୍କ୍ରିନ୍‌ରେ ପ୍ରଦର୍ଶିତ କରିଥାଏ।"</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"ଏଠାରେ ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଗ୍ରୁପ୍ କନଫ୍ୟୁଗର୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ମାଧ୍ୟମରେ"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ଏହି ଆପ୍ କ୍ୟାମେରା ବ୍ୟବହାର କରୁଛି।"</string>
<string name="appops_microphone" msgid="741508267659494555">"ଏହି ଆପ୍, ମାଇକ୍ରୋଫୋନ୍‍ ବ୍ୟବହାର କରୁଛି।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"ଏହି ଆପ୍, ଆପଣଙ୍କର ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ପ୍ରଦର୍ଶିତ ହେଉଛି।"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index bd92cc5419d8..223d9cc9b3a7 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ਸੁਚੇਤ ਰਖੋ"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"ਸਰਲ"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"ਤਰਜੀਹੀ"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"ਹਮੇਸ਼ਾਂ ਖਾਮੋਸ਼। ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ \'ਤੇ ਦਿਸਦੀ ਹੈ।"</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"ਹਮੇਸ਼ਾਂ ਖਾਮੋਸ਼। ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ ਅਤੇ ਸਥਿਤੀ ਪੱਟੀ \'ਤੇ ਦਿਸਦੀ ਹੈ।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"ਹਮੇਸ਼ਾਂ ਖਾਮੋਸ਼। ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਦੀ ਹੈ।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"ਹਮੇਸ਼ਾਂ ਖਾਮੋਸ਼। ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ, ਸਥਿਤੀ ਪੱਟੀ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਦੀ ਹੈ।"</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"ਧੁਨੀ ਵਜਾਉਂਦੀ ਹੈ ਅਤੇ ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ, ਸਥਿਤੀ ਪੱਟੀ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਦੀ ਹੈ।"</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"ਇਹ ਸੂਚਨਾਵਾਂ ਦਾ ਗਰੁੱਪ ਇੱਥੇ ਸੰਰੂਪਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਰਾਹੀਂ"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ਇਹ ਐਪ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string>
<string name="appops_microphone" msgid="741508267659494555">"ਇਹ ਐਪ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"ਇਹ ਐਪ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਹੋਰਾਂ ਐਪਾਂ ਉੱਪਰ ਦਿਖਾਈ ਜਾ ਰਹੀ ਹੈ।"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 80b9c229ae57..0e7cb0abe037 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -653,7 +653,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Sygnalizowane dźwiękiem i wyświetlanie w obszarze powiadomień, na pasku stanu i ekranie blokady."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Tych powiadomień nie można zmodyfikować."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Tej grupy powiadomień nie można tu skonfigurować"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"przez aplikację <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ta aplikacja używa aparatu."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ta aplikacja używa mikrofonu."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ta aplikacja wyświetla się nad innymi aplikacjami na ekranie."</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 8b2017c445f2..c048150ed5b2 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Emite sons e é exibida na aba suspensa, barra de status e tela de bloqueio."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Não é possível modificar essas notificações."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Não é possível configurar esse grupo de notificações aqui"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Este app está usando a câmera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Este app está usando o microfone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Este app está sobreposto a outros apps na sua tela."</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 2f3cf282e32b..4bfc2553be76 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Emite som e é apresentada no painel pendente, na barra de estado e no ecrã de bloqueio."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Não é possível modificar estas notificações."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Não é possível configurar este grupo de notificações aqui."</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"através da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Esta aplicação está a utilizar a câmara."</string>
<string name="appops_microphone" msgid="741508267659494555">"Esta aplicação está a utilizar o microfone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Esta aplicação está a sobrepor-se a outras aplicações no ecrã."</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 8b2017c445f2..c048150ed5b2 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Emite sons e é exibida na aba suspensa, barra de status e tela de bloqueio."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Não é possível modificar essas notificações."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Não é possível configurar esse grupo de notificações aqui"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Este app está usando a câmera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Este app está usando o microfone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Este app está sobreposto a outros apps na sua tela."</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 2ace09edbb88..3f37b676d8fa 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -648,7 +648,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Emite un sunet și se afișează în fereastra trasă în jos, în bara de stare și pe ecranul de blocare."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Aceste notificări nu pot fi modificate."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Acest grup de notificări nu poate fi configurat aici"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"prin <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Această aplicație folosește camera foto."</string>
<string name="appops_microphone" msgid="741508267659494555">"Această aplicație folosește microfonul."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Această aplicație se afișează pe alte aplicații de pe ecran."</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 8c1913775a32..eb9f98f530de 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -651,7 +651,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Появляются со звуком на панели уведомлений, в строке состояния и на заблокированном экране."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Эти уведомления нельзя изменить."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Эту группу уведомлений нельзя настроить здесь."</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"через приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Это приложение использует камеру."</string>
<string name="appops_microphone" msgid="741508267659494555">"Это приложение использует микрофон."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Это приложение располагается поверх других приложений."</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 2fa56f143320..82668bb2c67f 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"පහළ ඇදීමේ සෙවන, තත්ත්‍ව තීරුව සහ අඟුලු තිරය මත ශබ්ද සහ සංදර්ශන කරයි."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"මෙම දැනුම්දීම් වෙනස් කළ නොහැක."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"මෙම දැනුම්දීම් සමූහය මෙහි වින්‍යාස කළ නොහැක"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> හරහා"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"මෙම යෙදුම කැමරාව භාවිතා කරයි."</string>
<string name="appops_microphone" msgid="741508267659494555">"මෙම යෙදුම මයික්‍රෆෝනය භාවිතා කරයි."</string>
<string name="appops_overlay" msgid="6165912637560323464">"මෙම යෙදුම් ඔබගේ තිරය මත අනෙකුත් යෙදුම්වලට උඩින් සංදර්ශනය වේ."</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 45ae5a5e9d3b..d3c65f4679d9 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -642,24 +642,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Naďalej upozorňovať"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Vypnúť upozornenia"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Majú sa upozornenia z tejto aplikácie naďalej zobrazovať?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Nenápadné"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Prioritné"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Vždy potichu. Zobrazuje sa v rozbaľovacom paneli."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Vždy potichu. Zobrazuje sa v rozbaľovacom paneli a stavovom riadku."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Vždy potichu. Zobrazuje sa v rozbaľovacom paneli a na uzamknutej obrazovke."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Vždy potichu. Zobrazuje sa v rozbaľovacom paneli, stavovom riadku a na uzamknutej obrazovke."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Vydáva zvukový signál a zobrazuje sa v rozbaľovacom paneli, stavovom riadku a na uzamknutej obrazovke."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Tieto upozornenia sa nedajú upraviť."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Túto skupinu upozornení nejde na tomto mieste konfigurovať"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"prostredníctvom aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Táto aplikácia používa fotoaparát."</string>
<string name="appops_microphone" msgid="741508267659494555">"Táto aplikácia používa mikrofón."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Táto aplikácia sa zobrazuje cez ďalšie aplikácie na obrazovke."</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 23d58a95a146..1695fbb70522 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -651,7 +651,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Zvok ter prikaz na poteznem zaslonu z obvestili, v vrstici stanja in na zaklenjenem zaslonu."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Za ta obvestila ni mogoče spremeniti nastavitev."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Te skupine obvestil ni mogoče konfigurirati tukaj"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"prek aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ta aplikacija uporablja fotoaparat."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ta aplikacija uporablja mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ta aplikacija prekriva druge aplikacije na zaslonu."</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 018113ecd46c..01b96d715462 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Vazhdo të sinjalizosh"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Çaktivizo njoftimet"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Do të vazhdosh t\'i shfaqësh njoftimet nga ky aplikacion?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Me rëndësi të ulët"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Me prioritet"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Gjithmonë në heshtje. Shfaqet në strehën me tërheqje poshtë."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Gjithmonë në heshtje. Shfaqet në strehën me tërheqje poshtë dhe shiritin e statusit."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Gjithmonë në heshtje. Shfaqet në strehën me tërheqje poshtë dhe në ekranin e kyçjes."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Gjithmonë në heshtje. Shfaqet në strehën me tërheqje poshtë, shiritin e statusit dhe në ekranin e kyçjes."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Bën tinguj dhe shfaqet në strehën me tërheqje poshtë, shiritin e statusit dhe në ekranin e kyçjes."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Këto njoftime nuk mund të modifikohen."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Ky grup njoftimesh nuk mund të konfigurohet këtu"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"nëpërmjet <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ky aplikacion po përdor kamerën."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ky aplikacion po përdor mikrofonin."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ky aplikacion po shfaqet mbi aplikacionet e tjera në ekran."</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 1d0b394c9eee..81d88c700c39 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -648,7 +648,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Приказује се на падајућој траци, статусној траци и закључаном екрану уз звучно обавештење."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Ова обавештења не могу да се мењају."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Ова група обавештења не може да се конфигурише овде"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"преко апликације <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ова апликација користи камеру."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ова апликација користи микрофон."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ова апликација се приказује преко других апликација на екрану."</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 5d3a85a34484..0df3549933d5 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsätt meddela"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Inaktivera aviseringar"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vill du fortsätta visa aviseringar för den här appen?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Utan avbrott"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Prioriterade"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Alltid tyst. Visas på aviseringspanelen."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Alltid tyst. Visas på aviseringspanelen och i statusfältet."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Alltid tyst. Visas på aviseringspanelen och låsskärmen."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Alltid tyst. Visas på aviseringspanelen, i statusfältet och på låsskärmen."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Ljuder och visas på aviseringspanelen, i statusfältet och på låsskärmen."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Det går inte att ändra de här aviseringarna."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Den här aviseringsgruppen kan inte konfigureras här"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Kameran används av appen."</string>
<string name="appops_microphone" msgid="741508267659494555">"Mikrofonen används av appen."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Appen visas över andra appar på skärmen."</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 576e83f23d36..04dffd3a6197 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Endelea kutoa arifa"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Zima arifa"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Ungependa kuendelea kuonyesha arifa kutoka programu hii?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Bila sauti"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Zilizopewa kipaumbele"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Kimya kila wakati. Huonyeshwa katika orodha kunjuzi."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Kimya kila wakati. Huonyeshwa katika orodha kunjuzi na kwenye sehemu ya arifa."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Kimya kila wakati. Huonyeshwa katika orodha kunjuzi na kwenye skrini iliyofungwa."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Kimya kila wakati. Huonyeshwa katika orodha kunjuzi, sehemu ya arifa na kwenye skrini iliyofungwa."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Hutoa sauti na kuonyeshwa katika orodha kunjuzi, sehemu ya arifa na kwenye skrini iliyofungwa."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Arifa hizi haziwezi kubadilishwa."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Kikundi hiki cha arifa hakiwezi kuwekewa mipangilio hapa"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"kupitia <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Programu hii inatumia kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Programu hii inatumia maikrofoni."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Programu hii inachomoza kwenye programu zingine zilizo katika skrini yako."</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index f064017a3227..f828d15ea7b1 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -46,8 +46,8 @@
<string name="bluetooth_tethered" msgid="7094101612161133267">"புளூடூத் இணைக்கப்பட்டது"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"உள்ளீட்டு முறைகளை அமை"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"கைமுறை விசைப்பலகை"</string>
- <string name="usb_device_permission_prompt" msgid="1825685909587559679">"<xliff:g id="USB_DEVICE">%2$s</xliff:g>ஐ அணுக, <xliff:g id="APPLICATION">%1$s</xliff:g> பயன்பாட்டை அனுமதிக்கவா?"</string>
- <string name="usb_accessory_permission_prompt" msgid="2465531696941369047">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g>ஐ அணுக, <xliff:g id="APPLICATION">%1$s</xliff:g> பயன்பாட்டை அனுமதிக்கவா?"</string>
+ <string name="usb_device_permission_prompt" msgid="1825685909587559679">"<xliff:g id="USB_DEVICE">%2$s</xliff:g>ஐ அணுக, <xliff:g id="APPLICATION">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="2465531696941369047">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g>ஐ அணுக, <xliff:g id="APPLICATION">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
<string name="usb_device_confirm_prompt" msgid="7440562274256843905">"<xliff:g id="USB_DEVICE">%2$s</xliff:g>ஐக் கையாள, <xliff:g id="APPLICATION">%1$s</xliff:g> பயன்பாட்டைத் திறக்கவா?"</string>
<string name="usb_accessory_confirm_prompt" msgid="4333670517539993561">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g>ஐக் கையாள, <xliff:g id="APPLICATION">%1$s</xliff:g> பயன்பாட்டைத் திறக்கவா?"</string>
<string name="usb_accessory_uri_prompt" msgid="513450621413733343">"நிறுவிய பயன்பாடுகள் எதுவும், USB துணைக்கருவியுடன் இயங்காது. <xliff:g id="URL">%1$s</xliff:g> இல் துணைக்கருவி குறித்து மேலும் அறிக"</string>
@@ -75,7 +75,7 @@
<string name="screenshot_failed_title" msgid="7612509838919089748">"ஸ்கிரீன் ஷாட்டைச் சேமிக்க முடியவில்லை"</string>
<string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ஸ்கிரீன் ஷாட்டை மீண்டும் எடுக்க முயலவும்"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"போதுமான சேமிப்பிடம் இல்லாததால் ஸ்கிரீன்ஷாட்டைச் சேமிக்க முடியவில்லை"</string>
- <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ஸ்கிரீன் ஷாட்டுகளை எடுப்பதை, பயன்பாடு அல்லது உங்கள் நிறுவனம் அனுமதிக்கவில்லை"</string>
+ <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ஸ்கிரீன் ஷாட்டுகளை எடுப்பதை, ஆப்ஸ் அல்லது உங்கள் நிறுவனம் அனுமதிக்கவில்லை"</string>
<string name="screenrecord_name" msgid="4196719243134204796">"திரை ரெக்கார்டிங்"</string>
<string name="screenrecord_channel_description" msgid="4630777331970993858">"திரை ரெக்கார்டிங் அமர்விற்கான தொடர் அறிவிப்பு"</string>
<string name="screenrecord_start_label" msgid="5177739269492196055">"ரெக்கார்டிங்கைத் தொடங்கு"</string>
@@ -95,7 +95,7 @@
<string name="usb_preference_title" msgid="6551050377388882787">"USB கோப்பு இடமாற்ற விருப்பங்கள்"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"(MTP) மீடியா பிளேயராக ஏற்று"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"(PTP) கேமராவாக ஏற்று"</string>
- <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac க்கான Android கோப்பு இடமாற்ற பயன்பாட்டை நிறுவு"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac க்கான Android கோப்பு இடமாற்ற ஆப்ஸை நிறுவு"</string>
<string name="accessibility_back" msgid="567011538994429120">"பின்செல்"</string>
<string name="accessibility_home" msgid="8217216074895377641">"முகப்பு"</string>
<string name="accessibility_menu" msgid="316839303324695949">"மெனு"</string>
@@ -404,8 +404,7 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"அறிவிப்புகள்\nவேண்டாம்"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"முன்னுரிமைகள்\nமட்டும்"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"அலாரங்கள்\nமட்டும்"</string>
- <!-- no translation found for keyguard_indication_charging_time_wireless (6959284458466962592) -->
- <skip />
+ <string name="keyguard_indication_charging_time_wireless" msgid="6959284458466962592">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • வயர்லெஸ் முறையில் சார்ஜாகிறது (முடிய <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ஆகும்)"</string>
<string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • சார்ஜாகிறது (முழு சார்ஜ்: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string>
<string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • வேகமாகச் சார்ஜாகிறது (முழு சார்ஜ்: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • மெதுவாகச் சார்ஜாகிறது (முழு சார்ஜ்: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string>
@@ -490,7 +489,7 @@
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் உங்கள் பணிக் கணக்கு இணைக்கப்பட்டுள்ளது."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் உங்களின் தனிப்பட்ட சுயவிவரம் இணைக்கப்பட்டுள்ளது."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"உங்கள் சாதனத்தை நிர்வகிப்பது: <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
- <string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"உங்கள் சாதனத்தை நிர்வகிக்க, <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> பயன்பாட்டை <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> பயன்படுத்தும்."</string>
+ <string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"உங்கள் சாதனத்தை நிர்வகிக்க, <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> ஆப்ஸை <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> பயன்படுத்தும்."</string>
<string name="monitoring_description_do_body" msgid="3639594537660975895">"உங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், ஆப்ஸ், சாதனத்துடன் தொடர்புடைய டேட்டா, சாதன இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
<string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"மேலும் அறிக"</string>
@@ -508,8 +507,7 @@
<string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"<xliff:g id="APPLICATION">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால் மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்."</string>
<string name="monitoring_description_app_work" msgid="4612997849787922906">"உங்கள் பணிக் கணக்கை <xliff:g id="ORGANIZATION">%1$s</xliff:g> நிர்வகிக்கிறது. மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் பணி நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="APPLICATION">%2$s</xliff:g> உடன் அது இணைக்கப்பட்டுள்ளது.\n\nமேலும் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
<string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"உங்கள் பணிக் கணக்கை <xliff:g id="ORGANIZATION">%1$s</xliff:g> நிர்வகிக்கிறது. மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் பணி நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> உடன் அது இணைக்கப்பட்டுள்ளது.\n\nஉங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> உடனும் இணைக்கப்பட்டுள்ளீர்கள்."</string>
- <!-- no translation found for keyguard_indication_trust_unlocked (2712865815371519117) -->
- <skip />
+ <string name="keyguard_indication_trust_unlocked" msgid="2712865815371519117">"TrustAgent இதை லாக் செய்யவில்லை"</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"நீங்கள் கைமுறையாகத் திறக்கும் வரை, சாதனம் பூட்டப்பட்டிருக்கும்"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"விரைவாக அறிவிப்புகளைப் பெறுதல்"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"திறக்கும் முன் அவற்றைப் பார்க்கவும்"</string>
@@ -522,12 +520,9 @@
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"சுருக்கு"</string>
<string name="volume_odi_captions_tip" msgid="1193653197906918269">"வசன உரைகளைத் தானாக எழுதும்"</string>
<string name="accessibility_volume_close_odi_captions_tip" msgid="1163987066404128967">"விரிவான வசனங்களுக்கான உதவிக்குறிப்பு"</string>
- <!-- no translation found for volume_odi_captions_content_description (2950736796270214785) -->
- <skip />
- <!-- no translation found for volume_odi_captions_hint_enable (49750248924730302) -->
- <skip />
- <!-- no translation found for volume_odi_captions_hint_disable (8980842810619956593) -->
- <skip />
+ <string name="volume_odi_captions_content_description" msgid="2950736796270214785">"மேலடுக்கப்பட்ட வசனங்கள்"</string>
+ <string name="volume_odi_captions_hint_enable" msgid="49750248924730302">"இயக்கும்"</string>
+ <string name="volume_odi_captions_hint_disable" msgid="8980842810619956593">"முடக்கும்"</string>
<string name="accessibility_output_chooser" msgid="8185317493017988680">"வெளியீட்டுச் சாதனத்தை மாற்றுதல்"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"திரை பொருத்தப்பட்டது"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string>
@@ -604,7 +599,7 @@
<string name="tuner_toast" msgid="603429811084428439">"வாழ்த்துகள்! அமைப்புகளில் System UI Tuner சேர்க்கப்பட்டது"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"அமைப்புகளிலிருந்து அகற்று"</string>
<string name="remove_from_settings_prompt" msgid="6069085993355887748">"அமைப்புகளிலிருந்து System UI Tunerஐ அகற்றிவிட்டு, அதன் எல்லா அம்சங்களையும் பயன்படுத்துவதை நிறுத்தவா?"</string>
- <string name="activity_not_found" msgid="348423244327799974">"சாதனத்தில் பயன்பாடு நிறுவப்படவில்லை"</string>
+ <string name="activity_not_found" msgid="348423244327799974">"சாதனத்தில் ஆப்ஸ் நிறுவப்படவில்லை"</string>
<string name="clock_seconds" msgid="7689554147579179507">"கடிகார வினாடிகளைக் காட்டு"</string>
<string name="clock_seconds_desc" msgid="6282693067130470675">"நிலைப் பட்டியில் கடிகார வினாடிகளைக் காட்டும். பேட்டரியின் ஆயுளைக் குறைக்கலாம்."</string>
<string name="qs_rearrange" msgid="8060918697551068765">"விரைவு அமைப்புகளை மறுவரிசைப்படுத்து"</string>
@@ -658,7 +653,8 @@
<!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
<skip />
<string name="notification_multichannel_desc" msgid="4695920306092240550">"இந்த அறிவுப்புக் குழுக்களை இங்கே உள்ளமைக்க இயலாது"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> மூலமாக"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"இந்த ஆப்ஸானது கேமராவை உபயோகிக்கிறது."</string>
<string name="appops_microphone" msgid="741508267659494555">"இந்த ஆப்ஸானது, மைக்ரோஃபோனை உபயோகிக்கிறது."</string>
<string name="appops_overlay" msgid="6165912637560323464">"இந்த ஆப்ஸானது, உங்கள் திரையில் பிற ஆப்ஸின் இடைமுகத்தின் மேல் தோன்றுகிறது."</string>
@@ -814,9 +810,9 @@
<string name="accessibility_qs_edit_tile_move" msgid="3108103090006972938">"நிலைப்பாடு <xliff:g id="POSITION">%2$d</xliff:g>க்கு <xliff:g id="TILE_NAME">%1$s</xliff:g>ஐ நகர்த்தும்"</string>
<string name="accessibility_desc_quick_settings_edit" msgid="8073587401747016103">"விரைவு அமைப்புகள் திருத்தி."</string>
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> அறிவிப்பு: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="dock_forced_resizable" msgid="5914261505436217520">"திரைப் பிரிப்பில் பயன்பாடு வேலைசெய்யாமல் போகக்கூடும்."</string>
- <string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"திரையைப் பிரிப்பதைப் பயன்பாடு ஆதரிக்கவில்லை."</string>
- <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"இரண்டாம்நிலைத் திரையில் பயன்பாடு வேலை செய்யாமல் போகக்கூடும்."</string>
+ <string name="dock_forced_resizable" msgid="5914261505436217520">"திரைப் பிரிப்பில் ஆப்ஸ் வேலைசெய்யாமல் போகக்கூடும்."</string>
+ <string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"திரையைப் பிரிப்பதைப் ஆப்ஸ் ஆதரிக்கவில்லை."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"இரண்டாம்நிலைத் திரையில் ஆப்ஸ் வேலை செய்யாமல் போகக்கூடும்."</string>
<string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"இரண்டாம்நிலைத் திரைகளில் பயன்பாட்டைத் தொடங்க முடியாது."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"அமைப்புகளைத் திற."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"விரைவு அமைப்புகளைத் திற."</string>
@@ -864,7 +860,7 @@
<string name="tuner_left" msgid="8404287986475034806">"இடது"</string>
<string name="tuner_right" msgid="6222734772467850156">"வலது"</string>
<string name="tuner_menu" msgid="191640047241552081">"மெனு"</string>
- <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> பயன்பாடு"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> ஆப்ஸ்"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"விழிப்பூட்டல்கள்"</string>
<string name="notification_channel_battery" msgid="5786118169182888462">"பேட்டரி"</string>
<string name="notification_channel_screenshot" msgid="6314080179230000938">"ஸ்கிரீன் ஷாட்டுகள்"</string>
@@ -884,8 +880,8 @@
<string name="bt_is_off" msgid="2640685272289706392">"புளூடூத் முடக்கத்தில் உள்ளது"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"\"தொந்தரவு செய்ய வேண்டாம்\" முடக்கத்தில் உள்ளது"</string>
<string name="qs_dnd_prompt_auto_rule" msgid="862559028345233052">"\"தொந்தரவு செய்ய வேண்டாம்\" எனும் பயன்முறையை, தானியங்கு விதி (<xliff:g id="ID_1">%s</xliff:g>) இயக்கியுள்ளது."</string>
- <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"\"தொந்தரவு செய்ய வேண்டாம்\" எனும் பயன்முறையை, பயன்பாடு (<xliff:g id="ID_1">%s</xliff:g>) இயக்கியுள்ளது."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"\"தொந்தரவு செய்ய வேண்டாம்\" எனும் பயன்முறையை, தானியங்கு விதி அல்லது பயன்பாடு இயக்கியுள்ளது."</string>
+ <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"\"தொந்தரவு செய்ய வேண்டாம்\" எனும் பயன்முறையை, ஆப்ஸ் (<xliff:g id="ID_1">%s</xliff:g>) இயக்கியுள்ளது."</string>
+ <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"\"தொந்தரவு செய்ய வேண்டாம்\" எனும் பயன்முறையை, தானியங்கு விதி அல்லது ஆப்ஸ் இயக்கியுள்ளது."</string>
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> வரை"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"வைத்திரு"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"மாற்று"</string>
@@ -895,10 +891,10 @@
<string name="mobile_data_disable_message" msgid="4756541658791493506">"<xliff:g id="CARRIER">%s</xliff:g> மொபைல் நிறுவனத்தின் மூலம் டேட்டா அல்லது இணையத்தை உங்களால் பயன்படுத்த முடியாது. வைஃபை வழியாக மட்டுமே இணையத்தைப் பயன்படுத்த முடியும்."</string>
<string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"உங்கள் மொபைல் நிறுவனம்"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"அனுமதிக் கோரிக்கையை ஆப்ஸ் மறைப்பதால், அமைப்புகளால் உங்கள் பதிலைச் சரிபார்க்க முடியாது."</string>
- <string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> பயன்பாட்டை, <xliff:g id="APP_2">%2$s</xliff:g> பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க அனுமதிக்கவா?"</string>
+ <string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> ஆப்ஸை, <xliff:g id="APP_2">%2$s</xliff:g> பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க அனுமதிக்கவா?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- இது, <xliff:g id="APP">%1$s</xliff:g> பயன்பாட்டிலிருந்து தகவலைப் படிக்கும்"</string>
<string name="slice_permission_text_2" msgid="3146758297471143723">"- இது, <xliff:g id="APP">%1$s</xliff:g> பயன்பாட்டிற்குள் சென்று செயல்பாடுகளில் ஈடுபடும்"</string>
- <string name="slice_permission_checkbox" msgid="7986504458640562900">"எல்லா பயன்பாட்டிலிருந்தும் விழிப்பூட்டல்களைக் காண்பிக்க, <xliff:g id="APP">%1$s</xliff:g> பயன்பாட்டை அனுமதி"</string>
+ <string name="slice_permission_checkbox" msgid="7986504458640562900">"எல்லா பயன்பாட்டிலிருந்தும் விழிப்பூட்டல்களைக் காண்பிக்க, <xliff:g id="APP">%1$s</xliff:g> ஆப்ஸை அனுமதி"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"அனுமதி"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"நிராகரி"</string>
<string name="auto_saver_title" msgid="1217959994732964228">"பேட்டரி சேமிப்பானை ஆன் செய்வது தொடர்பாகத் திட்டமிட, தட்டவும்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 08f745e8d72d..0b1c78e0393d 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -271,8 +271,7 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS కోసం శోధిస్తోంది"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"స్థానం GPS ద్వారా సెట్ చేయబడింది"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"స్థాన అభ్యర్థనలు సక్రియంగా ఉన్నాయి"</string>
- <!-- no translation found for accessibility_sensors_off_active (157126524598525432) -->
- <skip />
+ <string name="accessibility_sensors_off_active" msgid="157126524598525432">"సెన్సార్‌లు ఆఫ్ యాక్టివ్‌లో ఉంది"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"అన్ని నోటిఫికేషన్‌లను క్లియర్ చేయండి."</string>
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
@@ -637,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ఎప్పటికప్పుడు హెచ్చరించు"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"నోటిఫికేషన్‌లను ఆఫ్ చేయి"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ఈ యాప్ నుండి నోటిఫికేషన్‌లను చూపిస్తూ ఉండాలా?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"సాధారణ"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"ప్రాధాన్యం గలవి"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"ఎల్లప్పుడూ నిశబ్దంగా ఉంచు. కిందకు-లాగే షేడ్‌లో ప్రదర్శింపబడుతుంది."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"ఎల్లప్పుడూ నిశబ్దంగా ఉంచు. కిందకు-లాగే షేడ్ &amp; స్థితి పట్టీ‌లో ప్రదర్శింపబడుంది."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"ఎల్లప్పుడూ నిశబ్దంగా ఉంచు. కిందకు-లాగే షేడ్ &amp; లాక్ స్క్రీన్‌లో ప్రదర్శింపబడుతుంది."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"ఎల్లప్పుడూ నిశబ్దంగా ఉంచు. కిందకు-లాగే షేడ్, స్థితి పట్టీ &amp; లాక్ స్క్రీన్‌లో ప్రదర్శింపబడుతుంది."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"శబ్దం చేస్తుంది, కిందకు-లాగే షేడ్, స్థితి పట్టీ &amp; లాక్ స్క్రీన్‌ లో.ప్రదర్శింపబడుతుంది."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ఈ నోటిఫికేషన్‌లను సవరించడం వీలుపడదు."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"ఈ నోటిఫికేషన్‌ల సమూహాన్ని ఇక్కడ కాన్ఫిగర్ చేయలేము"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ద్వారా"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ఈ యాప్ ఈ కెమెరాను ఉపయోగిస్తోంది."</string>
<string name="appops_microphone" msgid="741508267659494555">"ఈ యాప్ మైక్రోఫోన్‌ను ఉపయోగిస్తుంది."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ఈ యాప్ మీ స్క్రీన్‌లోని ఇతర యాప్‌లపై ప్రదర్శించబడుతోంది."</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 8f2e8f347da3..0f8fec3c0712 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"ส่งเสียงและแสดงในหน้าต่างแบบเลื่อนลง แถบสถานะ และในหน้าจอล็อก"</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"การแจ้งเตือนกลุ่มนี้กำหนดค่าที่นี่ไม่ได้"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"ผ่าน <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"แอปนี้กำลังใช้กล้อง"</string>
<string name="appops_microphone" msgid="741508267659494555">"แอปนี้กำลังใช้ไมโครโฟน"</string>
<string name="appops_overlay" msgid="6165912637560323464">"แอปนี้กำลังแสดงทับแอปอื่นๆ ในหน้าจอ"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index aa8d3a41120a..c24297cda036 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Tumutunog at ipinapakita sa pull-down na shade, status bar, at lock screen."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Hindi puwedeng baguhin ang mga notification na ito."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Hindi mako-configure dito ang pangkat na ito ng mga notification"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"sa pamamagitan ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ginagamit ng app na ito ang camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ginagamit ng app na ito ang mikropono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ipinapakita ang app na ito sa ibabaw ng iba pang app sa iyong screen."</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 230674d461fc..b424ab257b07 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -50,7 +50,7 @@
<string name="usb_accessory_permission_prompt" msgid="2465531696941369047">"<xliff:g id="APPLICATION">%1$s</xliff:g> uygulamasının <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> aksesuarına erişmesine izin verilsin mi?"</string>
<string name="usb_device_confirm_prompt" msgid="7440562274256843905">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> cihazını işlemek için <xliff:g id="APPLICATION">%1$s</xliff:g> uygulaması açılsın mı?"</string>
<string name="usb_accessory_confirm_prompt" msgid="4333670517539993561">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> aksesuarını işlemek için <xliff:g id="APPLICATION">%1$s</xliff:g> uygulaması açılsın mı?"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Bu USB aksesuarıyla çalışan yüklü uygulama yok. Bu aksesuar hakkında bilgi içn: <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Bu USB aksesuarıyla çalışan yüklü uygulama yok. Bu aksesuar hakkında bilgi için: <xliff:g id="URL">%1$s</xliff:g>"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"USB aksesuarı"</string>
<string name="label_view" msgid="6304565553218192990">"Görüntüle"</string>
<string name="always_use_device" msgid="4015357883336738417">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> bağlandığında <xliff:g id="APPLICATION">%1$s</xliff:g> uygulamasını her zaman aç"</string>
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Uyarıda bulunmaya devam et"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Bildirimleri kapat"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu uygulamadan gelen bildirimler gösterilmeye devam edilsin mi?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Sessiz"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Öncelikli"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Her zaman sessiz. Aşağı açılır gölgede gösterilir."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Her zaman sessiz. Aşağı açılır gölgede ve durum çubuğunda gösterilir."</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Her zaman sessiz. Aşağı açılır gölgede ve kilit ekranında gösterilir."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Her zaman sessiz. Aşağı açılır gölgede, durum çubuğunda ve kilit ekranında gösterilir."</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Ses çıkarır. Ayrıca aşağı açılır gölgede, durum çubuğunda ve kilit ekranında gösterilir."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Bu bildirimler değiştirilemez."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Bu bildirim grubu burada yapılandırılamaz"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ile"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Bu uygulama kamerayı kullanıyor."</string>
<string name="appops_microphone" msgid="741508267659494555">"Bu uygulama mikrofonu kullanıyor."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Bu uygulama, ekranınızdaki diğer uygulamaların üzerinde görüntüleniyor."</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index cc87f4b850fe..43fc2a7cc94f 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -651,7 +651,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Подають сигнал і показуються на розкривній панелі, у рядку стану й на заблокованому екрані."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Ці сповіщення не можна змінити."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Цю групу сповіщень не можна налаштувати тут"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"через додаток <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Цей додаток використовує камеру."</string>
<string name="appops_microphone" msgid="741508267659494555">"Цей додаток використовує мікрофон."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Цей додаток відображається поверх інших додатків на екрані."</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 711d8ac359a2..596349fc7f09 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"متنبہ کرنا جاری رکھیں"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"اطلاعات کو آف کریں"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"اس ایپ کی طرف سے اطلاعات دکھانا جاری رکھیں؟"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"لطیف"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"ترجیح دی گئی"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"ہمیشہ خاموش رکھیں۔ نیچے کی طرف کھینچیں شیڈ میں ڈسپلے کرتا ہے۔"</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"ہمیشہ خاموش رکھیں۔ نیچے کی طرف کھینچیں شیڈ اور اسٹیٹس بار پر ڈسپلے کرتا ہے۔"</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"ہمیشہ خاموش رکھیں۔ نیچے کی طرف کھینچیں شیڈ اور مقفل اسکرین پر ڈسپلے کرتا ہے۔"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"ہمیشہ خاموش رکھیں۔ نیچے کی طرف کھینچیں شیڈ، اسٹیٹس بار اور مقفل اسکرین پر ڈسپلے کرتا ہے۔"</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"نیچے کی طرف کھینچیں شیڈ، اسٹیٹس بار اور مقفل اسکرین پر آواز اور ڈسپلے کرتا ہے۔"</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"اطلاعات کے اس گروپ کو یہاں کنفیگر نہیں کیا جا سکتا"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"بذریعہ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"یہ ایپ کیمرے کا استعمال کر رہی ہے۔"</string>
<string name="appops_microphone" msgid="741508267659494555">"یہ ایپ مائیکروفون کا استعمال کر رہی ہے۔"</string>
<string name="appops_overlay" msgid="6165912637560323464">"یہ ایپ آپ کی اسکرین پر دیگر ایپس پر ڈسپلے کر رہی ہے۔"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 096eea43f911..83962e32f996 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -507,7 +507,7 @@
<string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"<xliff:g id="APPLICATION">%1$s</xliff:g> ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string>
<string name="monitoring_description_app_work" msgid="4612997849787922906">"Ishchi profilingiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi. <xliff:g id="APPLICATION">%2$s</xliff:g> ilovasi ish tarmog‘idagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nBatafsil axborot olish uchun administrator bilan bog‘laning."</string>
<string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"Ishchi profilingiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi. <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ilovasi ish tarmog‘idagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nShuningdek, <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ilovasi ham shaxsiy tarmoqdagi harakatlaringizni kuzatishi mumkin."</string>
- <string name="keyguard_indication_trust_unlocked" msgid="2712865815371519117">"TrustAgent tomonidan qulflanmagan"</string>
+ <string name="keyguard_indication_trust_unlocked" msgid="2712865815371519117">"TrustAgent tomonidan ochilgan"</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Qurilma qo‘lda qulfdan chiqarilmaguncha qulflangan holatda qoladi"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"Bildirishnomalarni tezroq oling"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"Ularni qulfdan chiqarishdan oldin ko‘ring"</string>
@@ -636,24 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Signal berishda davom etilsin"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"Bildirishnoma kelmasin"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu ilovadan keladigan bildirishnomalar chiqaversinmi?"</string>
- <!-- no translation found for notification_silence_title (7352089096356977930) -->
- <skip />
- <!-- no translation found for notification_alert_title (3966526305405016221) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low (8816251796432620434) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status (838359173060008373) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_lock (1568361562011497978) -->
- <skip />
- <!-- no translation found for notification_channel_summary_low_status_lock (966512668777695595) -->
- <skip />
- <!-- no translation found for notification_channel_summary_default (619096010741301745) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (4556908766584964102) -->
- <skip />
+ <string name="notification_silence_title" msgid="7352089096356977930">"Tovushsiz"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"Muhim"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"Doimo ovozsiz qolsin. Bildirishnomalar panelida chiqadi."</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"Doimo ovozsiz qolsin. Bildirishnomalar va holat panelida chiqadi"</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"Doimo ovozsiz qolsin. Bildirishnomalar paneli va ekran qulfida chiqadi"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"Doimo ovozsiz qolsin. Bildirishnomalar paneli, holat panelida va ekran qulfida chiqadi"</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"Ovoz chiqarib, bildirishnomalar paneli, holat paneli va ekran qulfida chiqadi."</string>
+ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Bu bildirishnomalarni tahrirlash imkonsiz."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Ushbu bildirishnomalar guruhi bu yerda sozlanmaydi"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> orqali"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Bu ilova kameradan foydalanmoqda."</string>
<string name="appops_microphone" msgid="741508267659494555">"Bu ilova mikrofondan foydalanmoqda."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Bu ilova ekranda boshqa ilovalar ustidan ochilgan."</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 48401b2f27fc..4e4aeee3afea 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Phát âm báo và hiển thị trong danh sách kéo xuống, thanh trạng thái và trên màn hình khóa."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Không thể sửa đổi các thông báo này."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Không thể định cấu hình nhóm thông báo này tại đây"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"thông qua <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ứng dụng này đang sử dụng máy ảnh."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ứng dụng này đang sử dụng micrô."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ứng dụng này đang hiển thị chồng lên các ứng dụng khác trên màn hình."</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 1350bee8b5f9..a40395f5e804 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"发出提示音,并显示在下拉通知栏、状态栏以及锁定屏幕中。"</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"无法修改这些通知。"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"您无法在此处配置这组通知"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"通过<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"此应用正在使用摄像头。"</string>
<string name="appops_microphone" msgid="741508267659494555">"此应用正在使用麦克风。"</string>
<string name="appops_overlay" msgid="6165912637560323464">"此应用正显示在屏幕上其他应用的上层。"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index ff4390735c77..aaba9c709ec6 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -636,16 +636,17 @@
<string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"繼續提示"</string>
<string name="inline_turn_off_notifications" msgid="8635596135532202355">"關閉通知"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"要繼續顯示此應用程式的通知嗎?"</string>
- <string name="notification_silence_title" msgid="7352089096356977930">"無聲通知"</string>
- <string name="notification_alert_title" msgid="3966526305405016221">"已設為優先"</string>
- <string name="notification_channel_summary_low" msgid="8816251796432620434">"一律不發出音效,但會顯示在下拉式通知欄中。"</string>
- <string name="notification_channel_summary_low_status" msgid="838359173060008373">"一律不發出音效,但會顯示在下拉式通知欄和狀態列中。"</string>
- <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"一律不發出音效,但會顯示在下拉式通知欄和螢幕鎖定畫面中。"</string>
- <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"一律不發出音效,但會顯示在下拉式通知欄、狀態列和螢幕鎖定畫面中。"</string>
- <string name="notification_channel_summary_default" msgid="619096010741301745">"會發出音效並顯示在下拉式通知欄、狀態列和螢幕鎖定畫面中。"</string>
+ <string name="notification_silence_title" msgid="7352089096356977930">"低重要性"</string>
+ <string name="notification_alert_title" msgid="3966526305405016221">"優先"</string>
+ <string name="notification_channel_summary_low" msgid="8816251796432620434">"一律靜音。在下拉式通知欄中顯示。"</string>
+ <string name="notification_channel_summary_low_status" msgid="838359173060008373">"一律靜音。在下拉式通知欄和狀態列中顯示。"</string>
+ <string name="notification_channel_summary_low_lock" msgid="1568361562011497978">"一律靜音。在下拉式通知欄和上鎖畫面中顯示。"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="966512668777695595">"一律靜音。在下拉式通知欄、狀態列和上鎖畫面中顯示。"</string>
+ <string name="notification_channel_summary_default" msgid="619096010741301745">"發出音效,並在下拉式通知欄、狀態列和上鎖畫面中顯示。"</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"無法修改這些通知。"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"無法在此設定這組通知"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"透過「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"此應用程式目前使用相機。"</string>
<string name="appops_microphone" msgid="741508267659494555">"此應用程式目前使用麥克風。"</string>
<string name="appops_overlay" msgid="6165912637560323464">"此應用程式目前透過其他應用程式在畫面上顯示內容。"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 1d5e3d832768..51209d2f8594 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"會發出音效並顯示在下拉式通知欄、狀態列和螢幕鎖定畫面中。"</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"無法修改這些通知。"</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"無法在這裡設定這個通知群組"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"透過「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"這個應用程式正在使用相機。"</string>
<string name="appops_microphone" msgid="741508267659494555">"這個應用程式正在使用麥克風。"</string>
<string name="appops_overlay" msgid="6165912637560323464">"這個應用程式顯示在畫面上其他應用程式的上層。"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index bb685cada7c3..611d827e18c1 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -645,7 +645,8 @@
<string name="notification_channel_summary_default" msgid="619096010741301745">"Yenza umsindo futhi iboniswa kumthunzi wokudonsela phansi, ibha yesimo nasekukhiyweni kwesikrini."</string>
<string name="notification_unblockable_desc" msgid="4556908766584964102">"Lezi zaziso azikwazi ukushintshwa."</string>
<string name="notification_multichannel_desc" msgid="4695920306092240550">"Leli qembu lezaziso alikwazi ukulungiselelwa lapha"</string>
- <string name="notification_delegate_header" msgid="9167022191405284627">"nge-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for notification_delegate_header (2857691673814814270) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Lolu hlelo lokusebenza lusebenzisa ikhamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Lolu hlelo lokusebenza lusebenzisa imakrofoni."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Lolu hlelo lokusebenza luboniswa ngaphezulu kwezinye izinhlelo zokusebenza kusikrini sakho."</string>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index df6bc20bbad8..a0c021a3f132 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -41,10 +41,16 @@
<!-- Size of the nav bar edge panels, should be greater to the
edge sensitivity + the drag threshold -->
- <dimen name="navigation_edge_panel_width">52dp</dimen>
- <dimen name="navigation_edge_panel_height">52dp</dimen>
+ <dimen name="navigation_edge_panel_width">76dp</dimen>
+ <!-- Padding at the end of the navigation panel to allow the arrow not to be clipped off -->
+ <dimen name="navigation_edge_panel_padding">24dp</dimen>
+ <dimen name="navigation_edge_panel_height">84dp</dimen>
<!-- The threshold to drag to trigger the edge action -->
<dimen name="navigation_edge_action_drag_threshold">16dp</dimen>
+ <!-- The minimum display position of the arrow on the screen -->
+ <dimen name="navigation_edge_arrow_min_y">64dp</dimen>
+ <!-- The amount by which the arrow is shifted to avoid the finger-->
+ <dimen name="navigation_edge_finger_offset">48dp</dimen>
<!-- Luminance threshold to determine black/white contrast for the navigation affordances -->
<item name="navigation_luminance_threshold" type="dimen" format="float">0.5</item>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 4b6434744394..d765f0c157bd 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -318,10 +318,6 @@
<item name="android:windowIsFloating">true</item>
</style>
- <style name="volume_dialog_theme" parent="qs_theme">
- <item name="android:windowIsFloating">false</item>
- </style>
-
<style name="systemui_theme_remote_input" parent="@android:style/Theme.DeviceDefault.Light">
<item name="android:colorAccent">@color/remote_input_accent</item>
</style>
diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
index 2e9b03c6b31e..12d1f7c3118d 100644
--- a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
+++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
@@ -27,6 +27,7 @@ import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
+import android.os.SystemProperties;
import android.telephony.CarrierConfigManager;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
@@ -40,6 +41,7 @@ import androidx.annotation.VisibleForTesting;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.TelephonyProperties;
import com.android.settingslib.WirelessUtils;
import com.android.systemui.Dependency;
import com.android.systemui.keyguard.WakefulnessLifecycle;
@@ -70,6 +72,8 @@ public class CarrierTextController {
private Context mContext;
private CharSequence mSeparator;
private WakefulnessLifecycle mWakefulnessLifecycle;
+ @VisibleForTesting
+ protected boolean mDisplayOpportunisticSubscriptionCarrierText;
private final WakefulnessLifecycle.Observer mWakefulnessObserver =
new WakefulnessLifecycle.Observer() {
@Override
@@ -247,7 +251,6 @@ public class CarrierTextController {
}
/**
- * STOPSHIP(b/130246708) remove when no longer needed for testing purpose.
* @param subscriptions
*/
private void filterMobileSubscriptionInSameGroup(List<SubscriptionInfo> subscriptions) {
@@ -274,21 +277,40 @@ public class CarrierTextController {
}
}
+ /**
+ * updates if opportunistic sub carrier text should be displayed or not
+ *
+ */
+ @VisibleForTesting
+ public void updateDisplayOpportunisticSubscriptionCarrierText() {
+ mDisplayOpportunisticSubscriptionCarrierText = SystemProperties
+ .getBoolean(TelephonyProperties
+ .DISPLAY_OPPORTUNISTIC_SUBSCRIPTION_CARRIER_TEXT_PROPERTY_NAME, false);
+ }
+
+ protected List<SubscriptionInfo> getSubscriptionInfo() {
+ List<SubscriptionInfo> subs;
+ if (mDisplayOpportunisticSubscriptionCarrierText) {
+ SubscriptionManager subscriptionManager = ((SubscriptionManager) mContext
+ .getSystemService(
+ Context.TELEPHONY_SUBSCRIPTION_SERVICE));
+ subs = subscriptionManager.getActiveSubscriptionInfoList(false);
+ if (subs == null) {
+ subs = new ArrayList<>();
+ } else {
+ filterMobileSubscriptionInSameGroup(subs);
+ }
+ } else {
+ subs = mKeyguardUpdateMonitor.getSubscriptionInfo(false);
+ }
+ return subs;
+ }
+
protected void updateCarrierText() {
boolean allSimsMissing = true;
boolean anySimReadyAndInService = false;
CharSequence displayText = null;
-
- // STOPSHIP(b/130246708) revert to mKeyguardUpdateMonitor.getSubscriptionInfo(false).
- SubscriptionManager subscriptionManager = ((SubscriptionManager) mContext.getSystemService(
- Context.TELEPHONY_SUBSCRIPTION_SERVICE));
- List<SubscriptionInfo> subs = subscriptionManager.getActiveSubscriptionInfoList(false);
-
- if (subs == null) {
- subs = new ArrayList<>();
- } else {
- filterMobileSubscriptionInSameGroup(subs);
- }
+ List<SubscriptionInfo> subs = getSubscriptionInfo();
final int numSubs = subs.size();
final int[] subsIds = new int[numSubs];
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 20de4d10692d..8d62bca00f0a 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -9,12 +9,14 @@ import android.app.WallpaperManager;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Paint.Style;
+import android.os.Build;
import android.transition.ChangeBounds;
import android.transition.Transition;
import android.transition.TransitionListenerAdapter;
import android.transition.TransitionManager;
import android.transition.TransitionValues;
import android.util.AttributeSet;
+import android.util.Log;
import android.util.MathUtils;
import android.util.TypedValue;
import android.view.View;
@@ -47,6 +49,8 @@ import javax.inject.Named;
*/
public class KeyguardClockSwitch extends RelativeLayout {
+ private static final String TAG = "KeyguardClockSwitch";
+
/**
* Controller used to track StatusBar state to know when to show the big_clock_container.
*/
@@ -343,6 +347,10 @@ public class KeyguardClockSwitch extends RelativeLayout {
if (mClockPlugin != null) {
mClockPlugin.onTimeTick();
}
+ if (Build.IS_DEBUGGABLE) {
+ // Log for debugging b/130888082 (sysui waking up, but clock not updating)
+ Log.d(TAG, "Updating clock: " + mClockView.getText());
+ }
}
/**
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java
index 814fec34b4dc..0a6885c0ae69 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java
@@ -27,6 +27,7 @@ import android.os.Looper;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.AttributeSet;
+import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;
@@ -120,6 +121,15 @@ public class KeyguardMessageArea extends TextView implements SecurityMessageDisp
}
@Override
+ public void onDensityOrFontScaleChanged() {
+ TypedArray array = mContext.obtainStyledAttributes(R.style.Keyguard_TextView, new int[] {
+ android.R.attr.textSize
+ });
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize(0, 0));
+ array.recycle();
+ }
+
+ @Override
public void setMessage(CharSequence msg) {
if (!TextUtils.isEmpty(msg)) {
securityMessageChanged(msg);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java
index 5860230e8573..420d0fac433e 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java
@@ -249,7 +249,7 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
mContext.getResources()
.getText(mCurrentDialog.getAuthenticatedAccessibilityResourceId()));
if (mCurrentDialog.requiresConfirmation()) {
- mCurrentDialog.showConfirmationButton(true /* show */);
+ mCurrentDialog.updateState(BiometricDialogView.STATE_PENDING_CONFIRMATION);
} else {
mCurrentDialog.updateState(BiometricDialogView.STATE_AUTHENTICATED);
mHandler.postDelayed(() -> {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java
index 30c97d718604..32a76784930f 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java
@@ -95,7 +95,7 @@ public abstract class BiometricDialogView extends LinearLayout {
private Bundle mBundle;
- private int mLastState;
+ private int mState;
private boolean mAnimatingAway;
private boolean mWasForceRemoved;
private boolean mSkipIntro;
@@ -209,7 +209,11 @@ public abstract class BiometricDialogView extends LinearLayout {
setDismissesDialog(rightSpace);
mNegativeButton.setOnClickListener((View v) -> {
- mCallback.onNegativePressed();
+ if (mState == STATE_PENDING_CONFIRMATION || mState == STATE_AUTHENTICATED) {
+ mCallback.onUserCanceled();
+ } else {
+ mCallback.onNegativePressed();
+ }
});
mPositiveButton.setOnClickListener((View v) -> {
@@ -260,7 +264,7 @@ public abstract class BiometricDialogView extends LinearLayout {
mDialog.getLayoutParams().width = (int) mDialogWidth;
}
- mLastState = STATE_IDLE;
+ mState = STATE_IDLE;
updateState(STATE_AUTHENTICATING);
CharSequence titleText = mBundle.getCharSequence(BiometricPrompt.KEY_TITLE);
@@ -288,6 +292,11 @@ public abstract class BiometricDialogView extends LinearLayout {
mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT));
+ if (requiresConfirmation()) {
+ mPositiveButton.setVisibility(View.VISIBLE);
+ mPositiveButton.setEnabled(false);
+ }
+
if (mWasForceRemoved || mSkipIntro) {
// Show the dialog immediately
mLayout.animate().cancel();
@@ -327,7 +336,7 @@ public abstract class BiometricDialogView extends LinearLayout {
private void setDismissesDialog(View v) {
v.setClickable(true);
v.setOnTouchListener((View view, MotionEvent event) -> {
- if (mLastState != STATE_AUTHENTICATED && shouldGrayAreaDismissDialog()) {
+ if (mState != STATE_AUTHENTICATED && shouldGrayAreaDismissDialog()) {
mCallback.onUserCanceled();
}
return true;
@@ -406,16 +415,6 @@ public abstract class BiometricDialogView extends LinearLayout {
return mRequireConfirmation;
}
- public void showConfirmationButton(boolean show) {
- if (show) {
- mHandler.removeMessages(MSG_CLEAR_MESSAGE);
- updateState(STATE_PENDING_CONFIRMATION);
- mPositiveButton.setVisibility(View.VISIBLE);
- } else {
- mPositiveButton.setVisibility(View.GONE);
- }
- }
-
public void setUserId(int userId) {
mUserId = userId;
}
@@ -452,15 +451,21 @@ public abstract class BiometricDialogView extends LinearLayout {
public void updateState(int newState) {
if (newState == STATE_PENDING_CONFIRMATION) {
+ mHandler.removeMessages(MSG_CLEAR_MESSAGE);
mErrorText.setVisibility(View.INVISIBLE);
+ mPositiveButton.setEnabled(true);
} else if (newState == STATE_AUTHENTICATED) {
mPositiveButton.setVisibility(View.GONE);
mNegativeButton.setVisibility(View.GONE);
mErrorText.setVisibility(View.INVISIBLE);
}
- updateIcon(mLastState, newState);
- mLastState = newState;
+ if (newState == STATE_PENDING_CONFIRMATION || newState == STATE_AUTHENTICATED) {
+ mNegativeButton.setText(R.string.cancel);
+ }
+
+ updateIcon(mState, newState);
+ mState = newState;
}
public void showTryAgainButton(boolean show) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java
index d26968635dc2..28156daaec08 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java
@@ -293,6 +293,12 @@ public class FaceDialogView extends BiometricDialogView {
mTryAgainButton.setVisibility(View.GONE);
}
}
+
+ if (show) {
+ mPositiveButton.setVisibility(View.GONE);
+ } else if (!show && requiresConfirmation()) {
+ mPositiveButton.setVisibility(View.VISIBLE);
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index c886062a1b02..21f0c1e4eeb4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -56,6 +56,7 @@ import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.phone.UnlockMethodCache;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.util.wakelock.SettableWakeLock;
@@ -69,7 +70,8 @@ import java.util.IllegalFormatConversionException;
/**
* Controls the indications and error messages shown on the Keyguard
*/
-public class KeyguardIndicationController implements StateListener {
+public class KeyguardIndicationController implements StateListener,
+ UnlockMethodCache.OnUnlockMethodChangedListener {
private static final String TAG = "KeyguardIndication";
private static final boolean DEBUG_CHARGING_SPEED = false;
@@ -81,6 +83,9 @@ public class KeyguardIndicationController implements StateListener {
private final Context mContext;
private final ShadeController mShadeController;
private final AccessibilityController mAccessibilityController;
+ private final UnlockMethodCache mUnlockMethodCache;
+ private final StatusBarStateController mStatusBarStateController;
+ private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private ViewGroup mIndicationArea;
private KeyguardIndicationTextView mTextView;
private KeyguardIndicationTextView mDisclosure;
@@ -122,18 +127,21 @@ public class KeyguardIndicationController implements StateListener {
this(context, indicationArea, lockIcon, new LockPatternUtils(context),
WakeLock.createPartial(context, "Doze:KeyguardIndication"),
Dependency.get(ShadeController.class),
- Dependency.get(AccessibilityController.class));
-
- registerCallbacks(KeyguardUpdateMonitor.getInstance(context));
+ Dependency.get(AccessibilityController.class),
+ UnlockMethodCache.getInstance(context),
+ Dependency.get(StatusBarStateController.class),
+ KeyguardUpdateMonitor.getInstance(context));
}
/**
- * Creates a new KeyguardIndicationController for testing. Does *not* register callbacks.
+ * Creates a new KeyguardIndicationController for testing.
*/
@VisibleForTesting
KeyguardIndicationController(Context context, ViewGroup indicationArea, LockIcon lockIcon,
LockPatternUtils lockPatternUtils, WakeLock wakeLock, ShadeController shadeController,
- AccessibilityController accessibilityController) {
+ AccessibilityController accessibilityController, UnlockMethodCache unlockMethodCache,
+ StatusBarStateController statusBarStateController,
+ KeyguardUpdateMonitor keyguardUpdateMonitor) {
mContext = context;
mIndicationArea = indicationArea;
mTextView = indicationArea.findViewById(R.id.keyguard_indication_text);
@@ -143,6 +151,9 @@ public class KeyguardIndicationController implements StateListener {
mLockIcon = lockIcon;
mShadeController = shadeController;
mAccessibilityController = accessibilityController;
+ mUnlockMethodCache = unlockMethodCache;
+ mStatusBarStateController = statusBarStateController;
+ mKeyguardUpdateMonitor = keyguardUpdateMonitor;
// lock icon is not used on all form factors.
if (mLockIcon != null) {
mLockIcon.setOnLongClickListener(this::handleLockLongClick);
@@ -161,15 +172,12 @@ public class KeyguardIndicationController implements StateListener {
mDevicePolicyManager = (DevicePolicyManager) context.getSystemService(
Context.DEVICE_POLICY_SERVICE);
-
updateDisclosure();
- }
- private void registerCallbacks(KeyguardUpdateMonitor monitor) {
- monitor.registerCallback(getKeyguardCallback());
-
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mTickReceiver);
- Dependency.get(StatusBarStateController.class).addCallback(this);
+ mKeyguardUpdateMonitor.registerCallback(getKeyguardCallback());
+ mKeyguardUpdateMonitor.registerCallback(mTickReceiver);
+ mStatusBarStateController.addCallback(this);
+ mUnlockMethodCache.addListener(this);
}
/**
@@ -179,8 +187,10 @@ public class KeyguardIndicationController implements StateListener {
* //TODO: This can probably be converted to a fragment and not have to be manually recreated
*/
public void destroy() {
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mTickReceiver);
- Dependency.get(StatusBarStateController.class).removeCallback(this);
+ mKeyguardUpdateMonitor.removeCallback(mTickReceiver);
+ mKeyguardUpdateMonitor.removeCallback(getKeyguardCallback());
+ mStatusBarStateController.removeCallback(this);
+ mUnlockMethodCache.removeListener(this);
}
private boolean handleLockLongClick(View view) {
@@ -271,7 +281,8 @@ public class KeyguardIndicationController implements StateListener {
*
* @return {@code null} or an empty string if a trust indication text should not be shown.
*/
- private String getTrustGrantedIndication() {
+ @VisibleForTesting
+ String getTrustGrantedIndication() {
return mContext.getString(R.string.keyguard_indication_trust_unlocked);
}
@@ -363,7 +374,6 @@ public class KeyguardIndicationController implements StateListener {
return;
}
- KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
int userId = KeyguardUpdateMonitor.getCurrentUser();
String trustGrantedIndication = getTrustGrantedIndication();
String trustManagedIndication = getTrustManagedIndication();
@@ -374,7 +384,7 @@ public class KeyguardIndicationController implements StateListener {
mTextView.switchIndication(mTransientIndication);
mTextView.setTextColor(mTransientTextColorState);
} else if (!TextUtils.isEmpty(trustGrantedIndication)
- && updateMonitor.getUserHasTrust(userId)) {
+ && mKeyguardUpdateMonitor.getUserHasTrust(userId)) {
mTextView.switchIndication(trustGrantedIndication);
mTextView.setTextColor(mInitialTextColorState);
} else if (mPowerPluggedIn) {
@@ -389,8 +399,8 @@ public class KeyguardIndicationController implements StateListener {
mTextView.switchIndication(indication);
}
} else if (!TextUtils.isEmpty(trustManagedIndication)
- && updateMonitor.getUserTrustIsManaged(userId)
- && !updateMonitor.getUserHasTrust(userId)) {
+ && mKeyguardUpdateMonitor.getUserTrustIsManaged(userId)
+ && !mKeyguardUpdateMonitor.getUserHasTrust(userId)) {
mTextView.switchIndication(trustManagedIndication);
mTextView.setTextColor(mInitialTextColorState);
} else {
@@ -572,6 +582,11 @@ public class KeyguardIndicationController implements StateListener {
setDozing(isDozing);
}
+ @Override
+ public void onUnlockMethodStateChanged() {
+ updateIndication(!mDozing);
+ }
+
protected class BaseKeyguardCallback extends KeyguardUpdateMonitorCallback {
public static final int HIDE_DELAY_MS = 5000;
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 9b3f05e3e8d3..4638c40c415d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
@@ -48,6 +48,7 @@ import android.view.InputMonitor;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
@@ -126,6 +127,12 @@ public class EdgeBackGestureHandler implements DisplayListener {
private final float mTouchSlop;
// Minimum distance to move so that is can be considerd as a back swipe
private final float mSwipeThreshold;
+ // The threshold where the touch needs to be at most, such that the arrow is displayed above the
+ // finger, otherwise it will be below
+ private final int mMinArrowPosition;
+ // The amount by which the arrow is shifted to avoid the finger
+ private final int mFingerOffset;
+
private final int mNavBarHeight;
@@ -147,6 +154,8 @@ public class EdgeBackGestureHandler implements DisplayListener {
private NavigationBarEdgePanel mEdgePanel;
private WindowManager.LayoutParams mEdgePanelLp;
+ private final Rect mSamplingRect = new Rect();
+ private RegionSamplingHelper mRegionSamplingHelper;
public EdgeBackGestureHandler(Context context, OverviewProxyService overviewProxyService) {
final Resources res = context.getResources();
@@ -163,6 +172,9 @@ public class EdgeBackGestureHandler implements DisplayListener {
mSwipeThreshold = res.getDimension(R.dimen.navigation_edge_action_drag_threshold);
mNavBarHeight = res.getDimensionPixelSize(R.dimen.navigation_bar_frame_height);
+ mMinArrowPosition = res.getDimensionPixelSize(
+ R.dimen.navigation_edge_arrow_min_y);
+ mFingerOffset = res.getDimensionPixelSize(R.dimen.navigation_edge_finger_offset);
}
/**
@@ -208,6 +220,8 @@ public class EdgeBackGestureHandler implements DisplayListener {
if (mEdgePanel != null) {
mWm.removeView(mEdgePanel);
mEdgePanel = null;
+ mRegionSamplingHelper.stop();
+ mRegionSamplingHelper = null;
}
if (!mIsEnabled) {
@@ -261,6 +275,18 @@ public class EdgeBackGestureHandler implements DisplayListener {
mEdgePanelLp.windowAnimations = 0;
mEdgePanel.setLayoutParams(mEdgePanelLp);
mWm.addView(mEdgePanel, mEdgePanelLp);
+ mRegionSamplingHelper = new RegionSamplingHelper(mEdgePanel,
+ new RegionSamplingHelper.SamplingCallback() {
+ @Override
+ public void onRegionDarknessChanged(boolean isRegionDark) {
+ mEdgePanel.setIsDark(!isRegionDark, true /* animate */);
+ }
+
+ @Override
+ public Rect getSampledRegion(View sampledView) {
+ return mSamplingRect;
+ }
+ });
}
}
@@ -291,7 +317,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
// Verify if this is in within the touch region and we aren't in immersive mode, and
// either the bouncer is showing or the notification panel is hidden
int stateFlags = mOverviewProxyService.getSystemUiStateFlags();
- mIsOnLeftEdge = ev.getX() < mEdgeWidth;
+ mIsOnLeftEdge = ev.getX() <= mEdgeWidth;
mAllowGesture = (stateFlags & SYSUI_STATE_NAV_BAR_HIDDEN) == 0
&& ((stateFlags & SYSUI_STATE_BOUNCER_SHOWING) == SYSUI_STATE_BOUNCER_SHOWING
|| (stateFlags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) == 0)
@@ -301,14 +327,13 @@ public class EdgeBackGestureHandler implements DisplayListener {
? (Gravity.LEFT | Gravity.TOP)
: (Gravity.RIGHT | Gravity.TOP);
mEdgePanel.setIsLeftPanel(mIsOnLeftEdge);
- mEdgePanelLp.y = MathUtils.constrain(
- (int) (ev.getY() - mEdgePanelLp.height / 2),
- 0, mDisplaySize.y);
+ mEdgePanel.handleTouch(ev);
+ updateEdgePanelPosition(ev.getY());
mWm.updateViewLayout(mEdgePanel, mEdgePanelLp);
+ mRegionSamplingHelper.start(mSamplingRect);
mDownPoint.set(ev.getX(), ev.getY());
mThresholdCrossed = false;
- mEdgePanel.handleTouch(ev);
}
} else if (mAllowGesture) {
if (!mThresholdCrossed && ev.getAction() == MotionEvent.ACTION_MOVE) {
@@ -333,12 +358,9 @@ public class EdgeBackGestureHandler implements DisplayListener {
// forward touch
mEdgePanel.handleTouch(ev);
- if (ev.getAction() == MotionEvent.ACTION_UP) {
- float xDiff = ev.getX() - mDownPoint.x;
- boolean exceedsThreshold = mIsOnLeftEdge
- ? (xDiff > mSwipeThreshold) : (-xDiff > mSwipeThreshold);
- boolean performAction = exceedsThreshold
- && Math.abs(xDiff) > Math.abs(ev.getY() - mDownPoint.y);
+ boolean isUp = ev.getAction() == MotionEvent.ACTION_UP;
+ if (isUp) {
+ boolean performAction = mEdgePanel.shouldTriggerBack();
if (performAction) {
// Perform back
sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
@@ -347,9 +369,32 @@ public class EdgeBackGestureHandler implements DisplayListener {
mOverviewProxyService.notifyBackAction(performAction, (int) mDownPoint.x,
(int) mDownPoint.y, false /* isButton */, !mIsOnLeftEdge);
}
+ if (isUp || ev.getAction() == MotionEvent.ACTION_CANCEL) {
+ mRegionSamplingHelper.stop();
+ } else {
+ updateSamplingRect();
+ mRegionSamplingHelper.updateSamplingRect();
+ }
}
}
+ private void updateEdgePanelPosition(float touchY) {
+ float position = touchY - mFingerOffset;
+ position = Math.max(position, mMinArrowPosition);
+ position = (position - mEdgePanelLp.height / 2.0f);
+ mEdgePanelLp.y = MathUtils.constrain((int) position, 0, mDisplaySize.y);
+ updateSamplingRect();
+ }
+
+ private void updateSamplingRect() {
+ int top = mEdgePanelLp.y;
+ int left = mIsOnLeftEdge ? 0 : mDisplaySize.x - mEdgePanelLp.width;
+ int right = left + mEdgePanelLp.width;
+ int bottom = top + mEdgePanelLp.height;
+ mSamplingRect.set(left, top, right, bottom);
+ mEdgePanel.adjustRectToBoundingBox(mSamplingRect);
+ }
+
@Override
public void onDisplayAdded(int displayId) { }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarEdgePanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarEdgePanel.java
index 86b53445468c..79c7ab1d2b8c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarEdgePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarEdgePanel.java
@@ -16,93 +16,221 @@
package com.android.systemui.statusbar.phone;
-import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
import android.content.Context;
-import android.graphics.Canvas;
+import android.content.res.Configuration;
+import android.graphics.Canvas;;
import android.graphics.Paint;
-import android.os.SystemClock;
+import android.graphics.Path;
+import android.graphics.Rect;
import android.os.VibrationEffect;
-import android.util.FloatProperty;
import android.util.MathUtils;
-import android.view.HapticFeedbackConstants;
+import android.view.ContextThemeWrapper;
import android.view.MotionEvent;
+import android.view.VelocityTracker;
import android.view.View;
+import android.view.animation.Interpolator;
+import android.view.animation.PathInterpolator;
+import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
+import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.VibratorHelper;
+import androidx.core.graphics.ColorUtils;
+import androidx.dynamicanimation.animation.DynamicAnimation;
+import androidx.dynamicanimation.animation.FloatPropertyCompat;
+import androidx.dynamicanimation.animation.SpringAnimation;
+import androidx.dynamicanimation.animation.SpringForce;
+
public class NavigationBarEdgePanel extends View {
- // TODO: read from resources once drawing is finalized.
- private static final boolean SHOW_PROTECTION_STROKE = true;
- private static final int PROTECTION_COLOR = 0xffc0c0c0;
- private static final int STROKE_COLOR = 0xffe5e5e5;
- private static final int PROTECTION_WIDTH_PX = 4;
- private static final int BASE_EXTENT = 32;
- private static final int ARROW_HEIGHT_DP = 32;
- private static final int POINT_EXTENT_DP = 8;
- private static final int ARROW_THICKNESS_DP = 4;
- private static final float TRACK_LENGTH_MULTIPLIER = 1.5f;
- private static final float START_POINTING_RATIO = 0.3f;
- private static final float POINTEDNESS_BEFORE_SNAP_RATIO = 0.4f;
- private static final int ANIM_DURATION_MS = 150;
- private static final long HAPTIC_TIMEOUT_MS = 200;
+ private static final long COLOR_ANIMATION_DURATION_MS = 100;
+ private static final long DISAPPEAR_FADE_ANIMATION_DURATION_MS = 140;
+ private static final long DISAPPEAR_ARROW_ANIMATION_DURATION_MS = 100;
+
+ /**
+ * The size of the protection of the arrow in px. Only used if this is not background protected
+ */
+ private static final int PROTECTION_WIDTH_PX = 2;
+
+ /**
+ * The basic translation in dp where the arrow resides
+ */
+ private static final int BASE_TRANSLATION_DP = 32;
+
+ /**
+ * The length of the arrow leg measured from the center to the end
+ */
+ private static final int ARROW_LENGTH_DP = 18;
+
+ /**
+ * The angle measured from the xAxis, where the leg is when the arrow rests
+ */
+ private static final int ARROW_ANGLE_WHEN_EXTENDED_DEGREES = 56;
+
+ /**
+ * The angle that is added per 1000 px speed to the angle of the leg
+ */
+ private static final int ARROW_ANGLE_ADDED_PER_1000_SPEED = 8;
+
+ /**
+ * The maximum angle offset allowed due to speed
+ */
+ private static final int ARROW_MAX_ANGLE_SPEED_OFFSET_DEGREES = 4;
+
+ /**
+ * The thickness of the arrow. Adjusted to match the home handle (approximately)
+ */
+ private static final float ARROW_THICKNESS_DP = 2.5f;
+
+ /**
+ * The amount of rubber banding we do for the horizontal translation beyond the base translation
+ */
+ private static final int RUBBER_BAND_AMOUNT = 10;
+
+ /**
+ * The interpolator used to rubberband
+ */
+ private static final Interpolator RUBBER_BAND_INTERPOLATOR
+ = new PathInterpolator(1.0f / RUBBER_BAND_AMOUNT, 1.0f, 1.0f, 1.0f);
+
+ /**
+ * The amount of rubber banding we do for the translation before base translation
+ */
+ private static final int RUBBER_BAND_AMOUNT_APPEAR = 4;
+
+ /**
+ * The interpolator used to rubberband the appearing of the arrow.
+ */
+ private static final Interpolator RUBBER_BAND_INTERPOLATOR_APPEAR
+ = new PathInterpolator(1.0f / RUBBER_BAND_AMOUNT_APPEAR, 1.0f, 1.0f, 1.0f);
private final VibratorHelper mVibratorHelper;
+ /**
+ * The paint the arrow is drawn with
+ */
private final Paint mPaint = new Paint();
- private final Paint mProtectionPaint = new Paint();
-
- private final ObjectAnimator mEndAnimator;
- private final ObjectAnimator mLegAnimator;
+ /**
+ * The paint the arrow protection is drawn with
+ */
+ private final Paint mProtectionPaint;
private final float mDensity;
- private final float mBaseExtent;
- private final float mPointExtent;
- private final float mHeight;
- private final float mStrokeThickness;
+ private final float mBaseTranslation;
+ private final float mArrowLength;
+ private final float mArrowThickness;
+
+ /**
+ * The minimum delta needed in movement for the arrow to change direction / stop triggering back
+ */
+ private final float mMinDeltaForSwitch;
private final float mSwipeThreshold;
+ private final Path mArrowPath = new Path();
+
+ private final SpringAnimation mAngleAnimation;
+ private final SpringAnimation mTranslationAnimation;
+ private final SpringAnimation mVerticalTranslationAnimation;
+ private final SpringForce mAngleAppearForce;
+ private final SpringForce mAngleDisappearForce;
+ private final ValueAnimator mArrowColorAnimator;
+ private final ValueAnimator mArrowDisappearAnimation;
+ private final SpringForce mRegularTranslationSpring;
+ private final SpringForce mTriggerBackSpring;
+
+ private VelocityTracker mVelocityTracker;
+ private boolean mIsDark = false;
+ private boolean mShowProtection = false;
+ private int mProtectionColorLight;
+ private int mArrowPaddingEnd;
+ private int mArrowColorLight;
+ private int mProtectionColorDark;
+ private int mArrowColorDark;
+ private int mProtectionColor;
+ private int mArrowColor;
+ /**
+ * True if the panel is currently on the left of the screen
+ */
private boolean mIsLeftPanel;
private float mStartX;
+ private float mStartY;
+ private float mCurrentAngle;
+ /**
+ * The current translation of the arrow
+ */
+ private float mCurrentTranslation;
+ /**
+ * Where the arrow will be in the resting position.
+ */
+ private float mDesiredTranslation;
private boolean mDragSlopPassed;
- private long mLastSlopHapticTime;
- private boolean mGestureDetected;
private boolean mArrowsPointLeft;
- private float mGestureLength;
- private float mLegProgress;
- private float mDragProgress;
-
- // How much the "legs" of the back arrow have proceeded from being a line to an arrow.
- private static final FloatProperty<NavigationBarEdgePanel> LEG_PROGRESS =
- new FloatProperty<NavigationBarEdgePanel>("legProgress") {
+ private float mMaxTranslation;
+ private boolean mTriggerBack;
+ private float mPreviousTouchTranslation;
+ private float mTotalTouchDelta;
+ private float mVerticalTranslation;
+ private float mDesiredVerticalTranslation;
+ private float mDesiredAngle;
+ private float mAngleOffset;
+ private int mArrowStartColor;
+ private int mCurrentArrowColor;
+ private float mDisappearAmount;
+
+ private DynamicAnimation.OnAnimationEndListener mSetGoneEndListener
+ = new DynamicAnimation.OnAnimationEndListener() {
+ @Override
+ public void onAnimationEnd(DynamicAnimation animation, boolean canceled, float value,
+ float velocity) {
+ animation.removeEndListener(this);
+ if (!canceled) {
+ setVisibility(GONE);
+ }
+ }
+ };
+ private static final FloatPropertyCompat<NavigationBarEdgePanel> CURRENT_ANGLE =
+ new FloatPropertyCompat<NavigationBarEdgePanel>("currentAngle") {
@Override
public void setValue(NavigationBarEdgePanel object, float value) {
- object.setLegProgress(value);
+ object.setCurrentAngle(value);
}
@Override
- public Float get(NavigationBarEdgePanel object) {
- return object.getLegProgress();
+ public float getValue(NavigationBarEdgePanel object) {
+ return object.getCurrentAngle();
}
};
- // How far across the view the arrow should be drawn.
- private static final FloatProperty<NavigationBarEdgePanel> DRAG_PROGRESS =
- new FloatProperty<NavigationBarEdgePanel>("dragProgress") {
+ private static final FloatPropertyCompat<NavigationBarEdgePanel> CURRENT_TRANSLATION =
+ new FloatPropertyCompat<NavigationBarEdgePanel>("currentTranslation") {
+
+ @Override
+ public void setValue(NavigationBarEdgePanel object, float value) {
+ object.setCurrentTranslation(value);
+ }
+
+ @Override
+ public float getValue(NavigationBarEdgePanel object) {
+ return object.getCurrentTranslation();
+ }
+ };
+ private static final FloatPropertyCompat<NavigationBarEdgePanel> CURRENT_VERTICAL_TRANSLATION =
+ new FloatPropertyCompat<NavigationBarEdgePanel>("verticalTranslation") {
@Override
public void setValue(NavigationBarEdgePanel object, float value) {
- object.setDragProgress(value);
+ object.setVerticalTranslation(value);
}
@Override
- public Float get(NavigationBarEdgePanel object) {
- return object.getDragProgress();
+ public float getValue(NavigationBarEdgePanel object) {
+ return object.getVerticalTranslation();
}
};
@@ -111,171 +239,499 @@ public class NavigationBarEdgePanel extends View {
mVibratorHelper = Dependency.get(VibratorHelper.class);
- mEndAnimator = ObjectAnimator.ofFloat(this, DRAG_PROGRESS, 1f);
- mEndAnimator.setAutoCancel(true);
- mEndAnimator.setDuration(ANIM_DURATION_MS);
-
- mLegAnimator = ObjectAnimator.ofFloat(this, LEG_PROGRESS, 1f);
- mLegAnimator.setAutoCancel(true);
- mLegAnimator.setDuration(ANIM_DURATION_MS);
-
mDensity = context.getResources().getDisplayMetrics().density;
- mBaseExtent = dp(BASE_EXTENT);
- mHeight = dp(ARROW_HEIGHT_DP);
- mPointExtent = dp(POINT_EXTENT_DP);
- mStrokeThickness = dp(ARROW_THICKNESS_DP);
+ mBaseTranslation = dp(BASE_TRANSLATION_DP);
+ mArrowLength = dp(ARROW_LENGTH_DP);
+ mArrowThickness = dp(ARROW_THICKNESS_DP);
+ mMinDeltaForSwitch = dp(32);
- mPaint.setStrokeWidth(mStrokeThickness);
+ mPaint.setStrokeWidth(mArrowThickness);
mPaint.setStrokeCap(Paint.Cap.ROUND);
- mPaint.setColor(STROKE_COLOR);
mPaint.setAntiAlias(true);
-
- mProtectionPaint.setStrokeWidth(mStrokeThickness + PROTECTION_WIDTH_PX);
- mProtectionPaint.setStrokeCap(Paint.Cap.ROUND);
- mProtectionPaint.setColor(PROTECTION_COLOR);
- mProtectionPaint.setAntiAlias(true);
-
- // Both panels arrow point the same way
- mArrowsPointLeft = getLayoutDirection() == LAYOUT_DIRECTION_LTR;
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeJoin(Paint.Join.ROUND);
+
+ mArrowColorAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
+ mArrowColorAnimator.setDuration(COLOR_ANIMATION_DURATION_MS);
+ mArrowColorAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int newColor = ColorUtils.blendARGB(mArrowStartColor, mArrowColor,
+ animation.getAnimatedFraction());
+ setCurrentArrowColor(newColor);
+ }
+ });
+
+ mArrowDisappearAnimation = ValueAnimator.ofFloat(0.0f, 1.0f);
+ mArrowDisappearAnimation.setDuration(DISAPPEAR_ARROW_ANIMATION_DURATION_MS);
+ mArrowDisappearAnimation.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
+ mArrowDisappearAnimation.addUpdateListener(animation -> {
+ mDisappearAmount = (float) animation.getAnimatedValue();
+ invalidate();
+ });
+
+ mAngleAnimation =
+ new SpringAnimation(this, CURRENT_ANGLE);
+ mAngleAppearForce = new SpringForce()
+ .setStiffness(SpringForce.STIFFNESS_LOW)
+ .setDampingRatio(0.4f)
+ .setFinalPosition(ARROW_ANGLE_WHEN_EXTENDED_DEGREES);
+ mAngleDisappearForce = new SpringForce()
+ .setStiffness(SpringForce.STIFFNESS_MEDIUM)
+ .setDampingRatio(SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY)
+ .setFinalPosition(90);
+ mAngleAnimation.setSpring(mAngleAppearForce).setMaxValue(90);
+
+ mTranslationAnimation =
+ new SpringAnimation(this, CURRENT_TRANSLATION);
+ mRegularTranslationSpring = new SpringForce()
+ .setStiffness(SpringForce.STIFFNESS_MEDIUM)
+ .setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY);
+ mTriggerBackSpring = new SpringForce()
+ .setStiffness(450)
+ .setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY);
+ mTranslationAnimation.setSpring(mRegularTranslationSpring);
+ mVerticalTranslationAnimation =
+ new SpringAnimation(this, CURRENT_VERTICAL_TRANSLATION);
+ mVerticalTranslationAnimation.setSpring(
+ new SpringForce()
+ .setStiffness(SpringForce.STIFFNESS_MEDIUM)
+ .setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY));
+
+ mProtectionPaint = new Paint(mPaint);
+ mProtectionPaint.setStrokeWidth(mArrowThickness + PROTECTION_WIDTH_PX);
+ loadDimens();
+
+ loadColors(context);
+ updateArrowDirection();
mSwipeThreshold = context.getResources()
.getDimension(R.dimen.navigation_edge_action_drag_threshold);
setVisibility(GONE);
}
- public void setIsLeftPanel(boolean isLeftPanel) {
- mIsLeftPanel = isLeftPanel;
- }
-
@Override
- protected void onDraw(Canvas canvas) {
- float edgeOffset = mBaseExtent * mDragProgress - mStrokeThickness;
- float animatedOffset = mPointExtent * mLegProgress;
- canvas.save();
- canvas.translate(
- mIsLeftPanel ? edgeOffset : getWidth() - edgeOffset,
- (getHeight() - mHeight) * 0.5f);
-
- float outsideX = mArrowsPointLeft ? animatedOffset : 0;
- float middleX = mArrowsPointLeft ? 0 : animatedOffset;
-
- if (SHOW_PROTECTION_STROKE) {
- canvas.drawLine(outsideX, 0, middleX, mHeight * 0.5f, mProtectionPaint);
- canvas.drawLine(middleX, mHeight * 0.5f, outsideX, mHeight, mProtectionPaint);
- }
-
- canvas.drawLine(outsideX, 0, middleX, mHeight * 0.5f, mPaint);
- canvas.drawLine(middleX, mHeight * 0.5f, outsideX, mHeight, mPaint);
- canvas.restore();
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
-
- // TODO: read the gesture length from the nav controller.
- mGestureLength = getWidth();
+ public boolean hasOverlappingRendering() {
+ return false;
}
- private void setLegProgress(float progress) {
- mLegProgress = progress;
- invalidate();
+ public boolean shouldTriggerBack() {
+ return mTriggerBack;
}
- private float getLegProgress() {
- return mLegProgress;
+ public void setIsDark(boolean isDark, boolean animate) {
+ mIsDark = isDark;
+ updateIsDark(animate);
}
- private void setDragProgress(float dragProgress) {
- mDragProgress = dragProgress;
+ public void setShowProtection(boolean showProtection) {
+ mShowProtection = showProtection;
invalidate();
}
- private float getDragProgress() {
- return mDragProgress;
+ public void setIsLeftPanel(boolean isLeftPanel) {
+ mIsLeftPanel = isLeftPanel;
}
- private void hide() {
- animate().alpha(0f).setDuration(ANIM_DURATION_MS)
- .withEndAction(() -> setVisibility(GONE));
+ /**
+ * Adjust the rect to conform the the actual visible bounding box of the arrow.
+ *
+ * @param samplingRect the existing bounding box in screen coordinates, to be modified
+ */
+ public void adjustRectToBoundingBox(Rect samplingRect) {
+ float translation = mDesiredTranslation;
+ if (!mTriggerBack) {
+ // Let's take the resting position and bounds as the sampling rect, since we are not
+ // visible right now
+ translation = mBaseTranslation;
+ if (mIsLeftPanel && mArrowsPointLeft
+ || (!mIsLeftPanel && !mArrowsPointLeft)) {
+ // If we're on the left we should move less, because the arrow is facing the other
+ // direction
+ translation -= getStaticArrowWidth();
+ }
+ }
+ float left = translation - mArrowThickness / 2.0f;
+ left = mIsLeftPanel ? left : samplingRect.width() - left;
+
+ // Let's calculate the position of the end based on the angle
+ float width = getStaticArrowWidth();
+ float height = polarToCartY(ARROW_ANGLE_WHEN_EXTENDED_DEGREES) * mArrowLength * 2.0f;
+ if (!mArrowsPointLeft) {
+ left -= width;
+ }
+
+ float top = (getHeight() * 0.5f) + mDesiredVerticalTranslation - height / 2.0f;
+ samplingRect.offset((int) left, (int) top);
+ samplingRect.set(samplingRect.left, samplingRect.top,
+ (int) (samplingRect.left + width),
+ (int) (samplingRect.top + height));
}
/**
* Updates the UI based on the motion events passed in device co-ordinates
*/
public void handleTouch(MotionEvent event) {
+ if (mVelocityTracker == null) {
+ mVelocityTracker = VelocityTracker.obtain();
+ }
+ mVelocityTracker.addMovement(event);
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN : {
mDragSlopPassed = false;
- mEndAnimator.cancel();
- mLegAnimator.cancel();
- animate().cancel();
- setLegProgress(0f);
- setDragProgress(0f);
+ resetOnDown();
mStartX = event.getX();
+ mStartY = event.getY();
setVisibility(VISIBLE);
break;
}
case MotionEvent.ACTION_MOVE: {
- handleNewSwipePoint(event.getX());
+ handleMoveEvent(event);
break;
}
// Fall through
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: {
- hide();
+ if (mTriggerBack) {
+ triggerBackAnimation();
+ } else {
+ if (mTranslationAnimation.isRunning()) {
+ mTranslationAnimation.addEndListener(mSetGoneEndListener);
+ } else {
+ setVisibility(GONE);
+ }
+ }
+ mVelocityTracker.recycle();
+ mVelocityTracker = null;
break;
}
}
}
- private void handleNewSwipePoint(float x) {
- float dist = MathUtils.abs(x - mStartX);
+ @Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ updateArrowDirection();
+ loadDimens();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ float pointerPosition = mCurrentTranslation - mArrowThickness / 2.0f;
+ canvas.save();
+ canvas.translate(
+ mIsLeftPanel ? pointerPosition : getWidth() - pointerPosition,
+ (getHeight() * 0.5f) + mVerticalTranslation);
+
+ // Let's calculate the position of the end based on the angle
+ float x = (polarToCartX(mCurrentAngle) * mArrowLength);
+ float y = (polarToCartY(mCurrentAngle) * mArrowLength);
+ Path arrowPath = calculatePath(x,y);
+ if (mShowProtection) {
+ canvas.drawPath(arrowPath, mProtectionPaint);
+ }
+
+ canvas.drawPath(arrowPath, mPaint);
+ canvas.restore();
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+
+ // TODO: read the gesture length from the nav controller.
+ mMaxTranslation = getWidth() - mArrowPaddingEnd;
+ }
+
+ private void loadDimens() {
+ mArrowPaddingEnd = getContext().getResources().getDimensionPixelSize(
+ R.dimen.navigation_edge_panel_padding);
+ }
+
+ private void updateArrowDirection() {
+ // Both panels arrow point the same way
+ mArrowsPointLeft = getLayoutDirection() == LAYOUT_DIRECTION_LTR;
+ invalidate();
+ }
+
+ private void loadColors(Context context) {
+ final int dualToneDarkTheme = Utils.getThemeAttr(context, R.attr.darkIconTheme);
+ final int dualToneLightTheme = Utils.getThemeAttr(context, R.attr.lightIconTheme);
+ Context lightContext = new ContextThemeWrapper(context, dualToneLightTheme);
+ Context darkContext = new ContextThemeWrapper(context, dualToneDarkTheme);
+ mArrowColorLight = Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor);
+ mArrowColorDark = Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor);
+ mProtectionColorDark = mArrowColorLight;
+ mProtectionColorLight = mArrowColorDark;
+ updateIsDark(false /* animate */);
+ }
+
+ private void updateIsDark(boolean animate) {
+ // TODO: Maybe animate protection as well
+ mProtectionColor = mIsDark ? mProtectionColorDark : mProtectionColorLight;
+ mProtectionPaint.setColor(mProtectionColor);
+ mArrowColor = mIsDark ? mArrowColorDark : mArrowColorLight;
+ mArrowColorAnimator.cancel();
+ if (!animate) {
+ setCurrentArrowColor(mArrowColor);
+ } else {
+ mArrowStartColor = mCurrentArrowColor;
+ mArrowColorAnimator.start();
+ }
+ }
+
+ private void setCurrentArrowColor(int color) {
+ mCurrentArrowColor = color;
+ mPaint.setColor(color);
+ invalidate();
+ }
+
+ private float getStaticArrowWidth() {
+ return polarToCartX(ARROW_ANGLE_WHEN_EXTENDED_DEGREES) * mArrowLength;
+ }
+
+ private float polarToCartX(float angleInDegrees) {
+ return (float) Math.cos(Math.toRadians(angleInDegrees));
+ }
+
+ private float polarToCartY(float angleInDegrees) {
+ return (float) Math.sin(Math.toRadians(angleInDegrees));
+ }
+
+ private Path calculatePath(float x, float y) {
+ if (!mArrowsPointLeft) {
+ x = -x;
+ }
+ float extent = 1.0f - mDisappearAmount;
+ x = x * extent;
+ y = y * extent;
+ mArrowPath.reset();
+ mArrowPath.moveTo(x, y);
+ mArrowPath.lineTo(0, 0);
+ mArrowPath.lineTo(x, -y);
+ return mArrowPath;
+ }
+
+ private float getCurrentAngle() {
+ return mCurrentAngle;
+ }
+
+ private float getCurrentTranslation() {
+ return mCurrentTranslation;
+ }
+
+ private void triggerBackAnimation() {
+
+ mVelocityTracker.computeCurrentVelocity(1000);
+ // Only do the extra translation if we're not already flinging
+ boolean doExtraTranslation = Math.abs(mVelocityTracker.getXVelocity()) < 1000;
+ if (doExtraTranslation) {
+ setDesiredTranslation(mDesiredTranslation + dp(16), true /* animate */);
+ }
+
+ // Let's also snap the angle a bit
+ if (mAngleOffset < -4) {
+ mAngleOffset = Math.max(-16, mAngleOffset - 16);
+ updateAngle(true /* animated */);
+ }
+
+ // Finally, after the translation, animate back and disappear the arrow
+ Runnable translationEnd = () -> {
+ setTriggerBack(false /* false */, true /* animate */);
+ mTranslationAnimation.setSpring(mTriggerBackSpring);
+ setDesiredTranslation(0, true /* animated */);
+ animate().alpha(0f).setDuration(DISAPPEAR_FADE_ANIMATION_DURATION_MS)
+ .withEndAction(() -> setVisibility(GONE));
+ mArrowDisappearAnimation.start();
+ };
+ if (mTranslationAnimation.isRunning()) {
+ mTranslationAnimation.addEndListener(new DynamicAnimation.OnAnimationEndListener() {
+ @Override
+ public void onAnimationEnd(DynamicAnimation animation, boolean canceled,
+ float value,
+ float velocity) {
+ animation.removeEndListener(this);
+ if (!canceled) {
+ translationEnd.run();
+ }
+ }
+ });
+ } else {
+ translationEnd.run();
+ }
+
+ }
+
+ private void resetOnDown() {
+ animate().cancel();
+ mAngleAnimation.cancel();
+ mTranslationAnimation.cancel();
+ mVerticalTranslationAnimation.cancel();
+ mArrowDisappearAnimation.cancel();
+ mAngleOffset = 0;
+ mTranslationAnimation.setSpring(mRegularTranslationSpring);
+ // Reset the arrow to the side
+ setTriggerBack(false /* triggerBack */, false /* animated */);
+ setDesiredTranslation(0, false /* animated */);
+ setCurrentTranslation(0);
+ mPreviousTouchTranslation = 0;
+ mTotalTouchDelta = 0;
+ setDesiredVerticalTransition(0, false /* animated */);
+ }
+
+ private void handleMoveEvent(MotionEvent event) {
+ float x = event.getX();
+ float y = event.getY();
+ float touchTranslation = MathUtils.abs(x - mStartX);
+ float yOffset = y - mStartY;
+ float delta = touchTranslation - mPreviousTouchTranslation;
+ if (Math.abs(delta) > 0) {
+ if (Math.signum(delta) == Math.signum(mTotalTouchDelta)) {
+ mTotalTouchDelta += delta;
+ } else {
+ mTotalTouchDelta = delta;
+ }
+ }
+ mPreviousTouchTranslation = touchTranslation;
// Apply a haptic on drag slop passed
- if (!mDragSlopPassed && dist > mSwipeThreshold) {
+ if (!mDragSlopPassed && touchTranslation > mSwipeThreshold) {
mDragSlopPassed = true;
mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK);
- mLastSlopHapticTime = SystemClock.uptimeMillis();
+
+ // Let's show the arrow and animate it in!
+ mDisappearAmount = 0.0f;
setAlpha(1f);
+ // And animate it go to back by default!
+ setTriggerBack(true /* triggerBack */, true /* animated */);
+ }
+
+ // Let's make sure we only go to the baseextend and apply rubberbanding afterwards
+ if (touchTranslation > mBaseTranslation) {
+ float diff = touchTranslation - mBaseTranslation;
+ float progress = MathUtils.saturate(diff / (mBaseTranslation * RUBBER_BAND_AMOUNT));
+ progress = RUBBER_BAND_INTERPOLATOR.getInterpolation(progress)
+ * (mMaxTranslation - mBaseTranslation);
+ touchTranslation = mBaseTranslation + progress;
+ } else {
+ float diff = mBaseTranslation - touchTranslation;
+ float progress = MathUtils.saturate(diff / mBaseTranslation);
+ progress = RUBBER_BAND_INTERPOLATOR_APPEAR.getInterpolation(progress)
+ * (mBaseTranslation / RUBBER_BAND_AMOUNT_APPEAR);
+ touchTranslation = mBaseTranslation - progress;
+ }
+ // By default we just assume the current direction is kept
+ boolean triggerBack = mTriggerBack;
+
+ // First lets see if we had continuous motion in one direction for a while
+ if (Math.abs(mTotalTouchDelta) > mMinDeltaForSwitch) {
+ triggerBack = mTotalTouchDelta > 0;
}
- setDragProgress(MathUtils.constrainedMap(
- 0, 1.0f,
- 0, mGestureLength * TRACK_LENGTH_MULTIPLIER,
- dist));
+ // Then, let's see if our velocity tells us to change direction
+ mVelocityTracker.computeCurrentVelocity(1000);
+ float xVelocity = mVelocityTracker.getXVelocity();
+ float yVelocity = mVelocityTracker.getYVelocity();
+ float velocity = MathUtils.mag(xVelocity, yVelocity);
+ mAngleOffset = Math.min(velocity / 1000 * ARROW_ANGLE_ADDED_PER_1000_SPEED,
+ ARROW_MAX_ANGLE_SPEED_OFFSET_DEGREES) * Math.signum(xVelocity);
+ if (mIsLeftPanel && mArrowsPointLeft || !mIsLeftPanel && !mArrowsPointLeft) {
+ mAngleOffset *= -1;
+ }
+
+ // Last if the direction in Y is bigger than X * 2 we also abort
+ if (Math.abs(yOffset) > Math.abs(x - mStartX) * 2) {
+ triggerBack = false;
+ }
+ setTriggerBack(triggerBack, true /* animated */);
+
+ if (!mTriggerBack) {
+ touchTranslation = 0;
+ } else if (mIsLeftPanel && mArrowsPointLeft
+ || (!mIsLeftPanel && !mArrowsPointLeft)) {
+ // If we're on the left we should move less, because the arrow is facing the other
+ // direction
+ touchTranslation -= getStaticArrowWidth();
+ }
+ setDesiredTranslation(touchTranslation, true /* animated */);
+ updateAngle(true /* animated */);
+
+ float maxYOffset = getHeight() / 2.0f - mArrowLength;
+ float progress = MathUtils.constrain(
+ Math.abs(yOffset) / (maxYOffset * RUBBER_BAND_AMOUNT),
+ 0, 1);
+ float verticalTranslation = RUBBER_BAND_INTERPOLATOR.getInterpolation(progress)
+ * maxYOffset * Math.signum(yOffset);
+ setDesiredVerticalTransition(verticalTranslation, true /* animated */);
+ }
- if (dist < mGestureLength) {
- float calculatedLegProgress = MathUtils.constrainedMap(
- 0f, POINTEDNESS_BEFORE_SNAP_RATIO,
- mGestureLength * START_POINTING_RATIO, mGestureLength,
- dist);
+ private void setDesiredVerticalTransition(float verticalTranslation, boolean animated) {
+ if (mDesiredVerticalTranslation != verticalTranslation) {
+ mDesiredVerticalTranslation = verticalTranslation;
+ if (!animated) {
+ setVerticalTranslation(verticalTranslation);
+ } else {
+ mVerticalTranslationAnimation.animateToFinalPosition(verticalTranslation);
+ }
+ invalidate();
+ }
+ }
- // Blend animated value with drag calculated value, allow the gesture to continue
- // while the animation is playing with jump cuts in the animation.
- setLegProgress(MathUtils.lerp(calculatedLegProgress, mLegProgress, mDragProgress));
+ private void setVerticalTranslation(float verticalTranslation) {
+ mVerticalTranslation = verticalTranslation;
+ invalidate();
+ }
- if (mGestureDetected) {
- mGestureDetected = false;
+ private float getVerticalTranslation() {
+ return mVerticalTranslation;
+ }
- mLegAnimator.setFloatValues(POINTEDNESS_BEFORE_SNAP_RATIO);
- mLegAnimator.start();
+ private void setDesiredTranslation(float desiredTranslation, boolean animated) {
+ if (mDesiredTranslation != desiredTranslation) {
+ mDesiredTranslation = desiredTranslation;
+ if (!animated) {
+ setCurrentTranslation(desiredTranslation);
+ } else {
+ mTranslationAnimation.animateToFinalPosition(desiredTranslation);
}
- } else {
- if (!mGestureDetected) {
- // Prevent another haptic if it was just used
- if (SystemClock.uptimeMillis() - mLastSlopHapticTime > HAPTIC_TIMEOUT_MS) {
- performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK);
- }
- mGestureDetected = true;
+ }
+ }
+
+ private void setCurrentTranslation(float currentTranslation) {
+ mCurrentTranslation = currentTranslation;
+ invalidate();
+ }
- mLegAnimator.setFloatValues(1f);
- mLegAnimator.start();
+ private void setTriggerBack(boolean triggerBack, boolean animated) {
+ if (mTriggerBack != triggerBack) {
+ mTriggerBack = triggerBack;
+ mAngleAnimation.cancel();
+ updateAngle(animated);
+ // Whenever the trigger back state changes the existing translation animation should be
+ // cancelled
+ mTranslationAnimation.cancel();
+ }
+ }
+
+ private void updateAngle(boolean animated) {
+ float newAngle = mTriggerBack ? ARROW_ANGLE_WHEN_EXTENDED_DEGREES + mAngleOffset : 90;
+ if (newAngle != mDesiredAngle) {
+ if (!animated) {
+ setCurrentAngle(newAngle);
+ } else {
+ mAngleAnimation.setSpring(mTriggerBack ? mAngleAppearForce : mAngleDisappearForce);
+ mAngleAnimation.animateToFinalPosition(newAngle);
}
+ mDesiredAngle = newAngle;
}
}
+ private void setCurrentAngle(float currentAngle) {
+ mCurrentAngle = currentAngle;
+ invalidate();
+ }
+
private float dp(float dp) {
return mDensity * dp;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java
new file mode 100644
index 000000000000..d59319e110de
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import android.annotation.Nullable;
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.IBinder;
+import android.provider.Settings;
+import android.view.CompositionSamplingListener;
+import android.view.SurfaceControl;
+import android.view.View;
+import android.view.ViewTreeObserver;
+
+import com.android.systemui.R;
+
+/**
+ * A helper class to sample regions on the screen and inspect its luminosity.
+ */
+public class RegionSamplingHelper implements View.OnAttachStateChangeListener,
+ View.OnLayoutChangeListener {
+
+ private final Handler mHandler = new Handler();
+ private final View mSampledView;
+
+ private final CompositionSamplingListener mSamplingListener;
+ private final Runnable mUpdateSamplingListener = this::updateSamplingListener;
+
+ /**
+ * The requested sampling bounds that we want to sample from
+ */
+ private final Rect mSamplingRequestBounds = new Rect();
+
+ /**
+ * The sampling bounds that are currently registered.
+ */
+ private final Rect mRegisteredSamplingBounds = new Rect();
+ private final SamplingCallback mCallback;
+ private boolean mSamplingEnabled = false;
+ private boolean mSamplingListenerRegistered = false;
+
+ private float mLastMedianLuma;
+ private float mCurrentMedianLuma;
+ private boolean mWaitingOnDraw;
+
+ // Passing the threshold of this luminance value will make the button black otherwise white
+ private final float mLuminanceThreshold;
+ private final float mLuminanceChangeThreshold;
+ private boolean mFirstSamplingAfterStart;
+ private SurfaceControl mRegisteredStopLayer = null;
+ private ViewTreeObserver.OnDrawListener mUpdateOnDraw = new ViewTreeObserver.OnDrawListener() {
+ @Override
+ public void onDraw() {
+ // We need to post the remove runnable, since it's not allowed to remove in onDraw
+ mHandler.post(mRemoveDrawRunnable);
+ RegionSamplingHelper.this.onDraw();
+ }
+ };
+ private Runnable mRemoveDrawRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mSampledView.getViewTreeObserver().removeOnDrawListener(mUpdateOnDraw);
+ }
+ };
+
+ public RegionSamplingHelper(View sampledView, SamplingCallback samplingCallback) {
+ mSamplingListener = new CompositionSamplingListener(
+ sampledView.getContext().getMainExecutor()) {
+ @Override
+ public void onSampleCollected(float medianLuma) {
+ if (mSamplingEnabled) {
+ updateMediaLuma(medianLuma);
+ }
+ }
+ };
+ mSampledView = sampledView;
+ mSampledView.addOnAttachStateChangeListener(this);
+ mSampledView.addOnLayoutChangeListener(this);
+
+ final Resources res = sampledView.getResources();
+ mLuminanceThreshold = res.getFloat(R.dimen.navigation_luminance_threshold);
+ mLuminanceChangeThreshold = res.getFloat(R.dimen.navigation_luminance_change_threshold);
+ mCallback = samplingCallback;
+ }
+
+ private void onDraw() {
+ if (mWaitingOnDraw) {
+ mWaitingOnDraw = false;
+ updateSamplingListener();
+ }
+ }
+
+ void start(Rect initialSamplingBounds) {
+ if (!mCallback.isSamplingEnabled()) {
+ return;
+ }
+ if (initialSamplingBounds != null) {
+ mSamplingRequestBounds.set(initialSamplingBounds);
+ }
+ mSamplingEnabled = true;
+ // make sure we notify once
+ mLastMedianLuma = -1;
+ mFirstSamplingAfterStart = true;
+ updateSamplingListener();
+ }
+
+ void stop() {
+ mSamplingEnabled = false;
+ updateSamplingListener();
+ }
+
+ @Override
+ public void onViewAttachedToWindow(View view) {
+ updateSamplingListener();
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(View view) {
+ // isAttachedToWindow is only changed after this call to the listeners, so let's post it
+ // instead
+ postUpdateSamplingListener();
+ }
+
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ updateSamplingRect();
+ }
+
+ private void postUpdateSamplingListener() {
+ mHandler.removeCallbacks(mUpdateSamplingListener);
+ mHandler.post(mUpdateSamplingListener);
+ }
+
+ private void updateSamplingListener() {
+ boolean isSamplingEnabled = mSamplingEnabled && !mSamplingRequestBounds.isEmpty()
+ && (mSampledView.isAttachedToWindow() || mFirstSamplingAfterStart);
+ if (isSamplingEnabled) {
+ SurfaceControl stopLayerControl = mSampledView.getViewRootImpl().getSurfaceControl();
+ if (!stopLayerControl.isValid()) {
+ if (!mWaitingOnDraw) {
+ mWaitingOnDraw = true;
+ // The view might be attached but we haven't drawn yet, so wait until the
+ // next draw to update the listener again with the stop layer, such that our
+ // own drawing doesn't affect the sampling.
+ if (mHandler.hasCallbacks(mRemoveDrawRunnable)) {
+ mHandler.removeCallbacks(mRemoveDrawRunnable);
+ } else {
+ mSampledView.getViewTreeObserver().addOnDrawListener(mUpdateOnDraw);
+ }
+ }
+ // If there's no valid surface, let's just sample without a stop layer, so we
+ // don't have to delay
+ stopLayerControl = null;
+ }
+ if (!mSamplingRequestBounds.equals(mRegisteredSamplingBounds)
+ || mRegisteredStopLayer != stopLayerControl) {
+ // We only want to reregister if something actually changed
+ unregisterSamplingListener();
+ mSamplingListenerRegistered = true;
+ CompositionSamplingListener.register(mSamplingListener, DEFAULT_DISPLAY,
+ stopLayerControl != null ? stopLayerControl.getHandle() : null,
+ mSamplingRequestBounds);
+ mRegisteredSamplingBounds.set(mSamplingRequestBounds);
+ mRegisteredStopLayer = stopLayerControl;
+ }
+ mFirstSamplingAfterStart = false;
+ } else {
+ unregisterSamplingListener();
+ }
+ }
+
+ private void unregisterSamplingListener() {
+ if (mSamplingListenerRegistered) {
+ mSamplingListenerRegistered = false;
+ mRegisteredStopLayer = null;
+ mRegisteredSamplingBounds.setEmpty();
+ CompositionSamplingListener.unregister(mSamplingListener);
+ }
+ }
+
+ private void updateMediaLuma(float medianLuma) {
+ mCurrentMedianLuma = medianLuma;
+
+ // If the difference between the new luma and the current luma is larger than threshold
+ // then apply the current luma, this is to prevent small changes causing colors to flicker
+ if (Math.abs(mCurrentMedianLuma - mLastMedianLuma) > mLuminanceChangeThreshold) {
+ mCallback.onRegionDarknessChanged(medianLuma < mLuminanceThreshold /* isRegionDark */);
+ mLastMedianLuma = medianLuma;
+ }
+ }
+
+ public void updateSamplingRect() {
+ Rect sampledRegion = mCallback.getSampledRegion(mSampledView);
+ if (!mSamplingRequestBounds.equals(sampledRegion)) {
+ mSamplingRequestBounds.set(sampledRegion);
+ updateSamplingListener();
+ }
+ }
+
+ public interface SamplingCallback {
+ /**
+ * Called when the darkness of the sampled region changes
+ * @param isRegionDark true if the sampled luminance is below the luminance threshold
+ */
+ void onRegionDarknessChanged(boolean isRegionDark);
+
+ /**
+ * Get the sampled region of interest from the sampled view
+ * @param sampledView The view that this helper is attached to for convenience
+ * @return the region to be sampled in sceen coordinates. Return {@code null} to avoid
+ * sampling in this frame
+ */
+ Rect getSampledRegion(View sampledView);
+
+ /**
+ * @return if sampling should be enabled in the current configuration
+ */
+ default boolean isSamplingEnabled() {
+ return true;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
index 329d02959435..de86f3d8cfb4 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
@@ -29,6 +29,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.MoveCallback;
import android.os.Bundle;
import android.os.Handler;
+import android.os.StrictMode;
import android.os.UserHandle;
import android.os.storage.DiskInfo;
import android.os.storage.StorageEventListener;
@@ -639,11 +640,16 @@ public class StorageNotification extends SystemUI {
}
private PendingIntent buildBrowsePendingIntent(VolumeInfo vol) {
- final Intent intent = vol.buildBrowseIntentForUser(vol.getMountUserId());
+ final StrictMode.VmPolicy oldPolicy = StrictMode.allowVmViolations();
+ try {
+ final Intent intent = vol.buildBrowseIntentForUser(vol.getMountUserId());
- final int requestKey = vol.getId().hashCode();
- return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
- PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+ final int requestKey = vol.getId().hashCode();
+ return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
+ PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+ } finally {
+ StrictMode.setVmPolicy(oldPolicy);
+ }
}
private PendingIntent buildVolumeSettingsPendingIntent(VolumeInfo vol) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 43912f9eb4f7..7b133f267d49 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -166,7 +166,7 @@ public class VolumeDialogImpl implements VolumeDialog,
public VolumeDialogImpl(Context context) {
mContext =
- new ContextThemeWrapper(context, com.android.systemui.R.style.volume_dialog_theme);
+ new ContextThemeWrapper(context, R.style.qs_theme);
mController = Dependency.get(VolumeDialogController.class);
mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
@@ -1337,7 +1337,7 @@ public class VolumeDialogImpl implements VolumeDialog,
private final class CustomDialog extends Dialog implements DialogInterface {
public CustomDialog(Context context) {
- super(context, com.android.systemui.R.style.volume_dialog_theme);
+ super(context, R.style.qs_theme);
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
index 9f91a17e846d..212c8f52a19e 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
@@ -66,9 +66,17 @@ public class CarrierTextControllerTest extends SysuiTestCase {
private static final CharSequence SEPARATOR = " \u2014 ";
private static final String TEST_CARRIER = "TEST_CARRIER";
+ private static final String TEST_CARRIER_2 = "TEST_CARRIER_2";
+ private static final String TEST_GROUP_UUID = "59b5c870-fc4c-47a4-a99e-9db826b48b24";
+ private static final int TEST_CARRIER_ID = 1;
private static final SubscriptionInfo TEST_SUBSCRIPTION = new SubscriptionInfo(0, "", 0,
TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "",
- DATA_ROAMING_DISABLE, null, null, null, null, false, null, "");
+ DATA_ROAMING_DISABLE, null, null, null, null, false, null, "", false, TEST_GROUP_UUID,
+ TEST_CARRIER_ID, 0);
+ private static final SubscriptionInfo TEST_SUBSCRIPTION_2 = new SubscriptionInfo(0, "", 0,
+ TEST_CARRIER, TEST_CARRIER_2, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "",
+ DATA_ROAMING_DISABLE, null, null, null, null, false, null, "", true, TEST_GROUP_UUID,
+ TEST_CARRIER_ID, 0);
private static final SubscriptionInfo TEST_SUBSCRIPTION_ROAMING = new SubscriptionInfo(0, "", 0,
TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "",
DATA_ROAMING_ENABLE, null, null, null, null, false, null, "");
@@ -369,6 +377,33 @@ public class CarrierTextControllerTest extends SysuiTestCase {
captor.getValue().carrierText);
}
+ @Test
+ public void testCarrierText_GroupedSubWithOpportunisticCarrierText() {
+ reset(mCarrierTextCallback);
+ List<SubscriptionInfo> list = new ArrayList<>();
+ list.add(TEST_SUBSCRIPTION);
+ list.add(TEST_SUBSCRIPTION_2);
+ when(mKeyguardUpdateMonitor.getSimState(anyInt()))
+ .thenReturn(IccCardConstants.State.READY);
+ when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list);
+ mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
+ mCarrierTextController.updateDisplayOpportunisticSubscriptionCarrierText();
+
+ // STOPSHIP(b/130246708) This line makes sure that SubscriptionManager provides the
+ // same answer as KeyguardUpdateMonitor. Remove when this is addressed
+ when(mSubscriptionManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(list);
+
+ ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextController.CarrierTextCallbackInfo.class);
+
+ mCarrierTextController.updateCarrierText();
+ mTestableLooper.processAllMessages();
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+
+ assertEquals(TEST_CARRIER_2, captor.getValue().carrierText);
+ }
+
public static class TestCarrierTextController extends CarrierTextController {
private KeyguardUpdateMonitor mKUM;
@@ -383,5 +418,10 @@ public class CarrierTextControllerTest extends SysuiTestCase {
super.setListening(callback);
mKeyguardUpdateMonitor = mKUM;
}
+
+ @Override
+ public void updateDisplayOpportunisticSubscriptionCarrierText() {
+ mDisplayOpportunisticSubscriptionCarrierText = true;
+ }
}
}
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 375b6e54db3e..ac536a5bda62 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -20,10 +20,12 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@@ -43,12 +45,15 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.ShadeController;
+import com.android.systemui.statusbar.phone.UnlockMethodCache;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.util.wakelock.WakeLockFake;
@@ -81,6 +86,12 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
private ShadeController mShadeController;
@Mock
private AccessibilityController mAccessibilityController;
+ @Mock
+ private UnlockMethodCache mUnlockMethodCache;
+ @Mock
+ private StatusBarStateController mStatusBarStateController;
+ @Mock
+ private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private KeyguardIndicationTextView mTextView;
private KeyguardIndicationController mController;
@@ -111,7 +122,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
Looper.prepare();
}
mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon,
- mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController);
+ mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController,
+ mUnlockMethodCache, mStatusBarStateController, mKeyguardUpdateMonitor);
}
@Test
@@ -250,4 +262,32 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
longClickCaptor.getValue().onLongClick(mLockIcon);
verify(mLockPatternUtils).requireCredentialEntry(anyInt());
}
+
+ @Test
+ public void unlockMethodCache_listenerUpdatesIndication() {
+ createController();
+ String restingIndication = "Resting indication";
+ when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true);
+ mController.setRestingIndication(restingIndication);
+ mController.setVisible(true);
+ assertThat(mTextView.getText()).isEqualTo(mController.getTrustGrantedIndication());
+
+ reset(mKeyguardUpdateMonitor);
+ when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false);
+ mController.onUnlockMethodStateChanged();
+ assertThat(mTextView.getText()).isEqualTo(restingIndication);
+ }
+
+ @Test
+ public void unlockMethodCache_listener() {
+ createController();
+ verify(mUnlockMethodCache).addListener(eq(mController));
+ verify(mStatusBarStateController).addCallback(eq(mController));
+ verify(mKeyguardUpdateMonitor, times(2)).registerCallback(any());
+
+ mController.destroy();
+ verify(mUnlockMethodCache).removeListener(eq(mController));
+ verify(mStatusBarStateController).removeCallback(eq(mController));
+ verify(mKeyguardUpdateMonitor, times(2)).removeCallback(any());
+ }
}
diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml
index 80fd45924fc9..637637ad6fdd 100644
--- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml
+++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml
@@ -31,7 +31,7 @@
<bool name="config_navBarTapThrough">true</bool>
<!-- Controls the size of the back gesture inset. -->
- <dimen name="config_backGestureInset">20dp</dimen>
+ <dimen name="config_backGestureInset">24dp</dimen>
<!-- Controls whether the navbar needs a scrim with
{@link Window#setEnsuringNavigationBarContrastWhenTransparent}. -->
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
index 1e3f20ecd01a..294cc5aad132 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
@@ -703,12 +703,17 @@ class TouchExplorer extends BaseEventStreamTransformation
final float secondPtrX = event.getX(1);
final float secondPtrY = event.getY(1);
- final float deltaX = firstPtrX - secondPtrX;
- final float deltaY = firstPtrY - secondPtrY;
+ final int pointerIndex = event.findPointerIndex(mDraggingPointerId);
+ final float deltaX =
+ (pointerIndex == 0) ? (secondPtrX - firstPtrX)
+ : (firstPtrX - secondPtrX);
+ final float deltaY =
+ (pointerIndex == 0) ? (secondPtrY - firstPtrY)
+ : (firstPtrY - secondPtrY);
final double distance = Math.hypot(deltaX, deltaY);
if (distance > mScaledMinPointerDistanceToUseMiddleLocation) {
- event.setLocation(deltaX / 2, deltaY / 2);
+ event.offsetLocation(deltaX / 2, deltaY / 2);
}
// If still dragging send a drag event.
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index 03f21498766d..32a814468f12 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -234,8 +234,10 @@ public class UserBackupManagerService {
// CPU on bring-up and increase time-to-UI.
private static final long INITIALIZATION_DELAY_MILLIS = 3000;
- // Timeout interval for deciding that a bind or clear-data has taken too long
- private static final long TIMEOUT_INTERVAL = 10 * 1000;
+ // Timeout interval for deciding that a bind has taken too long.
+ private static final long BIND_TIMEOUT_INTERVAL = 10 * 1000;
+ // Timeout interval for deciding that a clear-data has taken too long.
+ private static final long CLEAR_DATA_TIMEOUT_INTERVAL = 30 * 1000;
// User confirmation timeout for a full backup/restore operation. It's this long in
// order to give them time to enter the backup password.
@@ -1449,7 +1451,7 @@ public class UserBackupManagerService {
// success; wait for the agent to arrive
// only wait 10 seconds for the bind to happen
- long timeoutMark = System.currentTimeMillis() + TIMEOUT_INTERVAL;
+ long timeoutMark = System.currentTimeMillis() + BIND_TIMEOUT_INTERVAL;
while (mConnecting && mConnectedAgent == null
&& (System.currentTimeMillis() < timeoutMark)) {
try {
@@ -1554,16 +1556,22 @@ public class UserBackupManagerService {
// can't happen because the activity manager is in this process
}
- // only wait 10 seconds for the clear data to happen
- long timeoutMark = System.currentTimeMillis() + TIMEOUT_INTERVAL;
+ // Only wait 30 seconds for the clear data to happen.
+ long timeoutMark = System.currentTimeMillis() + CLEAR_DATA_TIMEOUT_INTERVAL;
while (mClearingData && (System.currentTimeMillis() < timeoutMark)) {
try {
mClearDataLock.wait(5000);
} catch (InterruptedException e) {
// won't happen, but still.
mClearingData = false;
+ Slog.w(TAG, "Interrupted while waiting for " + packageName
+ + " data to be cleared", e);
}
}
+
+ if (mClearingData) {
+ Slog.w(TAG, "Clearing app data for " + packageName + " timed out");
+ }
}
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index f5710e327125..55f9826effe8 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -3071,11 +3071,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// fallback network the default or requested a new network from the
// NetworkFactories, so network traffic isn't interrupted for an unnecessarily
// long time.
- try {
- mNetd.networkDestroy(nai.network.netId);
- } catch (RemoteException | ServiceSpecificException e) {
- loge("Exception destroying network: " + e);
- }
+ destroyNativeNetwork(nai);
mDnsManager.removeNetwork(nai.network);
}
synchronized (mNetworkForNetId) {
@@ -3083,6 +3079,35 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
+ private boolean createNativeNetwork(@NonNull NetworkAgentInfo networkAgent) {
+ try {
+ // This should never fail. Specifying an already in use NetID will cause failure.
+ if (networkAgent.isVPN()) {
+ mNetd.networkCreateVpn(networkAgent.network.netId,
+ (networkAgent.networkMisc == null
+ || !networkAgent.networkMisc.allowBypass));
+ } else {
+ mNetd.networkCreatePhysical(networkAgent.network.netId,
+ getNetworkPermission(networkAgent.networkCapabilities));
+ }
+ mDnsResolver.createNetworkCache(networkAgent.network.netId);
+ return true;
+ } catch (RemoteException | ServiceSpecificException e) {
+ loge("Error creating network " + networkAgent.network.netId + ": "
+ + e.getMessage());
+ return false;
+ }
+ }
+
+ private void destroyNativeNetwork(@NonNull NetworkAgentInfo networkAgent) {
+ try {
+ mNetd.networkDestroy(networkAgent.network.netId);
+ mDnsResolver.destroyNetworkCache(networkAgent.network.netId);
+ } catch (RemoteException | ServiceSpecificException e) {
+ loge("Exception destroying network: " + e);
+ }
+ }
+
// If this method proves to be too slow then we can maintain a separate
// pendingIntent => NetworkRequestInfo map.
// This method assumes that every non-null PendingIntent maps to exactly 1 NetworkRequestInfo.
@@ -6476,21 +6501,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// A network that has just connected has zero requests and is thus a foreground network.
networkAgent.networkCapabilities.addCapability(NET_CAPABILITY_FOREGROUND);
- try {
- // This should never fail. Specifying an already in use NetID will cause failure.
- if (networkAgent.isVPN()) {
- mNMS.createVirtualNetwork(networkAgent.network.netId,
- (networkAgent.networkMisc == null ||
- !networkAgent.networkMisc.allowBypass));
- } else {
- mNMS.createPhysicalNetwork(networkAgent.network.netId,
- getNetworkPermission(networkAgent.networkCapabilities));
- }
- } catch (Exception e) {
- loge("Error creating network " + networkAgent.network.netId + ": "
- + e.getMessage());
- return;
- }
+ if (!createNativeNetwork(networkAgent)) return;
networkAgent.created = true;
}
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index b1aaa82814b0..8d76634b7018 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -2051,28 +2051,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
}
@Override
- public void createPhysicalNetwork(int netId, int permission) {
- mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
-
- try {
- mNetdService.networkCreatePhysical(netId, permission);
- } catch (RemoteException | ServiceSpecificException e) {
- throw new IllegalStateException(e);
- }
- }
-
- @Override
- public void createVirtualNetwork(int netId, boolean secure) {
- mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
-
- try {
- mNetdService.networkCreateVpn(netId, secure);
- } catch (RemoteException | ServiceSpecificException e) {
- throw new IllegalStateException(e);
- }
- }
-
- @Override
public void addInterfaceToNetwork(String iface, int netId) {
modifyInterfaceInNetwork(MODIFY_OPERATION_ADD, netId, iface);
}
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 24f8fc26ae22..76136dfc81a0 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -828,6 +828,13 @@ public final class ActiveServices {
sb.append(compName);
Slog.w(TAG, sb.toString());
stopping.add(service);
+
+ // If the app is under bg restrictions, also make sure that
+ // any notification is dismissed
+ if (appRestrictedAnyInBackground(
+ service.appInfo.uid, service.packageName)) {
+ cancelForegroundNotificationLocked(service);
+ }
}
}
}
@@ -1232,6 +1239,10 @@ public final class ActiveServices {
}
}
+ private boolean appIsTopLocked(int uid) {
+ return mAm.getUidState(uid) <= ActivityManager.PROCESS_STATE_TOP;
+ }
+
/**
* @param id Notification ID. Zero === exit foreground state for the given service.
*/
@@ -1318,8 +1329,11 @@ public final class ActiveServices {
throw new SecurityException("Foreground not allowed as per app op");
}
- if (!ignoreForeground &&
- appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) {
+ // Apps that are TOP or effectively similar may call startForeground() on
+ // their services even if they are restricted from doing that while in bg.
+ if (!ignoreForeground
+ && !appIsTopLocked(r.appInfo.uid)
+ && appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) {
Slog.w(TAG,
"Service.startForeground() not allowed due to bg restriction: service "
+ r.shortInstanceName);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index dcb3a2298be1..11ddceb9b8f2 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -543,7 +543,7 @@ public class ActivityManagerService extends IActivityManager.Stub
private static final int NATIVE_DUMP_TIMEOUT_MS = 2000; // 2 seconds;
- final OomAdjuster mOomAdjuster;
+ OomAdjuster mOomAdjuster;
final LowMemDetector mLowMemDetector;
/** All system services */
@@ -1483,7 +1483,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final ServiceThread mProcStartHandlerThread;
final Handler mProcStartHandler;
- final ActivityManagerConstants mConstants;
+ ActivityManagerConstants mConstants;
// Encapsulates the global setting "hidden_api_blacklist_exemptions"
final HiddenApiSettings mHiddenApiBlacklist;
@@ -13853,6 +13853,18 @@ public class ActivityManagerService extends IActivityManager.Stub
throw new IllegalArgumentException("callingPackage cannot be null");
}
+ // Ensure that instanceName, which is caller provided, does not contain
+ // unusual characters.
+ if (instanceName != null) {
+ for (int i = 0; i < instanceName.length(); ++i) {
+ char c = instanceName.charAt(i);
+ if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
+ || (c >= '0' && c <= '9') || c == '_' || c == '.')) {
+ throw new IllegalArgumentException("Illegal instanceName");
+ }
+ }
+ }
+
synchronized(this) {
return mServices.bindServiceLocked(caller, token, service,
resolvedType, connection, flags, instanceName, callingPackage, userId);
diff --git a/services/core/java/com/android/server/am/OomAdjProfiler.java b/services/core/java/com/android/server/am/OomAdjProfiler.java
index 71f0db52ce5f..9846b310c917 100644
--- a/services/core/java/com/android/server/am/OomAdjProfiler.java
+++ b/services/core/java/com/android/server/am/OomAdjProfiler.java
@@ -29,6 +29,9 @@ import com.android.internal.util.function.pooled.PooledLambda;
import java.io.PrintWriter;
public class OomAdjProfiler {
+ // Disable profiling for Q. Re-enable once b/130635979 is fixed.
+ private static final boolean PROFILING_DISABLED = true;
+
@GuardedBy("this")
private boolean mOnBattery;
@GuardedBy("this")
@@ -56,6 +59,9 @@ public class OomAdjProfiler {
final RingBuffer<CpuTimes> mSystemServerCpuTimesHist = new RingBuffer<>(CpuTimes.class, 10);
void batteryPowerChanged(boolean onBattery) {
+ if (PROFILING_DISABLED) {
+ return;
+ }
synchronized (this) {
scheduleSystemServerCpuTimeUpdate();
mOnBattery = onBattery;
@@ -63,6 +69,9 @@ public class OomAdjProfiler {
}
void onWakefulnessChanged(int wakefulness) {
+ if (PROFILING_DISABLED) {
+ return;
+ }
synchronized (this) {
scheduleSystemServerCpuTimeUpdate();
mScreenOff = wakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE;
@@ -70,6 +79,9 @@ public class OomAdjProfiler {
}
void oomAdjStarted() {
+ if (PROFILING_DISABLED) {
+ return;
+ }
synchronized (this) {
mOomAdjStartTimeMs = SystemClock.currentThreadTimeMillis();
mOomAdjStarted = true;
@@ -77,6 +89,9 @@ public class OomAdjProfiler {
}
void oomAdjEnded() {
+ if (PROFILING_DISABLED) {
+ return;
+ }
synchronized (this) {
if (!mOomAdjStarted) {
return;
@@ -86,6 +101,9 @@ public class OomAdjProfiler {
}
private void scheduleSystemServerCpuTimeUpdate() {
+ if (PROFILING_DISABLED) {
+ return;
+ }
synchronized (this) {
if (mSystemServerCpuTimeUpdateScheduled) {
return;
@@ -98,6 +116,9 @@ public class OomAdjProfiler {
}
private void updateSystemServerCpuTime(boolean onBattery, boolean screenOff) {
+ if (PROFILING_DISABLED) {
+ return;
+ }
final long cpuTimeMs = mProcessCpuTracker.getCpuTimeForPid(Process.myPid());
synchronized (this) {
mSystemServerCpuTime.addCpuTimeMs(
@@ -121,6 +142,9 @@ public class OomAdjProfiler {
}
void dump(PrintWriter pw) {
+ if (PROFILING_DISABLED) {
+ return;
+ }
synchronized (this) {
if (mSystemServerCpuTimeUpdateScheduled) {
while (mSystemServerCpuTimeUpdateScheduled) {
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 8ae7c7d3e0c8..043daefe0fdb 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -75,6 +75,7 @@ import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.procstats.ProcessStats;
import com.android.server.LocalServices;
import com.android.server.wm.ActivityServiceConnectionsHolder;
@@ -1897,6 +1898,10 @@ public final class OomAdjuster {
// For apps that sit around for a long time in the interactive state, we need
// to report this at least once a day so they don't go idle.
maybeUpdateUsageStatsLocked(app, nowElapsed);
+ } else if (!app.reportedInteraction && (nowElapsed - app.getFgInteractionTime())
+ > mConstants.SERVICE_USAGE_INTERACTION_TIME) {
+ // For foreground services that sit around for a long time but are not interacted with.
+ maybeUpdateUsageStatsLocked(app, nowElapsed);
}
if (changes != 0) {
@@ -1917,6 +1922,14 @@ public final class OomAdjuster {
return success;
}
+ // ONLY used for unit testing in OomAdjusterTests.java
+ @VisibleForTesting
+ void maybeUpdateUsageStats(ProcessRecord app, long nowElapsed) {
+ synchronized (mService) {
+ maybeUpdateUsageStatsLocked(app, nowElapsed);
+ }
+ }
+
@GuardedBy("mService")
private void maybeUpdateUsageStatsLocked(ProcessRecord app, long nowElapsed) {
if (DEBUG_USAGE_STATS) {
diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java
index e33392d359dd..2321afb7df43 100644
--- a/services/core/java/com/android/server/connectivity/DnsManager.java
+++ b/services/core/java/com/android/server/connectivity/DnsManager.java
@@ -263,12 +263,6 @@ public class DnsManager {
}
public void removeNetwork(Network network) {
- try {
- mDnsResolver.clearResolverConfiguration(network.netId);
- } catch (RemoteException | ServiceSpecificException e) {
- Slog.e(TAG, "Error clearing DNS configuration: " + e);
- return;
- }
mPrivateDnsMap.remove(network.netId);
mPrivateDnsValidationMap.remove(network.netId);
}
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 5e5ef26f6624..85fbdf6d0182 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -405,7 +405,9 @@ final class LocalDisplayAdapter extends DisplayAdapter {
mInfo.presentationDeadlineNanos = phys.presentationDeadlineNanos;
mInfo.state = mState;
mInfo.uniqueId = getUniqueId();
- mInfo.address = DisplayAddress.fromPhysicalDisplayId(mPhysicalDisplayId);
+ final DisplayAddress.Physical physicalAddress =
+ DisplayAddress.fromPhysicalDisplayId(mPhysicalDisplayId);
+ mInfo.address = physicalAddress;
// Assume that all built-in displays that have secure output (eg. HDCP) also
// support compositing from gralloc protected buffers.
@@ -462,7 +464,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY;
}
- if (res.getBoolean(com.android.internal.R.bool.config_localDisplaysPrivate)) {
+ if (isDisplayPrivate(physicalAddress)) {
mInfo.flags |= DisplayDeviceInfo.FLAG_PRIVATE;
}
}
@@ -797,6 +799,24 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
return modes;
}
+
+ private boolean isDisplayPrivate(DisplayAddress.Physical physicalAddress) {
+ if (physicalAddress == null) {
+ return false;
+ }
+ final Resources res = getOverlayContext().getResources();
+ int[] ports = res.getIntArray(
+ com.android.internal.R.array.config_localPrivateDisplayPorts);
+ if (ports != null) {
+ int port = physicalAddress.getPort();
+ for (int p : ports) {
+ if (p == port) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
}
/** Supplies a context whose Resources apply runtime-overlays */
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index c2aade3b9d7a..651ce7d431fe 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -2037,6 +2037,12 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
if (mCurSeq <= 0) mCurSeq = 1;
mCurClient = cs;
mCurInputContext = inputContext;
+ if (cs.selfReportedDisplayId != displayIdToShowIme) {
+ // CursorAnchorInfo API does not work as-is for cross-display scenario. Pretend that
+ // InputConnection#requestCursorUpdates() is not implemented in the application so that
+ // IMEs will always receive false from this API.
+ missingMethods |= MissingMethodFlags.REQUEST_CURSOR_UPDATES;
+ }
mCurInputContextMissingMethods = missingMethods;
mCurAttribute = attribute;
diff --git a/services/core/java/com/android/server/job/controllers/QuotaController.java b/services/core/java/com/android/server/job/controllers/QuotaController.java
index ccd1db496675..11f0939a27d6 100644
--- a/services/core/java/com/android/server/job/controllers/QuotaController.java
+++ b/services/core/java/com/android/server/job/controllers/QuotaController.java
@@ -511,17 +511,28 @@ public final class QuotaController extends StateController {
@Override
public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
+ final int userId = jobStatus.getSourceUserId();
+ final String pkgName = jobStatus.getSourcePackageName();
// Still need to track jobs even if mShouldThrottle is false in case it's set to true at
// some point.
- ArraySet<JobStatus> jobs = mTrackedJobs.get(jobStatus.getSourceUserId(),
- jobStatus.getSourcePackageName());
+ ArraySet<JobStatus> jobs = mTrackedJobs.get(userId, pkgName);
if (jobs == null) {
jobs = new ArraySet<>();
- mTrackedJobs.add(jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), jobs);
+ mTrackedJobs.add(userId, pkgName, jobs);
}
jobs.add(jobStatus);
jobStatus.setTrackingController(JobStatus.TRACKING_QUOTA);
- jobStatus.setQuotaConstraintSatisfied(!mShouldThrottle || isWithinQuotaLocked(jobStatus));
+ if (mShouldThrottle) {
+ final boolean isWithinQuota = isWithinQuotaLocked(jobStatus);
+ jobStatus.setQuotaConstraintSatisfied(isWithinQuota);
+ if (!isWithinQuota) {
+ maybeScheduleStartAlarmLocked(userId, pkgName,
+ getEffectiveStandbyBucket(jobStatus));
+ }
+ } else {
+ // QuotaController isn't throttling, so always set to true.
+ jobStatus.setQuotaConstraintSatisfied(true);
+ }
}
@Override
@@ -1628,6 +1639,9 @@ public final class QuotaController extends StateController {
if (isActive()) {
pw.print("started at ");
pw.print(mStartTimeElapsed);
+ pw.print(" (");
+ pw.print(sElapsedRealtimeClock.millis() - mStartTimeElapsed);
+ pw.print("ms ago)");
} else {
pw.print("NOT active");
}
@@ -1937,6 +1951,7 @@ public final class QuotaController extends StateController {
pw.println("Is throttling: " + mShouldThrottle);
pw.println("Is charging: " + mChargeTracker.isCharging());
pw.println("In parole: " + mInParole);
+ pw.println("Current elapsed time: " + sElapsedRealtimeClock.millis());
pw.println();
pw.print("Foreground UIDs: ");
@@ -2030,6 +2045,26 @@ public final class QuotaController extends StateController {
}
}
pw.decreaseIndent();
+
+ pw.println();
+ pw.println("In quota alarms:");
+ pw.increaseIndent();
+ for (int u = 0; u < mInQuotaAlarmListeners.numUsers(); ++u) {
+ final int userId = mInQuotaAlarmListeners.keyAt(u);
+ for (int p = 0; p < mInQuotaAlarmListeners.numPackagesForUser(userId); ++p) {
+ final String pkgName = mInQuotaAlarmListeners.keyAt(u, p);
+ QcAlarmListener alarmListener = mInQuotaAlarmListeners.valueAt(u, p);
+
+ pw.print(string(userId, pkgName));
+ pw.print(": ");
+ if (alarmListener.isWaiting()) {
+ pw.println(alarmListener.getTriggerTimeElapsed());
+ } else {
+ pw.println("NOT WAITING");
+ }
+ }
+ }
+ pw.decreaseIndent();
}
@Override
@@ -2040,6 +2075,8 @@ public final class QuotaController extends StateController {
proto.write(StateControllerProto.QuotaController.IS_CHARGING, mChargeTracker.isCharging());
proto.write(StateControllerProto.QuotaController.IS_IN_PAROLE, mInParole);
+ proto.write(StateControllerProto.QuotaController.ELAPSED_REALTIME,
+ sElapsedRealtimeClock.millis());
for (int i = 0; i < mForegroundUids.size(); ++i) {
proto.write(StateControllerProto.QuotaController.FOREGROUND_UIDS,
@@ -2132,6 +2169,18 @@ public final class QuotaController extends StateController {
}
}
+ QcAlarmListener alarmListener = mInQuotaAlarmListeners.get(userId, pkgName);
+ if (alarmListener != null) {
+ final long alToken = proto.start(
+ StateControllerProto.QuotaController.PackageStats.IN_QUOTA_ALARM_LISTENER);
+ proto.write(StateControllerProto.QuotaController.AlarmListener.IS_WAITING,
+ alarmListener.isWaiting());
+ proto.write(
+ StateControllerProto.QuotaController.AlarmListener.TRIGGER_TIME_ELAPSED,
+ alarmListener.getTriggerTimeElapsed());
+ proto.end(alToken);
+ }
+
proto.end(psToken);
}
}
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index da836c271457..1b705bb7c4be 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -189,6 +189,7 @@ public class LockSettingsService extends ILockSettings.Stub {
private final LockPatternUtils mLockPatternUtils;
private final NotificationManager mNotificationManager;
private final UserManager mUserManager;
+ private final IStorageManager mStorageManager;
private final IActivityManager mActivityManager;
private final SyntheticPasswordManager mSpManager;
@@ -460,6 +461,7 @@ public class LockSettingsService extends ILockSettings.Stub {
mStorage = injector.getStorage();
mNotificationManager = injector.getNotificationManager();
mUserManager = injector.getUserManager();
+ mStorageManager = injector.getStorageManager();
mStrongAuthTracker = injector.getStrongAuthTracker();
mStrongAuthTracker.register(mStrongAuth);
@@ -1186,6 +1188,14 @@ public class LockSettingsService extends ILockSettings.Stub {
}
}
+ /**
+ * Unlock the user (both storage and user state) and its associated managed profiles
+ * synchronously.
+ *
+ * <em>Be very careful about the risk of deadlock here: ActivityManager.unlockUser()
+ * can end up calling into other system services to process user unlock request (via
+ * {@link com.android.server.SystemServiceManager#unlockUser} </em>
+ */
private void unlockUser(int userId, byte[] token, byte[] secret) {
// TODO: make this method fully async so we can update UI with progress strings
final CountDownLatch latch = new CountDownLatch(1);
@@ -1639,13 +1649,27 @@ public class LockSettingsService extends ILockSettings.Stub {
}
}
+ private boolean isUserKeyUnlocked(int userId) {
+ try {
+ return mStorageManager.isUserKeyUnlocked(userId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "failed to check user key locked state", e);
+ return false;
+ }
+ }
+
+ /** Unlock disk encryption */
+ private void unlockUserKey(int userId, byte[] token, byte[] secret) throws RemoteException {
+ final UserInfo userInfo = mUserManager.getUserInfo(userId);
+ mStorageManager.unlockUserKey(userId, userInfo.serialNumber, token, secret);
+ }
+
private void addUserKeyAuth(int userId, byte[] token, byte[] secret)
throws RemoteException {
final UserInfo userInfo = mUserManager.getUserInfo(userId);
- final IStorageManager storageManager = mInjector.getStorageManager();
final long callingId = Binder.clearCallingIdentity();
try {
- storageManager.addUserKeyAuth(userId, userInfo.serialNumber, token, secret);
+ mStorageManager.addUserKeyAuth(userId, userInfo.serialNumber, token, secret);
} finally {
Binder.restoreCallingIdentity(callingId);
}
@@ -1654,10 +1678,9 @@ public class LockSettingsService extends ILockSettings.Stub {
private void fixateNewestUserKeyAuth(int userId)
throws RemoteException {
if (DEBUG) Slog.d(TAG, "fixateNewestUserKeyAuth: user=" + userId);
- final IStorageManager storageManager = mInjector.getStorageManager();
final long callingId = Binder.clearCallingIdentity();
try {
- storageManager.fixateNewestUserKeyAuth(userId);
+ mStorageManager.fixateNewestUserKeyAuth(userId);
} finally {
Binder.restoreCallingIdentity(callingId);
}
@@ -2571,7 +2594,7 @@ public class LockSettingsService extends ILockSettings.Stub {
credential, credentialType, auth, requestedQuality, userId);
final Map<Integer, byte[]> profilePasswords;
if (credential != null) {
- // // not needed by synchronizeUnifiedWorkChallengeForProfiles()
+ // not needed by synchronizeUnifiedWorkChallengeForProfiles()
profilePasswords = null;
if (mSpManager.hasSidForUser(userId)) {
@@ -2599,9 +2622,12 @@ public class LockSettingsService extends ILockSettings.Stub {
mSpManager.clearSidForUser(userId);
getGateKeeperService().clearSecureUserId(userId);
// Clear key from vold so ActivityManager can just unlock the user with empty secret
- // during boot.
+ // during boot. Vold storage needs to be unlocked before manipulation of the keys can
+ // succeed.
+ unlockUserKey(userId, null, auth.deriveDiskEncryptionKey());
clearUserKeyProtection(userId);
fixateNewestUserKeyAuth(userId);
+ unlockKeystore(auth.deriveKeyStorePassword(), userId);
setKeystorePassword(null, userId);
}
setLong(SYNTHETIC_PASSWORD_HANDLE_KEY, newHandle, userId);
@@ -2809,45 +2835,50 @@ public class LockSettingsService extends ILockSettings.Stub {
if (!mSpManager.hasEscrowData(userId)) {
throw new SecurityException("Escrow token is disabled on the current user");
}
- result = setLockCredentialWithTokenInternal(credential, type, tokenHandle, token,
+ result = setLockCredentialWithTokenInternalLocked(credential, type, tokenHandle, token,
requestedQuality, userId);
}
if (result) {
synchronized (mSeparateChallengeLock) {
setSeparateProfileChallengeEnabledLocked(userId, true, null);
}
+ if (credential == null) {
+ // If clearing credential, unlock the user manually in order to progress user start
+ // Call unlockUser() on a handler thread so no lock is held (either by LSS or by
+ // the caller like DPMS), otherwise it can lead to deadlock.
+ mHandler.post(() -> unlockUser(userId, null, null));
+ }
notifyPasswordChanged(userId);
notifySeparateProfileChallengeChanged(userId);
}
return result;
}
- private boolean setLockCredentialWithTokenInternal(byte[] credential, int type,
- long tokenHandle, byte[] token, int requestedQuality, int userId) throws RemoteException {
+ @GuardedBy("mSpManager")
+ private boolean setLockCredentialWithTokenInternalLocked(byte[] credential, int type,
+ long tokenHandle, byte[] token, int requestedQuality, int userId)
+ throws RemoteException {
final AuthenticationResult result;
- synchronized (mSpManager) {
- result = mSpManager.unwrapTokenBasedSyntheticPassword(
- getGateKeeperService(), tokenHandle, token, userId);
- if (result.authToken == null) {
- Slog.w(TAG, "Invalid escrow token supplied");
- return false;
- }
- if (result.gkResponse.getResponseCode() != VerifyCredentialResponse.RESPONSE_OK) {
- // Most likely, an untrusted credential reset happened in the past which
- // changed the synthetic password
- Slog.e(TAG, "Obsolete token: synthetic password derived but it fails GK "
- + "verification.");
- return false;
- }
- // Update PASSWORD_TYPE_KEY since it's needed by notifyActivePasswordMetricsAvailable()
- // called by setLockCredentialWithAuthTokenLocked().
- // TODO: refactor usage of PASSWORD_TYPE_KEY b/65239740
- setLong(LockPatternUtils.PASSWORD_TYPE_KEY, requestedQuality, userId);
- long oldHandle = getSyntheticPasswordHandleLocked(userId);
- setLockCredentialWithAuthTokenLocked(credential, type, result.authToken,
- requestedQuality, userId);
- mSpManager.destroyPasswordBasedSyntheticPassword(oldHandle, userId);
+ result = mSpManager.unwrapTokenBasedSyntheticPassword(
+ getGateKeeperService(), tokenHandle, token, userId);
+ if (result.authToken == null) {
+ Slog.w(TAG, "Invalid escrow token supplied");
+ return false;
}
+ if (result.gkResponse.getResponseCode() != VerifyCredentialResponse.RESPONSE_OK) {
+ // Most likely, an untrusted credential reset happened in the past which
+ // changed the synthetic password
+ Slog.e(TAG, "Obsolete token: synthetic password derived but it fails GK "
+ + "verification.");
+ return false;
+ }
+ // TODO: refactor usage of PASSWORD_TYPE_KEY b/65239740
+ setLong(LockPatternUtils.PASSWORD_TYPE_KEY, requestedQuality, userId);
+ long oldHandle = getSyntheticPasswordHandleLocked(userId);
+ setLockCredentialWithAuthTokenLocked(credential, type, result.authToken,
+ requestedQuality, userId);
+ mSpManager.destroyPasswordBasedSyntheticPassword(oldHandle, userId);
+
onAuthTokenKnownForUser(userId, result.authToken);
return true;
}
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
index ee22264112ab..a5d59e3c8884 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
@@ -260,6 +260,10 @@ class LockSettingsShellCommand extends ShellCommand {
return false;
}
} else {
+ if (!mOld.isEmpty()) {
+ getOutPrintWriter().println("Old password provided but user has no password");
+ return false;
+ }
return true;
}
}
diff --git a/services/core/java/com/android/server/media/MediaSessionServiceImpl.java b/services/core/java/com/android/server/media/MediaSessionServiceImpl.java
index fdb499b5cd0e..aa886c27d7d8 100644
--- a/services/core/java/com/android/server/media/MediaSessionServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaSessionServiceImpl.java
@@ -33,6 +33,7 @@ import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ParceledListSlice;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.database.ContentObserver;
@@ -1072,7 +1073,7 @@ public class MediaSessionServiceImpl extends MediaSessionService.ServiceImpl {
}
@Override
- public List<Session2Token> getSession2Tokens(int userId) {
+ public ParceledListSlice getSession2Tokens(int userId) {
final int pid = Binder.getCallingPid();
final int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
@@ -1087,7 +1088,7 @@ public class MediaSessionServiceImpl extends MediaSessionService.ServiceImpl {
synchronized (mLock) {
result = getSession2TokensLocked(resolvedUserId);
}
- return result;
+ return new ParceledListSlice(result);
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index e2033c6fd07d..21a862a5ec6c 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -4816,10 +4816,11 @@ public class NotificationManagerService extends SystemService {
NotificationRecord oldRecord) {
Notification notification = r.getNotification();
- // Does the app want to bubble & have permission to bubble?
+ // Does the app want to bubble & is able to bubble
boolean canBubble = notification.getBubbleMetadata() != null
&& mPreferencesHelper.areBubblesAllowed(pkg, userId)
- && r.getChannel().canBubble();
+ && r.getChannel().canBubble()
+ && !mActivityManager.isLowRamDevice();
// Is the app in the foreground?
final boolean appIsForeground =
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 9ede263284a1..d45a8ef4e0ae 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -922,6 +922,8 @@ public class PermissionManagerService {
permissionsState.setGlobalGids(mGlobalGids);
synchronized (mLock) {
+ ArraySet<String> newImplicitPermissions = new ArraySet<>();
+
final int N = pkg.requestedPermissions.size();
for (int i = 0; i < N; i++) {
final String permName = pkg.requestedPermissions.get(i);
@@ -943,6 +945,17 @@ public class PermissionManagerService {
continue;
}
+ // Cache newImplicitPermissions before modifing permissionsState as for the shared
+ // uids the original and new state are the same object
+ if (!origPermissions.hasRequestedPermission(permName)
+ && pkg.implicitPermissions.contains(permName)) {
+ newImplicitPermissions.add(permName);
+
+ if (DEBUG_PERMISSIONS) {
+ Slog.i(TAG, permName + " is newly added for " + pkg.packageName);
+ }
+ }
+
// Limit ephemeral apps to ephemeral allowed permissions.
if (pkg.applicationInfo.isInstantApp() && !bp.isInstant()) {
if (DEBUG_PERMISSIONS) {
@@ -1298,7 +1311,7 @@ public class PermissionManagerService {
updatedUserIds = revokePermissionsNoLongerImplicitLocked(permissionsState, pkg,
updatedUserIds);
updatedUserIds = setInitialGrantForNewImplicitPermissionsLocked(origPermissions,
- permissionsState, pkg, updatedUserIds);
+ permissionsState, pkg, newImplicitPermissions, updatedUserIds);
}
// Persist the runtime permissions state for users with changes. If permissions
@@ -1437,27 +1450,9 @@ public class PermissionManagerService {
private @NonNull int[] setInitialGrantForNewImplicitPermissionsLocked(
@NonNull PermissionsState origPs,
@NonNull PermissionsState ps, @NonNull PackageParser.Package pkg,
+ @NonNull ArraySet<String> newImplicitPermissions,
@NonNull int[] updatedUserIds) {
String pkgName = pkg.packageName;
- ArraySet<String> newImplicitPermissions = new ArraySet<>();
-
- int numRequestedPerms = pkg.requestedPermissions.size();
- for (int i = 0; i < numRequestedPerms; i++) {
- BasePermission bp = mSettings.getPermissionLocked(pkg.requestedPermissions.get(i));
- if (bp != null) {
- String perm = bp.getName();
-
- if (!origPs.hasRequestedPermission(perm) && pkg.implicitPermissions.contains(
- perm)) {
- newImplicitPermissions.add(perm);
-
- if (DEBUG_PERMISSIONS) {
- Slog.i(TAG, perm + " is newly added for " + pkgName);
- }
- }
- }
- }
-
ArrayMap<String, ArraySet<String>> newToSplitPerms = new ArrayMap<>();
int numSplitPerms = PermissionManager.SPLIT_PERMISSIONS.size();
diff --git a/services/core/java/com/android/server/pm/permission/TEST_MAPPING b/services/core/java/com/android/server/pm/permission/TEST_MAPPING
index 05e9b93bcf5a..c27270712058 100644
--- a/services/core/java/com/android/server/pm/permission/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/permission/TEST_MAPPING
@@ -11,6 +11,9 @@
},
{
"include-filter": "android.permission.cts.PermissionFlagsTest"
+ },
+ {
+ "include-filter": "android.permission.cts.SharedUidPermissionsTest"
}
]
},
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 7bc9600f50b4..a55ee5ff7f1f 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -5810,8 +5810,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
*/
Intent getSecondaryHomeIntent(String preferredPackage) {
final Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
- if (preferredPackage == null) {
- // Using the component stored in config if no package name.
+ final boolean useSystemProvidedLauncher = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_useSystemProvidedLauncherForSecondary);
+ if (preferredPackage == null || useSystemProvidedLauncher) {
+ // Using the component stored in config if no package name or forced.
final String secondaryHomeComponent = mContext.getResources().getString(
com.android.internal.R.string.config_secondaryHomeComponent);
intent.setComponent(ComponentName.unflattenFromString(secondaryHomeComponent));
diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java
index 46b5f3ab38f9..e65a241e8612 100644
--- a/services/core/java/com/android/server/wm/RootActivityContainer.java
+++ b/services/core/java/com/android/server/wm/RootActivityContainer.java
@@ -94,6 +94,7 @@ import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
+import android.os.storage.StorageManager;
import android.provider.Settings;
import android.service.voice.IVoiceInteractionSession;
import android.util.ArraySet;
@@ -369,19 +370,17 @@ class RootActivityContainer extends ConfigurationContainer
displayId = getTopDisplayFocusedStack().mDisplayId;
}
- Intent homeIntent;
- ActivityInfo aInfo;
+ Intent homeIntent = null;
+ ActivityInfo aInfo = null;
if (displayId == DEFAULT_DISPLAY) {
homeIntent = mService.getHomeIntent();
aInfo = resolveHomeActivity(userId, homeIntent);
- } else if (!mService.mSupportsMultiDisplay) {
- return false;
- } else {
+ } else if (shouldPlaceSecondaryHomeOnDisplay(displayId)) {
Pair<ActivityInfo, Intent> info = resolveSecondaryHomeActivity(userId, displayId);
aInfo = info.first;
homeIntent = info.second;
}
- if (aInfo == null) {
+ if (aInfo == null || homeIntent == null) {
return false;
}
@@ -534,6 +533,46 @@ class RootActivityContainer extends ConfigurationContainer
}
/**
+ * Check if the display is valid for secondary home activity.
+ * @param displayId The id of the target display.
+ * @return {@code true} if allow to launch, {@code false} otherwise.
+ */
+ boolean shouldPlaceSecondaryHomeOnDisplay(int displayId) {
+ if (displayId == DEFAULT_DISPLAY) {
+ throw new IllegalArgumentException(
+ "shouldPlaceSecondaryHomeOnDisplay: Should not be DEFAULT_DISPLAY");
+ } else if (displayId == INVALID_DISPLAY) {
+ return false;
+ }
+
+ if (!mService.mSupportsMultiDisplay) {
+ // Can't launch home on secondary display if device does not support multi-display.
+ return false;
+ }
+
+ final boolean deviceProvisioned = Settings.Global.getInt(
+ mService.mContext.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 0) != 0;
+ if (!deviceProvisioned) {
+ // Can't launch home on secondary display before device is provisioned.
+ return false;
+ }
+
+ if (!StorageManager.isUserKeyUnlocked(mCurrentUser)) {
+ // Can't launch home on secondary displays if device is still locked.
+ return false;
+ }
+
+ final ActivityDisplay display = getActivityDisplay(displayId);
+ if (display == null || display.isRemoved() || !display.supportsSystemDecorations()) {
+ // Can't launch home on display that doesn't support system decorations.
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* Check if home activity start should be allowed on a display.
* @param homeInfo {@code ActivityInfo} of the home activity that is going to be launched.
* @param displayId The id of the target display.
@@ -562,22 +601,7 @@ class RootActivityContainer extends ConfigurationContainer
return true;
}
- if (displayId != DEFAULT_DISPLAY && !mService.mSupportsMultiDisplay) {
- // Can't launch home on secondary display if device not support multi-display.
- return false;
- }
-
- final boolean deviceProvisioned = Settings.Global.getInt(
- mService.mContext.getContentResolver(),
- Settings.Global.DEVICE_PROVISIONED, 0) != 0;
- if (displayId != DEFAULT_DISPLAY && displayId != INVALID_DISPLAY && !deviceProvisioned) {
- // Can't launch home on secondary display before device is provisioned.
- return false;
- }
-
- final ActivityDisplay display = getActivityDisplay(displayId);
- if (display == null || display.isRemoved() || !display.supportsSystemDecorations()) {
- // Can't launch home on display that doesn't support system decorations.
+ if (!shouldPlaceSecondaryHomeOnDisplay(displayId)) {
return false;
}
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index 7f1b4c0d0dd3..efd3e1cbf770 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -450,6 +450,11 @@ class TaskPositioner implements IBinder.DeathRecipient {
// This is a moving or scrolling operation.
mTask.mStack.getDimBounds(mTmpRect);
+ // If a target window is covered by system bar, there is no way to move it again by touch.
+ // So we exclude them from stack bounds. and then it will be shown inside stable area.
+ Rect stableBounds = new Rect();
+ mDisplayContent.getStableRect(stableBounds);
+ mTmpRect.intersect(stableBounds);
int nX = (int) x;
int nY = (int) y;
diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java
index 10fb559de2e6..d4d157fbe75c 100644
--- a/services/core/java/com/android/server/wm/TaskRecord.java
+++ b/services/core/java/com/android/server/wm/TaskRecord.java
@@ -2209,9 +2209,27 @@ class TaskRecord extends ConfigurationContainer {
// by policy, make sure the window remains within parent somewhere
final float density =
((float) newParentConfig.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;
- fitWithinBounds(outOverrideBounds, newParentConfig.windowConfiguration.getBounds(),
+ final Rect parentBounds =
+ new Rect(newParentConfig.windowConfiguration.getBounds());
+ final ActivityDisplay display = mStack.getDisplay();
+ if (display != null && display.mDisplayContent != null) {
+ // If a freeform window moves below system bar, there is no way to move it again
+ // by touch. Because its caption is covered by system bar. So we exclude them
+ // from stack bounds. and then caption will be shown inside stable area.
+ final Rect stableBounds = new Rect();
+ display.mDisplayContent.getStableRect(stableBounds);
+ parentBounds.intersect(stableBounds);
+ }
+
+ fitWithinBounds(outOverrideBounds, parentBounds,
(int) (density * WindowState.MINIMUM_VISIBLE_WIDTH_IN_DP),
(int) (density * WindowState.MINIMUM_VISIBLE_HEIGHT_IN_DP));
+
+ // Prevent to overlap caption with stable insets.
+ final int offsetTop = parentBounds.top - outOverrideBounds.top;
+ if (offsetTop > 0) {
+ outOverrideBounds.offset(0, offsetTop);
+ }
}
computeConfigResourceOverrides(getResolvedOverrideConfiguration(), newParentConfig);
}
diff --git a/services/net/Android.bp b/services/net/Android.bp
index d72f1cf8382b..a44d8351939f 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -16,7 +16,10 @@ aidl_interface {
},
},
api_dir: "aidl/ipmemorystore",
- versions: ["1"],
+ versions: [
+ "1",
+ "2",
+ ],
}
aidl_interface {
@@ -30,6 +33,7 @@ aidl_interface {
"java/android/net/INetworkStackConnector.aidl",
"java/android/net/INetworkStackStatusCallback.aidl",
"java/android/net/InitialConfigurationParcelable.aidl",
+ "java/android/net/NattKeepalivePacketDataParcelable.aidl",
"java/android/net/PrivateDnsConfigParcel.aidl",
"java/android/net/ProvisioningConfigurationParcelable.aidl",
"java/android/net/TcpKeepalivePacketDataParcelable.aidl",
@@ -49,7 +53,10 @@ aidl_interface {
},
api_dir: "aidl/networkstack",
imports: ["ipmemorystore-aidl-interfaces"],
- versions: ["1"],
+ versions: [
+ "1",
+ "2",
+ ],
}
java_library_static {
diff --git a/services/net/aidl/ipmemorystore/2/android/net/IIpMemoryStore.aidl b/services/net/aidl/ipmemorystore/2/android/net/IIpMemoryStore.aidl
new file mode 100644
index 000000000000..a8cbab26190f
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/IIpMemoryStore.aidl
@@ -0,0 +1,9 @@
+package android.net;
+interface IIpMemoryStore {
+ oneway void storeNetworkAttributes(String l2Key, in android.net.ipmemorystore.NetworkAttributesParcelable attributes, android.net.ipmemorystore.IOnStatusListener listener);
+ oneway void storeBlob(String l2Key, String clientId, String name, in android.net.ipmemorystore.Blob data, android.net.ipmemorystore.IOnStatusListener listener);
+ oneway void findL2Key(in android.net.ipmemorystore.NetworkAttributesParcelable attributes, android.net.ipmemorystore.IOnL2KeyResponseListener listener);
+ oneway void isSameNetwork(String l2Key1, String l2Key2, android.net.ipmemorystore.IOnSameL3NetworkResponseListener listener);
+ oneway void retrieveNetworkAttributes(String l2Key, android.net.ipmemorystore.IOnNetworkAttributesRetrievedListener listener);
+ oneway void retrieveBlob(String l2Key, String clientId, String name, android.net.ipmemorystore.IOnBlobRetrievedListener listener);
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/IIpMemoryStoreCallbacks.aidl b/services/net/aidl/ipmemorystore/2/android/net/IIpMemoryStoreCallbacks.aidl
new file mode 100644
index 000000000000..cf02c26c2fe3
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/IIpMemoryStoreCallbacks.aidl
@@ -0,0 +1,4 @@
+package android.net;
+interface IIpMemoryStoreCallbacks {
+ oneway void onIpMemoryStoreFetched(in android.net.IIpMemoryStore ipMemoryStore);
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/Blob.aidl b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/Blob.aidl
new file mode 100644
index 000000000000..291dbef817e6
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/Blob.aidl
@@ -0,0 +1,4 @@
+package android.net.ipmemorystore;
+parcelable Blob {
+ byte[] data;
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl
new file mode 100644
index 000000000000..52f40d49abd5
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl
@@ -0,0 +1,4 @@
+package android.net.ipmemorystore;
+interface IOnBlobRetrievedListener {
+ oneway void onBlobRetrieved(in android.net.ipmemorystore.StatusParcelable status, in String l2Key, in String name, in android.net.ipmemorystore.Blob data);
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl
new file mode 100644
index 000000000000..785351435d73
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl
@@ -0,0 +1,4 @@
+package android.net.ipmemorystore;
+interface IOnL2KeyResponseListener {
+ oneway void onL2KeyResponse(in android.net.ipmemorystore.StatusParcelable status, in String l2Key);
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl
new file mode 100644
index 000000000000..3dd2ae6e9bab
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl
@@ -0,0 +1,4 @@
+package android.net.ipmemorystore;
+interface IOnNetworkAttributesRetrievedListener {
+ oneway void onNetworkAttributesRetrieved(in android.net.ipmemorystore.StatusParcelable status, in String l2Key, in android.net.ipmemorystore.NetworkAttributesParcelable attributes);
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl
new file mode 100644
index 000000000000..46d4ecb9ed7c
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl
@@ -0,0 +1,4 @@
+package android.net.ipmemorystore;
+interface IOnSameL3NetworkResponseListener {
+ oneway void onSameL3NetworkResponse(in android.net.ipmemorystore.StatusParcelable status, in android.net.ipmemorystore.SameL3NetworkResponseParcelable response);
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnStatusListener.aidl b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnStatusListener.aidl
new file mode 100644
index 000000000000..54e654b80c9e
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/IOnStatusListener.aidl
@@ -0,0 +1,4 @@
+package android.net.ipmemorystore;
+interface IOnStatusListener {
+ oneway void onComplete(in android.net.ipmemorystore.StatusParcelable status);
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/NetworkAttributesParcelable.aidl b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/NetworkAttributesParcelable.aidl
new file mode 100644
index 000000000000..9531ea3963fb
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/NetworkAttributesParcelable.aidl
@@ -0,0 +1,8 @@
+package android.net.ipmemorystore;
+parcelable NetworkAttributesParcelable {
+ byte[] assignedV4Address;
+ long assignedV4AddressExpiry;
+ String groupHint;
+ android.net.ipmemorystore.Blob[] dnsAddresses;
+ int mtu;
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl
new file mode 100644
index 000000000000..414272b49f1d
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl
@@ -0,0 +1,6 @@
+package android.net.ipmemorystore;
+parcelable SameL3NetworkResponseParcelable {
+ String l2Key1;
+ String l2Key2;
+ float confidence;
+}
diff --git a/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/StatusParcelable.aidl b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/StatusParcelable.aidl
new file mode 100644
index 000000000000..92c6779b5dc0
--- /dev/null
+++ b/services/net/aidl/ipmemorystore/2/android/net/ipmemorystore/StatusParcelable.aidl
@@ -0,0 +1,4 @@
+package android.net.ipmemorystore;
+parcelable StatusParcelable {
+ int resultCode;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/DhcpResultsParcelable.aidl b/services/net/aidl/networkstack/2/android/net/DhcpResultsParcelable.aidl
new file mode 100644
index 000000000000..31891de7230a
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/DhcpResultsParcelable.aidl
@@ -0,0 +1,9 @@
+package android.net;
+parcelable DhcpResultsParcelable {
+ android.net.StaticIpConfiguration baseConfiguration;
+ int leaseDuration;
+ int mtu;
+ String serverAddress;
+ String vendorInfo;
+ String serverHostName;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/INetworkMonitor.aidl b/services/net/aidl/networkstack/2/android/net/INetworkMonitor.aidl
new file mode 100644
index 000000000000..029968b6f324
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/INetworkMonitor.aidl
@@ -0,0 +1,24 @@
+package android.net;
+interface INetworkMonitor {
+ oneway void start();
+ oneway void launchCaptivePortalApp();
+ oneway void notifyCaptivePortalAppFinished(int response);
+ oneway void setAcceptPartialConnectivity();
+ oneway void forceReevaluation(int uid);
+ oneway void notifyPrivateDnsChanged(in android.net.PrivateDnsConfigParcel config);
+ oneway void notifyDnsResponse(int returnCode);
+ oneway void notifyNetworkConnected(in android.net.LinkProperties lp, in android.net.NetworkCapabilities nc);
+ oneway void notifyNetworkDisconnected();
+ oneway void notifyLinkPropertiesChanged(in android.net.LinkProperties lp);
+ oneway void notifyNetworkCapabilitiesChanged(in android.net.NetworkCapabilities nc);
+ const int NETWORK_TEST_RESULT_VALID = 0;
+ const int NETWORK_TEST_RESULT_INVALID = 1;
+ const int NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY = 2;
+ const int NETWORK_VALIDATION_RESULT_VALID = 1;
+ const int NETWORK_VALIDATION_RESULT_PARTIAL = 2;
+ const int NETWORK_VALIDATION_PROBE_DNS = 4;
+ const int NETWORK_VALIDATION_PROBE_HTTP = 8;
+ const int NETWORK_VALIDATION_PROBE_HTTPS = 16;
+ const int NETWORK_VALIDATION_PROBE_FALLBACK = 32;
+ const int NETWORK_VALIDATION_PROBE_PRIVDNS = 64;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/INetworkMonitorCallbacks.aidl b/services/net/aidl/networkstack/2/android/net/INetworkMonitorCallbacks.aidl
new file mode 100644
index 000000000000..ee9871ddcd15
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/INetworkMonitorCallbacks.aidl
@@ -0,0 +1,8 @@
+package android.net;
+interface INetworkMonitorCallbacks {
+ oneway void onNetworkMonitorCreated(in android.net.INetworkMonitor networkMonitor);
+ oneway void notifyNetworkTested(int testResult, @nullable String redirectUrl);
+ oneway void notifyPrivateDnsConfigResolved(in android.net.PrivateDnsConfigParcel config);
+ oneway void showProvisioningNotification(String action, String packageName);
+ oneway void hideProvisioningNotification();
+}
diff --git a/services/net/aidl/networkstack/2/android/net/INetworkStackConnector.aidl b/services/net/aidl/networkstack/2/android/net/INetworkStackConnector.aidl
new file mode 100644
index 000000000000..7da11e476c0e
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/INetworkStackConnector.aidl
@@ -0,0 +1,7 @@
+package android.net;
+interface INetworkStackConnector {
+ oneway void makeDhcpServer(in String ifName, in android.net.dhcp.DhcpServingParamsParcel params, in android.net.dhcp.IDhcpServerCallbacks cb);
+ oneway void makeNetworkMonitor(in android.net.Network network, String name, in android.net.INetworkMonitorCallbacks cb);
+ oneway void makeIpClient(in String ifName, in android.net.ip.IIpClientCallbacks callbacks);
+ oneway void fetchIpMemoryStore(in android.net.IIpMemoryStoreCallbacks cb);
+}
diff --git a/services/net/aidl/networkstack/2/android/net/INetworkStackStatusCallback.aidl b/services/net/aidl/networkstack/2/android/net/INetworkStackStatusCallback.aidl
new file mode 100644
index 000000000000..f6ca6f7a78e2
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/INetworkStackStatusCallback.aidl
@@ -0,0 +1,4 @@
+package android.net;
+interface INetworkStackStatusCallback {
+ oneway void onStatusAvailable(int statusCode);
+}
diff --git a/services/net/aidl/networkstack/2/android/net/InitialConfigurationParcelable.aidl b/services/net/aidl/networkstack/2/android/net/InitialConfigurationParcelable.aidl
new file mode 100644
index 000000000000..c80a78785b3b
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/InitialConfigurationParcelable.aidl
@@ -0,0 +1,7 @@
+package android.net;
+parcelable InitialConfigurationParcelable {
+ android.net.LinkAddress[] ipAddresses;
+ android.net.IpPrefix[] directlyConnectedRoutes;
+ String[] dnsServers;
+ String gateway;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/NattKeepalivePacketDataParcelable.aidl b/services/net/aidl/networkstack/2/android/net/NattKeepalivePacketDataParcelable.aidl
new file mode 100644
index 000000000000..65de8833e6c5
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/NattKeepalivePacketDataParcelable.aidl
@@ -0,0 +1,7 @@
+package android.net;
+parcelable NattKeepalivePacketDataParcelable {
+ byte[] srcAddress;
+ int srcPort;
+ byte[] dstAddress;
+ int dstPort;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/PrivateDnsConfigParcel.aidl b/services/net/aidl/networkstack/2/android/net/PrivateDnsConfigParcel.aidl
new file mode 100644
index 000000000000..2de790bb7754
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/PrivateDnsConfigParcel.aidl
@@ -0,0 +1,5 @@
+package android.net;
+parcelable PrivateDnsConfigParcel {
+ String hostname;
+ String[] ips;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/ProvisioningConfigurationParcelable.aidl b/services/net/aidl/networkstack/2/android/net/ProvisioningConfigurationParcelable.aidl
new file mode 100644
index 000000000000..3a6c30496fd8
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/ProvisioningConfigurationParcelable.aidl
@@ -0,0 +1,15 @@
+package android.net;
+parcelable ProvisioningConfigurationParcelable {
+ boolean enableIPv4;
+ boolean enableIPv6;
+ boolean usingMultinetworkPolicyTracker;
+ boolean usingIpReachabilityMonitor;
+ int requestedPreDhcpActionMs;
+ android.net.InitialConfigurationParcelable initialConfig;
+ android.net.StaticIpConfiguration staticIpConfig;
+ android.net.apf.ApfCapabilities apfCapabilities;
+ int provisioningTimeoutMs;
+ int ipv6AddrGenMode;
+ android.net.Network network;
+ String displayName;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/TcpKeepalivePacketDataParcelable.aidl b/services/net/aidl/networkstack/2/android/net/TcpKeepalivePacketDataParcelable.aidl
new file mode 100644
index 000000000000..e121c064f7ac
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/TcpKeepalivePacketDataParcelable.aidl
@@ -0,0 +1,13 @@
+package android.net;
+parcelable TcpKeepalivePacketDataParcelable {
+ byte[] srcAddress;
+ int srcPort;
+ byte[] dstAddress;
+ int dstPort;
+ int seq;
+ int ack;
+ int rcvWnd;
+ int rcvWndScale;
+ int tos;
+ int ttl;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/dhcp/DhcpServingParamsParcel.aidl b/services/net/aidl/networkstack/2/android/net/dhcp/DhcpServingParamsParcel.aidl
new file mode 100644
index 000000000000..67193ae904bc
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/dhcp/DhcpServingParamsParcel.aidl
@@ -0,0 +1,11 @@
+package android.net.dhcp;
+parcelable DhcpServingParamsParcel {
+ int serverAddr;
+ int serverAddrPrefixLength;
+ int[] defaultRouters;
+ int[] dnsServers;
+ int[] excludedAddrs;
+ long dhcpLeaseTimeSecs;
+ int linkMtu;
+ boolean metered;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/dhcp/IDhcpServer.aidl b/services/net/aidl/networkstack/2/android/net/dhcp/IDhcpServer.aidl
new file mode 100644
index 000000000000..914315855496
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/dhcp/IDhcpServer.aidl
@@ -0,0 +1,10 @@
+package android.net.dhcp;
+interface IDhcpServer {
+ oneway void start(in android.net.INetworkStackStatusCallback cb);
+ oneway void updateParams(in android.net.dhcp.DhcpServingParamsParcel params, in android.net.INetworkStackStatusCallback cb);
+ oneway void stop(in android.net.INetworkStackStatusCallback cb);
+ const int STATUS_UNKNOWN = 0;
+ const int STATUS_SUCCESS = 1;
+ const int STATUS_INVALID_ARGUMENT = 2;
+ const int STATUS_UNKNOWN_ERROR = 3;
+}
diff --git a/services/net/aidl/networkstack/2/android/net/dhcp/IDhcpServerCallbacks.aidl b/services/net/aidl/networkstack/2/android/net/dhcp/IDhcpServerCallbacks.aidl
new file mode 100644
index 000000000000..dcc4489d52a6
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/dhcp/IDhcpServerCallbacks.aidl
@@ -0,0 +1,4 @@
+package android.net.dhcp;
+interface IDhcpServerCallbacks {
+ oneway void onDhcpServerCreated(int statusCode, in android.net.dhcp.IDhcpServer server);
+}
diff --git a/services/net/aidl/networkstack/2/android/net/ip/IIpClient.aidl b/services/net/aidl/networkstack/2/android/net/ip/IIpClient.aidl
new file mode 100644
index 000000000000..77d5917de913
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/ip/IIpClient.aidl
@@ -0,0 +1,15 @@
+package android.net.ip;
+interface IIpClient {
+ oneway void completedPreDhcpAction();
+ oneway void confirmConfiguration();
+ oneway void readPacketFilterComplete(in byte[] data);
+ oneway void shutdown();
+ oneway void startProvisioning(in android.net.ProvisioningConfigurationParcelable req);
+ oneway void stop();
+ oneway void setTcpBufferSizes(in String tcpBufferSizes);
+ oneway void setHttpProxy(in android.net.ProxyInfo proxyInfo);
+ oneway void setMulticastFilter(boolean enabled);
+ oneway void addKeepalivePacketFilter(int slot, in android.net.TcpKeepalivePacketDataParcelable pkt);
+ oneway void removeKeepalivePacketFilter(int slot);
+ oneway void setL2KeyAndGroupHint(in String l2Key, in String groupHint);
+}
diff --git a/services/net/aidl/networkstack/2/android/net/ip/IIpClientCallbacks.aidl b/services/net/aidl/networkstack/2/android/net/ip/IIpClientCallbacks.aidl
new file mode 100644
index 000000000000..d6bc8089a0be
--- /dev/null
+++ b/services/net/aidl/networkstack/2/android/net/ip/IIpClientCallbacks.aidl
@@ -0,0 +1,16 @@
+package android.net.ip;
+interface IIpClientCallbacks {
+ oneway void onIpClientCreated(in android.net.ip.IIpClient ipClient);
+ oneway void onPreDhcpAction();
+ oneway void onPostDhcpAction();
+ oneway void onNewDhcpResults(in android.net.DhcpResultsParcelable dhcpResults);
+ oneway void onProvisioningSuccess(in android.net.LinkProperties newLp);
+ oneway void onProvisioningFailure(in android.net.LinkProperties newLp);
+ oneway void onLinkPropertiesChange(in android.net.LinkProperties newLp);
+ oneway void onReachabilityLost(in String logMsg);
+ oneway void onQuit();
+ oneway void installPacketFilter(in byte[] filter);
+ oneway void startReadPacketFilter();
+ oneway void setFallbackMulticastFilter(boolean enabled);
+ oneway void setNeighborDiscoveryOffload(boolean enable);
+}
diff --git a/services/net/java/android/net/DhcpResultsParcelable.aidl b/services/net/java/android/net/DhcpResultsParcelable.aidl
index 978638b51ad1..c98d9c201342 100644
--- a/services/net/java/android/net/DhcpResultsParcelable.aidl
+++ b/services/net/java/android/net/DhcpResultsParcelable.aidl
@@ -24,4 +24,5 @@ parcelable DhcpResultsParcelable {
int mtu;
String serverAddress;
String vendorInfo;
-} \ No newline at end of file
+ String serverHostName;
+}
diff --git a/core/java/android/net/NattKeepalivePacketData.java b/services/net/java/android/net/NattKeepalivePacketData.java
index 5c55a98b874f..06838fe655b7 100644
--- a/core/java/android/net/NattKeepalivePacketData.java
+++ b/services/net/java/android/net/NattKeepalivePacketData.java
@@ -19,8 +19,10 @@ package android.net;
import static android.net.SocketKeepalive.ERROR_INVALID_IP_ADDRESS;
import static android.net.SocketKeepalive.ERROR_INVALID_PORT;
+import android.annotation.NonNull;
import android.net.SocketKeepalive.InvalidPacketException;
import android.net.util.IpUtils;
+import android.os.Parcelable;
import android.system.OsConstants;
import java.net.Inet4Address;
@@ -29,8 +31,7 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/** @hide */
-public final class NattKeepalivePacketData extends KeepalivePacketData {
-
+public final class NattKeepalivePacketData extends KeepalivePacketData implements Parcelable {
// This should only be constructed via static factory methods, such as
// nattKeepalivePacket
private NattKeepalivePacketData(InetAddress srcAddress, int srcPort,
@@ -77,4 +78,18 @@ public final class NattKeepalivePacketData extends KeepalivePacketData {
return new NattKeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, buf.array());
}
+
+ /**
+ * Convert this NattKeepalivePacketData to a NattKeepalivePacketDataParcelable.
+ */
+ @NonNull
+ public NattKeepalivePacketDataParcelable toStableParcelable() {
+ final NattKeepalivePacketDataParcelable parcel = new NattKeepalivePacketDataParcelable();
+
+ parcel.srcAddress = srcAddress.getAddress();
+ parcel.srcPort = srcPort;
+ parcel.dstAddress = dstAddress.getAddress();
+ parcel.dstPort = dstPort;
+ return parcel;
+ }
}
diff --git a/services/net/java/android/net/NattKeepalivePacketDataParcelable.aidl b/services/net/java/android/net/NattKeepalivePacketDataParcelable.aidl
new file mode 100644
index 000000000000..6f006d4971fb
--- /dev/null
+++ b/services/net/java/android/net/NattKeepalivePacketDataParcelable.aidl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+parcelable NattKeepalivePacketDataParcelable {
+ byte[] srcAddress;
+ int srcPort;
+ byte[] dstAddress;
+ int dstPort;
+}
+
diff --git a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
index 44d8e0ce3635..172dc24df6b0 100644
--- a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
+++ b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
@@ -41,6 +41,7 @@ public final class IpConfigurationParcelableUtil {
p.mtu = results.mtu;
p.serverAddress = parcelAddress(results.serverAddress);
p.vendorInfo = results.vendorInfo;
+ p.serverHostName = results.serverHostName;
return p;
}
@@ -54,6 +55,7 @@ public final class IpConfigurationParcelableUtil {
results.mtu = p.mtu;
results.serverAddress = (Inet4Address) unparcelAddress(p.serverAddress);
results.vendorInfo = p.vendorInfo;
+ results.serverHostName = p.serverHostName;
return results;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java
new file mode 100644
index 000000000000..9e255fe19881
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.view.DisplayAddress;
+import android.view.SurfaceControl;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.dx.mockito.inline.extended.StaticMockitoSession;
+import com.android.server.LocalServices;
+import com.android.server.lights.LightsManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.quality.Strictness;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class LocalDisplayAdapterTest {
+ private static final long HANDLER_WAIT_MS = 100;
+
+ private static final int PHYSICAL_DISPLAY_ID_MODEL_SHIFT = 8;
+
+ private StaticMockitoSession mMockitoSession;
+
+ private LocalDisplayAdapter mAdapter;
+
+ @Mock
+ private DisplayManagerService.SyncRoot mMockedSyncRoot;
+ @Mock
+ private Context mMockedContext;
+ @Mock
+ private Resources mMockedResources;
+ @Mock
+ private LightsManager mMockedLightsManager;
+
+ private Handler mHandler;
+
+ private TestListener mListener = new TestListener();
+
+ private LinkedList<Long> mDisplayIds = new LinkedList<>();
+
+ @Before
+ public void setUp() throws Exception {
+ mMockitoSession = mockitoSession()
+ .initMocks(this)
+ .mockStatic(SurfaceControl.class)
+ .strictness(Strictness.LENIENT)
+ .startMocking();
+ mHandler = new Handler(Looper.getMainLooper());
+ doReturn(mMockedResources).when(mMockedContext).getResources();
+ LocalServices.removeServiceForTest(LightsManager.class);
+ LocalServices.addService(LightsManager.class, mMockedLightsManager);
+ mAdapter = new LocalDisplayAdapter(mMockedSyncRoot, mMockedContext, mHandler,
+ mListener);
+ spyOn(mAdapter);
+ doReturn(mMockedContext).when(mAdapter).getOverlayContext();
+ }
+
+ @After
+ public void tearDown() {
+ if (mMockitoSession != null) {
+ mMockitoSession.finishMocking();
+ }
+ }
+
+ /**
+ * Confirm that display is marked as private when it is listed in
+ * com.android.internal.R.array.config_localPrivateDisplayPorts.
+ */
+ @Test
+ public void testPrivateDisplay() throws Exception {
+ // needs default one always
+ final long displayId0 = 0;
+ setUpDisplay(new DisplayConfig(displayId0, createDummyDisplayInfo()));
+ final long displayId1 = 1;
+ setUpDisplay(new DisplayConfig(displayId1, createDummyDisplayInfo()));
+ final long displayId2 = 2;
+ setUpDisplay(new DisplayConfig(displayId2, createDummyDisplayInfo()));
+ updateAvailableDisplays();
+ // display 1 should be marked as private while display 2 is not.
+ doReturn(new int[]{(int) displayId1}).when(mMockedResources)
+ .getIntArray(com.android.internal.R.array.config_localPrivateDisplayPorts);
+ mAdapter.registerLocked();
+
+ waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+
+ // This should be public
+ assertDisplay(mListener.addedDisplays.get(0).getDisplayDeviceInfoLocked(), displayId0,
+ false);
+ // This should be private
+ assertDisplay(mListener.addedDisplays.get(1).getDisplayDeviceInfoLocked(), displayId1,
+ true);
+ // This should be public
+ assertDisplay(mListener.addedDisplays.get(2).getDisplayDeviceInfoLocked(), displayId2,
+ false);
+ }
+
+ /**
+ * Confirm that all local displays are public when config_localPrivateDisplayPorts is empty.
+ */
+ @Test
+ public void testPublicDisplaysForNoConfigLocalPrivateDisplayPorts() throws Exception {
+ // needs default one always
+ final long displayId0 = 0;
+ setUpDisplay(new DisplayConfig(displayId0, createDummyDisplayInfo()));
+ final long displayId1 = 1;
+ setUpDisplay(new DisplayConfig(displayId1, createDummyDisplayInfo()));
+ updateAvailableDisplays();
+ // config_localPrivateDisplayPorts is null
+ mAdapter.registerLocked();
+
+ waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+
+ // This should be public
+ assertDisplay(mListener.addedDisplays.get(0).getDisplayDeviceInfoLocked(), displayId0,
+ false);
+ // This should be public
+ assertDisplay(mListener.addedDisplays.get(1).getDisplayDeviceInfoLocked(), displayId1,
+ false);
+ }
+
+ private void assertDisplay(DisplayDeviceInfo info, long expectedPort, boolean shouldBePrivate) {
+ DisplayAddress.Physical physical = (DisplayAddress.Physical) info.address;
+ assertNotNull(physical);
+ assertEquals(expectedPort, physical.getPort());
+ assertEquals(shouldBePrivate, (info.flags & DisplayDeviceInfo.FLAG_PRIVATE) != 0);
+ }
+
+ private class DisplayConfig {
+ public final long displayId;
+ public final IBinder displayToken = new Binder();
+ public final SurfaceControl.PhysicalDisplayInfo displayInfo;
+
+ private DisplayConfig(long displayId, SurfaceControl.PhysicalDisplayInfo displayInfo) {
+ this.displayId = displayId | (0x1 << PHYSICAL_DISPLAY_ID_MODEL_SHIFT);
+ this.displayInfo = displayInfo;
+ }
+ }
+
+ private void setUpDisplay(DisplayConfig config) {
+ mDisplayIds.add(config.displayId);
+ doReturn(config.displayToken).when(
+ () -> SurfaceControl.getPhysicalDisplayToken(config.displayId));
+ doReturn(new SurfaceControl.PhysicalDisplayInfo[]{
+ config.displayInfo
+ }).when(() -> SurfaceControl.getDisplayConfigs(config.displayToken));
+ doReturn(0).when(() -> SurfaceControl.getActiveConfig(config.displayToken));
+ doReturn(0).when(() -> SurfaceControl.getActiveColorMode(config.displayToken));
+ doReturn(new int[]{
+ 0
+ }).when(() -> SurfaceControl.getDisplayColorModes(config.displayToken));
+ doReturn(new int[]{
+ 0
+ }).when(() -> SurfaceControl.getAllowedDisplayConfigs(config.displayToken));
+ }
+
+ private void updateAvailableDisplays() {
+ long[] ids = new long[mDisplayIds.size()];
+ int i = 0;
+ for (long id : mDisplayIds) {
+ ids[i] = id;
+ i++;
+ }
+ doReturn(ids).when(() -> SurfaceControl.getPhysicalDisplayIds());
+ }
+
+ private SurfaceControl.PhysicalDisplayInfo createDummyDisplayInfo() {
+ SurfaceControl.PhysicalDisplayInfo info = new SurfaceControl.PhysicalDisplayInfo();
+ info.density = 100;
+ info.xDpi = 100;
+ info.yDpi = 100;
+ info.secure = false;
+ info.width = 800;
+ info.height = 600;
+
+ return info;
+ }
+
+ private void waitForHandlerToComplete(Handler handler, long waitTimeMs)
+ throws InterruptedException {
+ final Object lock = new Object();
+ synchronized (lock) {
+ handler.post(() -> {
+ synchronized (lock) {
+ lock.notify();
+ }
+ });
+ lock.wait(waitTimeMs);
+ }
+ }
+
+ private class TestListener implements DisplayAdapter.Listener {
+ public ArrayList<DisplayDevice> addedDisplays = new ArrayList<>();
+
+ @Override
+ public void onDisplayDeviceEvent(DisplayDevice device, int event) {
+ if (event == DisplayAdapter.DISPLAY_DEVICE_EVENT_ADDED) {
+ addedDisplays.add(device);
+ }
+ }
+
+ @Override
+ public void onTraversalRequested() {
+
+ }
+ }
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
index f492d13f371f..7c30f25c6281 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
@@ -2197,4 +2197,51 @@ public class QuotaControllerTest {
assertFalse(jobStatus.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
verify(handler, never()).sendMessageDelayed(any(), anyInt());
}
+
+ /**
+ * Tests that the start alarm is properly scheduled when a job has been throttled due to the job
+ * count quota.
+ */
+ @Test
+ public void testStartAlarmScheduled_JobCount_AllowedTime() {
+ // saveTimingSession calls maybeScheduleCleanupAlarmLocked which interferes with these tests
+ // because it schedules an alarm too. Prevent it from doing so.
+ spyOn(mQuotaController);
+ doNothing().when(mQuotaController).maybeScheduleCleanupAlarmLocked();
+
+ final long start = JobSchedulerService.sElapsedRealtimeClock.millis();
+ final int standbyBucket = WORKING_INDEX;
+ setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+
+ // No sessions saved yet.
+ mQuotaController.maybeScheduleStartAlarmLocked(SOURCE_USER_ID, SOURCE_PACKAGE,
+ standbyBucket);
+ verify(mAlarmManager, never()).set(anyInt(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
+
+ // Ran jobs up to the job limit. All of them should be allowed to run.
+ for (int i = 0; i < mConstants.QUOTA_CONTROLLER_MAX_JOB_COUNT_PER_ALLOWED_TIME; ++i) {
+ JobStatus job = createJobStatus("testStartAlarmScheduled_JobCount_AllowedTime", i);
+ mQuotaController.maybeStartTrackingJobLocked(job, null);
+ assertTrue(job.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+ mQuotaController.prepareForExecutionLocked(job);
+ advanceElapsedClock(SECOND_IN_MILLIS);
+ mQuotaController.maybeStopTrackingJobLocked(job, null, false);
+ advanceElapsedClock(SECOND_IN_MILLIS);
+ }
+ // Start alarm shouldn't have been scheduled since the app was in quota up until this point.
+ verify(mAlarmManager, never()).set(anyInt(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
+
+ // The app is now out of job count quota
+ JobStatus throttledJob = createJobStatus(
+ "testStartAlarmScheduled_JobCount_AllowedTime", 42);
+ mQuotaController.maybeStartTrackingJobLocked(throttledJob, null);
+ assertFalse(throttledJob.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA));
+
+ ExecutionStats stats = mQuotaController.getExecutionStatsLocked(SOURCE_USER_ID,
+ SOURCE_PACKAGE, standbyBucket);
+ final long expectedWorkingAlarmTime =
+ stats.jobCountExpirationTimeElapsed + mConstants.QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS;
+ verify(mAlarmManager, times(1))
+ .set(anyInt(), eq(expectedWorkingAlarmTime), eq(TAG_QUOTA_CHECK), any(), any());
+ }
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfig.java b/services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfig.java
index b76682269c2e..eb90295ed8c9 100644
--- a/services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfig.java
+++ b/services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfig.java
@@ -21,9 +21,14 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSess
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyFloat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
import android.provider.DeviceConfig;
+import android.provider.DeviceConfig.Properties;
import android.util.Pair;
import com.android.dx.mockito.inline.extended.StaticMockitoSession;
@@ -32,9 +37,11 @@ import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
+import org.mockito.Mockito;
import org.mockito.quality.Strictness;
import org.mockito.stubbing.Answer;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -57,6 +64,8 @@ public final class TestableDeviceConfig implements TestRule {
private StaticMockitoSession mMockitoSession;
private Map<DeviceConfig.OnPropertyChangedListener, Pair<String, Executor>>
mOnPropertyChangedListenerMap = new HashMap<>();
+ private Map<DeviceConfig.OnPropertiesChangedListener, Pair<String, Executor>>
+ mOnPropertiesChangedListenerMap = new HashMap<>();
private Map<String, String> mKeyValueMap = new ConcurrentHashMap<>();
/**
@@ -77,6 +86,18 @@ public final class TestableDeviceConfig implements TestRule {
doAnswer((Answer<Void>) invocationOnMock -> {
String namespace = invocationOnMock.getArgument(0);
Executor executor = invocationOnMock.getArgument(1);
+ DeviceConfig.OnPropertiesChangedListener onPropertiesChangedListener =
+ invocationOnMock.getArgument(2);
+ mOnPropertiesChangedListenerMap.put(
+ onPropertiesChangedListener, new Pair<>(namespace, executor));
+ return null;
+ }).when(() -> DeviceConfig.addOnPropertiesChangedListener(
+ anyString(), any(Executor.class),
+ any(DeviceConfig.OnPropertiesChangedListener.class)));
+
+ doAnswer((Answer<Void>) invocationOnMock -> {
+ String namespace = invocationOnMock.getArgument(0);
+ Executor executor = invocationOnMock.getArgument(1);
DeviceConfig.OnPropertyChangedListener onPropertyChangedListener =
invocationOnMock.getArgument(2);
mOnPropertyChangedListenerMap.put(
@@ -91,6 +112,14 @@ public final class TestableDeviceConfig implements TestRule {
String name = invocationOnMock.getArgument(1);
String value = invocationOnMock.getArgument(2);
mKeyValueMap.put(getKey(namespace, name), value);
+ for (DeviceConfig.OnPropertiesChangedListener listener :
+ mOnPropertiesChangedListenerMap.keySet()) {
+ if (namespace.equals(mOnPropertiesChangedListenerMap.get(listener).first)) {
+ mOnPropertiesChangedListenerMap.get(listener).second.execute(
+ () -> listener.onPropertiesChanged(
+ getProperties(namespace, name, value)));
+ }
+ }
for (DeviceConfig.OnPropertyChangedListener listener :
mOnPropertyChangedListenerMap.keySet()) {
if (namespace.equals(mOnPropertyChangedListenerMap.get(listener).first)) {
@@ -114,12 +143,14 @@ public final class TestableDeviceConfig implements TestRule {
protected void succeeded(Description description) {
mMockitoSession.finishMocking();
mOnPropertyChangedListenerMap.clear();
+ mOnPropertiesChangedListenerMap.clear();
}
@Override
protected void failed(Throwable e, Description description) {
mMockitoSession.finishMocking(e);
mOnPropertyChangedListenerMap.clear();
+ mOnPropertiesChangedListenerMap.clear();
}
}.apply(base, description);
}
@@ -128,4 +159,79 @@ public final class TestableDeviceConfig implements TestRule {
return namespace + "/" + name;
}
+ private Properties getProperties(String namespace, String name, String value) {
+ Properties properties = Mockito.mock(Properties.class);
+ when(properties.getNamespace()).thenReturn(namespace);
+ when(properties.getKeyset()).thenReturn(Collections.singleton(name));
+ when(properties.getBoolean(anyString(), anyBoolean())).thenAnswer(
+ invocation -> {
+ String key = invocation.getArgument(0);
+ boolean defaultValue = invocation.getArgument(1);
+ if (name.equalsIgnoreCase(key) && value != null) {
+ return Boolean.parseBoolean(value);
+ } else {
+ return defaultValue;
+ }
+ }
+ );
+ when(properties.getFloat(anyString(), anyFloat())).thenAnswer(
+ invocation -> {
+ String key = invocation.getArgument(0);
+ float defaultValue = invocation.getArgument(1);
+ if (name.equalsIgnoreCase(key) && value != null) {
+ try {
+ return Float.parseFloat(value);
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+ );
+ when(properties.getInt(anyString(), anyInt())).thenAnswer(
+ invocation -> {
+ String key = invocation.getArgument(0);
+ int defaultValue = invocation.getArgument(1);
+ if (name.equalsIgnoreCase(key) && value != null) {
+ try {
+ return Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+ );
+ when(properties.getLong(anyString(), anyLong())).thenAnswer(
+ invocation -> {
+ String key = invocation.getArgument(0);
+ long defaultValue = invocation.getArgument(1);
+ if (name.equalsIgnoreCase(key) && value != null) {
+ try {
+ return Long.parseLong(value);
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+ );
+ when(properties.getString(anyString(), anyString())).thenAnswer(
+ invocation -> {
+ String key = invocation.getArgument(0);
+ String defaultValue = invocation.getArgument(1);
+ if (name.equalsIgnoreCase(key) && value != null) {
+ return value;
+ } else {
+ return defaultValue;
+ }
+ }
+ );
+
+ return properties;
+ }
+
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfigTest.java b/services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfigTest.java
index 39b5840f12d8..3eb72097182d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfigTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/testables/TestableDeviceConfigTest.java
@@ -16,7 +16,7 @@
package com.android.server.testables;
-import static android.provider.DeviceConfig.OnPropertyChangedListener;
+import static android.provider.DeviceConfig.OnPropertiesChangedListener;
import static com.google.common.truth.Truth.assertThat;
@@ -93,20 +93,22 @@ public class TestableDeviceConfigTest {
public void testListener() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
- OnPropertyChangedListener changeListener = (namespace, name, value) -> {
- assertThat(namespace).isEqualTo(sNamespace);
- assertThat(name).isEqualTo(sKey);
- assertThat(value).isEqualTo(sValue);
+ OnPropertiesChangedListener changeListener = (properties) -> {
+ assertThat(properties.getNamespace()).isEqualTo(sNamespace);
+ assertThat(properties.getKeyset().size()).isEqualTo(1);
+ assertThat(properties.getKeyset()).contains(sKey);
+ assertThat(properties.getString(sKey, "bogus_value")).isEqualTo(sValue);
+ assertThat(properties.getString("bogus_key", "bogus_value")).isEqualTo("bogus_value");
countDownLatch.countDown();
};
try {
- DeviceConfig.addOnPropertyChangedListener(sNamespace,
+ DeviceConfig.addOnPropertiesChangedListener(sNamespace,
ActivityThread.currentApplication().getMainExecutor(), changeListener);
DeviceConfig.setProperty(sNamespace, sKey, sValue, false);
assertThat(countDownLatch.await(
WAIT_FOR_PROPERTY_CHANGE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)).isTrue();
} finally {
- DeviceConfig.removeOnPropertyChangedListener(changeListener);
+ DeviceConfig.removeOnPropertiesChangedListener(changeListener);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java b/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
new file mode 100644
index 000000000000..d3bcff528155
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.am;
+
+import static android.testing.DexmakerShareClassLoaderRule.runWithDexmakerShareClassLoader;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+
+import android.app.ActivityManager;
+import android.app.usage.UsageStatsManagerInternal;
+import android.content.Context;
+
+import com.android.server.LocalServices;
+import com.android.server.wm.ActivityTaskManagerService;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Test class for {@link OomAdjuster}.
+ *
+ * Build/Install/Run:
+ * atest FrameworksServicesTests:OomAdjusterTests
+ */
+public class OomAdjusterTests {
+ private static Context sContext;
+ private static ActivityManagerService sService;
+
+ private ProcessRecord mProcessRecord;
+
+ private static final long ZERO = 0L;
+ private static final long USAGE_STATS_INTERACTION = 2 * 60 * 60 * 1000L;
+ private static final long SERVICE_USAGE_INTERACTION = 30 * 60 * 1000;
+
+ @BeforeClass
+ public static void setUpOnce() {
+ sContext = getInstrumentation().getTargetContext();
+
+ // We need to run with dexmaker share class loader to make use of
+ // ActivityTaskManagerService from wm package.
+ runWithDexmakerShareClassLoader(() -> {
+ sService = mock(ActivityManagerService.class);
+ sService.mActivityTaskManager = new ActivityTaskManagerService(sContext);
+ sService.mActivityTaskManager.initialize(null, null, sContext.getMainLooper());
+ sService.mAtmInternal = sService.mActivityTaskManager.getAtmInternal();
+
+ sService.mConstants = new ActivityManagerConstants(sContext, sService,
+ sContext.getMainThreadHandler());
+ sService.mOomAdjuster = new OomAdjuster(sService, sService.mProcessList, null);
+ LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
+ LocalServices.addService(UsageStatsManagerInternal.class,
+ mock(UsageStatsManagerInternal.class));
+ sService.mUsageStatsService = LocalServices.getService(UsageStatsManagerInternal.class);
+ });
+ }
+
+ @Before
+ public void setUpProcess() {
+ // Need to run with dexmaker share class loader to mock package private class.
+ runWithDexmakerShareClassLoader(() -> {
+ mProcessRecord = spy(new ProcessRecord(sService, sContext.getApplicationInfo(),
+ "name", 12345));
+ });
+
+ // Ensure certain services and constants are defined properly
+ assertNotNull(sService.mUsageStatsService);
+ assertEquals(USAGE_STATS_INTERACTION, sService.mConstants.USAGE_STATS_INTERACTION_INTERVAL);
+ assertEquals(SERVICE_USAGE_INTERACTION, sService.mConstants.SERVICE_USAGE_INTERACTION_TIME);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStatePersistentUI() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT_UI);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, true, elapsedTime);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateTop() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_TOP);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, true, elapsedTime);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateTop_PreviousInteraction() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_TOP);
+ mProcessRecord.reportedInteraction = true;
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, true, ZERO);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateTop_PastUsageInterval() {
+ final long elapsedTime = 3 * USAGE_STATS_INTERACTION;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_TOP);
+ mProcessRecord.reportedInteraction = true;
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, true, elapsedTime);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateBoundTop() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_BOUND_TOP);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, true, elapsedTime);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateFGS() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(elapsedTime, false, ZERO);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateFGS_ShortInteraction() {
+ final long elapsedTime = ZERO;
+ final long fgInteractionTime = 1000L;
+ mProcessRecord.setFgInteractionTime(fgInteractionTime);
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(fgInteractionTime, false, ZERO);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateFGS_LongInteraction() {
+ final long elapsedTime = 2 * SERVICE_USAGE_INTERACTION;
+ final long fgInteractionTime = 1000L;
+ mProcessRecord.setFgInteractionTime(fgInteractionTime);
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(fgInteractionTime, true, elapsedTime);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateFGS_PreviousLongInteraction() {
+ final long elapsedTime = 2 * SERVICE_USAGE_INTERACTION;
+ final long fgInteractionTime = 1000L;
+ mProcessRecord.setFgInteractionTime(fgInteractionTime);
+ mProcessRecord.reportedInteraction = true;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(fgInteractionTime, true, ZERO);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateFGSLocation() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(elapsedTime, false, ZERO);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateBFGS() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, true, elapsedTime);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateImportantFG() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, true, elapsedTime);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateImportantFG_PreviousInteraction() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
+ mProcessRecord.reportedInteraction = true;
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, true, ZERO);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateImportantFG_PastUsageInterval() {
+ final long elapsedTime = 3 * USAGE_STATS_INTERACTION;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
+ mProcessRecord.reportedInteraction = true;
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, true, elapsedTime);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateImportantBG() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, false, ZERO);
+ }
+
+ @Test
+ public void testMaybeUpdateUsageStats_ProcStateService() {
+ final long elapsedTime = ZERO;
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_SERVICE);
+ sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
+
+ assertProcessRecordState(ZERO, false, ZERO);
+ }
+
+ private void assertProcessRecordState(long fgInteractionTime, boolean reportedInteraction,
+ long interactionEventTime) {
+ assertEquals("Foreground interaction time was not updated correctly.",
+ fgInteractionTime, mProcessRecord.getFgInteractionTime());
+ assertEquals("Interaction was not updated correctly.",
+ reportedInteraction, mProcessRecord.reportedInteraction);
+ assertEquals("Interaction event time was not updated correctly.",
+ interactionEventTime, mProcessRecord.getInteractionEventTime());
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java b/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
index dbdb41bc71b1..1ae1fa65ddf2 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
@@ -65,17 +65,13 @@ public class FakeStorageManager {
listener.onStarted(userId, null);
listener.onFinished(userId, null);
ArrayList<Pair<byte[], byte[]>> auths = getUserAuth(userId);
- if (secret != null) {
- if (auths.size() > 1) {
- throw new AssertionFailedError("More than one secret exists");
- }
- Pair<byte[], byte[]> auth = auths.get(0);
- if ((!mIgnoreBadUnlock) && auth.second != null && !Arrays.equals(secret, auth.second)) {
- throw new AssertionFailedError("Invalid secret to unlock user");
- }
- } else {
- if (auths != null && auths.size() > 0) {
- throw new AssertionFailedError("Cannot unlock encrypted user with empty token");
+ if (auths.size() > 1) {
+ throw new AssertionFailedError("More than one secret exists");
+ }
+ Pair<byte[], byte[]> auth = auths.get(0);
+ if (!Arrays.equals(secret, auth.second)) {
+ if (!mIgnoreBadUnlock) {
+ throw new AssertionFailedError("Invalid secret to unlock user " + userId);
}
}
}
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 34bb0a89227a..cbca087872d9 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -5154,4 +5154,41 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
assertEquals(1, notifsAfter.length);
assertEquals((notifsAfter[0].getNotification().flags & FLAG_BUBBLE), 0);
}
+
+ @Test
+ public void testNotificationBubbles_disabled_lowRamDevice() throws Exception {
+ // Bubbles are allowed!
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.areBubblesAllowed(anyString(), anyInt())).thenReturn(true);
+ when(mPreferencesHelper.getNotificationChannel(
+ anyString(), anyInt(), anyString(), anyBoolean())).thenReturn(
+ mTestNotificationChannel);
+ when(mPreferencesHelper.getImportance(anyString(), anyInt())).thenReturn(
+ mTestNotificationChannel.getImportance());
+
+ // Plain notification that has bubble metadata
+ NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel,
+ null /* tvExtender */, true /* isBubble */);
+ mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag",
+ nr.sbn.getId(), nr.sbn.getNotification(), nr.sbn.getUserId());
+ waitForIdle();
+
+ // Would be a normal notification because wouldn't have met requirements to bubble
+ StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+ assertEquals(1, notifsBefore.length);
+ assertEquals((notifsBefore[0].getNotification().flags & FLAG_BUBBLE), 0);
+
+ // Make the package foreground so that we're allowed to be a bubble
+ when(mActivityManager.getPackageImportance(nr.sbn.getPackageName())).thenReturn(
+ IMPORTANCE_FOREGROUND);
+
+ // And we are low ram
+ when(mActivityManager.isLowRamDevice()).thenReturn(true);
+
+ // We wouldn't be a bubble because the notification didn't meet requirements (low ram)
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ assertEquals(1, notifsAfter.length);
+ assertEquals((notifsAfter[0].getNotification().flags & FLAG_BUBBLE), 0);
+
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
index 94def2bb7846..6d27e6d0852c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
@@ -31,6 +31,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.server.wm.ActivityDisplay.POSITION_TOP;
@@ -55,6 +56,7 @@ import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.util.Pair;
@@ -468,6 +470,48 @@ public class RootActivityContainerTests extends ActivityTestsBase {
}
/**
+ * Tests that secondary home activity should not be resolved if device is still locked.
+ */
+ @Test
+ public void testStartSecondaryHomeOnDisplayWithUserKeyLocked() {
+ // Create secondary displays.
+ final TestActivityDisplay secondDisplay = spy(createNewActivityDisplay());
+ mRootActivityContainer.addChild(secondDisplay, POSITION_TOP);
+
+ doReturn(true).when(secondDisplay).supportsSystemDecorations();
+ // Use invalid user id to let StorageManager.isUserKeyUnlocked() return false.
+ final int currentUser = mRootActivityContainer.mCurrentUser;
+ mRootActivityContainer.mCurrentUser = -1;
+
+ mRootActivityContainer.startHomeOnDisplay(0 /* userId */, "testStartSecondaryHome",
+ secondDisplay.mDisplayId, true /* allowInstrumenting */, true /* fromHomeKey */);
+
+ try {
+ verify(mRootActivityContainer, never()).resolveSecondaryHomeActivity(anyInt(),
+ anyInt());
+ } finally {
+ mRootActivityContainer.mCurrentUser = currentUser;
+ }
+ }
+
+ /**
+ * Tests that secondary home activity should not be resolved if display does not support system
+ * decorations.
+ */
+ @Test
+ public void testStartSecondaryHomeOnDisplayWithoutSysDecorations() {
+ // Create secondary displays.
+ final TestActivityDisplay secondDisplay = spy(createNewActivityDisplay());
+ mRootActivityContainer.addChild(secondDisplay, POSITION_TOP);
+ doReturn(false).when(secondDisplay).supportsSystemDecorations();
+
+ mRootActivityContainer.startHomeOnDisplay(0 /* userId */, "testStartSecondaryHome",
+ secondDisplay.mDisplayId, true /* allowInstrumenting */, true /* fromHomeKey */);
+
+ verify(mRootActivityContainer, never()).resolveSecondaryHomeActivity(anyInt(), anyInt());
+ }
+
+ /**
* Tests that secondary home should be selected if default home not set.
*/
@Test
@@ -495,6 +539,71 @@ public class RootActivityContainerTests extends ActivityTestsBase {
}
/**
+ * Tests that the default secondary home activity is always picked when it is in forced by
+ * config_useSystemProvidedLauncherForSecondary.
+ */
+ @Test
+ public void testResolveSecondaryHomeActivityForced() {
+ Resources resources = mContext.getResources();
+ spyOn(resources);
+ final String defaultSecondaryHome =
+ "com.android.test/com.android.test.TestDefaultSecondaryHome";
+ final ComponentName secondaryComp = ComponentName.unflattenFromString(defaultSecondaryHome);
+ doReturn(defaultSecondaryHome).when(resources).getString(
+ com.android.internal.R.string.config_secondaryHomeComponent);
+ doReturn(true).when(resources).getBoolean(
+ com.android.internal.R.bool.config_useSystemProvidedLauncherForSecondary);
+
+ final Intent secondaryHomeIntent = mService.getSecondaryHomeIntent(null);
+ assertEquals(secondaryComp, secondaryHomeIntent.getComponent());
+
+ final ActivityInfo aInfoSecondary = new ActivityInfo();
+ aInfoSecondary.name = secondaryComp.getClassName();
+ aInfoSecondary.applicationInfo = new ApplicationInfo();
+ aInfoSecondary.applicationInfo.packageName = secondaryComp.getPackageName();
+ doReturn(aInfoSecondary).when(mRootActivityContainer).resolveHomeActivity(anyInt(),
+ refEq(secondaryHomeIntent));
+
+ final Intent homeIntent = mService.getHomeIntent();
+ final ActivityInfo aInfoDefault = new ActivityInfo();
+ aInfoDefault.name = "fakeHomeActivity";
+ aInfoDefault.applicationInfo = new ApplicationInfo();
+ aInfoDefault.applicationInfo.packageName = "fakeHomePackage";
+ doReturn(aInfoDefault).when(mRootActivityContainer).resolveHomeActivity(anyInt(),
+ refEq(homeIntent));
+
+ // Let resolveActivities call to validate both main launcher and second launcher so that
+ // resolveActivities call does not work as enabler for secondary.
+ final List<ResolveInfo> resolutions1 = new ArrayList<>();
+ final ResolveInfo resolveInfo1 = new ResolveInfo();
+ resolveInfo1.activityInfo = new ActivityInfo();
+ resolveInfo1.activityInfo.name = aInfoDefault.name;
+ resolveInfo1.activityInfo.applicationInfo = aInfoDefault.applicationInfo;
+ resolutions1.add(resolveInfo1);
+ doReturn(resolutions1).when(mRootActivityContainer).resolveActivities(anyInt(),
+ refEq(homeIntent));
+ final List<ResolveInfo> resolutions2 = new ArrayList<>();
+ final ResolveInfo resolveInfo2 = new ResolveInfo();
+ resolveInfo2.activityInfo = new ActivityInfo();
+ resolveInfo2.activityInfo.name = aInfoSecondary.name;
+ resolveInfo2.activityInfo.applicationInfo = aInfoSecondary.applicationInfo;
+ resolutions2.add(resolveInfo2);
+ doReturn(resolutions2).when(mRootActivityContainer).resolveActivities(anyInt(),
+ refEq(secondaryHomeIntent));
+
+ doReturn(true).when(mRootActivityContainer).canStartHomeOnDisplay(
+ any(), anyInt(), anyBoolean());
+
+ final Pair<ActivityInfo, Intent> resolvedInfo = mRootActivityContainer
+ .resolveSecondaryHomeActivity(0 /* userId */, 1 /* displayId */);
+
+ assertEquals(secondaryComp.getClassName(), resolvedInfo.first.name);
+ assertEquals(secondaryComp.getPackageName(),
+ resolvedInfo.first.applicationInfo.packageName);
+ assertEquals(aInfoSecondary.name, resolvedInfo.first.name);
+ }
+
+ /**
* Tests that secondary home should be selected if default home not support secondary displays
* or there is no matched activity in the same package as selected default home.
*/
diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
index 030c3f495d0f..dd9b2421a333 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
@@ -224,4 +224,11 @@ public interface TelephonyProperties
*/
static final String PROPERTY_VIDEOCALL_AUDIO_OUTPUT = "persist.radio.call.audio.output";
+ /** 'true' if the carrier text from opportunistic subscription should be used to display
+ * on UI.
+ *
+ */
+ String DISPLAY_OPPORTUNISTIC_SUBSCRIPTION_CARRIER_TEXT_PROPERTY_NAME =
+ "persist.radio.display_opportunistic_carrier";
+
}
diff --git a/tests/net/Android.bp b/tests/net/Android.bp
index 689abed19ac4..1fbb6580c389 100644
--- a/tests/net/Android.bp
+++ b/tests/net/Android.bp
@@ -6,6 +6,7 @@ java_defaults {
static_libs: [
"FrameworksNetCommonTests",
"frameworks-base-testutils",
+ "frameworks-net-testutils",
"framework-protos",
"androidx.test.rules",
"mockito-target-minus-junit4",
diff --git a/tests/net/common/Android.bp b/tests/net/common/Android.bp
index 0a1ac75aac80..9ee58583779d 100644
--- a/tests/net/common/Android.bp
+++ b/tests/net/common/Android.bp
@@ -21,6 +21,7 @@ java_library {
srcs: ["java/**/*.java"],
static_libs: [
"androidx.test.rules",
+ "frameworks-net-testutils",
"junit",
],
libs: [
diff --git a/tests/net/java/android/net/LinkAddressTest.java b/tests/net/common/java/android/net/LinkAddressTest.java
index d462441b22fa..d462441b22fa 100644
--- a/tests/net/java/android/net/LinkAddressTest.java
+++ b/tests/net/common/java/android/net/LinkAddressTest.java
diff --git a/tests/net/java/android/net/LinkPropertiesTest.java b/tests/net/common/java/android/net/LinkPropertiesTest.java
index 417729150be8..417729150be8 100644
--- a/tests/net/java/android/net/LinkPropertiesTest.java
+++ b/tests/net/common/java/android/net/LinkPropertiesTest.java
diff --git a/tests/net/java/android/net/NetworkCapabilitiesTest.java b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java
index ad76388b3c9b..ad76388b3c9b 100644
--- a/tests/net/java/android/net/NetworkCapabilitiesTest.java
+++ b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java
diff --git a/tests/net/java/android/net/NetworkTest.java b/tests/net/common/java/android/net/NetworkTest.java
index 0bee7cd29d29..0bee7cd29d29 100644
--- a/tests/net/java/android/net/NetworkTest.java
+++ b/tests/net/common/java/android/net/NetworkTest.java
diff --git a/tests/net/java/android/net/RouteInfoTest.java b/tests/net/common/java/android/net/RouteInfoTest.java
index 2edbd403b5b5..2edbd403b5b5 100644
--- a/tests/net/java/android/net/RouteInfoTest.java
+++ b/tests/net/common/java/android/net/RouteInfoTest.java
diff --git a/tests/net/java/android/net/StaticIpConfigurationTest.java b/tests/net/common/java/android/net/StaticIpConfigurationTest.java
index 8449ca76d580..8449ca76d580 100644
--- a/tests/net/java/android/net/StaticIpConfigurationTest.java
+++ b/tests/net/common/java/android/net/StaticIpConfigurationTest.java
diff --git a/tests/net/java/android/net/apf/ApfCapabilitiesTest.java b/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java
index 75752c33da5c..7238895b3657 100644
--- a/tests/net/java/android/net/apf/ApfCapabilitiesTest.java
+++ b/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java
@@ -19,11 +19,10 @@ package android.net.apf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
-import android.net.shared.ParcelableTestUtil;
-
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.internal.util.ParcelableTestUtil;
import com.android.internal.util.TestUtils;
import org.junit.Test;
diff --git a/tests/net/java/android/net/shared/InitialConfigurationTest.java b/tests/net/java/android/net/shared/InitialConfigurationTest.java
index 27bc13d75440..2fb8b19abcd4 100644
--- a/tests/net/java/android/net/shared/InitialConfigurationTest.java
+++ b/tests/net/java/android/net/shared/InitialConfigurationTest.java
@@ -17,7 +17,8 @@
package android.net.shared;
import static android.net.InetAddresses.parseNumericAddress;
-import static android.net.shared.ParcelableTestUtil.assertFieldCountEquals;
+
+import static com.android.internal.util.ParcelableTestUtil.assertFieldCountEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
diff --git a/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java b/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java
index 21a4988950db..f9dbdc7fbf3e 100644
--- a/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java
+++ b/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java
@@ -19,7 +19,8 @@ package android.net.shared;
import static android.net.InetAddresses.parseNumericAddress;
import static android.net.shared.IpConfigurationParcelableUtil.fromStableParcelable;
import static android.net.shared.IpConfigurationParcelableUtil.toStableParcelable;
-import static android.net.shared.ParcelableTestUtil.assertFieldCountEquals;
+
+import static com.android.internal.util.ParcelableTestUtil.assertFieldCountEquals;
import static org.junit.Assert.assertEquals;
@@ -54,9 +55,10 @@ public class IpConfigurationParcelableUtilTest {
mDhcpResults.serverAddress = (Inet4Address) parseNumericAddress("192.168.44.44");
mDhcpResults.vendorInfo = "TEST_VENDOR_INFO";
mDhcpResults.leaseDuration = 3600;
+ mDhcpResults.serverHostName = "dhcp.example.com";
mDhcpResults.mtu = 1450;
// Any added DhcpResults field must be included in equals() to be tested properly
- assertFieldCountEquals(8, DhcpResults.class);
+ assertFieldCountEquals(9, DhcpResults.class);
}
@Test
@@ -100,6 +102,12 @@ public class IpConfigurationParcelableUtilTest {
doDhcpResultsParcelUnparcelTest();
}
+ @Test
+ public void testParcelUnparcelDhcpResults_NullServerHostName() {
+ mDhcpResults.serverHostName = null;
+ doDhcpResultsParcelUnparcelTest();
+ }
+
private void doDhcpResultsParcelUnparcelTest() {
final DhcpResults unparceled = fromStableParcelable(toStableParcelable(mDhcpResults));
assertEquals(mDhcpResults, unparceled);
diff --git a/tests/net/java/android/net/shared/ProvisioningConfigurationTest.java b/tests/net/java/android/net/shared/ProvisioningConfigurationTest.java
index 6fad89ec50b2..382afe0279be 100644
--- a/tests/net/java/android/net/shared/ProvisioningConfigurationTest.java
+++ b/tests/net/java/android/net/shared/ProvisioningConfigurationTest.java
@@ -17,9 +17,10 @@
package android.net.shared;
import static android.net.InetAddresses.parseNumericAddress;
-import static android.net.shared.ParcelableTestUtil.assertFieldCountEquals;
import static android.net.shared.ProvisioningConfiguration.fromStableParcelable;
+import static com.android.internal.util.ParcelableTestUtil.assertFieldCountEquals;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 16ec134794d1..c15775fc4734 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -4894,7 +4894,10 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.sendLinkProperties(cellLp);
mCellNetworkAgent.connect(false);
waitForIdle();
- // CS tells netd about the empty DNS config for this network.
+
+ verify(mMockDnsResolver, times(1)).createNetworkCache(
+ eq(mCellNetworkAgent.getNetwork().netId));
+ // CS tells dnsresolver about the empty DNS config for this network.
verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(any());
reset(mMockDnsResolver);
@@ -4978,6 +4981,8 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.sendLinkProperties(cellLp);
mCellNetworkAgent.connect(false);
waitForIdle();
+ verify(mMockDnsResolver, times(1)).createNetworkCache(
+ eq(mCellNetworkAgent.getNetwork().netId));
verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
mResolverParamsParcelCaptor.capture());
ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue();
@@ -5851,12 +5856,17 @@ public class ConnectivityServiceTest {
cellLp.addRoute(new RouteInfo(myIpv6, null, MOBILE_IFNAME));
reset(mNetworkManagementService);
reset(mMockDnsResolver);
+ reset(mMockNetd);
when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME))
.thenReturn(getClatInterfaceConfig(myIpv4));
// Connect with ipv6 link properties. Expect prefix discovery to be started.
mCellNetworkAgent.sendLinkProperties(cellLp);
mCellNetworkAgent.connect(true);
+
+ verify(mMockNetd, times(1)).networkCreatePhysical(eq(cellNetId), anyInt());
+ verify(mMockDnsResolver, times(1)).createNetworkCache(eq(cellNetId));
+
networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId);
@@ -6048,7 +6058,7 @@ public class ConnectivityServiceTest {
verify(mNetworkManagementService, times(0)).removeIdleTimer(eq(MOBILE_IFNAME));
verify(mMockNetd, times(1)).networkDestroy(eq(mCellNetworkAgent.getNetwork().netId));
verify(mMockDnsResolver, times(1))
- .clearResolverConfiguration(eq(mCellNetworkAgent.getNetwork().netId));
+ .destroyNetworkCache(eq(mCellNetworkAgent.getNetwork().netId));
// Disconnect wifi
ConditionVariable cv = waitForConnectivityBroadcasts(1);
diff --git a/tests/net/util/Android.bp b/tests/net/util/Android.bp
new file mode 100644
index 000000000000..d8c502d46871
--- /dev/null
+++ b/tests/net/util/Android.bp
@@ -0,0 +1,30 @@
+//
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// Common utilities for network tests.
+java_library {
+ name: "frameworks-net-testutils",
+ srcs: ["java/**/*.java"],
+ // test_current to be also appropriate for CTS tests
+ sdk_version: "test_current",
+ static_libs: [
+ "androidx.annotation_annotation",
+ "junit",
+ ],
+ libs: [
+ "android.test.base.stubs",
+ ],
+} \ No newline at end of file
diff --git a/tests/net/java/android/net/shared/ParcelableTestUtil.java b/tests/net/util/java/com/android/internal/util/ParcelableTestUtil.java
index 088ea3c1d1ed..87537b93887b 100644
--- a/tests/net/java/android/net/shared/ParcelableTestUtil.java
+++ b/tests/net/util/java/com/android/internal/util/ParcelableTestUtil.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.net.shared;
+package com.android.internal.util;
import static org.junit.Assert.assertEquals;
diff --git a/tests/net/java/com/android/internal/util/TestUtils.java b/tests/net/util/java/com/android/internal/util/TestUtils.java
index 57cc1723835c..75329a805606 100644
--- a/tests/net/java/com/android/internal/util/TestUtils.java
+++ b/tests/net/util/java/com/android/internal/util/TestUtils.java
@@ -19,7 +19,6 @@ package com.android.internal.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
-import android.annotation.NonNull;
import android.os.ConditionVariable;
import android.os.Handler;
import android.os.HandlerThread;
@@ -27,6 +26,8 @@ import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
+import androidx.annotation.NonNull;
+
import java.util.concurrent.Executor;
public final class TestUtils {
@@ -36,7 +37,7 @@ public final class TestUtils {
* Block until the given Handler thread becomes idle, or until timeoutMs has passed.
*/
public static void waitForIdleHandler(HandlerThread handlerThread, long timeoutMs) {
- waitForIdleHandler(handlerThread.getThreadHandler(), timeoutMs);
+ waitForIdleLooper(handlerThread.getLooper(), timeoutMs);
}
/**
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index fe401e22c50e..45cea8190844 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -693,7 +693,7 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser,
// If the resource type was not recognized, write the error and return false.
diag_->Error(DiagMessage(out_resource->source)
- << "unknown resource type '" << parser->element_name() << "'");
+ << "unknown resource type '" << resource_type << "'");
return false;
}
@@ -1712,7 +1712,14 @@ bool ResourceParser::ParseDeclareStyleable(xml::XmlPullParser* parser,
child_ref.SetSource(item_source);
styleable->entries.push_back(std::move(child_ref));
- out_resource->child_resources.push_back(std::move(child_resource));
+ // Do not add referenced attributes that do not define a format to the table.
+ CHECK(child_resource.value != nullptr);
+ Attribute* attr = ValueCast<Attribute>(child_resource.value.get());
+
+ CHECK(attr != nullptr);
+ if (attr->type_mask != android::ResTable_map::TYPE_ANY) {
+ out_resource->child_resources.push_back(std::move(child_resource));
+ }
} else if (!ShouldIgnoreElement(element_namespace, element_name)) {
diag_->Error(DiagMessage(item_source) << "unknown tag <"
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index 7c8b6d054cd5..464225fefb85 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -341,7 +341,7 @@ TEST_F(ResourceParserTest, ParseAttrAndDeclareStyleableUnderConfigButRecordAsNoC
std::string input = R"(
<attr name="foo" />
<declare-styleable name="bar">
- <attr name="baz" />
+ <attr name="baz" format="reference"/>
</declare-styleable>)";
ASSERT_TRUE(TestParse(input, watch_config));
@@ -589,8 +589,7 @@ TEST_F(ResourceParserTest, ParseAttributesDeclareStyleable) {
EXPECT_THAT(result.value().entry->visibility.level, Eq(Visibility::Level::kPublic));
Attribute* attr = test::GetValue<Attribute>(&table_, "attr/bar");
- ASSERT_THAT(attr, NotNull());
- EXPECT_TRUE(attr->IsWeak());
+ ASSERT_THAT(attr, IsNull());
attr = test::GetValue<Attribute>(&table_, "attr/bat");
ASSERT_THAT(attr, NotNull());