[automerger skipped] Import translations. DO NOT MERGE ANYWHERE am: 41993d1837 -s ours am: 715ccb8c06 -s ours
am skip reason: subject contains skip directive
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Car/Settings/+/16632030
Change-Id: Icd015ef62efd7203193e8efd65c1c49c322df485
diff --git a/Android.bp b/Android.bp
index f52fe2c..5e4cf90 100644
--- a/Android.bp
+++ b/Android.bp
@@ -16,9 +16,8 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
-android_app {
- name: "CarSettings",
- overrides: ["Settings"],
+android_library {
+ name: "CarSettings-core",
platform_apis: true,
defaults: [
"SettingsLibDefaults",
@@ -27,10 +26,6 @@
srcs: ["src/**/*.java"],
- libs: [
- "android.car",
- ],
-
static_libs: [
"androidx.lifecycle_lifecycle-common-java8",
"androidx.lifecycle_lifecycle-extensions",
@@ -46,6 +41,24 @@
"jsr305",
"car-ui-lib",
"car-admin-ui-lib",
+ "car-qc-lib",
+ ],
+
+ libs: [
+ "android.car",
+ ],
+
+ manifest: "AndroidManifest.xml",
+ resource_dirs: ["res"],
+}
+
+android_app {
+ name: "CarSettings",
+ overrides: ["Settings"],
+ platform_apis: true,
+
+ static_libs: [
+ "CarSettings-core",
],
certificate: "platform",
@@ -101,6 +114,7 @@
"jsr305",
"car-ui-lib-testing-support",
"car-admin-ui-lib",
+ "car-qc-lib",
],
// Testing only resources must be applied last so they take precedence.
@@ -160,6 +174,7 @@
"jsr305",
"car-ui-lib-testing-support",
"car-admin-ui-lib",
+ "car-qc-lib",
],
// Testing only resources must be applied last so they take precedence.
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 16bef70..14394e1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -83,10 +83,6 @@
android:finishOnTaskLaunch="true"
android:windowSoftInputMode="adjustPan"
android:exported="true">
- <intent-filter android:priority="1">
- <action android:name="android.settings.NIGHT_DISPLAY_SETTINGS" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
<meta-data android:name="com.android.car.settings.SINGLE_PANE" android:value="true"/>
<meta-data android:name="distractionOptimized" android:value="true"/>
</activity>
@@ -360,6 +356,8 @@
<intent-filter android:priority="100">
<action android:name="android.settings.DATA_ROAMING_SETTINGS" />
<action android:name="android.settings.NETWORK_OPERATOR_SETTINGS" />
+ <action android:name="android.settings.DATA_USAGE_SETTINGS" />
+ <action android:name="android.settings.MOBILE_DATA_USAGE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="com.android.car.settings.TOP_LEVEL_HEADER_KEY"
@@ -377,20 +375,6 @@
</activity>
<activity
- android:name=".common.CarSettingActivities$DataUsageActivity"
- android:windowSoftInputMode="adjustPan"
- android:exported="true">
- <intent-filter android:priority="100">
- <action android:name="android.settings.DATA_USAGE_SETTINGS" />
- <action android:name="android.settings.MOBILE_DATA_USAGE" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <meta-data android:name="com.android.car.settings.TOP_LEVEL_HEADER_KEY"
- android:value="@string/hk_DataUsageActivity" />
- <meta-data android:name="distractionOptimized" android:value="true"/>
- </activity>
-
- <activity
android:name=".common.CarSettingActivities$ApplicationsSettingsActivity"
android:windowSoftInputMode="adjustPan"
android:exported="true">
@@ -794,7 +778,7 @@
<activity
android:name=".security.ChooseLockPasswordActivity"
- android:windowSoftInputMode="adjustPan"
+ android:windowSoftInputMode="adjustResize"
android:noHistory="true"
android:exported="false">
<meta-data android:name="com.android.car.settings.SINGLE_PANE" android:value="true"/>
@@ -910,6 +894,23 @@
</intent-filter>
</activity>
+ <activity
+ android:name=".enterprise.EnterprisePrivacySettingsActivity"
+ android:exported="true">
+ <meta-data android:name="com.android.car.settings.SINGLE_PANE" android:value="true"/>
+ <meta-data android:name="distractionOptimized" android:value="true"/>
+ <intent-filter>
+ <action android:name="android.settings.ENTERPRISE_PRIVACY_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".notifications.NotificationAccessConfirmationActivity"
+ android:exported="true"
+ android:taskAffinity="com.android.car.settings.notifications.NotificationAccessConfirmationActivity"
+ android:theme="@style/ActionDialogTheme"
+ />
+
<activity android:name=".enterprise.ActionDisabledByAdminActivity"
android:theme="@style/ActionDialogTheme"
android:taskAffinity=".enterprise"
@@ -921,6 +922,34 @@
</intent-filter>
</activity>
+ <activity
+ android:name=".common.CarSettingActivities$AccessibilityActivity"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:windowSoftInputMode="adjustResize"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.settings.ACCESSIBILITY_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data android:name="com.android.car.settings.TOP_LEVEL_HEADER_KEY"
+ android:value="@string/hk_AccessibilitySettingsActivity" />
+ <meta-data android:name="distractionOptimized" android:value="true"/>
+ </activity>
+
+ <activity
+ android:name=".common.CarSettingActivities$CaptionsActivity"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:windowSoftInputMode="adjustPan"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.settings.CAPTIONING_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data android:name="com.android.car.settings.TOP_LEVEL_HEADER_KEY"
+ android:value="@string/hk_CaptionsSettingsActivity" />
+ <meta-data android:name="distractionOptimized" android:value="true"/>
+ </activity>
+
<service android:name=".bluetooth.BluetoothPairingService" />
<service android:name=".setupservice.InitialLockSetupService"
@@ -963,5 +992,18 @@
</intent-filter>
</provider>
+ <provider android:name=".qc.SettingsQCProvider"
+ android:authorities="com.android.car.settings.qc"
+ android:grantUriPermissions="true"
+ android:exported="true">
+ </provider>
+
+ <!-- For security purposes, only intents created by the CarSettings application should be
+ able to call this receiver. Therefore, it should not be exported. -->
+ <receiver
+ android:name=".qc.SettingsQCBroadcastReceiver"
+ android:exported="false">
+ </receiver>
+
</application>
</manifest>
diff --git a/res/color/top_level_accessibility_background.xml b/res/color/top_level_accessibility_background.xml
new file mode 100644
index 0000000..76eb8c1
--- /dev/null
+++ b/res/color/top_level_accessibility_background.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <item android:state_enabled="false"
+ android:alpha="?android:attr/disabledAlpha"
+ android:color="#5011C1"/>
+ <item app:state_ux_restricted="true"
+ android:alpha="?android:attr/disabledAlpha"
+ android:color="#5011C1"/>
+ <item android:color="#5011C1"/>
+</selector>
\ No newline at end of file
diff --git a/res/color/white_disabled.xml b/res/color/white_disabled.xml
new file mode 100644
index 0000000..85215fd
--- /dev/null
+++ b/res/color/white_disabled.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@*android:color/white"
+ android:alpha="?android:attr/disabledAlpha" />
+</selector>
diff --git a/res/drawable/car_ic_navigation.xml b/res/drawable/car_ic_navigation.xml
index 0a6fa2e..1a90e35 100644
--- a/res/drawable/car_ic_navigation.xml
+++ b/res/drawable/car_ic_navigation.xml
@@ -15,11 +15,11 @@
~ limitations under the License
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:viewportWidth="44.0"
- android:viewportHeight="44.0"
- android:width="@dimen/icon_size"
- android:height="@dimen/icon_size">
- <path
- android:pathData="M39.8016667 20.6983333L23.3016667 4.19833333C22.5866667 3.48333333 21.4316667 3.48333333 20.7166667 4.19833333L4.21666667 20.6983333C3.50166667 21.4133333 3.50166667 22.5683333 4.21666667 23.2833333L20.7166667 39.7833333C21.4316667 40.4983333 22.5866667 40.4983333 23.3016667 39.7833333L39.8016667 23.2833333C40.5166667 22.5866667 40.5166667 21.4316667 39.8016667 20.6983333ZM25.6666667 26.5833333L25.6666667 22L18.3333333 22L18.3333333 27.5L14.6666667 27.5L14.6666667 20.1666667C14.6666667 19.1583333 15.4916667 18.3333333 16.5 18.3333333L25.6666667 18.3333333L25.6666667 13.75L32.0833333 20.1666667L25.6666667 26.5833333Z"
- android:fillColor="?attr/iconColor" />
-</vector>
\ No newline at end of file
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size">
+ <path
+ android:pathData="M12,2L4,20l1,1l7,-3l7,3l1,-1L12,2z"
+ android:fillColor="@color/icon_color_default"/>
+</vector>
diff --git a/res/drawable/car_ic_navigation_mute.xml b/res/drawable/car_ic_navigation_mute.xml
new file mode 100644
index 0000000..7dcf9ca
--- /dev/null
+++ b/res/drawable/car_ic_navigation_mute.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size">
+ <path
+ android:pathData="M8.923,8.9233L4,20L5,21L12,18L19,21L19.9998,20.0002L8.923,8.9233Z"
+ android:fillColor="@color/icon_color_default"/>
+ <path
+ android:pathData="M17.7443,14.9246L9.7907,6.971L12,2L17.7443,14.9246Z"
+ android:fillColor="@color/icon_color_default"/>
+ <path
+ android:pathData="M3.41,3L2,4.41L20.38,22.79L21.79,21.38L3.41,3Z"
+ android:fillColor="@color/icon_color_default"/>
+</vector>
diff --git a/res/drawable/car_ic_phone_volume.xml b/res/drawable/car_ic_phone_volume.xml
new file mode 100644
index 0000000..df9b43a
--- /dev/null
+++ b/res/drawable/car_ic_phone_volume.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size">
+ <path
+ android:pathData="M7.96,14.46l2.62,2.62c2.75,-1.49 5.01,-3.75 6.5,-6.5l-2.62,-2.62c-0.24,-0.24 -0.34,-0.58 -0.27,-0.9l0.65,-3.26c0.09,-0.46 0.5,-0.8 0.98,-0.8h4.15c0.56,0 1.03,0.47 1,1.03 -0.17,2.91 -1.04,5.63 -2.43,8.01 -1.57,2.69 -3.81,4.93 -6.5,6.5 -2.38,1.39 -5.1,2.26 -8.01,2.43 -0.56,0.03 -1.03,-0.44 -1.03,-1v-4.15c0,-0.48 0.34,-0.89 0.8,-0.98l3.26,-0.65c0.33,-0.07 0.67,0.04 0.9,0.27z"
+ android:fillColor="@color/icon_color_default"/>
+</vector>
diff --git a/res/drawable/car_ic_phone_volume_mute.xml b/res/drawable/car_ic_phone_volume_mute.xml
new file mode 100644
index 0000000..67c0749
--- /dev/null
+++ b/res/drawable/car_ic_phone_volume_mute.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size">
+ <path
+ android:pathData="M14.22,17.05c-0.69,0.55 -1.41,1.05 -2.18,1.49 -2.38,1.39 -5.1,2.26 -8.01,2.43 -0.56,0.03 -1.03,-0.44 -1.03,-1v-4.15c0,-0.48 0.34,-0.89 0.8,-0.98l3.26,-0.65c0.33,-0.07 0.67,0.04 0.9,0.27l2.62,2.62c0.78,-0.42 1.52,-0.91 2.22,-1.45L1.39,4.22l1.42,-1.41L21.19,21.2l-1.41,1.41 -5.56,-5.56zM15.62,12.82c0.55,-0.7 1.04,-1.45 1.47,-2.24l-2.62,-2.62c-0.24,-0.24 -0.34,-0.58 -0.27,-0.9l0.65,-3.26c0.09,-0.46 0.5,-0.8 0.98,-0.8h4.15c0.56,0 1.03,0.47 1,1.03 -0.17,2.91 -1.04,5.63 -2.43,8.01 -0.45,0.77 -0.96,1.51 -1.51,2.2l-1.42,-1.42z"
+ android:fillColor="@color/icon_color_default"/>
+</vector>
diff --git a/res/drawable/color_progress_bar.xml b/res/drawable/color_progress_bar.xml
index 10a2891..684efd8 100644
--- a/res/drawable/color_progress_bar.xml
+++ b/res/drawable/color_progress_bar.xml
@@ -20,7 +20,7 @@
android:gravity="center_vertical|fill_horizontal">
<shape android:shape="rectangle"
android:tint="@color/config_progress_background_tint">
- <solid android:color="@color/white_disabled_material"/>
+ <solid android:color="@color/white_disabled"/>
</shape>
</item>
<item android:id="@android:id/progress"
diff --git a/res/drawable/ic_add.xml b/res/drawable/ic_add.xml
index 458f8bf..1c7016c 100644
--- a/res/drawable/ic_add.xml
+++ b/res/drawable/ic_add.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</vector>
diff --git a/res/drawable/ic_apps.xml b/res/drawable/ic_apps.xml
new file mode 100644
index 0000000..3012cf4
--- /dev/null
+++ b/res/drawable/ic_apps.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportWidth="44"
+ android:viewportHeight="44">
+ <path
+ android:pathData="M7.334,14.6666H14.6673V7.3333H7.334V14.6666ZM18.334,36.6666H25.6673V29.3333H18.334V36.6666ZM7.334,36.6666H14.6673V29.3333H7.334V36.6666ZM7.334,25.6666H14.6673V18.3333H7.334V25.6666ZM18.334,25.6666H25.6673V18.3333H18.334V25.6666ZM29.334,7.3333V14.6666H36.6673V7.3333H29.334ZM18.334,14.6666H25.6673V7.3333H18.334V14.6666ZM29.334,25.6666H36.6673V18.3333H29.334V25.6666ZM29.334,36.6666H36.6673V29.3333H29.334V36.6666Z"
+ android:fillColor="@color/icon_color_default"/>
+</vector>
diff --git a/res/drawable/ic_arrow_back.xml b/res/drawable/ic_arrow_back.xml
index f23c621..1e794ad 100644
--- a/res/drawable/ic_arrow_back.xml
+++ b/res/drawable/ic_arrow_back.xml
@@ -25,6 +25,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>
diff --git a/res/drawable/ic_arrow_drop_down.xml b/res/drawable/ic_arrow_drop_down.xml
index 854660a..da66931 100644
--- a/res/drawable/ic_arrow_drop_down.xml
+++ b/res/drawable/ic_arrow_drop_down.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M7,10l5,5 5,-5z"/>
</vector>
diff --git a/res/drawable/ic_arrow_forward.xml b/res/drawable/ic_arrow_forward.xml
index 2b6b63c..1c8286d 100644
--- a/res/drawable/ic_arrow_forward.xml
+++ b/res/drawable/ic_arrow_forward.xml
@@ -23,6 +23,6 @@
android:viewportWidth="24">
<path android:pathData="M0 0h24v24H0z"/>
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/>
</vector>
diff --git a/res/drawable/ic_backspace.xml b/res/drawable/ic_backspace.xml
index d2ea585..a0ef860 100644
--- a/res/drawable/ic_backspace.xml
+++ b/res/drawable/ic_backspace.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M22,3H7C6.31,3 5.77,3.35 5.41,3.88l-5.04,7.57c-0.22,0.34 -0.22,0.77 0,1.11l5.04,7.56C5.77,20.64 6.31,21 7,21h15c1.1,0 2,-0.9 2,-2V5C24,3.9 23.1,3 22,3zM18.3,16.3L18.3,16.3c-0.39,0.39 -1.02,0.39 -1.41,0L14,13.41l-2.89,2.89c-0.39,0.39 -1.02,0.39 -1.41,0h0c-0.39,-0.39 -0.39,-1.02 0,-1.41L12.59,12L9.7,9.11c-0.39,-0.39 -0.39,-1.02 0,-1.41l0,0c0.39,-0.39 1.02,-0.39 1.41,0L14,10.59l2.89,-2.89c0.39,-0.39 1.02,-0.39 1.41,0v0c0.39,0.39 0.39,1.02 0,1.41L15.41,12l2.89,2.89C18.68,15.27 18.68,15.91 18.3,16.3z"/>
</vector>
diff --git a/res/drawable/ic_block.xml b/res/drawable/ic_block.xml
index 0c777f9..970084d 100644
--- a/res/drawable/ic_block.xml
+++ b/res/drawable/ic_block.xml
@@ -22,6 +22,6 @@
android:viewportHeight="36.0"
android:viewportWidth="36.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M18 3C9.7125 3 3 9.7125 3 18C3 26.2875 9.7125 33 18 33C26.2875 33 33 26.2875 33 18C33 9.7125 26.2875 3 18 3ZM6 18C6 11.37 11.37 6 18 6C20.775 6 23.3175 6.9525 25.35 8.5275L8.5275 25.35C6.9525 23.3175 6 20.775 6 18ZM18 30C15.225 30 12.6825 29.0475 10.65 27.4725L27.4725 10.65C29.0475 12.6825 30 15.225 30 18C30 24.63 24.63 30 18 30Z"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_cellular_data.xml b/res/drawable/ic_cellular_data.xml
index 9b0b27f..cef238c 100644
--- a/res/drawable/ic_cellular_data.xml
+++ b/res/drawable/ic_cellular_data.xml
@@ -22,7 +22,7 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M12.0,12.0m-9.5,0.0a9.5,9.5 0.0,1.0 1.0,19.0 0.0a9.5,9.5 0.0,1.0 1.0,-19.0 0.0
M10.6,5.4c-0.2,-0.2 -0.5,-0.2 -0.6,0.0L7.6,9.1l2.0,0.0l0.0,3.8L11.0,12.900001L11.0,9.1l2.0,0.0L10.6,5.4z
M13.3,18.6c0.2,0.2 0.5,0.2 0.6,0.0l2.4,-3.7l-2.0,0.0l0.0,-3.8l-1.4,0.0l0.0,3.8l-2.0,0.0L13.3,18.6z"/>
diff --git a/res/drawable/ic_check.xml b/res/drawable/ic_check.xml
index 9838470..0578abb 100644
--- a/res/drawable/ic_check.xml
+++ b/res/drawable/ic_check.xml
@@ -24,6 +24,6 @@
<path
android:pathData="M0 0h24v24H0z"/>
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/>
</vector>
diff --git a/res/drawable/ic_check_box_checked.xml b/res/drawable/ic_check_box_checked.xml
index 479163d..5395ca4 100644
--- a/res/drawable/ic_check_box_checked.xml
+++ b/res/drawable/ic_check_box_checked.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"/>
</vector>
diff --git a/res/drawable/ic_check_box_unchecked.xml b/res/drawable/ic_check_box_unchecked.xml
index 70dbcd1..2a3c9ed 100644
--- a/res/drawable/ic_check_box_unchecked.xml
+++ b/res/drawable/ic_check_box_unchecked.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"/>
</vector>
diff --git a/res/drawable/ic_check_circle.xml b/res/drawable/ic_check_circle.xml
index 4d917f1..a51a8b8 100644
--- a/res/drawable/ic_check_circle.xml
+++ b/res/drawable/ic_check_circle.xml
@@ -22,6 +22,6 @@
android:viewportHeight="36.0"
android:viewportWidth="36.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M18 3C9.7125 3 3 9.7125 3 18C3 26.28 9.7125 33 18 33C26.28 33 33 26.28 33 18C33 9.7125 26.28 3 18 3ZM15 25.5L7.5 18L9.6225 15.8775L15 21.255L26.3775 9.8775L28.5 12L15 25.5Z"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_chevron_right.xml b/res/drawable/ic_chevron_right.xml
index ea9a763..a7df3fe 100644
--- a/res/drawable/ic_chevron_right.xml
+++ b/res/drawable/ic_chevron_right.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/>
</vector>
diff --git a/res/drawable/ic_close.xml b/res/drawable/ic_close.xml
index 07c42ef..e9f0680 100644
--- a/res/drawable/ic_close.xml
+++ b/res/drawable/ic_close.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>
diff --git a/res/drawable/ic_corp_icon.xml b/res/drawable/ic_corp_icon.xml
new file mode 100644
index 0000000..f47ffa9
--- /dev/null
+++ b/res/drawable/ic_corp_icon.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!-- Copied from frameworks/base, but with different fill color and un-hardcoded dimensions -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="@*android:string/config_work_badge_path_24"
+ android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/res/drawable/ic_date_time.xml b/res/drawable/ic_date_time.xml
index fcb707d..e74b52f 100644
--- a/res/drawable/ic_date_time.xml
+++ b/res/drawable/ic_date_time.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM16.49,16.36L11,13.07L11,6.42h2v5.51l4.51,2.71z"/>
</vector>
diff --git a/res/drawable/ic_delete.xml b/res/drawable/ic_delete.xml
index 1f358ca..db75f67 100644
--- a/res/drawable/ic_delete.xml
+++ b/res/drawable/ic_delete.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
</vector>
diff --git a/res/drawable/ic_edit.xml b/res/drawable/ic_edit.xml
index 8e3332e..c0330be 100644
--- a/res/drawable/ic_edit.xml
+++ b/res/drawable/ic_edit.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M20.41,4.94l-1.35,-1.35c-0.78,-0.78 -2.05,-0.78 -2.83,0l0,0L3,16.82V21h4.18L20.41,7.77C21.2,6.99 21.2,5.72 20.41,4.94zM6.41,19.06L5,19v-1.36l9.82,-9.82l1.41,1.41L6.41,19.06z"/>
</vector>
diff --git a/res/drawable/ic_folder.xml b/res/drawable/ic_folder.xml
index aed22cf..dad87ac 100644
--- a/res/drawable/ic_folder.xml
+++ b/res/drawable/ic_folder.xml
@@ -19,6 +19,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M20,6h-8l-2,-2H4C2.9,4 2.01,4.9 2.01,6L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8C22,6.9 21.1,6 20,6zM20,18H4V8h16V18z"/>
</vector>
diff --git a/res/drawable/ic_headset.xml b/res/drawable/ic_headset.xml
index 0de143e..3cb969d 100644
--- a/res/drawable/ic_headset.xml
+++ b/res/drawable/ic_headset.xml
@@ -19,6 +19,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M19,15v3c0,0.55 -0.45,1 -1,1h-1v-4H19M7,15v4H6c-0.55,0 -1,-0.45 -1,-1v-3H7M12,2c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7C21,6.03 16.97,2 12,2L12,2z"/>
</vector>
diff --git a/res/drawable/ic_keyboard_arrow_down.xml b/res/drawable/ic_keyboard_arrow_down.xml
index 45eda10..a8a0e1c 100644
--- a/res/drawable/ic_keyboard_arrow_down.xml
+++ b/res/drawable/ic_keyboard_arrow_down.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z"/>
</vector>
diff --git a/res/drawable/ic_keyboard_arrow_up.xml b/res/drawable/ic_keyboard_arrow_up.xml
index 4437437..5857917 100644
--- a/res/drawable/ic_keyboard_arrow_up.xml
+++ b/res/drawable/ic_keyboard_arrow_up.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z"/>
</vector>
diff --git a/res/drawable/ic_language.xml b/res/drawable/ic_language.xml
index eddea9a..80150eb 100644
--- a/res/drawable/ic_language.xml
+++ b/res/drawable/ic_language.xml
@@ -22,6 +22,6 @@
android:viewportHeight="48.0"
android:viewportWidth="48.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M23.99,4C12.94,4 4,12.95 4,24s8.94,20 19.99,20C35.04,44 44,35.05 44,24S35.04,4 23.99,4zM37.84,16h-5.9c-0.65,-2.5 -1.56,-4.9 -2.76,-7.12 3.68,1.26 6.74,3.81 8.66,7.12zM24,8.07c1.67,2.4 2.97,5.07 3.82,7.93h-7.64c0.85,-2.86 2.15,-5.53 3.82,-7.93zM8.52,28C8.19,26.72 8,25.38 8,24s0.19,-2.72 0.52,-4h6.75c-0.16,1.31 -0.27,2.64 -0.27,4 0,1.36 0.11,2.69 0.28,4L8.52,28zM10.15,32h5.9c0.65,2.5 1.56,4.9 2.76,7.13 -3.68,-1.26 -6.74,-3.82 -8.66,-7.13zM16.05,16h-5.9c1.92,-3.31 4.98,-5.87 8.66,-7.13 -1.2,2.23 -2.11,4.63 -2.76,7.13zM24,39.93c-1.66,-2.4 -2.96,-5.07 -3.82,-7.93h7.64c-0.86,2.86 -2.16,5.53 -3.82,7.93zM28.68,28h-9.36c-0.19,-1.31 -0.32,-2.64 -0.32,-4 0,-1.36 0.13,-2.69 0.32,-4h9.36c0.19,1.31 0.32,2.64 0.32,4 0,1.36 -0.13,2.69 -0.32,4zM29.19,39.12c1.2,-2.23 2.11,-4.62 2.76,-7.12h5.9c-1.93,3.31 -4.99,5.86 -8.66,7.12zM32.72,28c0.16,-1.31 0.28,-2.64 0.28,-4 0,-1.36 -0.11,-2.69 -0.28,-4h6.75c0.33,1.28 0.53,2.62 0.53,4s-0.19,2.72 -0.53,4h-6.75z"/>
</vector>
diff --git a/res/drawable/ic_lock.xml b/res/drawable/ic_lock.xml
index 4caeaf1..a0be696 100644
--- a/res/drawable/ic_lock.xml
+++ b/res/drawable/ic_lock.xml
@@ -22,6 +22,6 @@
android:viewportHeight="48.0"
android:viewportWidth="48.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M36,16h-2v-4c0,-5.52 -4.48,-10 -10,-10S14,6.48 14,12v4h-2c-2.21,0 -4,1.79 -4,4v20c0,2.21 1.79,4 4,4h24c2.21,0 4,-1.79 4,-4L40,20c0,-2.21 -1.79,-4 -4,-4zM24,34c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4zM30.2,16L17.8,16v-4c0,-3.42 2.78,-6.2 6.2,-6.2 3.42,0 6.2,2.78 6.2,6.2v4z"/>
</vector>
diff --git a/res/drawable/ic_media_stream.xml b/res/drawable/ic_media_stream.xml
index c07d1e0..3ac4741 100644
--- a/res/drawable/ic_media_stream.xml
+++ b/res/drawable/ic_media_stream.xml
@@ -19,6 +19,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M12,3l0.01,10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55C7.79,13 6,14.79 6,17c0,2.21 1.79,4 4.01,4S14,19.21 14,17V7h4V3H12zM10.01,19c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C12.01,18.1 11.11,19 10.01,19z"/>
</vector>
diff --git a/res/drawable/ic_people.xml b/res/drawable/ic_people.xml
index 25d1cc5..2f734a8 100644
--- a/res/drawable/ic_people.xml
+++ b/res/drawable/ic_people.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M15,8c0,-1.42 -0.5,-2.73 -1.33,-3.76C14.09,4.1 14.53,4 15,4c2.21,0 4,1.79 4,4s-1.79,4 -4,4c-0.43,0 -0.84,-0.09 -1.23,-0.21c-0.03,-0.01 -0.06,-0.02 -0.1,-0.03C14.5,10.73 15,9.42 15,8zM16.66,13.13C18.03,14.06 19,15.32 19,17v3h4v-3C23,14.82 19.42,13.53 16.66,13.13zM9,4c2.21,0 4,1.79 4,4s-1.79,4 -4,4s-4,-1.79 -4,-4S6.79,4 9,4zM9,13c2.67,0 8,1.34 8,4v3H1v-3C1,14.34 6.33,13 9,13z"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_profile.xml b/res/drawable/ic_profile.xml
index 3906c00..39f0e9a 100644
--- a/res/drawable/ic_profile.xml
+++ b/res/drawable/ic_profile.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,5c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM12,19.2c-2.5,0 -4.71,-1.28 -6,-3.22 0.03,-1.99 4,-3.08 6,-3.08 1.99,0 5.97,1.09 6,3.08 -1.29,1.94 -3.5,3.22 -6,3.22z"/>
</vector>
diff --git a/res/drawable/ic_qc_bluetooth.xml b/res/drawable/ic_qc_bluetooth.xml
new file mode 100644
index 0000000..6e21fd4
--- /dev/null
+++ b/res/drawable/ic_qc_bluetooth.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="48.0"
+ android:viewportWidth="48.0">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M35.41,15.41L24.0,4.0l-2.0,0.0l0.0,15.17L12.83,10.0 10.0,12.83 21.17,24.0 10.0,35.17 12.83,38.0 22.0,28.83L22.0,44.0l2.0,0.0l11.41,-11.41L26.83,24.0l8.58,-8.59zM26.0,11.66l3.76,3.76L26.0,19.17l0.0,-7.51zm3.76,20.93L26.0,36.34l0.0,-7.52l3.76,3.77z"/>
+</vector>
diff --git a/res/drawable/ic_qc_bluetooth_media.xml b/res/drawable/ic_qc_bluetooth_media.xml
new file mode 100644
index 0000000..d0a9111
--- /dev/null
+++ b/res/drawable/ic_qc_bluetooth_media.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z"/>
+</vector>
diff --git a/res/drawable/ic_qc_bluetooth_media_unavailable.xml b/res/drawable/ic_qc_bluetooth_media_unavailable.xml
new file mode 100644
index 0000000..88deeec
--- /dev/null
+++ b/res/drawable/ic_qc_bluetooth_media_unavailable.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M21.19,21.19L14,14l-2,-2 -9.2,-9.2 -1.41,1.42 8.79,8.79c-0.06,0 -0.12,-0.01 -0.18,-0.01 -2.21,0 -4,1.79 -4,4s1.79,4 4.01,4S14,19.21 14,17v-0.17l5.78,5.78 1.41,-1.42zM14,11.17V7h4V3h-6v6.17z"/>
+</vector>
diff --git a/res/drawable/ic_qc_bluetooth_phone.xml b/res/drawable/ic_qc_bluetooth_phone.xml
new file mode 100644
index 0000000..f88e376
--- /dev/null
+++ b/res/drawable/ic_qc_bluetooth_phone.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M7.96,14.46l2.62,2.62c2.75,-1.49 5.01,-3.75 6.5,-6.5l-2.62,-2.62c-0.24,-0.24 -0.34,-0.58 -0.27,-0.9l0.65,-3.26c0.09,-0.46 0.5,-0.8 0.98,-0.8h4.15c0.56,0 1.03,0.47 1,1.03 -0.17,2.91 -1.04,5.63 -2.43,8.01 -1.57,2.69 -3.81,4.93 -6.5,6.5 -2.38,1.39 -5.1,2.26 -8.01,2.43 -0.56,0.03 -1.03,-0.44 -1.03,-1v-4.15c0,-0.48 0.34,-0.89 0.8,-0.98l3.26,-0.65c0.33,-0.07 0.67,0.04 0.9,0.27z"/>
+</vector>
diff --git a/res/drawable/ic_qc_bluetooth_phone_unavailable.xml b/res/drawable/ic_qc_bluetooth_phone_unavailable.xml
new file mode 100644
index 0000000..e9791a2
--- /dev/null
+++ b/res/drawable/ic_qc_bluetooth_phone_unavailable.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M14.22,17.05c-0.69,0.55 -1.41,1.05 -2.18,1.49 -2.38,1.39 -5.1,2.26 -8.01,2.43 -0.56,0.03 -1.03,-0.44 -1.03,-1v-4.15c0,-0.48 0.34,-0.89 0.8,-0.98l3.26,-0.65c0.33,-0.07 0.67,0.04 0.9,0.27l2.62,2.62c0.78,-0.42 1.52,-0.91 2.22,-1.45L1.39,4.22l1.42,-1.41L21.19,21.2l-1.41,1.41 -5.56,-5.56zM15.62,12.82c0.55,-0.7 1.04,-1.45 1.47,-2.24l-2.62,-2.62c-0.24,-0.24 -0.34,-0.58 -0.27,-0.9l0.65,-3.26c0.09,-0.46 0.5,-0.8 0.98,-0.8h4.15c0.56,0 1.03,0.47 1,1.03 -0.17,2.91 -1.04,5.63 -2.43,8.01 -0.45,0.77 -0.96,1.51 -1.51,2.2l-1.42,-1.42z"/>
+</vector>
diff --git a/res/drawable/ic_qc_brightness.xml b/res/drawable/ic_qc_brightness.xml
new file mode 100644
index 0000000..cfd4c2e
--- /dev/null
+++ b/res/drawable/ic_qc_brightness.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="44.0"
+ android:viewportWidth="44.0">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M12.3843 8.88247L9.10266 5.59163L6.5085 8.1858L9.79933 11.4766L12.3843 8.88247ZM7.3335 19.25H1.8335V22.9166H7.3335V19.25ZM23.8335 1.0083H20.1668V6.41663H23.8335V1.0083ZM37.4918 8.1858L34.8977 5.59163L31.6068 8.88247L34.201 11.4766L37.4918 8.1858ZM31.616 33.2841L34.9068 36.575L37.501 33.9808L34.2102 30.69L31.616 33.2841ZM36.6668 19.25V22.9166H42.1668V19.25H36.6668ZM22.0002 10.0833C15.9227 10.0833 11.0002 15.0058 11.0002 21.0833C11.0002 27.1608 15.9227 32.0833 22.0002 32.0833C28.0777 32.0833 33.0002 27.1608 33.0002 21.0833C33.0002 15.0058 28.0777 10.0833 22.0002 10.0833ZM20.1668 41.1583H23.8335V35.75H20.1668V41.1583ZM6.5085 33.9808L9.10266 36.575L12.3935 33.2841L9.79933 30.69L6.5085 33.9808Z"/>
+</vector>
diff --git a/res/drawable/ic_qc_hotspot.xml b/res/drawable/ic_qc_hotspot.xml
new file mode 100644
index 0000000..08a5b3a
--- /dev/null
+++ b/res/drawable/ic_qc_hotspot.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M12,11c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,13a6,6 0,0 0,-6.75 -5.95c-2.62,0.32 -4.78,2.41 -5.18,5.02 -0.32,2.14 0.49,4.11 1.92,5.39 0.48,0.43 1.24,0.33 1.56,-0.23 0.24,-0.42 0.14,-0.94 -0.22,-1.26a3.99,3.99 0,0 1,-1.22 -3.94,3.954 3.954,0 0,1 2.9,-2.91A4.007,4.007 0,0 1,16 13c0,1.18 -0.51,2.23 -1.33,2.96 -0.36,0.33 -0.47,0.85 -0.23,1.27 0.31,0.54 1.04,0.69 1.5,0.28A5.97,5.97 0,0 0,18 13zM10.83,3.07c-4.62,0.52 -8.35,4.33 -8.78,8.96a9.966,9.966 0,0 0,4.02 9.01c0.48,0.35 1.16,0.2 1.46,-0.31 0.25,-0.43 0.14,-0.99 -0.26,-1.29 -2.28,-1.69 -3.65,-4.55 -3.16,-7.7 0.54,-3.5 3.46,-6.29 6.98,-6.68C15.91,4.51 20,8.28 20,13c0,2.65 -1.29,4.98 -3.27,6.44 -0.4,0.3 -0.51,0.85 -0.26,1.29 0.3,0.52 0.98,0.66 1.46,0.31A9.96,9.96 0,0 0,22 13c0,-5.91 -5.13,-10.62 -11.17,-9.93z"/>
+</vector>
diff --git a/res/drawable/ic_qc_mobile_data.xml b/res/drawable/ic_qc_mobile_data.xml
new file mode 100644
index 0000000..c6f95f8
--- /dev/null
+++ b/res/drawable/ic_qc_mobile_data.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M2,22h20V2z"/>
+</vector>
diff --git a/res/drawable/ic_qc_wifi_disabled.xml b/res/drawable/ic_qc_wifi_disabled.xml
new file mode 100644
index 0000000..dca68da
--- /dev/null
+++ b/res/drawable/ic_qc_wifi_disabled.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4 -1.5,0 -2.89,0.19 -4.15,0.48L18.18,13.8 23.64,7zM17.04,15.22L3.27,1.44 2,2.72l2.05,2.06C1.91,5.76 0.59,6.82 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01 3.9,-4.86 3.32,3.32 1.27,-1.27 -3.46,-3.46z"/>
+</vector>
diff --git a/res/drawable/ic_qc_wifi_disconnected.xml b/res/drawable/ic_qc_wifi_disconnected.xml
new file mode 100644
index 0000000..9fab4a2
--- /dev/null
+++ b/res/drawable/ic_qc_wifi_disconnected.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportHeight="44"
+ android:viewportWidth="44">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M22.0002 7.33317C29.1925 7.33318 34.8955 10.1015 38.3817 12.3748L22.0002 34.4665L5.63555 12.3748C9.10478 10.1015 14.8079 7.33317 22.0002 7.33317ZM22.0002 3.66651C9.71401 3.66651 1.52324 10.9265 0.710936 11.5865L21.9832 40.2965L22.0002 40.3332L22.0171 40.3148L43.2894 11.5865C42.4771 10.9265 34.2863 3.66651 22.0002 3.66651Z"/>
+</vector>
diff --git a/res/drawable/ic_qc_wifi_level_0.xml b/res/drawable/ic_qc_wifi_level_0.xml
new file mode 100644
index 0000000..c10e2bf
--- /dev/null
+++ b/res/drawable/ic_qc_wifi_level_0.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M12,4c3.42,0,6.73,1.27,9.3,3.53L12,18.85L2.7,7.53C5.27,5.27,8.58,4,12,4 M12,2C7.25,2,2.97,4.08,0,7.39L12,22L24,7.39 C21.03,4.08,16.75,2,12,2L12,2z" />
+</vector>
diff --git a/res/drawable/ic_qc_wifi_level_1.xml b/res/drawable/ic_qc_wifi_level_1.xml
new file mode 100644
index 0000000..395ae89
--- /dev/null
+++ b/res/drawable/ic_qc_wifi_level_1.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M12,2.01c-4.75,0-9.03,2.08-12,5.39L12,22L24,7.4C21.03,4.09,16.75,2.01,12,2.01z M12,18.86L2.7,7.54 C5.27,5.28,8.58,4.01,12,4.01s6.73,1.27,9.3,3.53L12,18.86z" />
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M16.42,16.63L12,22l-4.42-5.37c0.15-0.74,0.48-1.43,0.95-1.99C9.35,13.64,10.6,13,12,13s2.65,0.64,3.47,1.64 C15.94,15.2,16.27,15.89,16.42,16.63z" />
+</vector>
diff --git a/res/drawable/ic_qc_wifi_level_2.xml b/res/drawable/ic_qc_wifi_level_2.xml
new file mode 100644
index 0000000..c8fdb4c
--- /dev/null
+++ b/res/drawable/ic_qc_wifi_level_2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M12,2C7.25,2,2.97,4.08,0,7.39L12,22L24,7.39C21.03,4.08,16.75,2,12,2z M12,18.85L2.7,7.53C5.27,5.27,8.58,4,12,4 s6.73,1.27,9.3,3.53L12,18.85z" />
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M18.61,13.95L12,22l-6.61-8.05c0.33-0.61,0.74-1.17,1.22-1.66c1.36-1.42,3.27-2.3,5.39-2.3s4.03,0.88,5.39,2.3 C17.87,12.78,18.28,13.34,18.61,13.95z" />
+</vector>
diff --git a/res/drawable/ic_qc_wifi_level_3.xml b/res/drawable/ic_qc_wifi_level_3.xml
new file mode 100644
index 0000000..a283d9a
--- /dev/null
+++ b/res/drawable/ic_qc_wifi_level_3.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M12,2C7.25,2,2.97,4.08,0,7.39L12,22L24,7.39C21.03,4.08,16.75,2,12,2z M12,18.85L2.7,7.53C5.27,5.27,8.58,4,12,4 s6.73,1.27,9.3,3.53L12,18.85z" />
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M20.7,11.41L12,22L3.3,11.41c0.38-0.52,0.8-0.99,1.26-1.43C6.49,8.13,9.1,6.99,12,6.99s5.51,1.13,7.44,2.99 C19.9,10.41,20.33,10.89,20.7,11.41z" />
+</vector>
diff --git a/res/drawable/ic_qc_wifi_level_4.xml b/res/drawable/ic_qc_wifi_level_4.xml
new file mode 100644
index 0000000..412b258
--- /dev/null
+++ b/res/drawable/ic_qc_wifi_level_4.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@color/qc_default_icon_color"
+ android:pathData="M24,7.39L12,22L0,7.39C2.97,4.08,7.25,2,12,2S21.03,4.08,24,7.39z" />
+</vector>
diff --git a/res/drawable/ic_remove_circle.xml b/res/drawable/ic_remove_circle.xml
index 16ce5d3..5f1452f 100644
--- a/res/drawable/ic_remove_circle.xml
+++ b/res/drawable/ic_remove_circle.xml
@@ -22,7 +22,7 @@
android:viewportHeight="48"
android:viewportWidth="48">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M24,4C12.95,4,4,12.95,4,24
s8.95,20,20,20,20-8.95,20-20
S35.05,4,24,4zm10,22H14v-4h20v4z"/>
diff --git a/res/drawable/ic_restore.xml b/res/drawable/ic_restore.xml
index 0c457f5..c356969 100644
--- a/res/drawable/ic_restore.xml
+++ b/res/drawable/ic_restore.xml
@@ -22,7 +22,7 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M13.5 7.75v4.5l3.37 2c.34 .2 .46 .65 .25 .99 s-.64 .45 -.98 .24 L12
13V7.75c0-.41 .34 -.75 .75 -.75s.75 .34 .75 .75 zM13.05 3C8.11 3 4.1 7.02 4.1
11.95c0 .02 .01 .03 .01 .05H2.05c-.47 0-.71 .57 -.37 .9 l2.95 2.94c.21 .21 .54
diff --git a/res/drawable/ic_settings_about.xml b/res/drawable/ic_settings_about.xml
index 75647d0..7ca4689 100644
--- a/res/drawable/ic_settings_about.xml
+++ b/res/drawable/ic_settings_about.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M11.0,17.0l2.0,0.0l0.0,-6.0l-2.0,0.0l0.0,6.0zm1.0,-15.0C6.48,2.0 2.0,6.48 2.0,12.0s4.48,10.0 10.0,10.0 10.0,-4.48 10.0,-10.0S17.52,2.0 12.0,2.0zm0.0,18.0c-4.41,0.0 -8.0,-3.59 -8.0,-8.0s3.59,-8.0 8.0,-8.0 8.0,3.59 8.0,8.0 -3.59,8.0 -8.0,8.0zM11.0,9.0l2.0,0.0L13.0,7.0l-2.0,0.0l0.0,2.0z"/>
</vector>
diff --git a/res/drawable/ic_settings_auto_wifi.xml b/res/drawable/ic_settings_auto_wifi.xml
index 5eddaf1..59957d3 100644
--- a/res/drawable/ic_settings_auto_wifi.xml
+++ b/res/drawable/ic_settings_auto_wifi.xml
@@ -22,15 +22,15 @@
android:viewportHeight="24.0">
<path
android:pathData="M18 10l3 0 -10 -9 -10 9 3 0 0 8 7.1 0c0 -0.3 -0.1 -0.7 -0.1 -1 0 -3.9 3.1 -7 7 -7z"
- android:fillColor="?attr/iconColor"/>
+ android:fillColor="@color/icon_color_default"/>
<path
android:pathData="M18 14l0 1.6 2.1 -2.1 -2.1 -2.2 0 1.6c-2.3 0 -4.2 1.9 -4.2 4.3 0 0.8 0.2 1.6 0.7 2.3l0.8 -0.8C15.1 18.3 14.9 17.8 14.9 17.2 14.8 15.4 16.2 14 18 14"
android:strokeWidth="0.5"
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:strokeMiterLimit="10" />
<path
android:pathData="M20.8 15.7c0.2 0.4 0.4 0.9 0.4 1.5 0 1.8 -1.4 3.2 -3.2 3.2l0 -1.6 -2.1 2.1 2.1 2.1 0 -1.6c2.3 0 4.2 -1.9 4.2 -4.2 0 -0.8 -0.2 -1.6 -0.7 -2.3l-0.7 0.8z"
android:strokeWidth="0.5"
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:strokeMiterLimit="10" />
</vector>
diff --git a/res/drawable/ic_settings_bluetooth.xml b/res/drawable/ic_settings_bluetooth.xml
index 52127a8..025169d 100644
--- a/res/drawable/ic_settings_bluetooth.xml
+++ b/res/drawable/ic_settings_bluetooth.xml
@@ -22,6 +22,6 @@
android:viewportHeight="48.0"
android:viewportWidth="48.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M35.41,15.41L24.0,4.0l-2.0,0.0l0.0,15.17L12.83,10.0 10.0,12.83 21.17,24.0 10.0,35.17 12.83,38.0 22.0,28.83L22.0,44.0l2.0,0.0l11.41,-11.41L26.83,24.0l8.58,-8.59zM26.0,11.66l3.76,3.76L26.0,19.17l0.0,-7.51zm3.76,20.93L26.0,36.34l0.0,-7.52l3.76,3.77z"/>
</vector>
diff --git a/res/drawable/ic_settings_bluetooth_connected.xml b/res/drawable/ic_settings_bluetooth_connected.xml
index 537d239..63e81a9 100644
--- a/res/drawable/ic_settings_bluetooth_connected.xml
+++ b/res/drawable/ic_settings_bluetooth_connected.xml
@@ -22,6 +22,6 @@
android:viewportHeight="20.0"
android:viewportWidth="20.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M5.833,10L4.167,8.333L2.5,10l1.667,1.667L5.833,10zM14.758,6.425L10,1.667H9.167v6.325L5.342,4.167L4.167,5.342L8.825,10l-4.658,4.658l1.175,1.175l3.825,-3.825v6.325H10l4.758,-4.758L11.175,10C11.175,10 14.758,6.425 14.758,6.425zM10.833,4.858L12.4,6.425l-1.567,1.567V4.858zM12.4,13.575l-1.567,1.567v-3.133C10.833,12.008 12.4,13.575 12.4,13.575zM15.833,8.333L14.167,10l1.667,1.667L17.5,10L15.833,8.333z"/>
</vector>
diff --git a/res/drawable/ic_settings_bluetooth_disabled.xml b/res/drawable/ic_settings_bluetooth_disabled.xml
index 4e4d150..05df823 100644
--- a/res/drawable/ic_settings_bluetooth_disabled.xml
+++ b/res/drawable/ic_settings_bluetooth_disabled.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M13,5.83l1.88,1.88 -1.6,1.6 1.41,1.41 3.02,-3.02L12,2h-1v5.03l2,2v-3.2zM5.41,4L4,5.41 10.59,12 5,17.59 6.41,19 11,14.41V22h1l4.29,-4.29 2.3,2.29L20,18.59 5.41,4zM13,18.17v-3.76l1.88,1.88L13,18.17z"/>
</vector>
diff --git a/res/drawable/ic_settings_cellular.xml b/res/drawable/ic_settings_cellular.xml
index 18b28ff..8f83c75 100644
--- a/res/drawable/ic_settings_cellular.xml
+++ b/res/drawable/ic_settings_cellular.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M2,22h20V2z"/>
</vector>
diff --git a/res/drawable/ic_settings_data_usage.xml b/res/drawable/ic_settings_data_usage.xml
index 54a9f50..4170f39 100644
--- a/res/drawable/ic_settings_data_usage.xml
+++ b/res/drawable/ic_settings_data_usage.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M13,2.05v3.03c3.39,0.49 6,3.39 6,6.92 0,0.9 -0.18,1.75 -0.48,2.54l2.6,1.53c0.56,-1.24 0.88,-2.62 0.88,-4.07 0,-5.18 -3.95,-9.45 -9,-9.95zM12,19c-3.87,0 -7,-3.13 -7,-7 0,-3.53 2.61,-6.43 6,-6.92V2.05c-5.06,0.5 -9,4.76 -9,9.95 0,5.52 4.47,10 9.99,10 3.31,0 6.24,-1.61 8.06,-4.09l-2.6,-1.53C16.17,17.98 14.21,19 12,19z"/>
</vector>
diff --git a/res/drawable/ic_settings_development.xml b/res/drawable/ic_settings_development.xml
index 6bf4307..ddb472c 100644
--- a/res/drawable/ic_settings_development.xml
+++ b/res/drawable/ic_settings_development.xml
@@ -22,6 +22,6 @@
android:viewportHeight="256.0"
android:viewportWidth="256.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="m66.641,197.718c-7.73,-7.73 -7.974,-8.747 -7.974,-33.186 0,-26.1 -1.346,-29.646 -12,-31.605 -9.22,-1.696 -8.063,-11.352 1.884,-15.729l8.783,-3.864 1.333,-26.241c1.262,-24.834 1.744,-26.593 8.986,-32.813 9.335,-8.017 21.681,-7.817 21.681,0.351 0,3.149 -2.974,6.723 -7.333,8.812 -7.171,3.437 -7.333,4.03 -7.333,26.776 0,16.737 -1.164,24.923 -4.151,29.188 -3.757,5.364 -3.757,6.489 0,11.853 3.037,4.336 4.151,12.604 4.151,30.805v24.879l8.145,2.839c6.138,2.14 7.945,4.241 7.333,8.528 -1.331,9.333 -13.894,9.016 -23.504,-0.593zM167.111,203.556c-4.355,-4.355 -1.269,-11.211 6.222,-13.823l8,-2.789v-24.879c0,-18.201 1.114,-26.469 4.151,-30.805 3.757,-5.364 3.757,-6.489 0,-11.853 -2.987,-4.264 -4.151,-12.451 -4.151,-29.188 0,-22.746 -0.162,-23.339 -7.333,-26.776 -4.359,-2.089 -7.333,-5.663 -7.333,-8.812 0,-8.168 12.346,-8.369 21.681,-0.351 7.242,6.22 7.724,7.979 8.986,32.813l1.333,26.241 8.783,3.864c9.947,4.377 11.104,14.033 1.884,15.729 -10.654,1.959 -12,5.505 -12,31.605 0,24.31 -0.279,25.491 -7.795,33.007 -7.235,7.235 -18.253,10.191 -22.427,6.017z"/>
</vector>
diff --git a/res/drawable/ic_settings_gear.xml b/res/drawable/ic_settings_gear.xml
index 6a38d8c..e9b6564 100644
--- a/res/drawable/ic_settings_gear.xml
+++ b/res/drawable/ic_settings_gear.xml
@@ -21,7 +21,7 @@
android:height="@dimen/icon_size"
android:viewportHeight="48.0"
android:viewportWidth="48.0"
- android:tint="?attr/iconColor">
+ android:tint="@color/icon_color_default">
<path
android:fillColor="#FFFFFF"
android:pathData="M38.86,25.95c0.08,-0.64 0.14,-1.29 0.14,-1.95s-0.06,-1.31 -0.14,-1.95l4.23,-3.31c0.38,-0.3 0.49,-0.84 0.24,-1.28l-4,-6.93c-0.25,-0.43 -0.77,-0.61 -1.22,-0.43l-4.98,2.01c-1.03,-0.79 -2.16,-1.46 -3.38,-1.97L29,4.84c-0.09,-0.47 -0.5,-0.84 -1,-0.84h-8c-0.5,0 -0.91,0.37 -0.99,0.84l-0.75,5.3c-1.22,0.51 -2.35,1.17 -3.38,1.97L9.9,10.1c-0.45,-0.17 -0.97,0 -1.22,0.43l-4,6.93c-0.25,0.43 -0.14,0.97 0.24,1.28l4.22,3.31C9.06,22.69 9,23.34 9,24s0.06,1.31 0.14,1.95l-4.22,3.31c-0.38,0.3 -0.49,0.84 -0.24,1.28l4,6.93c0.25,0.43 0.77,0.61 1.22,0.43l4.98,-2.01c1.03,0.79 2.16,1.46 3.38,1.97l0.75,5.3c0.08,0.47 0.49,0.84 0.99,0.84h8c0.5,0 0.91,-0.37 0.99,-0.84l0.75,-5.3c1.22,-0.51 2.35,-1.17 3.38,-1.97l4.98,2.01c0.45,0.17 0.97,0 1.22,-0.43l4,-6.93c0.25,-0.43 0.14,-0.97 -0.24,-1.28l-4.22,-3.31zM24,31c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z"/>
diff --git a/res/drawable/ic_settings_location_off.xml b/res/drawable/ic_settings_location_off.xml
new file mode 100644
index 0000000..cefb5f9
--- /dev/null
+++ b/res/drawable/ic_settings_location_off.xml
@@ -0,0 +1,25 @@
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportWidth="44"
+ android:viewportHeight="44">
+ <path
+ android:pathData="M22.0001,11.9167C24.5301,11.9167 26.5834,13.9701 26.5834,16.5001C26.5834,17.8476 25.9876,19.0484 25.0617,19.8917L31.7167,26.5467C33.5042,23.1367 34.8334,19.5892 34.8334,16.5001C34.8334,9.4143 29.0859,3.6667 22.0001,3.6667C18.3701,3.6667 15.0976,5.1792 12.7692,7.5992L18.6084,13.4384C19.4426,12.5126 20.6526,11.9167 22.0001,11.9167ZM30.0209,29.5167L21.5417,21.0376L21.3401,20.8359L5.9951,5.5001L3.6667,7.8376L9.4967,13.6676C9.2859,14.5751 9.1667,15.5192 9.1667,16.5001C9.1667,26.1251 22.0001,40.3334 22.0001,40.3334C22.0001,40.3334 25.0617,36.9417 28.1876,32.3584L34.3292,38.5001L36.6667,36.1626L30.0209,29.5167Z"
+ android:fillColor="@color/car_ui_text_color_primary"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_settings_night_display.xml b/res/drawable/ic_settings_night_display.xml
index 6b4d4b4..aa8e62a 100644
--- a/res/drawable/ic_settings_night_display.xml
+++ b/res/drawable/ic_settings_night_display.xml
@@ -22,6 +22,6 @@
android:viewportHeight="44.0"
android:viewportWidth="44.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M26.5,40.33C28.42,40.33 30.26,40.04 32,39.49C24.56,37.16 19.17,30.21 19.17,22C19.17,13.79 24.56,6.84 32,4.51C30.26,3.96 28.42,3.67 26.5,3.67C16.38,3.67 8.17,11.88 8.17,22C8.17,32.12 16.38,40.33 26.5,40.33Z"/>
</vector>
diff --git a/res/drawable/ic_settings_wifi.xml b/res/drawable/ic_settings_wifi.xml
index c6324c7..61e6ac4 100644
--- a/res/drawable/ic_settings_wifi.xml
+++ b/res/drawable/ic_settings_wifi.xml
@@ -22,6 +22,6 @@
android:viewportHeight="18.0"
android:viewportWidth="18.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M9.01,15.99l8.8,-10.96C17.47,4.77 14.08,2.0 9.0,2.0S0.53,4.7 0.19,5.03l8.8,10.96l0.02,0.0z"/>
</vector>
diff --git a/res/drawable/ic_settings_wifi_disabled.xml b/res/drawable/ic_settings_wifi_disabled.xml
index b4bd202..257cf05 100644
--- a/res/drawable/ic_settings_wifi_disabled.xml
+++ b/res/drawable/ic_settings_wifi_disabled.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4 -1.5,0 -2.89,0.19 -4.15,0.48L18.18,13.8 23.64,7zM17.04,15.22L3.27,1.44 2,2.72l2.05,2.06C1.91,5.76 0.59,6.82 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01 3.9,-4.86 3.32,3.32 1.27,-1.27 -3.46,-3.46z"/>
</vector>
diff --git a/res/drawable/ic_storage.xml b/res/drawable/ic_storage.xml
index ab7b48e..983645c 100644
--- a/res/drawable/ic_storage.xml
+++ b/res/drawable/ic_storage.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M3,20h18v-4H3V20zM5,17h2v2H5V17zM3,4v4h18V4H3zM7,7H5V5h2V7zM3,14h18v-4H3V14zM5,11h2v2H5V11z"/>
</vector>
diff --git a/res/drawable/ic_storage_apps.xml b/res/drawable/ic_storage_apps.xml
index 5d080c8..5c56c06 100644
--- a/res/drawable/ic_storage_apps.xml
+++ b/res/drawable/ic_storage_apps.xml
@@ -19,6 +19,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M6,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM6,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM6,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM16,6c0,1.1 0.9,2 2,2s2,-0.9 2,-2 -0.9,-2 -2,-2 -2,0.9 -2,2zM12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z"/>
</vector>
diff --git a/res/drawable/ic_sync.xml b/res/drawable/ic_sync.xml
index 06282c5..416a320 100644
--- a/res/drawable/ic_sync.xml
+++ b/res/drawable/ic_sync.xml
@@ -22,9 +22,9 @@
android:viewportHeight="44.0"
android:viewportWidth="44.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M25.6667 7.33337H36.6667V11H31.6617C34.7234 13.6767 36.6667 17.6 36.6667 22C36.6667 28.8384 31.9917 34.5584 25.6667 36.19V32.3584C29.9384 30.8367 33.0001 26.785 33.0001 22C33.0001 18.755 31.5701 15.8767 29.3334 13.86V18.3334H25.6667V7.33337Z"/>
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M12.3383 33.0001C9.27659 30.3234 7.33325 26.4001 7.33325 22.0001C7.33325 15.1617 12.0083 9.44173 18.3333 7.81006V11.6417C14.0616 13.1634 10.9999 17.2151 10.9999 22.0001C10.9999 25.2451 12.4299 28.1234 14.6666 30.1401V25.6667H18.3333V36.6667H7.33325V33.0001H12.3383Z"/>
</vector>
diff --git a/res/drawable/ic_sync_cancel.xml b/res/drawable/ic_sync_cancel.xml
index b2ecb35..aef5820 100644
--- a/res/drawable/ic_sync_cancel.xml
+++ b/res/drawable/ic_sync_cancel.xml
@@ -22,13 +22,13 @@
android:viewportHeight="44.0"
android:viewportWidth="44.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M25.6668 7.33337H36.6668V11H31.6618C34.3172 13.3215 36.1314 16.5807 36.5661 20.2753C35.7393 20.095 34.8807 20 34.0001 20C33.6039 20 33.2121 20.0192 32.8256 20.0568C32.3806 17.6123 31.1121 15.4637 29.3335 13.86V18.3334H25.6668V7.33337Z"/>
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M12.3385 33.0001C9.27683 30.3234 7.3335 26.4001 7.3335 22.0001C7.3335 15.1617 12.0085 9.44173 18.3335 7.81006V11.6417C14.0618 13.1634 11.0002 17.2151 11.0002 22.0001C11.0002 25.2451 12.4302 28.1234 14.6668 30.1401V25.6667H18.3335V36.6667H7.3335V33.0001H12.3385Z"/>
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:fillType="evenOdd"
android:pathData="M25.0001 32.1667C25.0001 27.1067 29.1068 23 34.1668 23C39.2268 23 43.3335 27.1067 43.3335 32.1667C43.3335 37.2267 39.2268 41.3333 34.1668 41.3333C29.1068 41.3333 25.0001 37.2267 25.0001 32.1667ZM37.3935 36.7133L38.6951 35.4117L35.4685 32.1667L38.7135 28.9217L37.4118 27.62L34.1668 30.865L30.9218 27.62L29.6201 28.9217L32.8651 32.1667L29.6201 35.4117L30.9218 36.7133L34.1668 33.4683L37.3935 36.7133Z"/>
</vector>
diff --git a/res/drawable/ic_system_update.xml b/res/drawable/ic_system_update.xml
index 69ccc06..8f23493 100644
--- a/res/drawable/ic_system_update.xml
+++ b/res/drawable/ic_system_update.xml
@@ -22,6 +22,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14zM16,13h-3L13,8h-2v5L8,13l4,4 4,-4z"/>
</vector>
diff --git a/res/drawable/ic_top_level_accessibility.xml b/res/drawable/ic_top_level_accessibility.xml
new file mode 100644
index 0000000..3e8e4f7
--- /dev/null
+++ b/res/drawable/ic_top_level_accessibility.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <com.android.car.settings.common.TopLevelIconShapeDrawable
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:tint="@color/top_level_accessibility_background"/>
+ </item>
+ <item
+ android:start="@dimen/top_level_foreground_icon_inset"
+ android:top="@dimen/top_level_foreground_icon_inset"
+ android:end="@dimen/top_level_foreground_icon_inset"
+ android:bottom="@dimen/top_level_foreground_icon_inset">
+ <vector
+ android:width="@dimen/icon_size"
+ android:height="@dimen/icon_size"
+ android:viewportWidth="44"
+ android:viewportHeight="44">
+ <path
+ android:pathData="M22,7.3333C24.0167,7.3333 25.6667,5.6833 25.6667,3.6667C25.6667,1.65 24.0167,0 22,0C19.9833,0 18.3333,1.65 18.3333,3.6667C18.3333,5.6833 19.9833,7.3333 22,7.3333ZM37.5833,7.3333C32.7983,8.6167 27.1883,9.1667 22,9.1667C16.8117,9.1667 11.2017,8.6167 6.4167,7.3333L5.5,11C8.91,11.9167 12.8333,12.5217 16.5,12.8333V36.6667H20.1667V25.6667H23.8333V36.6667H27.5V12.8333C31.1667,12.5217 35.09,11.9167 38.5,11L37.5833,7.3333ZM16.5,44H12.8333V40.3333H16.5V44ZM23.8333,44V40.3333H20.1667V44H23.8333ZM31.1667,44H27.5V40.3333H31.1667V44Z"
+ android:fillColor="@color/top_level_accessibility_icon"
+ android:fillType="evenOdd"/>
+ </vector>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/res/drawable/ic_translate.xml b/res/drawable/ic_translate.xml
index 6e22fc5..e244de7 100644
--- a/res/drawable/ic_translate.xml
+++ b/res/drawable/ic_translate.xml
@@ -21,6 +21,6 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M12.87,15.07l-2.54,-2.51 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53L17,6L17,4h-7L10,2L8,2v2L1,4v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z"/>
</vector>
diff --git a/res/drawable/ic_units.xml b/res/drawable/ic_units.xml
index e5ac8ec..6bd7a3a 100644
--- a/res/drawable/ic_units.xml
+++ b/res/drawable/ic_units.xml
@@ -22,9 +22,9 @@
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M10.59,15.41c0.78,0.78 2.05,0.78 2.83,0C14.2,14.63 19,7 19,7s-7.63,4.8 -8.41,5.59C9.8,13.37 9.8,14.63 10.59,15.41z"/>
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M20.36,8.59c-0.37,0.59 -0.78,1.23 -1.2,1.9c0.52,1.04 0.83,2.19 0.84,3.41c0.02,1.45 -0.36,2.87 -1.09,4.1L5.09,18.02C4.38,16.8 4,15.41 4,14c0,-4.41 3.59,-8 8,-8c0.07,0 0.15,0 0.23,0c1.18,0.03 2.29,0.34 3.29,0.84c0.66,-0.42 1.31,-0.83 1.89,-1.2C15.91,4.66 14.16,4.06 12.28,4C12.19,4 12.09,4 12,4C6.48,4 2,8.48 2,14c0,1.84 0.5,3.56 1.37,5.03C3.72,19.64 4.39,20 5.09,20h13.82c0.7,0 1.36,-0.36 1.72,-0.97c0.89,-1.51 1.39,-3.27 1.37,-5.16C21.97,11.94 21.37,10.13 20.36,8.59z"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_video_settings.xml b/res/drawable/ic_video_settings.xml
new file mode 100644
index 0000000..61a3d06
--- /dev/null
+++ b/res/drawable/ic_video_settings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector android:height="@dimen/icon_size"
+ android:width="@dimen/icon_size"
+ android:viewportHeight="24"
+ android:viewportWidth="24"
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="@color/icon_color_default"
+ android:pathData="M3,6h18v5h2V6c0,-1.1 -0.9,-2 -2,-2H3C1.9,4 1,4.9 1,6v12c0,1.1 0.9,2 2,2h9v-2H3V6z"/>
+ <path android:fillColor="@color/icon_color_default"
+ android:pathData="M15,12l-6,-4l0,8z"/>
+ <path android:fillColor="@color/icon_color_default"
+ android:pathData="M22.71,18.43c0.03,-0.29 0.04,-0.58 0.01,-0.86l1.07,-0.85c0.1,-0.08 0.12,-0.21 0.06,-0.32l-1.03,-1.79c-0.06,-0.11 -0.19,-0.15 -0.31,-0.11L21.23,15c-0.23,-0.17 -0.48,-0.31 -0.75,-0.42l-0.2,-1.36C20.26,13.09 20.16,13 20.03,13h-2.07c-0.12,0 -0.23,0.09 -0.25,0.21l-0.2,1.36c-0.26,0.11 -0.51,0.26 -0.74,0.42l-1.28,-0.5c-0.12,-0.05 -0.25,0 -0.31,0.11l-1.03,1.79c-0.06,0.11 -0.04,0.24 0.06,0.32l1.07,0.86c-0.03,0.29 -0.04,0.58 -0.01,0.86l-1.07,0.85c-0.1,0.08 -0.12,0.21 -0.06,0.32l1.03,1.79c0.06,0.11 0.19,0.15 0.31,0.11l1.27,-0.5c0.23,0.17 0.48,0.31 0.75,0.42l0.2,1.36c0.02,0.12 0.12,0.21 0.25,0.21h2.07c0.12,0 0.23,-0.09 0.25,-0.21l0.2,-1.36c0.26,-0.11 0.51,-0.26 0.74,-0.42l1.28,0.5c0.12,0.05 0.25,0 0.31,-0.11l1.03,-1.79c0.06,-0.11 0.04,-0.24 -0.06,-0.32L22.71,18.43zM19,19.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S19.83,19.5 19,19.5z"/>
+</vector>
diff --git a/res/drawable/ic_warning.xml b/res/drawable/ic_warning.xml
index 0ea4785..577fee9 100644
--- a/res/drawable/ic_warning.xml
+++ b/res/drawable/ic_warning.xml
@@ -22,6 +22,6 @@
android:viewportHeight="36.0"
android:viewportWidth="36.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M1.5 31.5H34.5L18 3L1.5 31.5ZM19.5 27H16.5V24H19.5V27ZM19.5 21H16.5V15H19.5V21Z"/>
</vector>
diff --git a/res/drawable/ic_wifi_tethering.xml b/res/drawable/ic_wifi_tethering.xml
index 402a69b..09ee1c9 100644
--- a/res/drawable/ic_wifi_tethering.xml
+++ b/res/drawable/ic_wifi_tethering.xml
@@ -20,5 +20,5 @@
android:viewportHeight="24.0">
<path
android:pathData="M12,11c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,13a6,6 0,0 0,-6.75 -5.95c-2.62,0.32 -4.78,2.41 -5.18,5.02 -0.32,2.14 0.49,4.11 1.92,5.39 0.48,0.43 1.24,0.33 1.56,-0.23 0.24,-0.42 0.14,-0.94 -0.22,-1.26a3.99,3.99 0,0 1,-1.22 -3.94,3.954 3.954,0 0,1 2.9,-2.91A4.007,4.007 0,0 1,16 13c0,1.18 -0.51,2.23 -1.33,2.96 -0.36,0.33 -0.47,0.85 -0.23,1.27 0.31,0.54 1.04,0.69 1.5,0.28A5.97,5.97 0,0 0,18 13zM10.83,3.07c-4.62,0.52 -8.35,4.33 -8.78,8.96a9.966,9.966 0,0 0,4.02 9.01c0.48,0.35 1.16,0.2 1.46,-0.31 0.25,-0.43 0.14,-0.99 -0.26,-1.29 -2.28,-1.69 -3.65,-4.55 -3.16,-7.7 0.54,-3.5 3.46,-6.29 6.98,-6.68C15.91,4.51 20,8.28 20,13c0,2.65 -1.29,4.98 -3.27,6.44 -0.4,0.3 -0.51,0.85 -0.26,1.29 0.3,0.52 0.98,0.66 1.46,0.31A9.96,9.96 0,0 0,22 13c0,-5.91 -5.13,-10.62 -11.17,-9.93z"
- android:fillColor="?attr/iconColor"/>
+ android:fillColor="@color/icon_color_default"/>
</vector>
diff --git a/res/drawable/privacy_app_permissions.xml b/res/drawable/privacy_app_permissions.xml
index d0fff6d..15b10ab 100644
--- a/res/drawable/privacy_app_permissions.xml
+++ b/res/drawable/privacy_app_permissions.xml
@@ -21,6 +21,6 @@
android:viewportHeight="48.0"
android:viewportWidth="48.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M22 31.1666C24.0259 31.1666 25.6667 29.5258 25.6667 27.5C25.6667 25.4741 24.0259 23.8333 22 23.8333C19.9742 23.8333 18.3334 25.4741 18.3334 27.5C18.3334 29.5258 19.9742 31.1666 22 31.1666ZM33 14.6666H31.1667V11C31.1667 5.93998 27.06 1.83331 22 1.83331C16.94 1.83331 12.8334 5.93998 12.8334 11H16.3167C16.3167 7.86498 18.865 5.31665 22 5.31665C25.135 5.31665 27.6834 7.86498 27.6834 11V14.6666H11C8.97421 14.6666 7.33337 16.3075 7.33337 18.3333V36.6666C7.33337 38.6925 8.97421 40.3333 11 40.3333H33C35.0259 40.3333 36.6667 38.6925 36.6667 36.6666V18.3333C36.6667 16.3075 35.0259 14.6666 33 14.6666ZM33 36.6666H11V18.3333H33V36.6666Z"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/privacy_location.xml b/res/drawable/privacy_location.xml
index b59d528..cdb272f 100644
--- a/res/drawable/privacy_location.xml
+++ b/res/drawable/privacy_location.xml
@@ -21,6 +21,6 @@
android:viewportHeight="48.0"
android:viewportWidth="48.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M22 3.66669C14.9141 3.66669 9.16663 9.41419 9.16663 16.5C9.16663 26.125 22 40.3334 22 40.3334C22 40.3334 34.8333 26.125 34.8333 16.5C34.8333 9.41419 29.0858 3.66669 22 3.66669ZM22 21.0834C19.47 21.0834 17.4166 19.03 17.4166 16.5C17.4166 13.97 19.47 11.9167 22 11.9167C24.53 11.9167 26.5833 13.97 26.5833 16.5C26.5833 19.03 24.53 21.0834 22 21.0834Z"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/privacy_mic.xml b/res/drawable/privacy_mic.xml
index 595e46f..cad4f1d 100644
--- a/res/drawable/privacy_mic.xml
+++ b/res/drawable/privacy_mic.xml
@@ -13,14 +13,17 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-
+<!-- Icon is intended to match frameworks/base/core/res/res/drawable/perm_group_microphone.xml -->
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="@dimen/icon_size"
- android:height="@dimen/icon_size"
- android:viewportHeight="48.0"
- android:viewportWidth="48.0">
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
<path
- android:fillColor="?attr/iconColor"
- android:pathData="M22 25.6667C25.0341 25.6667 27.4816 23.2009 27.4816 20.1667L27.5 9.16669C27.5 6.12335 25.0433 3.66669 22 3.66669C18.9658 3.66669 16.5 6.12335 16.5 9.16669V20.1667C16.5 23.2009 18.9658 25.6667 22 25.6667ZM31.7166 20.1667C31.7166 25.6667 27.0691 29.5167 22 29.5167C16.94 29.5167 12.2833 25.6667 12.2833 20.1667H9.16663C9.16663 26.4275 14.1533 31.5975 20.1666 32.4867V38.5H23.8333V32.4867C29.8466 31.5975 34.8333 26.4275 34.8333 20.1667H31.7166Z"/>
+ android:fillColor="@color/icon_color_default"
+ android:pathData="M12,14c1.66,0 3,-1.34 3,-3V5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6C9,12.66 10.34,14 12,14zM11,5c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v6c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1V5z"/>
+ <path
+ android:fillColor="@color/icon_color_default"
+ android:pathData="M17,11c0,2.76 -2.24,5 -5,5s-5,-2.24 -5,-5H5c0,3.53 2.61,6.43 6,6.92V21h2v-3.08c3.39,-0.49 6,-3.39 6,-6.92H17z"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/privacy_vehicle_data.xml b/res/drawable/privacy_vehicle_data.xml
index 07e417e..8546e35 100644
--- a/res/drawable/privacy_vehicle_data.xml
+++ b/res/drawable/privacy_vehicle_data.xml
@@ -21,6 +21,6 @@
android:viewportHeight="48.0"
android:viewportWidth="48.0">
<path
- android:fillColor="?attr/iconColor"
+ android:fillColor="@color/icon_color_default"
android:pathData="M34.8333 16.5H27.5V5.5H16.5V16.5H9.16663L22 29.3333L34.8333 16.5ZM9.16663 33V36.6667H34.8333V33H9.16663Z"/>
</vector>
\ No newline at end of file
diff --git a/res/layout/choose_lock_pattern.xml b/res/layout/choose_lock_pattern.xml
index f34bc79..75bf474 100644
--- a/res/layout/choose_lock_pattern.xml
+++ b/res/layout/choose_lock_pattern.xml
@@ -36,7 +36,7 @@
android:layout_gravity="center_vertical"
android:layout_weight="@integer/content_weight">
- <com.android.internal.widget.LockPatternView
+ <com.android.car.settings.security.CarLockPatternView
android:id="@+id/lockPattern"
style="@style/LockPattern"
android:layout_width="wrap_content"
diff --git a/res/layout/confirm_lock_pattern.xml b/res/layout/confirm_lock_pattern.xml
index d546746..71f16d6 100644
--- a/res/layout/confirm_lock_pattern.xml
+++ b/res/layout/confirm_lock_pattern.xml
@@ -42,7 +42,7 @@
android:gravity="center"
android:textAppearance="?android:attr/textAppearanceMedium"/>
- <com.android.internal.widget.LockPatternView
+ <com.android.car.settings.security.CarLockPatternView
android:id="@+id/lockPattern"
style="@style/LockPattern"
android:layout_width="@dimen/confirm_pattern_dimension"
diff --git a/res/layout/data_usage_edit_text_preference.xml b/res/layout/data_usage_edit_text_preference.xml
new file mode 100644
index 0000000..723e41c
--- /dev/null
+++ b/res/layout/data_usage_edit_text_preference.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <EditText
+ android:id="@+id/data_usage_edit_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:ems="@integer/data_usage_bytes_threshold_ems"
+ android:inputType="numberDecimal"
+ android:maxLines="1"
+ android:textAppearance="?android:attr/textAppearanceLarge"/>
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/data_usage_summary_preference.xml b/res/layout/data_usage_summary_preference.xml
index 0d9c198..0656efc 100644
--- a/res/layout/data_usage_summary_preference.xml
+++ b/res/layout/data_usage_summary_preference.xml
@@ -22,7 +22,6 @@
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:orientation="vertical"
- android:paddingBottom="@dimen/data_usage_summary_preference_padding_bottom"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingStart="?android:attr/listPreferredItemPaddingStart">
<TextView
@@ -46,7 +45,6 @@
android:id="@+id/progress_bar_labels"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/usage_indicator_preference_label_margin_bottom"
android:layout_marginTop="@dimen/usage_indicator_preference_label_margin_top"
android:orientation="horizontal">
<TextView android:id="@android:id/text1"
@@ -66,20 +64,11 @@
</LinearLayout>
<TextView
- android:id="@+id/data_limit_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"/>
- <TextView
- android:id="@+id/remaining_billing_cycle_time_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"/>
- <TextView
android:id="@+id/carrier_info_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"/>
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:layout_marginTop="@dimen/usage_indicator_preference_label_margin_bottom"/>
<Button
android:id="@+id/manage_subscription_button"
android:layout_width="wrap_content"
diff --git a/res/layout/multi_action_preference_toggle_button.xml b/res/layout/multi_action_preference_toggle_button.xml
index dba0993..f3800d5 100644
--- a/res/layout/multi_action_preference_toggle_button.xml
+++ b/res/layout/multi_action_preference_toggle_button.xml
@@ -18,6 +18,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/multi_action_preference_toggle_button"
android:background="@android:color/transparent"
+ android:defaultFocusHighlightEnabled="false"
android:layout_width="@dimen/multi_action_preference_toggle_button_size"
android:layout_height="@dimen/multi_action_preference_toggle_button_size"
android:layout_marginTop="@dimen/multi_action_preference_toggle_button_margin"
diff --git a/res/layout/preference_dialog_password_edittext.xml b/res/layout/preference_dialog_password_edittext.xml
index bcfd422..31b3a9e 100644
--- a/res/layout/preference_dialog_password_edittext.xml
+++ b/res/layout/preference_dialog_password_edittext.xml
@@ -38,6 +38,7 @@
android:id="@android:id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:textAlignment="viewStart"
android:layout_marginEnd="@dimen/alert_dialog_edit_text_margin_end"
android:layout_marginStart="@dimen/alert_dialog_edit_text_margin_start"/>
diff --git a/res/layout/summary_preference.xml b/res/layout/summary_preference.xml
new file mode 100644
index 0000000..d263b19
--- /dev/null
+++ b/res/layout/summary_preference.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
+ android:tag="carUiPreference">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
+ android:textAppearance="@style/TextAppearance.CarUi.PreferenceTitle"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"/>
+
+ <TextView
+ android:id="@+id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/entity_header_inner_margin"
+ android:textAppearance="@style/TextAppearance.CarUi.PreferenceSummary"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"/>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/values-af/arrays.xml b/res/values-af/arrays.xml
index b4043fd..bf7bde3 100644
--- a/res/values-af/arrays.xml
+++ b/res/values-af/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Moet nooit toelaat nie"</item>
<item msgid="1154273129608299386">"Laat altyd toe"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index f5b752d..7d1963b 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Nagmodus"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Netwerk en internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Selnetwerk"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-kaarte</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM-kaart</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-kaart}other{# SIM-kaarte}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktief / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Onaktief / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktief / Afgelaaide SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Voeg nog by"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiele data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Kry toegang tot data deur selnetwerk"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Selnetwerk"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Gebruik mobiele data"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Skakel mobiele data af?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Keuse vereis"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Gebruik <xliff:g id="CARRIER">%1$s</xliff:g> vir mobiele data?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g>-datawaarskuwing"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g>-datalimiet"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g>-datawaarskuwing / <xliff:g id="ID_2">^2</xliff:g>-datalimiet"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d dae oor</item>
- <item quantity="one">%d dag oor</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# dag oor}other{# dae oor}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Geen tyd oor nie"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Minder as 1 dag oor"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> gelede opgedateer deur <xliff:g id="ID_1">^1</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Stel"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Datawaarskuwing en -limiet"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Programdatagebruiksiklus"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobieledatagebruik"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Stel datawaarskuwing"</string>
<string name="data_warning" msgid="116776633806885370">"Datawaarskuwing"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Stel datalimiet"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Jou voertuig se hoofeenheid sal mobiele data afskakel wanneer dit die limiet wat jy gestel het, bereik het.\n\nOorweeg dit om \'n konserwatiewe limiet te stel omdat die datagebruik deur die hoofeenheid gemeet word terwyl jou diensverskaffer die gebruik dalk anders bereken."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Stel datagebruikwaarskuwing"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Stel datagebruiklimiet"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Datagebruik word deur jou toestel gemeet. Dit kan van jou selfoondiensverskaffer se data verskil."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Stel"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Stoor"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-netwerk"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Voertuiginternet"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"As jy die voertuiginternet afskakel, kan sommige kenmerke of programme dalk ophou werk.\n\nKritieke data wat nodig is vir jou voertuig om te werk, sal nog met die voertuigvervaardiger gedeel word."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Skakel in elk geval af"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Voertuiginternet is afgeskakel. Dit kan sommige kenmerke of programme dalk verhoed om te werk. Kritieke data wat nodig is om jou voertuig te laat werk, sal steeds met die voertuigvervaardiger gedeel word."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s gebruik tussen %2$s en %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Sluit by ander netwerk aan"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Netwerkvoorkeure"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Voeg netwerk by"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Koppel"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Koppel tans …"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nie gekoppel nie"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Netwerk nie binne sendbereik nie"</string>
<string name="wifi_password" msgid="5565632142720292397">"Wagwoord"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Wys wagwoord"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Kies 1+ band vir warmkol:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Warmkol en verbinding"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Warmkol"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Af"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Skakel warmkol outomaties af"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi-Fi-warmkol sal afskakel as geen toestelle gekoppel is nie"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> wil Wi-Fi aanskakel"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Dwing stop"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Dwing stop?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"As jy \'n program dwing om te stop, kan dit wangedra."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Skakel werkverrigtingbeskerming af?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"As jy dit doen, sal jou sagte- en hardeware nie so goed werk nie."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Los aan"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Skakel af"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Skakel Prioritiseer Programwerkverrigting aan?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"As jy dit aanskakel, kan dit potensiële stelselonstabiliteit of \'n langtermynimpak op hardware veroorsaak. Wil jy voortgaan?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ja"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nee, dankie"</string>
<string name="disable_text" msgid="4358165448648990820">"Deaktiveer"</string>
<string name="enable_text" msgid="1794971777861881238">"Aktiveer"</string>
<string name="uninstall_text" msgid="277907956072833012">"Deïnstalleer"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Toestemmings"</string>
<string name="notifications_label" msgid="6586089149665170731">"Kennisgewings"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Berging en kas"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Verseker topwerkverrigting"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritiseer programwerkverrigting"</string>
<string name="application_version_label" msgid="8556889839783311649">"Weergawe: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Geen toestemmings is verleen nie"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Geen toestemmings is versoek nie"</string>
<string name="unused_apps" msgid="648471933781010395">"Ongebruikte programme"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ongebruikte programme</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ongebruikte program</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ongebruikte program}other{# ongebruikte programme}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Verwyder toestemmings en maak spasie oop"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s se interne berging"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Maak program toe en keer oormatige hulpbrongebruik waar nodig"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Gebruik stelselhulpbronne om programwerkverrigting te prioritiseer"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Datagebruik"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Programdatagebruik"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Gebruikgeskiedenis"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Alle programme"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data- en wi-fi-gebruik"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Gebruikgeskiedenis"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Totale gebruik"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Voorgrond"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Agtergrond"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Laat data toe"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Laat dié program toe om mobiele data te gebruik"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Beperk data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Gebruik mobiele data net as program op voorgrond is"</string>
<string name="computing_size" msgid="5791407621793083965">"Bereken tans …"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> bykomende toestemmings</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> bykomende toestemming</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# bykomende toestemming}other{# bykomende toestemmings}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Let wel: Ná \'n herselflaai kan hierdie program nie begin voordat jy jou voertuig ontsluit het nie."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Bystand en steminvoer"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Bystandprogram"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi-beheer laat \'n program toe om Wi-Fi aan of af te skakel, Wi-Fi-netwerke te soek en aan hulle te koppel, netwerke by te voeg of te verwyder, en om \'n warmkol wat net plaaslik is, te begin."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Meer"</string>
<string name="location_settings_title" msgid="901334356682423679">"Ligging"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Gebruik ligging"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Gee programme wat jy spesifiseer toegang tot jou ligging"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"As jy dit afskakel, sal liggingtoegang vir alle programme afgeskakel word. Bestuurderbystandprogramme sal steeds toegang hê."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Gebruik ligging vir bestuurderbystand"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Voertuigligging is af"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Bestuurderbystandprogramme het nie toegang tot jou ligging nie"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Verander"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Gee programme wat jou help bestuur, toegang tot jou ligging"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"As jy dit afskakel, sal bestuurderbystandkenmerke wat op ligginginligting staatmaak, gedeaktiveer word."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Skakel in elk geval af"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Onlangse liggingversoeke"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Geen onlangse liggingversoeke nie"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Programvlaktoestemmings"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Liggingdienste"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Gebruik ligging"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Ligging kan bronne soos GPS, wi-fi, selnetwerke en sensors gebruik om te help om jou toestel se ligging te skat."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Bestuurderbystand"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Ligginginligting wat na bestuurderbystandprogramme toe gestuur word, bevat nie inligting wat jou identifiseer nie. Dit word hoogstens 2 dae lank geberg voordat dit uitgevee word."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofoon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Gebruik mikrofoon"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Gee programme toegang tot jou mikrofoon"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Bestuur mikrofoontoestemmings"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Onlangs toegang gekry"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Geen onlangse programme nie"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 programme het toegang"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# van {total_count} programme het toegang}other{# van {total_count} programme het toegang}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Onlangs gebruik"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Bekyk alles"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Laai tans …"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Stelsel"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Stelselopdaterings"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Gevorderd"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Derdepartylisensies"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Kon nie die lisensies laai nie."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Laai tans …"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Jy het nou <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> stappe oor voordat jy \'n ontwikkelaar is.</item>
- <item quantity="one">Jy het nou <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> stap oor voordat jy \'n ontwikkelaar is.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Jy het nou # stap oor voordat jy \'n ontwikkelaar is.}other{Jy het nou # stappe oor voordat jy \'n ontwikkelaar is.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Jy is nou \'n ontwikkelaar!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Dis nie nodig nie – jy is reeds \'n ontwikkelaar."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Ontwikkelaaropsies"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Nadat jy \'n nuwe profiel geskep het, moet daardie persoon dit self pasmaak."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Programme kan vanaf enige profiel opgedateer word om deur alle ander profiele gebruik te word."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profiellimiet is bereik"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Jy kan tot <xliff:g id="COUNT">%d</xliff:g> profiele skep.</item>
- <item quantity="one">Net een profiel kan geskep word.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Net een profiel kan geskep word.}other{Jy kan tot # profiele skep.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Kon nie nuwe profiel skep nie"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Vee hierdie profiel uit?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Alle programme en data vir hierdie profiel sal uitgevee word"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Kon nie profiel uitvee nie."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profiel is nie uitgevee nie. Herbegin die toestel en probeer weer."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Hierdie profiel sal uitgevee word wanneer jy profiele wissel of die voertuig weer aanskakel."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Maak toe"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Herprobeer"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Hoe om \'n ontsluitpatroon te teken"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Kon nie patroon stoor nie"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Te veel verkeerde pogings. Probeer oor <xliff:g id="NUMBER">%d</xliff:g> sekondes weer."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Patroon steun nie rotasie nie; gebruik raak"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Verwyder skermslot?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Dit sal enigiemand toegang tot jou rekening gee"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Jou IT-administrateur blokkeer algemene PIN\'e. Probeer \'n ander PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Dit mag nie \'n ongeldige karakter insluit nie."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Wagwoord is ongeldig; moet minstens 4 karakters lank wees."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Moet minstens <xliff:g id="COUNT">%d</xliff:g> letters bevat</item>
- <item quantity="one">Moet minstens een letter bevat</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Moet minstens <xliff:g id="COUNT">%d</xliff:g> kleinletters bevat</item>
- <item quantity="one">Moet minstens 1 kleinletter bevat</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Moet minstens <xliff:g id="COUNT">%d</xliff:g> hoofletters bevat</item>
- <item quantity="one">Moet minstens 1 hoofletter bevat</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Moet minstens <xliff:g id="COUNT">%d</xliff:g> syfers bevat</item>
- <item quantity="one">Moet minstens 1 syfer bevat</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Moet minstens <xliff:g id="COUNT">%d</xliff:g> spesiale simbole bevat</item>
- <item quantity="one">Moet minstens 1 spesiale simbool bevat</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Moet minstens <xliff:g id="COUNT">%d</xliff:g> nieletterkarakters bevat</item>
- <item quantity="one">Moet minstens 1 nieletterkarakter bevat</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Toesteladministrateur laat nie toe dat \'n onlangse wagwoord gebruik word nie"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Kon nie wagwoord stoor nie"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Jou IT-administrateur blokkeer algemene wagwoorde. Probeer \'n ander wagwoord."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Voeg \'n profiel by"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Vee hierdie profiel uit"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Voeg profiel by"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Skermhelderheid"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Skakel Bluetooth aan om jou toestelle te sien"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Maak Bluetooth-instellings oop om \'n toestel saam te bind"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Inligtingvermaakstelseladmin"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Geaktiveerde programme"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Gedeaktiveerde programme"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Programme met hierdie toestemming het toegang tot hierdie voertuig se data"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Geen voertuigadministrateurprogramme nie"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Die inligtingvermaakstelsel se administrasieprogram is aktief en laat die program <xliff:g id="APP_NAME">%1$s</xliff:g> toe om die volgende bewerkings uit te voer:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Die aktivering van hierdie inligtingvermaakstelselprogram sal die program <xliff:g id="APP_NAME">%1$s</xliff:g> toelaat om die volgende bewerkings uit te voer:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktiveer dié inligtingvermaakstelselapp?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktiveer hierdie inligtingvermaakstelselprogram"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktiveer en deïnstalleer"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deaktiveer hierdie inligtingvermaakstelselprogram"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Meer besonderhede"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Die organisasiebestuurder kan programme en data wat met hierdie profiel geassosieer word, insluitend instellings, toestemmings, korporatiewe toegang, netwerkaktiwiteit en die voertuig se ligginginligting, monitor en bestuur."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Die organisasiebestuurder kan programme en data wat met hierdie profiel geassosieer word, insluitend instellings, toestemmings, korporatiewe toegang, netwerkaktiwiteit en die toestel se ligginginligting, monitor en bestuur."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Die organisasiebestuurder kan programme en data wat met hierdie inligtingvermaakstelsel geassosieer word, insluitend instellings, toestemmings, korporatiewe toegang, netwerkaktiwiteit en die voertuig se ligginginligting, monitor en bestuur."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Die organisasiebestuurder sal dalk toegang kan kry tot data wat met hierdie inligtingvermaakstelsel geassosieer word, programme kan bestuur en hierdie voertuig se instellings kan verander."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Dit is onbeskikbaar"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Kan nie volume in hierdie bestuurde voertuig verander nie"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Kan nie oproepe in hierdie bestuurde voertuig maak nie"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Mag nie SMS\'e in hierdie bestuurde voertuig stuur nie"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera is nie in hierdie bestuurde voertuig beskikbaar nie"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Kan nie skermskote in hierdie bestuurde voertuig neem nie"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Kan nie hierdie program in hierdie bestuurde voertuig oopmaak nie"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Geblokkeer deur jou kredietverskaffer"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Die organisasie beperk toegang tot sekere van die kenmerke.\n\nKontak die organisasiebestuurder as jy vrae het."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Voertuigadministrasieprogramme"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# geaktiveerde program}other{# geaktiveerde programme}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Geen geaktiveerde programme nie"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> se voertuigbeleid"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Instellings wat deur die organisasiebestuurder bestuur word"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Kom meer te wete oor <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Deel foutverslag?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Hierdie voertuig se organisasiebestuurder het \'n foutverslag versoek om met die foutsporing van hierdie toestel te help. Programme en data sal dalk gedeel word."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Hierdie voertuig se organisasiebestuurder het \'n foutverslag versoek om met die foutsporing van hierdie toestel te help. Programme en data sal dalk gedeel word en jou toestel sal dalk tydelik stadiger wees."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Hierdie foutverslag word met hierdie voertuig se organisasiebestuurder gedeel. Kontak hulle vir meer besonderhede."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Deel"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Wys af"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Hierdie instelling kan nie nou onmiddellik verander word nie"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Toeganklikheid"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Onderskrifte"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Onderskrifvoorkeure"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Af"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Aan"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Skermleser"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Wys onderskrifte"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Teksgrootte"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Grootte en styl van onderskrif"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Baie klein"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Klein"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Verstek"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Groot"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Baie groot"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Onderskrifstyl"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Stel volgens program"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Wit op swart"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Swart op wit"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Geel op swart"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Geel op blou"</string>
</resources>
diff --git a/res/values-am/arrays.xml b/res/values-am/arrays.xml
index bef6b89..76d40e9 100644
--- a/res/values-am/arrays.xml
+++ b/res/values-am/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"በጭራሽ አትፍቀድ"</item>
<item msgid="1154273129608299386">"ሁልጊዜ ፍቀድ"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 895a8af..d4963d2 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"የሌሊት ሁነታ"</string>
<string name="network_and_internet" msgid="4229023630498537530">"አውታረ መረብ እና በይነመረብ"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"የተንቀሳቃሽ ስልክ አውታረ መረብ"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ሲሞች</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ሲሞች</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# ሲም}one{# ሲሞች}other{# ሲሞች}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"ገቢር / ሲም"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"ገቢር ያልሆነ / ሲም"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"ገቢር / የወረደ ሲም"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"ተጨማሪ ያክሉ"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"የተንቀሳቃሽ ስልክ ውሂብ"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"የተንቀሳቃሽ ስልክ አውታረ መረብን በመጠቀም ውሂብን ይድረሱበት"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"የተንቀሳቃሽ ስልክ አውታረ መረብ"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"የተንቀሳቃሽ ስልክ ውሂብን ተጠቀም"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"የተንቀሳቃሽ ስልክ ውሂብ ይጥፋ?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"መምረጥ ያስፈልጋል"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"ለተንቀሳቃሽ ውሂብ <xliff:g id="CARRIER">%1$s</xliff:g>ን ይጠቀሙ?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"የ<xliff:g id="ID_1">^1</xliff:g> ውሂብ ማስጠንቀቂያ"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"የ<xliff:g id="ID_1">^1</xliff:g> ውሂብ ገደብ"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"የ<xliff:g id="ID_1">^1</xliff:g> ውሂብ ማስጠንቀቂያ / የ<xliff:g id="ID_2">^2</xliff:g> ውሂብ ገደብ"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d ቀናት ቀርተዋል</item>
- <item quantity="other">%d ቀናት ቀርተዋል</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# ቀን ቀርቷል}one{# ቀኖች ቀርተዋል}other{# ቀኖች ቀርተዋል}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"ምንም ጊዜ አይቀርም"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"ከ1 ቀን በታች ቀርቷል"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"ከ<xliff:g id="ID_2">^2</xliff:g> በፊት በ<xliff:g id="ID_1">^1</xliff:g> ተዘምኗል"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"አዘጋጅ"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"የውሂብ ማስጠንቀቂያ እና ገደብ"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"የመተግበሪያ ውሂብ አጠቃቀም ዑደት"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"የተንቀሳቃሽ ስልክ ውሂብ አጠቃቀም"</string>
<string name="set_data_warning" msgid="6628236612886588097">"የውሂብ ማስጠንቀቂያ አዘጋጅ"</string>
<string name="data_warning" msgid="116776633806885370">"የውሂብ ማስጠንቀቂያ"</string>
<string name="set_data_limit" msgid="7136539812414500084">"የውሂብ ገደብ ያዘጋጁ"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"የእርስዎ ተሽከርካሪ ዋናው አሃድ አንዴ ያዘጋጁት ገደብ ላይ ሲደርስ የተንቀሳቃሽ ስልክ ውሂቡን ያጠፋዋል።\n\nየውሂብ አጠቃቀም የሚለካው በዋናው አሃድ፣ እና የአገልግሎት አቅራቢዎ አጠቃቀም በተለየ መልኩ ሊቆጥር የሚችል እንደመሆኑ መጠን ቆጠብ ያለ ገደብ ማዘጋጀቱን ያስቡበት።"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"የውሂብ አጠቃቀም ማስጠንቀቂያ ያቀናብሩ"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"የውሂብ አጠቃቀም ወሰን አቀናብር"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"የውሂብ አጠቃቀም የሚለካው በመሣሪያዎ ነው። ከተንቀሳቃሽ ስልክ አገልግሎት አቅራቢዎ ውሂብ ሊለይ ይችላል።"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"አቀናብር"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"አስቀምጥ"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"የOEM አውታረ መረብ"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"የተሽከርካሪ በይነመረብ"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"የተሽከርካሪ በይነመረብን ማጥፋት አንዳንድ የተሽከርካሪ ባህሪዎች ወይም መተግበሪያዎች እንዳይሰሩ ሊያግድ ይችላል።\n\nተሽከርካሪዎን ለማሰራት የሚያስፈልገው ወሳኝ ውሂብ ለተሽከርካሪው አምራች ማጋራቱን ይቀጥላል።"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"ለማንኛውም አጥፋ"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"የተሽከርካሪ በይነመረብ ጠፍቷል። ይህ አንዳንድ የተሽከርካሪ ባህሪዎች ወይም መተግበሪያዎች እንዳይሠሩ ሊያግድ ይችላል። ተሽከርካሪዎን ለማሰራት የሚያስፈልገው ወሳኝ ውሂብ ከተሽከርካሪው አምራች ጋር መጋራቱን ይቀጥላል።"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s ላይ %1$s ጥቅም ላይ ውሏል"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"ሌላ አውታረ መረብ ይቀላቀሉ"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"የአውታረ መረብ ምርጫዎች"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"አውታረ መረብ አክል"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"አገናኝ"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"በማገናኘት ላይ…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"አልተገናኘም"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"አውታረ መረብ በክልል ውስጥ አይደለም"</string>
<string name="wifi_password" msgid="5565632142720292397">"የይለፍ ቃል"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"የይለፍ ቃል አሳይ"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"ለWi-Fi መገናኛ ነጥብ ቢያንስ አንድ ሞገድ ይምረጡ፦"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"የመገናኛ ነጥብ እና እንደ ሞደም መጠቀም"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"መገናኛ ነጥብ"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ጠፍቷል"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"መገናኛ ነጥብን በራስሰር አጥፋ"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi መገናኛ ነጥብ ምንም መሣሪያዎች ካልተገናኙ ይጠፋል"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> Wi-Fiን ማብራት ይፈልጋል"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"በኃይል አቁም"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"በኃይል አቁም?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"መተግበሪያን በጉልበት እንዲቆም ካደረጉት ከአደብ ውጪ ሊሆን ይችላል።"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"የአፈጻጸም ጥበቃ ይጥፋ?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"ይህን ካደረጉ የእርስዎ ሶፍትዌር እና ሃርድዌር እንዲሁም ላይሰሩ ይችላሉ።"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"እንደበራ ተወው"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"አጥፋ"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"ለመተግበሪያ አፈጻጸም ቅድሚያ መስጠት ይብራ?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"እሱን ማብራት ሊከሰት የሚችል የስርዓት አለመረጋጋትን ወይም የረጅም ጊዜ የሃርድዌር ተፅእኖን ሊያስከትል ይችላል። መቀጠል ይፈልጋሉ?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"አዎ"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"አይ፣ አመሰግናለሁ"</string>
<string name="disable_text" msgid="4358165448648990820">"አሰናክል"</string>
<string name="enable_text" msgid="1794971777861881238">"አንቃ"</string>
<string name="uninstall_text" msgid="277907956072833012">"አራግፍ"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"ፈቃዶች"</string>
<string name="notifications_label" msgid="6586089149665170731">"ማሳወቂያዎች"</string>
<string name="storage_application_label" msgid="5911779903670978586">"ማከማቻ እና መሸጎጫ"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"ከፍተኛ አፈጻጸምን አረጋግጥ"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ለመተግበሪያ አፈጻጸም ቅድሚያ ይስጡ"</string>
<string name="application_version_label" msgid="8556889839783311649">"ስሪት፦ %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ምንም ፈቃዶች አልተሰጡም"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ምንም ፈቃዶች አልተጠየቁም"</string>
<string name="unused_apps" msgid="648471933781010395">"ስራ ላይ ያልዋሉ መተግበሪያዎች"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ጥቅም ላይ ያልዋሉ መተግበሪያዎች</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ጥቅም ላይ ያልዋሉ መተግበሪያዎች</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ስራ ላይ ያልዋለ መተግበሪያ}one{# ስራ ላይ ያልዋሉ መተግበሪያዎች}other{# ስራ ላይ ያልዋሉ መተግበሪያዎች}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"ፈቃዶችን ያስወግዱ እና ቦታ ያስለቅቁ"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s በውስጣዊ ማከማቻ ውስጥ ነው"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"አስፈላጊ ሆኖ ሲገኝ ግብዓቶችን ከልክ በላይ ላለመጠቀም መተግበሪያን ይዝጉ"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ለመተግበሪያ አፈጻጸም ቅድሚያ ለመስጠት የስርዓት ንብረቶችን ይጠቀማል"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"የውሂብ አጠቃቀም"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"የመተግበሪያ ውሂብ አጠቃቀም"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"የአጠቃቀም ታሪክ"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"ሁሉም መተግበሪያዎች"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"የውሂብ እና የWi-Fi አጠቃቀም"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"የአጠቃቀም ታሪክ"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"ጠቅላላ አጠቃቀም"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ቅድመ ገፅ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ዳራ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ውሂብ ይፍቀዱ"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"ይህ መተግበሪያ የተንቀሳቃሽ ስልክ ውሂብን እንዲጠቀም ይፍቀዱ"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ውሂብን ገድብ"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"መተግበሪያው በቀዳሚው ገጽ ላይ ሲሆን ብቻ የተንቀሳቃሽ ስልክ ውሂብን ይጠቀሙ"</string>
<string name="computing_size" msgid="5791407621793083965">"በማስላት ላይ…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ተጨማሪ ፈቃዶች</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ተጨማሪ ፈቃዶች</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# ተጨማሪ ፈቃድ}one{# ተጨማሪ ፈቃዶች}other{# ተጨማሪ ፈቃዶች}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"ማስታወሻ፦ ከዳግም ማስነሳት በኋላ ይህ መተግበሪያ ተሽከርካሪዎን እስከሚከፍቱት ድረስ ሊጀምር አይችልም።"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"እገዛ እና የድምጽ ግቤት"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"የእገዛ መተግበሪያ"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi መቆጣጠሪያ አንድ መተግበሪያ Wi-Fiን እንዲያበራ ወይም እንዲያጠፋ፣ የWi-Fi አውታረ መረቦች እንዲቃኝ እና ከእነሱ ጋር እንዲገናኝ፣ አውታረ መረቦችን እንዲያክል ወይም እንዲያስወግድድ፣ ወይም የአካባቢ-ብቻ መገናኛ ነጥብን እንዲያስጀምርር ያስችለዋል።"</string>
<string name="more_special_access_title" msgid="166115485446645971">"ተጨማሪ"</string>
<string name="location_settings_title" msgid="901334356682423679">"አካባቢ"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"አካባቢን ተጠቀም"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"የጠቀሷቸው መተግበሪያዎች አካባቢዎን እንዲደርሱበት ይፍቀዱ"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"ይህን ካጠፉት ለሁሉም መተግበሪያዎች የአካባቢ መዳረሻን ያስወግዳል። የአሽከርካሪ ረዳት መተግበሪያዎች አሁንም መዳረሻ ይኖራቸዋል።"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ለአሽከርካሪ ረዳት አካባቢን ይጠቀሙ"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"የተሽከርካሪ አካባቢ ጠፍቷል"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"የአሽከርካሪ ረዳት መተግበሪያዎች ወደ አካባቢዎ መድረስ አይችሉም"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"ቀይር"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"መንዳትን የሚያግዙ መተግበሪያዎች አካባቢዎን እንዲደርሱ ይፍቀዱ"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"ይህን ካጠፉት በአከባቢ መረጃ ላይ የሚደገፉ የአሽከርካሪ ድጋፍ መተግበሪያዎች ይሰናከላሉ።"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"ለማንኛውም አጥፋ"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"የቅርብ ጊዜ የአካባቢ ጥያቄዎች"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ምንም የቅርብ ጊዜ የአካባቢ ጥያቄዎች የሉም"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"የመተግበሪያ ደረጃ ፈቃዶች"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"የአካባቢ አገልግሎቶች"</string>
<string name="location_use_location_title" msgid="117735895374606680">"አካባቢን ተጠቀም"</string>
<string name="location_settings_footer" msgid="296892848338100051">"አካባቢ የመሣሪያዎን አካባቢ እንዲገምት ለማገዝ እንደ ጂፒኤስ፣ Wi‑Fi፣ የተንቀሳቃሽ ስልክ አውታረ መረቦች እና ዳሳሾች ያሉ ምንጮችን ሊጠቀም ይችላል።"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"የአሽከርካሪ ረዳት"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ወደ የአሽከርካሪ ረዳት መተግበሪያዎች የተላከ የአካባቢ መረጃ እርስዎን የሚለይ መረጃ የለውም። ከመሰረዙ በፊት ቢበዛ ለ2 ቀናት ነው የሚከማቸው።"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"ማይክሮፎን"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"ማይክፎሮን ተጠቀም"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"ሁሉም መተግበሪያዎች የእርስዎን ማይክሮፎን እንዲደርሱ ይፍቀዱላቸው"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"የማይክሮፎን ፈቃዶችን ያቀናብሩ"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"በቅርብ ጊዜ የተደረሰ"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"ምንም የቅርብ ጊዜ መተግበሪያዎች የሉም"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 መተግበሪያዎች መዳረሻ አለው"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# ከ{total_count} መተግበሪያዎች መዳረሻ አለው}one{# ከ{total_count} መተግበሪያዎች መዳረሻ አላቸው}other{# ከ{total_count} መተግበሪያዎች መዳረሻ አላቸው}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"በቅርብ ጊዜ የተደረሰ"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"ሁሉንም ይመልከቱ"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"በመጫን ላይ…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"ሥርዓት"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"የሥርዓት ዝማኔዎች"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"ከፍተኛ"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"የሶስተኛ ወገን ፈቃዶች"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ፈቃዶቹን መጫን ላይ ችግር አለ።"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"በመጫን ላይ…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">አሁን ገንቢ ለመሆን <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ደረጃዎች ይቀርዎታል።</item>
- <item quantity="other">አሁን ገንቢ ለመሆን <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ደረጃዎች ይቀረዎታል።</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ገንቢ ለመሆን አሁን # ደረጃ ይቀረዎታል።}one{ገንቢ ለመሆን አሁን # ደረጃዎች ይቀረዎታል።}other{ገንቢ ለመሆን አሁን # ደረጃዎች ይቀረዎታል።}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"አሁን ገንቢ ሆነዋል!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"አያስፈልግም፣ አስቀድሞ ገንቢ ሆነዋል።"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"የገንቢ አማራጮች"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"አዲስ መገለጫ ከፈጠሩ በኋላ ያ ሰው ለራሱ ማበጀት አለበት።"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"መተግበሪያዎች ለሁሉም ሌሎች መገለጫዎች እንዲጠቀሙ ከማንኛውም መገለጫ ሊዘመኑ ይችላሉ።"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"የመገለጫ ከፍተኛው ገደብ ላይ ተደርሷል"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">እስከ <xliff:g id="COUNT">%d</xliff:g> መገለጫዎች ድረስ መፍጠር ይችላሉ።</item>
- <item quantity="other">እስከ <xliff:g id="COUNT">%d</xliff:g> መገለጫዎች ድረስ መፍጠር ይችላሉ።</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{አንድ መገለጫ ብቻ ነው ሊፈጠር የሚችለው።}one{እስከ # መገለጫዎች ድረስ መፍጠር ይችላሉ።}other{እስከ # መገለጫዎች ድረስ መፍጠር ይችላሉ።}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"አዲስ መገለጫ መፍጠር አልተቻለም"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ይህ መገለጫ ይሰረዝ?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ለዚህ መገለጫ ሁሉም መተግበሪያዎች እና ውሂብ ይሰረዛሉ"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"መገለጫ መሰረዝ አልተቻለም።"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"መገለጫ አልተሰረዘም። መሣሪያውን ዳግም ማስነሳት እና እንደገና መሞከር ይችላሉ።"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"እርስዎ መገለጫዎችን ሲቀይሩ ወይም ተሽከርካሪውን ዳግም ሲያስነሱት ይህ መገለጫ ይሰረዛል።"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"አሰናብት"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"እንደገና ሞክር"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"የመክፈቻ ስርዓተ ንጥል እንዴት እንደሚሳል"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"ስርዓተ-ጥለትን ማስቀመጥ ላይ ስህተት"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"ከልክ በላይ ብዙ የተሳሳቱ ሙከራዎች። በ<xliff:g id="NUMBER">%d</xliff:g> ሰከንዶች ውስጥ እንደገና ይሞክሩ።"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"ሥርዓተ ጥለት መሽከርከርን አይደግፍም፣ እባክዎ ንካን ይጠቀሙ"</string>
<string name="okay" msgid="4589873324439764349">"እሺ"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"ማያ ገጽ ቆላፊ ይወገድ?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"ይህ ማንም የፈለገ ሰው የእርስዎን መለያ እንዲደርስበት ይፈቅዳል"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"የተለመዱ ፒኖች በአይቲ አስተዳዳሪዎ የታገዱ ናቸው። የተለየ ፒን ይሞክሩ።"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"ይህ ልክ ያልሆነ ቁምፊን ማካተት አይችልም።"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"የይለፍ ቃል ልክ ያልሆነ ነው፣ ቢያንስ 4 ቁምፊዎች መሆን አለበት"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ፊደሎችን መያዝ አለበት</item>
- <item quantity="other">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ፊደሎችን መያዝ አለበት</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ንዑስ ሆሄዎችን መያዝ አለበት</item>
- <item quantity="other">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ንዑስ ሆሄዎችን መያዝ አለበት</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> አቢይ ሆሄዎችን መያዝ አለበት</item>
- <item quantity="other">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> አቢይ ሆሄዎችን መያዝ አለበት</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ቁጥራዊ አኃዞችን መያዝ አለበት</item>
- <item quantity="other">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ቁጥራዊ አኃዞችን መያዝ አለበት</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ልዩ ምልክቶችን መያዝ አለበት</item>
- <item quantity="other">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ልዩ ምልክቶችን መያዝ አለበት</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ፊደል ያልሆኑ ቁምፊዎችን መያዝ አለበት</item>
- <item quantity="other">ቢያንስ <xliff:g id="COUNT">%d</xliff:g> ፊደል ያልሆኑ ቁምፊዎችን መያዝ አለበት</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"የመሣሪያ አስተዳዳሪው የቅርብ ጊዜ የይለፍ ቃልን መጠቀም አይፈቅድም"</string>
<string name="error_saving_password" msgid="8334882262622500658">"የይለፍ ቃልን ማስቀመጥ ላይ ስህተት"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"የተለመዱ የይለፍ ቃላት በአይቲ አስተዳዳሪዎ የታገዱ ናቸው። የተለየ የይለፍ ቃል ይሞክሩ።"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"መገለጫን አክል"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ይህን መገለጫ ይሰርዙ"</string>
<string name="add_profile_text" msgid="9118410102199116969">"መገለጫን ያክሉ"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ብሩህነት ያሳዩ"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"የእርስዎን መሣሪያዎች ለማየት ብሉቱዝን ያብሩ"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"አንድ መሣሪያን ለማጣመር የብሉቱዝ ቅንብሮችን ይክፈቱ"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"የኢንፎቴይንመንት ስርዓት አስተዳዳሪ"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"የገበሩ መተግበሪያዎች"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"የተቦዘኑ መተግበሪያዎች"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ይህ ፈቃድ ያላቸው መተግበሪያዎች የዚህ ተሽከርካሪ ውሂብ መዳረሻ ይኖራቸዋል"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"የተሽከርካሪ አስተዳዳሪ መተግበሪያዎች የሉም"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"ይህ የኢንፎቴይንመንት ስርዓት አስተዳዳሪ መተግበሪያ ገቢር ሲሆን የ<xliff:g id="APP_NAME">%1$s</xliff:g> መተግበሪያ የሚከተሉትን ክወናዎች እንዲያከናውን ያስችለዋል፦"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"ይህን የኢንፎቴይንመንት ስርዓት መተግበሪያ ማግበር የ<xliff:g id="APP_NAME">%1$s</xliff:g> መተግበሪያ የሚከተሉትን ክንውኖች እንዲያከናውን ያስችለዋል፦"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"ይህ የኢንፎቴይንመንት ስርዓት መተግበሪያ ይንቃ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"ይህንን የኢንፎቴይንመንት ስርዓት መተግበሪያን አግብር"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"አቦዝን & አራግፍ"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"ይህንን የኢንፎቴይንመንት ስርዓት መተግበሪያን አቦዝን"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"ተጨማሪ ዝርዝሮች"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"የድርጅት አስተዳዳሪው ቅንብሮችን፣ ፈቃዶችን፣ የኮርፖሬት መዳረሻን፣ የአውታረ መረብ እንቅስቃሴን እና የተሽከርካሪውን አካባቢ መረጃን ጨምሮ ከዚህ መገለጫ ጋር የተጎዳኙ መተግበሪያዎችን እና ውሂብን መከታተል እና ማስተዳደር ይችላል።"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"የድርጅት አስተዳዳሪው ቅንብሮችን፣ ፈቃዶችን፣ የኮርፖሬት መዳረሻን፣ የአውታረ መረብ እንቅስቃሴን እና የመሳሪያውን አካባቢ መረጃን ጨምሮ ከዚህ መገለጫ ጋር የተጎዳኙ መተግበሪያዎችን እና ውሂብን መከታተል እና ማስተዳደር ይችላል።"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"የድርጅት አስተዳዳሪ ቅንብሮችን፣ ፈቃዶችን፣ የኮርፖሬት መዳረሻን፣ የአውታረ መረብ እንቅስቃሴን እና የተሽከርካሪውን አካባቢ መረጃን ጨምሮ ከዚህ የኢንፎቴይንመንት ስርዓት ጋር የተጎዳኙ መተግበሪያዎችን እና ውሂብን መቆጣጠር እና ማስተዳደር ይችላል።"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"የድርጅት አስተዳዳሪ ከዚህ የኢንፎቴይንመንት ስርዓት ጋር የተጎዳኘ ውሂብን መድረስ፣ መተግበሪያዎችን ማስተዳደር እና ይህንን የተሽከርካሪዎች ቅንብሮችን መለወጥ ይችል ይሆናል።"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ይህ አይገኝም"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"በዚህ በሚተዳደር ተሽከርካሪ ውስጥ የድምፅ መጠን መለወጥ አይቻልም"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"በዚህ በሚተዳደር ተሽከርካሪ ውስጥ ጥሪዎችን ማድረግ አይቻልም"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"በዚህ በሚተዳደር ተሽከርካሪ ውስጥ ኤስኤምኤስ አይፈቀድም"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"በዚህ በሚተዳደር ተሽከርካሪ ውስጥ ካሜራ አይገኝም"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"በዚህ የሚተዳደር ተሽከርካሪ ላይ ቅጽበታዊ ገጽ እይታዎችን ማንሳት አይቻልም"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"በዚህ በሚተዳደር ተሽከርካሪ ውስጥ ይህን መተግበሪያ መክፈት አይቻልም"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"በክሬዲት አቅራቢዎ ታግዷል"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"የአንዳንድ ባህሪያት መዳረሻ በድርጅቱ ተገድቧል።\n\nጥያቄዎች ካሉዎት የድርጅቱን ስራ አስኪያጅ ያነጋግሩ።"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"የተሽከርካሪ አስተዳዳሪ መተግበሪያዎች"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# የገበረ መተግበሪያ}one{# የገበሩ መተግበሪያዎች}other{# የገበሩ መተግበሪያዎች}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"ምንም የገበሩ መተግበሪያዎች የሉም"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"የ<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ተሽከርካሪ መመሪያ"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"በድርጅቱ አስተዳዳሪ የሚተዳደሩ ቅንብሮች"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"ስለ<xliff:g id="SERVICE">%1$s</xliff:g> የበለጠ ይወቁ"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"የሳንካ ሪፖርት ይጋራ?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"የዚህ ተሽከርካሪ ድርጅት አስተዳዳሪ ለዚህ መሣሪያ መላ ለመፈለግ ለማገዝ የሳንካ ሪፖርት ጠይቋል። መተግበሪያዎች እና ውሂብ ሊጋሩ ይችላሉ።"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"የዚህ ተሽከርካሪ ድርጅት አስተዳዳሪ ለዚህ መሣሪያ መላ ለመፈለግ ለማገዝ የሳንካ ሪፖርት ጠይቋል። መተግበሪያዎች እና ውሂብ ሊጋሩ ይችላሉ፣ እምዲሁም ይሄ መሣሪያዎን ለጊዜው ሊያዘገየው ይችላል።"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"ይህ የሳንካ ሪፖርት ለዚህ ተሽከርካሪ ድርጅት አስተዳዳሪ እየተጋራ ነው። ተጨማሪ ዝርዝሮችን ለማግኘት ያነጋግሯቸው።"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"አጋራ"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"አትቀበል"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"ይህ ቅንብር አሁን መቀየር አይችልም"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ተደራሽነት"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"መግለጫ ፅሁፎች"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"የመግለጫ ጽሑፍ ምርጫዎች"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"አጥፋ"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"አብራ"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"ማያ ገጽ አንባቢ"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"መግለጫ ጽሑፎችን አሳይ"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"የጽሑፍ መጠን"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"የመግለጫ ጽሑፍ መጠን እና ቅጥ"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"በጣም ትንሽ"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"ትንሽ"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ነባሪ"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ትልቅ"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"በጣም ትልቅ"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"የመግለጫ ጽሑፍ ቅጥ"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"በመተግበሪያ የተቀናበረ"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"ነጭ በጥቁር ላይ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"ጥቁር በነጭ ላይ"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"ቢጫ በጥቁር ላይ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"ቢጫ በሰማያዊ ላይ"</string>
</resources>
diff --git a/res/values-ar/arrays.xml b/res/values-ar/arrays.xml
index 6336fd4..da2bd0a 100644
--- a/res/values-ar/arrays.xml
+++ b/res/values-ar/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"عدم السماح مطلقًا"</item>
<item msgid="1154273129608299386">"السماح دومًا"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 980d6f0..4107a97 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -27,14 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"الوضع الليلي"</string>
<string name="network_and_internet" msgid="4229023630498537530">"الشبكة والإنترنت"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"شبكة الجوّال"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> شريحة SIM</item>
- <item quantity="two">شريحتا SIM <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> شرائح SIM</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> شريحة SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> شريحة SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> شريحة SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{شريحة SIM واحدة}zero{# شريحة SIM}two{شريحتَا SIM}few{# شرائح SIM}many{# شريحة SIM}other{# شريحة SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"مفعّلة / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"غير مفعّلة / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"مفعّلة / شريحة SIM التي تم تنزيلها"</string>
@@ -42,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"إضافة المزيد"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"بيانات الجوّال"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"الوصول إلى البيانات باستخدام شبكة الجوّال"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"شبكة الجوّال"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"استخدام بيانات الجوّال"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"هل تريد إيقاف بيانات الجوّال؟"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"يجب الاختيار."</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"هل تريد بيانات الجوّال من <xliff:g id="CARRIER">%1$s</xliff:g>؟"</string>
@@ -57,14 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"حد التحذير بشأن البيانات <xliff:g id="ID_1">^1</xliff:g>."</string>
<string name="cell_data_limit" msgid="6862164869877993009">"الحد الأقصى للبيانات <xliff:g id="ID_1">^1</xliff:g>."</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"حد التحذير بشأن البيانات <xliff:g id="ID_1">^1</xliff:g> / الحد الأقصى للبيانات <xliff:g id="ID_2">^2</xliff:g>."</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="zero">يتبقى %d يوم.</item>
- <item quantity="two">يتبقى يومان (%d).</item>
- <item quantity="few">يتبقى %d أيام.</item>
- <item quantity="many">يتبقى %d يومًا.</item>
- <item quantity="other">يتبقى %d يوم.</item>
- <item quantity="one">يتبقى %d يوم.</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{يتبقّى يوم واحد.}zero{يتبقّى # يوم.}two{يتبقّى يومان.}few{تتبقّى # أيام.}many{يتبقّى # يومًا.}other{يتبقّى # يوم.}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"لا يتبقى أي وقت."</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"يتبقى أقل من يوم واحد."</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"تم التحديث بواسطة <xliff:g id="ID_1">^1</xliff:g> قبل <xliff:g id="ID_2">^2</xliff:g>."</string>
@@ -79,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"ضبط"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"تحذير بشأن قيود البيانات"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"دورة استخدام التطبيقات للبيانات"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"استخدام بيانات الجوّال"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ضبط تحذيرات استخدام البيانات"</string>
<string name="data_warning" msgid="116776633806885370">"تحذيرات البيانات"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ضبط الأحد الأقصى للبيانات"</string>
@@ -87,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ستُوقف الوحدة الأساسية لمركبتك بيانات الجوّال بعد الوصول إلى الحد الأقصى الذي وضعته.\n\nولأنّ الوحدة الأساسية تقيس حجم استخدام البيانات بطريقة معيّنة وقد يحاسبك مشغّل شبكة الجوّال بطريقة مختلفة، ننصحك بوضع حدٍ معتدلٍ."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ضبط تحذيرات استخدام البيانات"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ضبط حد استخدام البيانات"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"يقيس جهازك استخدام البيانات. قد يختلف هذا الاستخدام عن بيانات مشغِّل شبكة الجوّال."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"ضبط"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"حفظ"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"شبكة المصنّع الأصلي للجهاز"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"اتصال الإنترنت في السيارة"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"قد يؤدي إيقاف اتصال الإنترنت في السيارة إلى منع بعض ميزات السيارة أو التطبيقات من العمل.\n\nوستستمر مشاركة البيانات المُهمة المطلوبة لتشغيل سيارتك مع الشركة المصنِّعة للسيارة."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"إيقاف على أي حال"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"تم إيقاف اتصال الإنترنت في السيارة، ما قد يؤدي إلى منع بعض ميزات السيارة أو التطبيقات من العمل. وستستمر مشاركة البيانات المُهمة المطلوبة لتشغيل سيارتك مع الشركة المصنِّعة للسيارة."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"تم استخدام %1$s من %2$s إلى %3$s."</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"الانضمام إلى شبكة أخرى"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"الإعدادات المفضَّلة للشبكة"</string>
@@ -102,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"إضافة شبكة"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"اتصال"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"جارٍ الاتصال…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"غير متّصل"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"الشبكة ليست في النطاق."</string>
<string name="wifi_password" msgid="5565632142720292397">"كلمة المرور"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"عرض كلمة المرور"</string>
@@ -163,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"اختر نطاقًا واحدًا على الأقل لنقطة اتصال Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"نقطة الاتصال والتوصيل"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"نقطة الاتصال"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"إيقاف"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"إيقاف نقطة الاتصال تلقائيًا"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"سيتم إيقاف نقطة اتصال Wi‑Fi في حال عدم اتصال أي أجهزة."</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"هناك رغبة من <xliff:g id="REQUESTER">%s</xliff:g> في تفعيل شبكة Wi-Fi."</string>
@@ -305,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"فرض الإيقاف"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"هل تريد فرض إيقاف التطبيق؟"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"في حال فرض إيقاف التطبيق، قد لا يعمل بشكل صحيح."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"هل تريد إيقاف ميزة حماية الأداء؟"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"في حال إجراء ذلك، ربما لا تعمل برامجك وأجهزتك على النحو المعتاد."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"مواصلة التشغيل"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"إيقاف"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"هل تريد تفعيل الإعداد \"منح الأولوية لأداء التطبيق\"؟"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"يمكن أن يؤدي تفعيل هذا الإعداد إلى حدوث عدم استقرار محتمل في النظام أو تأثير طويل الأمد في الأجهزة. هل تريد المتابعة؟"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"نعم"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"لا، شكرًا"</string>
<string name="disable_text" msgid="4358165448648990820">"إيقاف"</string>
<string name="enable_text" msgid="1794971777861881238">"تفعيل"</string>
<string name="uninstall_text" msgid="277907956072833012">"إلغاء التثبيت"</string>
@@ -318,33 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"الأذونات"</string>
<string name="notifications_label" msgid="6586089149665170731">"الإشعارات"</string>
<string name="storage_application_label" msgid="5911779903670978586">"التخزين وذاكرة التخزين المؤقت"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"ضمان أفضل أداء"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"منح الأولوية لأداء التطبيق"</string>
<string name="application_version_label" msgid="8556889839783311649">"الإصدار: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"لم يتم منح أي أذونات."</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"لم يتم طلب أي أذونات."</string>
<string name="unused_apps" msgid="648471933781010395">"التطبيقات غير المستخدمة"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> تطبيق غير مستخدم</item>
- <item quantity="two">تطبيقان (<xliff:g id="COUNT_1">%d</xliff:g>) غير مستخدمين</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> تطبيقات غير مستخدمة</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> تطبيقًا غير مستخدم</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> تطبيق غير مستخدم</item>
- <item quantity="one">تطبيق واحد (<xliff:g id="COUNT_0">%d</xliff:g>) غير مستخدم</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{تطبيق واحد غير مستخدَم}zero{# تطبيق غير مستخدَم}two{تطبيقان غير مستخدَمين}few{# تطبيقات غير مستخدَمة}many{# تطبيقًا غير مستخدَم}other{# تطبيق غير مستخدَم}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"إزالة الأذونات وإخلاء بعض المساحة"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"وحدة التخزين الداخلية %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"إغلاق التطبيق عند اللزوم لتوفير الموارد"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"يستخدم هذا الإعداد موارد النظام لمنح الأولوية لأداء التطبيق."</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"استخدام البيانات"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"استخدام بيانات التطبيق"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"سجلّ الاستخدام"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"جميع التطبيقات"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"استخدام البيانات وWi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"سجلّ الاستخدام"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"إجمالي الاستخدام"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"المقدّمة"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"الخلفية"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"السماح باستخدام البيانات"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"السماح لهذا التطبيق باستخدام بيانات الجوّال"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"تقييد البيانات"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"استخدام بيانات الجوّال فقط عندما يكون التطبيق في المقدّمة"</string>
<string name="computing_size" msgid="5791407621793083965">"جارٍ الحساب…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> إذن إضافي</item>
- <item quantity="two">إذنان (<xliff:g id="COUNT_1">%d</xliff:g>) إضافيان</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> أذونات إضافية</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> إذنًا إضافيًا</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> إذن إضافي</item>
- <item quantity="one">إذن واحد إضافي (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{إذن واحد إضافي}zero{# إذن إضافي}two{إذنان إضافيان}few{# أذونات إضافية}many{# إذنًا إضافيًا}other{# إذن إضافي}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"ملاحظة: بعد إعادة التشغيل، يتعذر بدء هذا التطبيق إلى أن تفتح سيارتك."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"المساعدة والإدخال الصوتي"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"تطبيق المساعد"</string>
@@ -401,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"يسمح التحكم في شبكة Wi-Fi للتطبيق بتفعيل شبكات Wi-Fi أو إيقافها أو البحث عنها أو الاتصال بها أو إضافتها أو إزالتها أو بدء نقطة اتصال محلية فقط."</string>
<string name="more_special_access_title" msgid="166115485446645971">"المزيد"</string>
<string name="location_settings_title" msgid="901334356682423679">"الموقع الجغرافي"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"استخدام الموقع الجغرافي"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"السماح للتطبيقات التي تحددها بالوصول إلى موقعك الجغرافي"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"إذا أوقفت هذا الإعداد، سيؤدي ذلك إلى إزالة إمكانية وصول كل التطبيقات إلى الموقع الجغرافي. وسيظل بإمكان تطبيقات \"مساعدة السائق\" الوصول إلى الموقع الجغرافي."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"استخدام الموقع الجغرافي لميزات \"مساعدة السائق\""</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"ميزة الموقع الجغرافي للسيارة غير مفعَّلة"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"يتعذّر على تطبيقات \"مساعدة السائق\" الوصول إلى موقعك الجغرافي."</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"تغيير"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"السماح للتطبيقات التي تساعدك على القيادة بالوصول إلى موقعك الجغرافي"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"إذا أوقفت ميزة \"مساعدة السائق\" هذه، سيتم إيقاف تطبيقات \"مساعدة السائق\" التي تعتمد على معلومات الموقع الجغرافي."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"إيقاف على أي حال"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"طلبات الموقع الجغرافي الأخيرة"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"لا توجد طلبات حديثة للموقع الجغرافي."</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"الأذونات على مستوى التطبيقات"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"خدمات الموقع الجغرافي"</string>
<string name="location_use_location_title" msgid="117735895374606680">"استخدام الموقع الجغرافي"</string>
<string name="location_settings_footer" msgid="296892848338100051">"قد تستخدم ميزة الموقع الجغرافي مصادر مثل نظام تحديد المواقع العالمي (GPS) أو شبكة Wi-Fi أو شبكات الجوّال أو أجهزة الاستشعار للمساعدة في تقدير الموقع الجغرافي لجهازك."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"مساعدة السائق"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"لا تحتوي معلومات الموقع الجغرافي التي تم إرسالها إلى تطبيقات \"مساعدة السائق\" على أي معلومات تحدِّد هويتك. وسيتم تخزين تلك المعلومات لمدة يومين كحد أقصى قبل حذفها."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"الميكروفون"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"استخدام الميكروفون"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"السماح لجميع التطبيقات باستخدام الميكروفون"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"إدارة أذونات الميكروفون"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"تطبيقات حصلت مؤخرًا على إذن بالوصول إلى الميكروفون"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"لم يحصل أي تطبيق مؤخرًا على إذن لاستخدام الميكروفون."</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"ليس لدى أي تطبيق إذن لاستخدام الميكروفون."</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{لدى تطبيق واحد من إجمالي {total_count} تطبيق إذن بالوصول إلى الميكروفون.}zero{لدى # تطبيق من إجمالي {total_count} تطبيق إذن بالوصول إلى الميكروفون.}two{لدى تطبيقين من إجمالي {total_count} تطبيق إذن بالوصول إلى الميكروفون.}few{لدى # تطبيقات من إجمالي {total_count} تطبيق إذن بالوصول إلى الميكروفون.}many{لدى # تطبيقًا من إجمالي {total_count} تطبيق إذن بالوصول إلى الميكروفون.}other{لدى # تطبيق من إجمالي {total_count} تطبيق إذن بالوصول إلى الميكروفون.}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"تطبيقات حصلت مؤخرًا على إذن بالوصول إلى الميكروفون"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"عرض الكل"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"جارٍ التحميل…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"النظام"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"تحديثات النظام"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"الإعدادات المتقدّمة"</string>
@@ -445,14 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"تراخيص الأطراف الثالثة"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"حدثت مشكلة أثناء تحميل التراخيص."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"جارٍ التحميل…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="zero">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> خطوة.</item>
- <item quantity="two">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى خطوتين (<xliff:g id="STEP_COUNT_1">%1$d</xliff:g>).</item>
- <item quantity="few">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> خطوات.</item>
- <item quantity="many">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> خطوة.</item>
- <item quantity="other">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> خطوة.</item>
- <item quantity="one">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى خطوة (<xliff:g id="STEP_COUNT_0">%1$d</xliff:g>).</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{لا تفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى خطوة واحدة.}zero{لا تفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى # خطوة.}two{لا تفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى خطوتين.}few{لا تفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى # خطوات.}many{لا تفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى # خطوة.}other{لا تفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى # خطوة.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"لقد أصبحت الآن مطوّر برامج."</string>
<string name="show_dev_already" msgid="1678087328973865736">"لا حاجة لذلك، فأنت مطوّر برامج فعلاً."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"خيارات المطوّرين"</string>
@@ -521,18 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"بعد إنشاء ملف شخصي جديد لأحد المستخدمين، يكون على هذا المستخدم تخصيص إعدادات الملف الشخصي."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"يمكن تحديث التطبيقات من أي ملف شخصي لكي تستخدمها كل الملفات الشخصية الأخرى."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"تم بلوغ أقصى عدد للملفات الشخصية"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="zero">يمكنك إنشاء ما يصل إلى <xliff:g id="COUNT">%d</xliff:g> ملف شخصي.</item>
- <item quantity="two">يمكنك إنشاء ما يصل إلى ملفّين شخصيين (<xliff:g id="COUNT">%d</xliff:g>).</item>
- <item quantity="few">يمكنك إنشاء ما يصل إلى <xliff:g id="COUNT">%d</xliff:g> ملفات شخصية.</item>
- <item quantity="many">يمكنك إنشاء ما يصل إلى <xliff:g id="COUNT">%d</xliff:g> ملفًا شخصيًا.</item>
- <item quantity="other">يمكنك إنشاء ما يصل إلى <xliff:g id="COUNT">%d</xliff:g> ملف شخصي.</item>
- <item quantity="one">يمكن إنشاء ملف شخصي واحد فقط.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{يمكن إنشاء ملف شخصي واحد فقط.}zero{يمكنك إنشاء # ملف شخصي كحد أقصى.}two{يمكنك إنشاء ملفين شخصيين كحد أقصى.}few{يمكنك إنشاء # ملفات شخصية كحد أقصى.}many{يمكنك إنشاء # ملفًا شخصيًا كحد أقصى.}other{يمكنك إنشاء # ملف شخصي كحد أقصى.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"تعذّر إنشاء ملف شخصي جديد"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"هل تريد حذف هذا الملف الشخصي؟"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"سيتم حذف جميع التطبيقات والبيانات المرتبطة بهذا الملف الشخصي."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"تعذّر حذف الملف الشخصي"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"لم يُحذَف الملف الشخصي يمكنك إعادة تشغيل الجهاز وإعادة المحاولة."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"سيتمّ حذف الملف الشخصي هذا عند تبديل الملفات الشخصية أو إعادة تشغيل المركبة"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"رفض"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"إعادة المحاولة"</string>
@@ -645,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"كيفية رسم نقش فتح القفل"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"حدث خطأ أثناء حفظ النقش."</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"تم إجراء عدد كبير جدًا من المحاولات غير الصحيحة. أعِد المحاولة خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"لا يدعم النقش الإدخال عبر وحدة تحكّم دورانية، يُرجى استخدام وحدة تحكّم باللمس."</string>
<string name="okay" msgid="4589873324439764349">"حسنًا"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"هل تريد إزالة قفل الشاشة؟"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"سيؤدي هذا الإجراء إلى السماح لأي شخص بالدخول إلى حسابك."</string>
@@ -676,54 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"حظرَ مشرف تكنولوجيا المعلومات استخدام أرقام التعريف الشخصية الشائعة. جرِّب استخدام رقم تعريف شخصي مختلف."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"يجب ألا تتضمّن كلمة المرور حرفًا غير صالح."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"كلمة المرور غير صالحة، ويجب أن تتكوَّن من 4 أحرف على الأقل."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="zero">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرف على الأقل.</item>
- <item quantity="two">يجب أن تحتوي كلمة المرور على حرفين (<xliff:g id="COUNT">%d</xliff:g>) على الأقل.</item>
- <item quantity="few">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> أحرف على الأقل.</item>
- <item quantity="many">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرفًا على الأقل.</item>
- <item quantity="other">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرف على الأقل.</item>
- <item quantity="one">يجب أن تحتوي كلمة المرور على حرف واحد على الأقل.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="zero">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرف صغير على الأقل.</item>
- <item quantity="two">يجب أن تحتوي كلمة المرور على حرفين صغيرين (<xliff:g id="COUNT">%d</xliff:g>) على الأقل.</item>
- <item quantity="few">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> أحرف صغيرة على الأقل.</item>
- <item quantity="many">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرفًا صغيرًا على الأقل.</item>
- <item quantity="other">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرف صغير على الأقل.</item>
- <item quantity="one">يجب أن تحتوي كلمة المرور على حرف صغير واحد على الأقل.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="zero">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرف كبير على الأقل.</item>
- <item quantity="two">يجب أن تحتوي كلمة المرور على حرفين كبيرين (<xliff:g id="COUNT">%d</xliff:g>) على الأقل.</item>
- <item quantity="few">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> أحرف كبيرة على الأقل.</item>
- <item quantity="many">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرفًا كبيرًا على الأقل.</item>
- <item quantity="other">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرف كبير على الأقل.</item>
- <item quantity="one">يجب أن تحتوي كلمة المرور على حرف كبير واحد على الأقل.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="zero">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> رقم عددي على الأقل.</item>
- <item quantity="two">يجب أن تحتوي كلمة المرور على رقمين عدديين (<xliff:g id="COUNT">%d</xliff:g>) على الأقل.</item>
- <item quantity="few">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> أرقام عددية على الأقل.</item>
- <item quantity="many">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> رقمًا عدديًا على الأقل.</item>
- <item quantity="other">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> رقم عددي على الأقل.</item>
- <item quantity="one">يجب أن تحتوي كلمة المرور على رقم عددي واحد على الأقل.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="zero">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> رمز خاص على الأقل.</item>
- <item quantity="two">يجب أن تحتوي كلمة المرور على رمزين خاصين (<xliff:g id="COUNT">%d</xliff:g>) على الأقل.</item>
- <item quantity="few">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> رموز خاصة على الأقل.</item>
- <item quantity="many">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> رمزًا خاصًا على الأقل.</item>
- <item quantity="other">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> رمز خاص على الأقل.</item>
- <item quantity="one">يجب أن تحتوي كلمة المرور على رمز خاص واحد على الأقل.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="zero">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرف ليس من الأحرف الأبجدية على الأقل.</item>
- <item quantity="two">يجب أن تحتوي كلمة المرور على حرفين (<xliff:g id="COUNT">%d</xliff:g>) ليسا من الأحرف الأبجدية على الأقل.</item>
- <item quantity="few">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> أحرف ليست من الأحرف الأبجدية على الأقل.</item>
- <item quantity="many">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرفًا ليس من الأحرف الأبجدية على الأقل.</item>
- <item quantity="other">يجب أن تحتوي كلمة المرور على <xliff:g id="COUNT">%d</xliff:g> حرف ليس من الأحرف الأبجدية على الأقل.</item>
- <item quantity="one">يجب أن تحتوي كلمة المرور على حرف واحد ليس من الأحرف الأبجدية على الأقل.</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"لا يسمح مشرف الجهاز باستخدام كلمة مرور تم استخدامها مؤخرًا."</string>
<string name="error_saving_password" msgid="8334882262622500658">"حدث خطأ أثناء حفظ كلمة المرور."</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"حظرَ مشرف تكنولوجيا المعلومات استخدام كلمات المرور الشائعة. جرِّب استخدام كلمة مرور مختلفة."</string>
@@ -766,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"إنشاء ملف شخصي"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"حذف هذا الملف الشخصي"</string>
<string name="add_profile_text" msgid="9118410102199116969">"إضافة ملف شخصي"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"سطوع الشاشة"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"لرؤية أجهزتك، يجب تفعيل البلوتوث."</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"لإقران جهاز، افتح إعدادات البلوتوث."</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"مشرف \"نظام الترفيه والمعلومات\""</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"التطبيقات المفعّلة"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"التطبيقات غير المفعّلة"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"يمكن للتطبيقات التي حصلت على هذا الإذن الوصول إلى بيانات هذه السيارة."</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"لا تتوفّر تطبيقات المشرف في السيارة."</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"تطبيق مشرف \"نظام الترفيه والمعلومات\" هذا نشط ويسمح للتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> بتنفيذ العمليات التالية:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"سيؤدي تفعيل تطبيق \"نظام الترفيه والمعلومات\" هذا إلى السماح للتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> بتنفيذ العمليات التالية:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"هل تريد تفعيل تطبيق \"نظام الترفيه والمعلومات\" هذا؟"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"تفعيل تطبيق \"نظام الترفيه والمعلومات\" هذا"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"إلغاء التفعيل وإلغاء التثبيت"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"إيقاف تطبيق \"نظام الترفيه والمعلومات\" هذا"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"المزيد من التفاصيل"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"يمكن لمدير مؤسستك مراقبة التطبيقات والبيانات المرتبطة بهذا الملف الشخصي وإدارتها، بما في ذلك الإعدادات والأذونات وميزات الوصول إلى موارد المؤسسة ونشاط الشبكة ومعلومات الموقع الجغرافي للمركبة."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"يمكن لمدير مؤسستك مراقبة التطبيقات والبيانات المرتبطة بهذا الملف الشخصي وإدارتها، بما في ذلك الإعدادات والأذونات وميزات الوصول إلى موارد المؤسسة ونشاط الشبكة ومعلومات الموقع الجغرافي للجهاز."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"يمكن لمدير المؤسسة مراقبة التطبيقات والبيانات المرتبطة بنظام الترفيه والمعلومات هذا وإدارتها، بما في ذلك الإعدادات والأذونات وميزات الوصول إلى موارد المؤسسة ونشاط الشبكة ومعلومات الموقع الجغرافي للمركبة."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"قد يتمكّن مدير المؤسسة من الوصول إلى البيانات المرتبطة بنظام الترفيه والمعلومات هذا وإدارة التطبيقات وتغيير إعدادات المركبات."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"هذا الإعداد غير متوفّر"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"لا يمكن تغيير مستوى الصوت في هذه المركبة المُدارة"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"لا يمكن إجراء المكالمات في هذه المركبة المُدارة"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"الرسائل القصيرة غير مسموح بها في هذه المركبة المُدارة"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"لا تتوفر الكاميرا في هذه المركبة المُدارة"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"لا يمكن الحصول على لقطات شاشة في هذه المركبة المُدارة"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"لا يمكن فتح هذا التطبيق في هذه المركبة المُدارة"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"حظرت شركة بيع الأجهزة بالائتمان هذا الإعداد"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"تقيِّد المؤسسة إمكانية الوصول إلى بعض الميزات.\n\nإذا كانت لديك أسئلة، يمكنك التواصل مع مدير المؤسسة."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"تطبيقات مشرف المركبة"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{تطبيق واحد مفعّل}zero{# تطبيق مفعّل}two{تطبيقان مفعّلان}few{# تطبيقات مفعّلة}many{# تطبيقًا مفعّلاً}other{# تطبيق مفعّل}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"ما مِن تطبيقات مفعّلة"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"سياسة المركبات السارية لدى <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"الإعدادات التي يديرها مدير المؤسسة"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"مزيد من المعلومات عن <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"هل تريد مشاركة تقرير الخطأ؟"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"طلب مدير المؤسسة التابعة لها هذه المركبة الحصول على تقرير خطأ للمساعدة في تحديد مشكلة هذا الجهاز وحلّها. وقد تتم مشاركة التطبيقات والبيانات."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"طلب مدير المؤسسة التابعة لها هذه المركبة الحصول على تقرير خطأ للمساعدة في تحديد مشكلة هذا الجهاز وحلّها. قد تتم مشاركة التطبيقات والبيانات، وقد يعمل جهازك ببطء مؤقتًا."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"تتم مشاركة تقرير الخطأ هذا مع مدير المؤسسة التابعة لها هذه المركبة. للحصول على مزيد من التفاصيل، يمكنك التواصل مع مدير المؤسسة."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"مشاركة"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"رفض"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"لا يمكن تغيير هذا الإعداد الآن."</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"أدوات تسهيل الاستخدام"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"الشرح"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"الإعدادات المفضّلة للشرح"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ميزة الترجمة والشرح غير مفعّلة"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ميزة الترجمة والشرح مفعّلة"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"قارئ الشاشة"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"عرض الشرح"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"حجم النص"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"حجم نصوص الشرح ونمطها"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"صغير جدًا"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"صغير"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"تلقائي"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"كبير"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"كبير جدًا"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"نمط الشرح"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"الضبط حسب التطبيق"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"أبيض في أسود"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"أسود في أبيض"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"أصفر في أسود"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"أصفر في أزرق"</string>
</resources>
diff --git a/res/values-as/arrays.xml b/res/values-as/arrays.xml
index c7500e7..02588d0 100644
--- a/res/values-as/arrays.xml
+++ b/res/values-as/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"কেতিয়াও অনুমতি নিদিব"</item>
<item msgid="1154273129608299386">"চিৰদিনৰ বাবে অনুমতি দিয়ক"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index b851c1b..300bef0 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"নৈশ ম\'ড"</string>
<string name="network_and_internet" msgid="4229023630498537530">"নেটৱৰ্ক আৰু ইণ্টাৰনেট"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"ম’বাইল নেটৱৰ্ক"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> খন ছিম</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> খন ছিম</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# খন ছিম}one{# খন ছিম}other{# খন ছিম}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"সক্রিয় / ছিম"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"নিষ্ক্ৰিয় / ছিম"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"সক্ৰিয় / ডাউনল’ড কৰা ছিম"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"অধিক যোগ কৰক"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"ম’বাইল ডেটা"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ম’বাইল নেটৱৰ্ক ব্যৱহাৰ কৰি ডেটা এক্সেছ কৰক"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"ম’বাইলৰ নেটৱৰ্ক"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"ম’বাইল ডেটা ব্যৱহাৰ কৰক"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"ম’বাইল ডেটা অফ কৰিবনে?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"বাছনি কৰা প্ৰয়োজন"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"ডেটাৰ বাবে <xliff:g id="CARRIER">%1$s</xliff:g> ব্যৱহাৰ কৰিবনে?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"ডেটাৰ ব্যৱহাৰ সম্পৰ্কীয় সকীয়নি <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"ডেটাৰ সীমা <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"ডেটাৰ ব্যৱহাৰ সম্পৰ্কীয় সকীয়নি <xliff:g id="ID_1">^1</xliff:g> / ডেটাৰ সীমা <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d দিন বাকী আছে</item>
- <item quantity="other">%d দিন বাকী আছে</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# দিন বাকী আছে}one{# দিন বাকী আছে}other{# দিন বাকী আছে}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"সময় শেষ হ’ল"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"১দিনতকৈও কম সময় বাকী আছে"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g>এ <xliff:g id="ID_2">^2</xliff:g> আগত আপডে’ট কৰিছে"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"ছেট কৰক"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ডেটা ব্যৱহাৰৰ সকীয়নি আৰু সীমা"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"এপে ব্যৱহাৰ কৰা ডেটাৰ চক্ৰ"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"ম’বাইল ডেটাৰ ব্যৱহাৰ"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ডেটা ব্যৱহাৰৰ সকীয়নি ছেট কৰক"</string>
<string name="data_warning" msgid="116776633806885370">"ডেটা সকীয়নি"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ডেটাৰ সীমা ছেট কৰক"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"আপুনি ছেট কৰা সীমাত উপনীত হোৱাৰ লগে লগে আপোনাৰ বাহনৰ হে’ড ইউনিটে ম’বাইল ডেটা অফ কৰি দিব।\n\nযিহেতু ডেটাৰ ব্যৱহাৰ আপোনাৰ হে’ড ইউনিটে গণনা কৰে যিটো আপোনাৰ বাহকৰ গণনাৰ সৈতে একে নহ’বও পাৰে, গতিকে এক ৰক্ষণশীল সীমা বন্ধাৰ কথা বিবেচনা কৰক।"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ডেটা ব্যৱহাৰৰ সতৰ্কবাণী ছেট কৰক"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ডেটা ব্যৱহাৰৰ সীমা ছেট কৰক"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"ডেটাৰ ব্যৱহাৰ আপোনাৰ ডিভাইচৰ দ্বাৰা জোখা হয়। ই আপোনাৰ ম’বাইলৰ বাহকৰ ডেটাতকৈ পৃথক হ’ব পাৰে।"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"ছেট কৰক"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"ছেভ কৰক"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM নেটৱৰ্ক"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"বাহনৰ ইণ্টাৰনেট"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"বাহনখনৰ ইণ্টাৰনেট অফ কৰা কাৰ্যই বাহনৰ কিছুমান সুবিধা অথবা এপ্সমূহক কাম কৰাত বাধা দিব পাৰে।\n\n আপোনাৰ বাহনখন চলাবলৈ আৱশ্যক হোৱা গুৰুত্বপূৰ্ণ ডেটা বাহন নিৰ্মাতাৰ সৈতে শ্বেয়াৰ কৰাটো অব্যাহত থাকিব।"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"যি হ’লেও অফ কৰক"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"বাহনৰ ইণ্টাৰনেট অফ হৈ আছে। এই কাৰ্যই বাহনৰ কিছুমান সুবিধা অথবা এপ্সমূহক কাম কৰাত বাধা দিব পাৰে। আপোনাৰ বাহনখন চলাবলৈ আৱশ্যক হোৱা গুৰুত্বপূৰ্ণ ডেটা বাহন নিৰ্মাতাৰ সৈতে শ্বেয়াৰ কৰাটো অব্যাহত থাকিব।"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s ব্যৱহাৰ কৰা হৈছে %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"অন্য নেটৱৰ্কৰ সৈতে সংযোগ কৰক"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"নেটৱৰ্কৰ অগ্ৰাধিকাৰ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"নেটৱৰ্ক যোগ কৰক"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"সংযোগ কৰক"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"সংযোগ কৰি থকা হৈছে…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"সংযোজিত হৈ থকা নাই"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"নেটৱৰ্ক সংযোগ সীমাৰ ভিতৰত নাই"</string>
<string name="wifi_password" msgid="5565632142720292397">"পাছৱৰ্ড"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"পাছৱৰ্ড দেখুৱাওক"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"ৱাই-ফাই হটস্পটৰ বাবে কমেও এটা বেণ্ড বাছনি কৰক:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"হ’টস্পট আৰু টেডাৰিং"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"হটস্পট"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"অফ আছে"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"স্বয়ংক্ৰিয়ভাৱে হটস্পট অফ কৰক"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"যদি কোনো ডিভাইচ সংযোগ হৈ নাথাকে, তেন্তে ৱাই-ফাই হটস্পট অফ হ’ব"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g>এ ৱাই-ফাই অন কৰিব বিচাৰে"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"বলেৰে ৰখাওক"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"বলেৰে বন্ধ কৰিবনে?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"আপুনি কোনো এপ্ বলেৰে বন্ধ কৰিবলৈ চেষ্টা কৰিলে ই অস্বাভাৱিক আচৰণ কৰিব পাৰে।"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"কাৰ্যদক্ষতাৰ সুৰক্ষা অফ কৰিবনে?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"যদি আপুনি কৰে, আপোনাৰ ছফ্টৱেৰ আৰু হাৰ্ডৱেৰেও কাম নকৰিব পাৰে।"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"বাহিৰ হওক"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"অফ কৰক"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"এপৰ কাৰ্যদক্ষতাক অগ্ৰাধিকাৰ দিয়াটো অন কৰিবনে?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"এইটো অন কৰাটোৱে ছিষ্টেমত সমস্যাৰ সৃষ্টি কৰা অথবা দীঘলীয়া সময়ৰ বাবে হাৰ্ডৱেৰত প্ৰভাৱ পেলোৱাৰ সম্ভাৱনা থাকে। আপুনি অব্যাহত ৰাখিব বিচাৰেনে?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"হয়"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"নালাগে, ধন্যবাদ"</string>
<string name="disable_text" msgid="4358165448648990820">"অক্ষম কৰক"</string>
<string name="enable_text" msgid="1794971777861881238">"সক্ষম কৰক"</string>
<string name="uninstall_text" msgid="277907956072833012">"আনইনষ্টল কৰক"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"অনুমতি"</string>
<string name="notifications_label" msgid="6586089149665170731">"জাননী"</string>
<string name="storage_application_label" msgid="5911779903670978586">"ষ্ট’ৰেজ আৰু কেশ্ব"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"সৰ্বাধিক কাৰ্যদক্ষতা নিশ্চিত কৰক"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"এপৰ কাৰ্যদক্ষতাক অগ্ৰাধিকাৰ দিয়ক"</string>
<string name="application_version_label" msgid="8556889839783311649">"সংস্কৰণ: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"কোনো অনুমতি দিয়া হোৱা নাই"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"অনুমতি বিচৰা হোৱা নাই"</string>
<string name="unused_apps" msgid="648471933781010395">"অব্যৱহৃত এপ্"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> টা অব্যৱহৃত এপ্</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> টা অব্যৱহৃত এপ্</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# টা অব্যৱহৃত এপ্}one{# টা অব্যৱহৃত এপ্}other{# টা অব্যৱহৃত এপ্}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"অনুমতি আঁতৰাওক আৰু ঠাই খালী কৰক"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s অভ্যন্তৰীণ ষ্ট’ৰেজত আছে"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"সম্পদৰ অতিমাত্ৰা ব্যৱহাৰ হোৱাটো এৰাই চলিবলৈ আৱশ্যক হ’লে এপ্ বন্ধ কৰক"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"এপৰ কাৰ্যদক্ষতাক অগ্ৰাধিকাৰ দিবলৈ ছিষ্টেমৰ সম্পদসমূহ ব্যৱহাৰ কৰে"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ডেটাৰ ব্যৱহাৰ"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"এপ্ ডেটাৰ ব্যৱহাৰ"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"ব্যৱহাৰৰ ইতিহাস"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"আটাইবোৰ এপ্"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ডেটা আৰু ৱাই-ফাইৰ ব্যৱহাৰ"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"ব্যৱহাৰৰ ইতিহাস"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"মুঠ ব্যৱহাৰ"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"অগ্ৰভাগ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"নেপথ্য ডেটা ব্যৱহাৰ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ডেটাৰ অনুমতি দিয়ক"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"এই এপ্টোক ম’বাইল ডেটা ব্যৱহাৰ কৰিবলৈ দিয়ক"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ডেটা সীমিত কৰক"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"এপ্টো অগ্ৰভাগত থাকিলেহে ম’বাইল ডেটা ব্যৱহাৰ কৰক"</string>
<string name="computing_size" msgid="5791407621793083965">"গণনা কৰি থকা হৈছে…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>টা অতিৰিক্ত অনুমতি</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>টা অতিৰিক্ত অনুমতি</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# টা অতিৰিক্ত অনুমতি}one{# টা অতিৰিক্ত অনুমতি}other{# টা অতিৰিক্ত অনুমতি}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"টোকা: ৰিবুট কৰাৰ পিছত আপুনি নিজৰ বাহনখন আনলক নকৰালৈকে এই এপ্টো ষ্টাৰ্ট হ’ব নোৱাৰে।"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"সহায় আৰু ধ্বনি ইনপুট"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"সহায়ক এপ্"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"ৱাই-ফাই নিয়ন্ত্ৰণ সুবিধাই এটা এপক ৱাই-ফাই অন বা অফ কৰিবলৈ, স্কেন কৰিবলৈ আৰু ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযোগ কৰিবলৈ আৰু বা নেটৱৰ্ক আঁতৰাবলৈ, বা স্থানীয়-মাত্ৰ হটস্পট আৰম্ভ কৰিবলৈ অনুমতি দিয়ে।"</string>
<string name="more_special_access_title" msgid="166115485446645971">"অধিক"</string>
<string name="location_settings_title" msgid="901334356682423679">"অৱস্থান"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"অৱস্থান ব্যৱহাৰ কৰক"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"আপুনি উল্লেখ কৰা এপ্সমূহক আপোনাৰ অৱস্থান এক্সেছ কৰিবলৈ দিয়ে"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"আপুনি যদি এইটো অফ কৰে, তেন্তে ই আটাইবোৰ এপৰ বাবে অৱস্থানৰ এক্সেছ আঁতৰাব। চালক সাহায্য এপ্সমূহৰ তথাপি এক্সেছ থাকিব।"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"চালক সাহায্য সুবিধাৰ বাবে অৱস্থানৰ তথ্য ব্যৱহাৰ কৰক"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"বাহনখনৰ অৱস্থান অফ আছে"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"চালক সাহায্য এপে আপোনাৰ অৱস্থান এক্সেছ কৰিব নোৱাৰে"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"সলনি কৰক"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"গাড়ী চলোৱাত সহায় কৰা এপক আপোনাৰ অৱস্থানৰ তথ্য এক্সেছ কৰিবলৈ দিয়ক"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"আপুনি যদি এইটো অফ কৰে, তেন্তে অৱস্থানৰ তথ্যৰ ওপৰত নিৰ্ভৰশীল চালকৰ সাহায্য এপ্সমূহ অক্ষম কৰা হ’ব।"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"তথাপি অফ কৰক"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"শেহতীয়া অৱস্থানৰ অনুৰোধ"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"শেহতীয়াকৈ কোনো এপে অৱস্থানৰ অনুৰোধ প্ৰেৰণ কৰা নাই"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"এপ্-স্তৰৰ অনুমতি"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"অৱস্থান সেৱা"</string>
<string name="location_use_location_title" msgid="117735895374606680">"অৱস্থান ব্যৱহাৰ কৰক"</string>
<string name="location_settings_footer" msgid="296892848338100051">"অৱস্থান সেৱাই আপোনাৰ ডিভাইচৰ অৱস্থান অনুমান কৰাত সহায় কৰিবলৈ জিপিএছ, ৱাই-ফাই, ম’বাইল নেটৱৰ্ক আৰু ছেন্সৰৰ দৰে উৎসসমূহ ব্যৱহাৰ কৰিব পাৰে।"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"চালক সাহায্য"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"চালক সাহায্য এপলৈ পঠিওৱা অৱস্থানৰ তথ্যত আপোনাক চিনাক্ত কৰা কোনো তথ্য নাথাকে। মচাৰ পূৰ্বে ইয়াক সৰ্বাধিক ২ দিনৰ বাবে ষ্ট’ৰ কৰা হয়।"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"মাইক্ৰ’ফ’ন"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"মাইক্র’ফ’ন ব্যৱহাৰ কৰক"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"আটাইবোৰ এপক আপোনাৰ মাইক্ৰ’ফ’ন এক্সেছ কৰিবলৈ দিয়ক"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"মাইক্ৰ’ফ’নৰ অনুমতি পৰিচালনা কৰক"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"শেহতীয়াকৈ এক্সেছ কৰা"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"কোনো শেহতীয়া এপ্ নাই"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"০ টা এপৰ এক্সেছ আছে"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count} টা এপৰ ভিতৰত # টাৰ এক্সেছ আছে}one{{total_count} টা এপৰ ভিতৰত # টাৰ এক্সেছ আছে}other{{total_count} টা এপৰ ভিতৰত # টাৰ এক্সেছ আছে}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"শেহতীয়াকৈ এক্সেছ কৰা"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"আটাইবোৰ চাওক"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"ল’ড কৰি থকা হৈছে…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"ছিষ্টেম"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"ছিষ্টেম আপডে’ট"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"উচ্চখাপৰ"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"তৃতীয় পক্ষৰ অনুজ্ঞাপত্ৰ"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"অনুজ্ঞাপত্ৰসমূহ ল\'ড কৰাত সমস্যা।"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"ল’ড হৈ আছে…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">আপুনি এতিয়া এজন বিকাশকৰ্তা হোৱাৰ পৰা <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>টা পদক্ষেপ দূৰত।</item>
- <item quantity="other">আপুনি এতিয়া এজন বিকাশকৰ্তা হোৱাৰ পৰা <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>টা পদক্ষেপ দূৰত।</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{আপুনি এতিয়া এগৰাকী বিকাশকৰ্তা হোৱাৰ পৰা # টা পদক্ষেপ দূৰত আছে।}one{আপুনি এতিয়া এগৰাকী বিকাশকৰ্তা হোৱাৰ পৰা # টা পদক্ষেপ দূৰত আছে।}other{আপুনি এতিয়া এগৰাকী বিকাশকৰ্তা হোৱাৰ পৰা # টা পদক্ষেপ দূৰত আছে।}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"আপুনি এতিয়া এজন বিকাশকৰ্তা!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"কোনো প্ৰয়োজন নাই, আপুনি ইতিমধ্যে এজন বিকাশকৰ্তা।"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"বিকাশকৰ্তাৰ বিকল্পসমূহ"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"আপুনি এটা নতুন প্ৰ\'ফাইল সৃষ্টি কৰাৰ পাছত, সেই ব্যক্তিগৰাকীয়ে এইটোক নিজৰ বাবে কাষ্টমাইজ কৰিব লাগে।"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"অন্য আটাইবোৰ প্ৰ\'ফাইলে ব্যৱহাৰ কৰিবলৈ যিকোনো প্ৰ\'ফাইলৰ পৰা এপ্ আপডে’ট কৰিব পৰা যায়।"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"প্ৰ’ফাইলৰ সীমাত উপনীত হৈছে"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">আপুনি <xliff:g id="COUNT">%d</xliff:g> টা পৰ্যন্ত প্ৰ’ফাইল সৃষ্টি কৰিব পাৰে।</item>
- <item quantity="other">আপুনি <xliff:g id="COUNT">%d</xliff:g> টা পৰ্যন্ত প্ৰ’ফাইল সৃষ্টি কৰিব পাৰে।</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{কেৱল এটা প্ৰ’ফাইল সৃষ্টি কৰিব পাৰি।}one{আপুনি # টা পৰ্যন্ত প্ৰ’ফাইল সৃষ্টি কৰিব পাৰে।}other{আপুনি # টা পৰ্যন্ত প্ৰ’ফাইল সৃষ্টি কৰিব পাৰে।}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"নতুন প্ৰ\'ফাইল সৃষ্টি কৰিব পৰা নগ’ল"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"এই প্ৰ’ফাইলটো মচিবনে?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"এই প্ৰ’ফাইলটোৰ আটাইবোৰ এপ্ আৰু ডেটা মচা হ’ব"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"প্ৰ\'ফাইল মচিব পৰা নগ’ল।"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"প্ৰ’ফাইল মচিব পৰা নগ’ল। আপুনি ডিভাইচটো ৰিষ্টাৰ্ট কৰি পুনৰ চেষ্টা কৰিব পাৰে।"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"আপুনি প্ৰ’ফাইল সলনি কৰিলে অথবা গাড়ীখন ৰিষ্টাৰ্ট কৰিলে এই প্ৰ’ফাইলটো মচা হ’ব।"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"অগ্ৰাহ্য কৰক"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"পুনৰায় চেষ্টা কৰক"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"লক খোলাৰ আৰ্হি অঁকা উপায়"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"আৰ্হি ছেভ কৰোঁতে আঁসোৱাহ"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"বহুসংখ্যক ভুল প্ৰয়াস। <xliff:g id="NUMBER">%d</xliff:g> ছেকেণ্ডত পুনৰ চেষ্টা কৰক।"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"আহিটোৱে ৰ\'টেৰী সমর্থন কৰে, স্পর্শ কৰাটো ব্যৱহাৰ কৰক"</string>
<string name="okay" msgid="4589873324439764349">"ঠিক আছে"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"স্ক্ৰীণ লক আঁতৰাবনে?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"এই কাৰ্যই সকলোকে আপোনাৰ একাউণ্টৰ এক্সেছ দিব"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"আপোনাৰ আইটি প্ৰশাসকে উমৈহতীয়া পিনসমূহ অৱৰোধ কৰিছে। অন্য এটা পিন ব্যৱহাৰ কৰি চাওক।"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"ইয়াত অমান্য় বৰ্ণ থাকিব নোৱাৰে।"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"অমান্য পাছৱর্ড, অতি কমেও ৪টা বর্ণ থাকিব লাগিব।"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g> টা বৰ্ণ থাকিব লাগিব</item>
- <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g> বৰ্ণ থাকিব লাগিব</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা সৰুফলাৰ বৰ্ণ থাকিব লাগিব</item>
- <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা সৰুফলাৰ বৰ্ণ থাকিব লাগিব</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা বৰফলাৰ বৰ্ণ থাকিব লাগিব</item>
- <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা বৰফলাৰ বৰ্ণ থাকিব লাগিব</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">কমেও <xliff:g id="COUNT">%d</xliff:g>টা অংক থাকিব লাগিব</item>
- <item quantity="other">কমেও <xliff:g id="COUNT">%d</xliff:g>টা অংক থাকিব লাগিব</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা বিশেষ চিহ্ন থাকিব লাগিব</item>
- <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা বিশেষ চিহ্ন থাকিব লাগিব</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা সংখ্যা বা প্ৰতীক থাকিব লাগিব</item>
- <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা সংখ্যা বা প্ৰতীক থাকিব লাগিব</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ডিভাইচৰ প্ৰশাসকে শেহতীয়া পাছৱৰ্ড ব্যৱহাৰ কৰিব নিদিয়ে"</string>
<string name="error_saving_password" msgid="8334882262622500658">"পাছৱৰ্ড ছেভ কৰোঁতে আঁসোৱাহ"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"আপোনাৰ আইটি প্ৰশাসকে উমৈহতীয়া পাছৱৰ্ডসমূহ অৱৰোধ কৰিছে। অন্য এটা পাছৱৰ্ড ব্যৱহাৰ কৰি চাওক।"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"এটা প্ৰ’ফাইল যোগ দিয়ক"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"এই প্ৰ’ফাইলটো মচক"</string>
<string name="add_profile_text" msgid="9118410102199116969">"প্ৰ’ফাইল যোগ দিয়ক"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ডিছপ্লে\'ৰ উজ্জ্বলতা"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"আপোনাৰ ডিভাইচসমূহ চাবলৈ ব্লুটুথ অন কৰক"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"কোনো ডিভাইচ পেয়াৰ কৰিবলৈ ব্লুটুথ ছেটিং খোলক"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"ইনফ’টেইনমেণ্ট ছিষ্টেমৰ প্ৰশাসক"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"সক্ৰিয় কৰা এপ্"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"নিষ্ক্ৰিয় কৰা এপ্"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"এই অনুমতিটো থকা এপৰ ওচৰত এই বাহনখনৰ ডেটা এক্সেছ আছে"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"কোনো প্ৰশাসকৰ এপ্ নাই"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"এই ইনফ’টেইনমেণ্ট ছিষ্টেমৰ প্ৰশাসক এপ্টো সক্ৰিয় হৈ আছে আৰু এইটোৱে <xliff:g id="APP_NAME">%1$s</xliff:g> এপ্টোক নিম্নলিখিত কাৰ্যকলাপসমূহ কৰিবলৈ দিয়ে:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"এই ইনফ’টেইনমেণ্ট ছিষ্টেম এপ্টো সক্ৰিয় কৰিলে <xliff:g id="APP_NAME">%1$s</xliff:g> এপ্টোক নিম্নলিখিত কাৰ্যকলাপসমূহ কৰিবলৈ দিয়ে:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"এই ইনফ’টেইনমেণ্ট ছিষ্টেম এপ্ সক্ৰিয় কৰিবনে?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"এই ইনফ’টেইনমেণ্ট ছিষ্টেম এপ্টো সক্ৰিয় কৰক"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"নিষ্ক্ৰিয় আৰু আনইনষ্টল কৰক"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"এই ইনফ’টেইনমেণ্ট ছিষ্টেম এপ্টো নিষ্ক্ৰিয় কৰক"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"অধিক সবিশেষ"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"প্ৰতিষ্ঠানটোৰ পৰিচালকে ছেটিং, অনুমতি, কৰ্পৰে’ট এক্সেছ, নেটৱৰ্কৰ কাৰ্যকলাপ আৰু বাহনখনৰ অৱস্থানৰ তথ্যক সামৰি, এই প্ৰ’ফাইলৰ সৈতে জড়িত এপ্ আৰু ডেটা নিৰীক্ষণ আৰু পৰিচালনা কৰিব পাৰে।"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"প্ৰতিষ্ঠানটোৰ পৰিচালকে ছেটিং, অনুমতি, কৰ্পৰে’ট এক্সেছ, নেটৱৰ্কৰ কাৰ্যকলাপ আৰু ডিভাইচৰ অৱস্থানৰ তথ্যক সামৰি, এই প্ৰ’ফাইলৰ সৈতে জড়িত এপ্ আৰু ডেটা নিৰীক্ষণ আৰু পৰিচালনা কৰিব পাৰে।"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"প্ৰতিষ্ঠানটোৰ পৰিচালকে ছেটিং, অনুমতি, কৰ্পৰে’ট এক্সেছ, নেটৱৰ্কৰ কাৰ্যকলাপ আৰু বাহনখনৰ অৱস্থানৰ তথ্যক সামৰি, এই ইনফ’টেইনমেণ্ট ছিষ্টেমৰ সৈতে জড়িত এপ্ আৰু ডেটা নিৰীক্ষণ আৰু পৰিচালনা কৰিব পাৰে।"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"প্ৰতিষ্ঠানটোৰ পৰিচালকে হয়তো এই ইনফ’টেইনমেণ্ট ছিষ্টেমৰ সৈতে জড়িত হৈ থকা ডেটা এক্সেছ কৰিব, এপ্ পৰিচালনা কৰিব আৰু এই বাহনখনৰ ছেটিং সলনি কৰিব পাৰিব।"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"এইটো উপলব্ধ নহয়"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"এই পৰিচালিত বাহনখনত ভলিউম সলনি কৰিব নোৱাৰি"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"এই পৰিচালিত বাহনখনত কল কৰিব নোৱাৰি"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"এই পৰিচালিত বাহনখনত এছএমএছৰ অনুমতি নাই"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"এই পৰিচালিত বাহনখনত কেমেৰা উপলব্ধ নহয়"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"এই পৰিচালিত বাহনখনত স্ক্ৰীনশ্বট ল’ব নোৱাৰি"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"এই পৰিচালিত বাহনখনত এই এপ্টো খুলিব নোৱাৰি"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"আপোনাৰ ঋণ প্ৰদানকাৰীয়ে অৱৰোধ কৰিছে"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"প্ৰতিষ্ঠানটোৱে কিছুমান সুবিধাৰ এক্সেছ সীমিত কৰিছে।\n\nযদি আপোনাৰ কিবা প্ৰশ্ন আছে, প্ৰতিষ্ঠানৰ পৰিচালকগৰাকীৰ সৈতে যোগাযোগ কৰক।"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"বাহনৰ প্ৰশাসক এপ্"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# টা সক্ৰিয় কৰা এপ্}one{# টা সক্ৰিয় কৰা এপ্}other{# টা সক্ৰিয় কৰা এপ্}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"কোনো সক্ৰিয় এপ্ নাই"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ৰ বাহনৰ নীতি"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"প্ৰতিষ্ঠানটোৰ পৰিচালকে পৰিচালনা কৰা ছেটিং"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g>ৰ বিষয়ে অধিক জানক"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবনে?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"এই বাহনখনৰ প্ৰতিষ্ঠানৰ প্ৰশাসকে এই ডিভাইচটোৰ সমস্যা সমাধান কৰাত সহায় কৰিবলৈ এটা বাগ সম্পর্কীয় অভিযোগৰ বাবে অনুৰোধ জনাইছে। এপ্ আৰু ডেটা শ্বেয়াৰ কৰা হ\'ব পাৰে।"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"এই বাহনখনৰ প্ৰতিষ্ঠানৰ প্ৰশাসকে এই ডিভাইচটোৰ সমস্যা সমাধান কৰাত সহায় কৰিবলৈ এটা বাগ সম্পর্কীয় অভিযোগৰ বাবে অনুৰোধ জনাইছে। এপ্ আৰু ডেটা শ্বেয়াৰ কৰা হ\'ব পাৰে আৰু আপোনাৰ ডিভাইচটো সাময়িকভাৱে লেহেমীয়া হ\'ব পাৰে।"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"এই বাগ সম্পর্কীয় অভিযোগটো এই বাহনখনৰ প্ৰতিষ্ঠানৰ প্ৰশাসকৰ সৈতে শ্বেয়াৰ কৰা হৈছে। অধিক সবিশেষৰ বাবে তেওঁলোকৰ সৈতে যোগাযোগ কৰক।"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"শ্বেয়াৰ কৰক"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"প্ৰত্যাখ্যান কৰক"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"এই ছেটিংটো এই মুহূৰ্তত সলনি কৰিব নোৱাৰি"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"সাধ্য সুবিধা"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"কেপশ্বন"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"কেপশ্বনৰ অগ্ৰাধিকাৰসমূহ"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"অফ আছে"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"অন আছে"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"স্ক্ৰীন ৰীডাৰ"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"কেপশ্বনসমূহ দেখুৱাওক"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"পাঠৰ আকাৰ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"কেপশ্বনৰ আকাৰ আৰু শৈলী"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"বেছি সৰু"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"সৰু"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ডিফ’ল্ট"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ডাঙৰ"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"বেছি ডাঙৰ"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"কেপশ্বন শৈলী"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"এপ্টোৱে ছেট কৰিছে"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"ক’লাৰ ওপৰত বগা"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"বগাৰ ওপৰত ক’লা"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"ক’লাৰ ওপৰত হালধীয়া"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"নীলাৰ ওপৰত হালধীয়া"</string>
</resources>
diff --git a/res/values-az/arrays.xml b/res/values-az/arrays.xml
index 17b22a4..76366d2 100644
--- a/res/values-az/arrays.xml
+++ b/res/values-az/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Heç vaxt icazə verməyin"</item>
<item msgid="1154273129608299386">"Həmişə icazə verin"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index df75862..a759c85 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Gecə rejimi"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Şəbəkə və internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobil şəbəkə"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktiv / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Deaktiv / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktiv / Endirilən SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Daha çox əlavə edin"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobil data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Mobil internetə giriş"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobil şəbəkə"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Mobil data istifadə edin"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobil data söndürülsün?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Seçim tələb olunur"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Mobil data üçün <xliff:g id="CARRIER">%1$s</xliff:g> istifadə edilsin?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> trafik xəbərdarlığı"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> trafik limiti"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> data xəbərdarlığı / <xliff:g id="ID_2">^2</xliff:g> data limiti"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d gün qalıb</item>
- <item quantity="one">%d gün qalıb</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# gün qalıb}other{# gün qalıb}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Vaxt qalmayıb"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 gündən az vaxt qalıb"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> təəfindən <xliff:g id="ID_2">^2</xliff:g> əvvəl güncəlləndi"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Ayarlayın"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Data xəbərdarlığı və limiti"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Tətbiq datasının istifadə tsikli"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobil data istifadəsi"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Xəbərdarlıq ayarlayın"</string>
<string name="data_warning" msgid="116776633806885370">"Trafik xəbərdarlığı"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Trafik limiti ayarlayın"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Ayarladığınız limitə çatdıqda, avtomobilinizin idarə paneli mobil datanı söndürəcək.\n\nData istifadəsi idarə paneli tərəfindən ölçüldüyü və operatorun hesablaması fərqli ola bildiyi üçün uyğun limit ayarlamağınız tövsiyə olunur."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Trafik istifadəsi xəbərdarlığı"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Trafik limiti"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Data istifadəsi cihazınız tərəfindən ölçülür. Mobil operatorunuzun datasından fərqli ola bilər."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Ayarlayın"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Yadda saxlayın"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM şəbəkəsi"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Avtomobilin interneti"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Avtomobilin internetini söndürmək bəzi avtomobil funksiyaları və ya tətbiqlərinin işləməsinə mane ola bilər.\n\nAvtomobilinizin işləməsi üçün lazım olan vacib data avtomobil istehsalçısı ilə paylaşılmağa davam edəcək."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"İstənilən halda deaktiv edin"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Avtomobilin interneti söndürülüb. Bəzi avtomobil funksiyaları və ya tətbiqləri işləməyə bilər. Avtomobilinizin işləməsi üçün lazım olan vacib data avtomobil istehsalçısı ilə paylaşılmağa davam edəcək."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s %1$s istifadə edilib"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Digər şəbəkəyə qoşulun"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Şəbəkə tərcihləri"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Şəbəkə əlavə edin"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Qoşun"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Qoşulur…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Qoşulmayıb"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Şəbəkənin əhatə dairəsində deyilsiniz"</string>
<string name="wifi_password" msgid="5565632142720292397">"Parol"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Parol görünsün"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi‑Fi hotspotu üçün azı bir diapazon seçin:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot və modem rejimi"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Deaktiv"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Hotspot avtomatik deaktiv edilsin"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Heç bir cihaz qoşulu olmazsa, Wi‑Fi hotspot\'u deaktiv ediləcək"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> Wi‑Fi şəbəkəsini aktiv etmək istəyir"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Dayandırılsın"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Dayandırılsın?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Tətbiqi məcburi dayandırsanız, o, düzgün işləməyə bilər."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Performans qorunması deaktiv edilsin?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Bunu etsəniz, proqram və avadanlıqınız da işləməyə bilər."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Aktiv saxlayın"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Deaktiv edin"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"\"Tətbiq performansını prioritetləşdir\" aktiv edilsin?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Bunu aktiv etməklə sistem stabil işləməyə və ya avadanlığa uzunmüddətli təsirin göstərilə bilər. Davam etmək istəyirsiniz?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Bəli"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Xeyr, çox sağ olun"</string>
<string name="disable_text" msgid="4358165448648990820">"Deaktiv edin"</string>
<string name="enable_text" msgid="1794971777861881238">"Aktiv edin"</string>
<string name="uninstall_text" msgid="277907956072833012">"Sistemdən silin"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"İcazələr"</string>
<string name="notifications_label" msgid="6586089149665170731">"Bildirişlər"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Yaddaş və keş"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Pik performansı təmin edin"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Tətbiq performansını prioritetləşdir"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versiya: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"İcazə verilməyib"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"İcazə sorğusu göndərilməyib"</string>
<string name="unused_apps" msgid="648471933781010395">"İstifadə olunmayan tətbiqlər"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> istifadə olunmayan tətbiq</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> istifadə olunmayan tətbiq</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# istifadə olunmayan tətbiq}other{# istifadə olunmayan tətbiq}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"İcazələri silin və yer boşaldın"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"Daxili yaddaşda %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Lazım olduqda, resurslardan həddindən artıq istifadə etməmək üçün tətbiqi bağlayın"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Tətbiq performansını prioritetləşdirmək üçün sistem resurslarından istifadə edilir"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Data istifadəsi"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Tətbiq trafiki"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"İstifadə tarixçəsi"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Bütün tətbiqlər"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data və Wi‑Fi istifadəsi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"İstifadə tarixçəsi"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Cəmi istifadə"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Ön plan"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Arxa fon"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Dataya icazə verin"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Bu tətbiqin mobil data istifadə etməsinə icazə verin"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Datanı məhdudlaşdırın"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Mobil datadan yalnız tətbiq ön planda olduqda istifadə edin"</string>
<string name="computing_size" msgid="5791407621793083965">"Hesablanır…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> əlavə icazə</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> əlavə icazə</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# əlavə icazə}other{# əlavə icazə}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Qeyd: Yenidən yüklənmədən sonra, avtomobilin kilidini açmadan tətbiq başlaya bilməz."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Yardım və səslə daxiletmə"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Yardım tətbiqi"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi idarəetməsi tətbiqə Wi-Fi şəbəkəsini aktiv və ya deaktiv etmək, Wi-Fi şəbəkələrini skan etmək və onlara qoşulmaq, şəbəkə əlavə etmək və ya silmək, yaxud yalnız lokal olan hotspota qoşulmaq imkanı verir."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Daha çox"</string>
<string name="location_settings_title" msgid="901334356682423679">"Məkan"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Məkandan istifadə edin"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Təyin etdiyiniz tətbiqlərin məkanınıza girişinə icazə verin"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Bunu deaktiv etsəniz, bütün tətbiqlər üçün məkana giriş silinəcək. Sürücü Yardımı tətbiqlərinin hələ də girişi olacaq."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Sürücü Yardımı üçün məkan istifadə edin"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Avtomobilin məkanı deaktivdir"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Sürücü Yardımı tətbiqləri məkanınıza giriş edə bilmir"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Dəyişin"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Sürməyə kömək edən tətbiqlərin məkanınıza girişinə icazə verin"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Bunu deaktiv etsəniz, məkan məlumatlarına əsaslanan Sürücü Yardımı tətbiqləri deaktiv ediləcək."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"İstənilən halda deaktiv edin"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Son Məkan Sorğuları"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Məkan sorğusu yoxdur"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Tətbiq səviyyəsi icazələri"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Məkan Xidmətləri"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Məkandan istifadə edin"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Məkan GPS, Wi‑Fi, mobil şəbəkə və sensor kimi mənbələrdən cihazınızın məkanını təyin etmək üçün istifadə edə bilər."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Sürücü yardımı"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Sürücü Yardımı tətbiqlərinə göndərilən məkan məlumatları sizi tanıdan məlumatları ehtiva etmir. Silinməzdən əvvəl maksimum 2 gün saxlanılır."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Mikrofondan istifadə edin"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Bütün tətbiqlərin mikrofonunuza girişinə icazə verin"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Mikrofon icazələrini idarə edin"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Son vaxtlar giriş edilib"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Heç bir son tətbiq yoxdur"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 tətbiqin girişi var"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{#/{total_count} tətbiqin girişi var}other{#/{total_count} tətbiqin girişi var}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Son vaxtlar giriş edilib"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Hamısına baxın"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Yüklənir…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Sistem yenilənməsi"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Qabaqcıl"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Üçüncü tərəf lisenziyaları"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Lisenziyaların yüklənilməsində problem var."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Yüklənir…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">İndi tərtibatçı olmağınıza <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> addım qalıb.</item>
- <item quantity="one">İndi tərtibatçı olmağınıza <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> addım qalıb.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{İndi tərtibatçı olmağınıza # addım qalıb.}other{İndi tərtibatçı olmağınıza # addım qalıb.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Siz indi tərtibatçısınız!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Ehtiyac yoxdur, siz artıq tərtibatçısınız."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Tərtibatçı seçimləri"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Yeni bir profil yaratdıqdan sonra həmin şəxs onu özü üçün fərdiləşdirməlidir."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Tətbiqlər bütün digər profillər tərəfindən istifadə üçün istənilən profildən güncəllənə bilər."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profil limitinə çatmısınız"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Maksimum <xliff:g id="COUNT">%d</xliff:g> profil yarada bilərsiniz.</item>
- <item quantity="one">Yalnız bir profil yaradıla bilər.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Yalnız bir profil yaradıla bilər.}other{Maksimum # profil yarada bilərsiniz.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Yeni profil yaratmaq mümkün olmadı"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Bu profil silinsin?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Bu profildəki bütün tətbiqlər və data silinəcək"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profili silmək mümkün olmadı."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil silinmədi. Cihazı yenidən başladıb cəhd edin."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Bu profil profilləri dəyişdirdikdə və ya nəqliyyat vasitəsini yenidən başlatdıqda silinəcək."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Silin"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Yenidən cəhd edin"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Sxem kilidini necə çəkməli"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Modeli saxlamaqla bağlı problem var"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Həddindən çox yanlış cəhdlər. <xliff:g id="NUMBER">%d</xliff:g> saniyəyə yenidən cəhd edin."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Model fırlanmanı dəstəkləmir, toxunuşdan istifadə edin"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Ekran kilidi ləğv edilsin?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Bu, hər kəsə hesabınıza daxil olmaq imkanı verəcək"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Ümumi PIN kodlar IT admini tərəfindən blok edilib. Fərqli PIN kod sınayın."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Yalnış simvol daxil edə bilməzsiniz"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Parol yanlışdır, ən azı 4 simvol olmalıdır."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Ən azı <xliff:g id="COUNT">%d</xliff:g> hərf olmalıdır</item>
- <item quantity="one">Ən azı 1 hərf olmalıdır</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Ən azı <xliff:g id="COUNT">%d</xliff:g> kiçik hərf olmalıdır</item>
- <item quantity="one">Ən azı 1 kiçik hərf olmalıdır</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Ən azı <xliff:g id="COUNT">%d</xliff:g> böyük hərf olmalıdır</item>
- <item quantity="one">Ən azı 1 böyük hərf olmalıdır</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Ən azı <xliff:g id="COUNT">%d</xliff:g> rəqəm olmalıdır</item>
- <item quantity="one">Ən azı 1 rəqəm olmalıdır</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Ən azı <xliff:g id="COUNT">%d</xliff:g> xüsusi simvol olmalıdır</item>
- <item quantity="one">Ən azı 1 xüsusi simvol olmalıdır</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Ən azı hərf olmayan <xliff:g id="COUNT">%d</xliff:g> simvol olmalıdır</item>
- <item quantity="one">Ən azı hərf olmayan 1 simvol olmalıdır</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Cihaz admini son vaxtlardakı parolu istifadə etməyə icazə vermir"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Parolu saxlamaqla bağlı problem var"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Ümumi parollar IT admini tərəfindən blok edilib. Fərqli parolu sınayın."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Profil əlavə edin"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Bu profili silin"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Profil əlavə edin"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Displey parlaqlığı"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Cihazlarınızı görmək üçün Bluetooth\'u aktiv edin"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Cihazı birləşdirmək üçün Bluetooth ayarlarını açın"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Məlumat-əyləncə sisteminin admini"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktiv edilmiş tətbiqlər"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktiv edilmiş tətbiqlər"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Bu icazəyə malik olan tətbiqlər bu avtomobilin datasına giriş edə bilər"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Avtomobilin admin tətbiqləri yoxdur"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Bu məlumat-əyləncə sisteminin admin tətbiqi aktivdir və <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə aşağıdakı əməliyyatları etməyə icazə verir:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Bu məlumat-əyləncə sistemi tətbiqini aktiv etdikdə <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə aşağıdakı əməliyyatları etməyə icazə verir:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Bu məlumat-əyləncə sistemi tətbiqi aktiv edilsin?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Bu məlumat-əyləncə sistemi tətbiqini aktiv edin"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktiv edin və sistemdən silin"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Bu məlumat-əyləncə sistemi tətbiqini deaktiv edin"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Daha ətraflı"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Təşkilat meneceriniz ayarlar, icazələr, korporativ giriş, şəbəkə fəaliyyəti və avtomobilin məkan məlumatı da daxil olmaqla bu profil ilə əlaqəli tətbiqlər və dataya nəzarət edə və idarə edə bilər."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Təşkilat meneceriniz ayarlar, icazələr, korporativ giriş, şəbəkə fəaliyyəti və cihazın məkan məlumatı da daxil olmaqla bu profil ilə əlaqəli tətbiqlər və dataya nəzarət edə və idarə edə bilər."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Təşkilat meneceri ayarlar, icazələr, korporativ giriş, şəbəkə fəaliyyəti və avtomobilin məkan məlumatı da daxil olmaqla bu məlumat-əyləncə sistemi ilə əlaqəli tətbiqlər və dataya nəzarət edə və idarə edə bilər."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Təşkilat meneceri bu məlumat-əyləncə sistemi ilə əlaqəli dataya giriş edə, tətbiqləri idarə edə və bu avtomobilin ayarlarını dəyişdirə bilər."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Bu, əlçatan deyil"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Bu idarə olunan avtomobildə səsi dəyişdirmək mümkün deyil"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Bu idarə olunan avtomobildə zəng etmək olmur"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Bu idarə olunan avtomobildə SMS-ə icazə verilmir"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Bu idarə olunan avtomobildə kamera əlçatan deyil"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Bu idarə olunan avtomobildə skrinşot çəkmək olmur"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Bu idarə olunan avtomobildə bu tətbiqi açmaq olmur"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Kredit təminatçınız tərəfindən bloklanıb"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Bəzi funksiyalara giriş təşkilat tərəfindən məhdudlaşdırılıb.\n\nSualınız varsa, təşkilat meneceri ilə əlaqə saxlayın."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Avtomobilin admin tətbiqləri"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktiv edilmiş tətbiq}other{# aktiv edilmiş tətbiq}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Aktiv edilmiş tətbiq yoxdur"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> avtomobil siyasəti"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Ayarlar təşkilat meneceri tərəfindən idarə edilir"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> haqqında ətraflı məlumat"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Baq hesabatı paylaşılsın?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Bu avtomobilin təşkilat meneceri bu cihazda nasazlıqların aşkarlanması üçün baq hesabatı sorğusu göndərdi. Tətbiqlər və data paylaşıla bilər."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Bu avtomobilin təşkilat meneceri bu cihazda nasazlıqların aşkarlanması üçün baq hesabatı sorğusu göndərdi. Tətbiqlər və data paylaşıla və cihazınızın surəti müvəqqəti azala bilər."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Bu baq hesabatı bu avtomobilin təşkilat meneceri ilə paylaşılır. Ətraflı məlumat üçün onunla əlaqə saxlayın."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Paylaşın"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"İmtina edin"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Bu ayar hazırda dəyişdirilə bilməz"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Əlçatımlılıq"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Altyazılar"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Altyazı tərcihləri"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Deaktiv"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Aktiv"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Ekran oxuyucusu"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Altyazılar göstərilsin"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Mətn ölçüsü"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Altyazı ölçü və üslubu"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Çox kiçik"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Kiçik"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Defolt"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Böyük"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Çox böyük"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Altyazı üslubu"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Tətbiqlə ayarlayın"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Qara üstündə ağ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Ağ üstündə qara"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Qara üstündə sarı"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Mavi üstündə sarı"</string>
</resources>
diff --git a/res/values-b+sr+Latn/arrays.xml b/res/values-b+sr+Latn/arrays.xml
index 84059a1..49d2934 100644
--- a/res/values-b+sr+Latn/arrays.xml
+++ b/res/values-b+sr+Latn/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nikada ne dozvoli"</item>
<item msgid="1154273129608299386">"Uvek dozvoli"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 112d06c..40ec8ce 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -27,11 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Noćni režim"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Mreža i internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilna mreža"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM kartica</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM kartice</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM kartica</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM kartica}one{# SIM kartica}few{# SIM kartice}other{# SIM kartica}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktivno/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Neaktivno/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktivno/preuzeti SIM"</string>
@@ -39,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Dodajte još"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilni podaci"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Koristi podatke preko mobilne mreže"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilna mreža"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Koristi mobilne podatke"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Želite li da isključite mobilne podatke?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Treba da izaberete nešto"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Koristiti <xliff:g id="CARRIER">%1$s</xliff:g> za mob. podatke?"</string>
@@ -54,11 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Upozorenje za potrošnju podataka: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Ograničenje potrošnje podataka: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Upozorenje za potrošnju podataka: <xliff:g id="ID_1">^1</xliff:g>/Ograničenje potrošnje podataka: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Ostao je još %d dan</item>
- <item quantity="few">Ostala su još %d dana</item>
- <item quantity="other">Ostalo je još %d dana</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Preostao je # dan}one{Preostao je # dan}few{Preostala su # dana}other{Preostalo je # dana}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Vreme je isteklo"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Preostalo je manje od jednog dana"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Ažurirao operater <xliff:g id="ID_1">^1</xliff:g> pre <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -73,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Podesi"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Upozorenje i ograničenja za podatke"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciklus potrošnje podataka aplikacije"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Potrošnja mobilnih podataka"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Podesite upozorenja o podacima"</string>
<string name="data_warning" msgid="116776633806885370">"Upozorenje na potrošnju podataka"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Podesite ograničenja za podatke"</string>
@@ -81,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Glavna jedinica u vozilu će isključiti mobilne podatke čim dostigne ograničenje koje ste podesili.\n\nPošto potrošnju podataka meri glavna jedinica, a mobilni operater može drugačije da računa potrošnju, razmislite o tome da podesite neko uobičajeno ograničenje."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Podesite upozorenje o potrošnji podataka"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Podesite ograničenje potrošnje podataka"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Potrošnju podataka meri uređaj. Može da se razlikuje od podataka mobilnog operatera."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Podesi"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Sačuvaj"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Mreža proizvođača originalne opreme"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet u vozilu"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Ako isključite internet u vozilu, neke funkcije ili aplikacije vozila možda neće raditi.\n\nPodaci neophodni za rad vozila i dalje će se deliti sa proizvođačem vozila."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Ipak isključi"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet u vozilu je isključen. To može da onemogući neke funkcije ili aplikacije vozila. Podaci neophodni za rad vozila i dalje će se deliti sa proizvođačem vozila."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Iskorišćeno je %1$s u periodu %2$s–%3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Pridruži me drugoj mreži"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Podešavanja mreže"</string>
@@ -96,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj mrežu"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Poveži se"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Povezuje se…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nije povezano"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Mreža nije u dometu"</string>
<string name="wifi_password" msgid="5565632142720292397">"Lozinka"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Prikaži lozinku"</string>
@@ -157,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Odaberite bar jedan opseg za Wi‑Fi hotspot:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot i privezivanje"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Isključeno"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Automatski isključi hotspot"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi hotspot će se isključiti ako nijedan uređaj nije povezan"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> želi da uključi WiFi"</string>
@@ -299,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Prinudno zaustavi"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Želite li da prinudno zaustavite?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ako prinudno zaustavite aplikaciju, možda će se ponašati neočekivano."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Želite da isključite zaštitu učinka?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ako je isključite, softver i hardver možda neće raditi tako dobro."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Ostavi uključeno"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Isključi"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Uključite prioritet učinka aplikacije?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Uključivanjem može da dođe do potencijalne nestabilnosti sistema ili dugotrajnog uticaja na hardver Želite li da nastavite?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Da"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ne, hvala"</string>
<string name="disable_text" msgid="4358165448648990820">"Onemogući"</string>
<string name="enable_text" msgid="1794971777861881238">"Omogući"</string>
<string name="uninstall_text" msgid="277907956072833012">"Deinstaliraj"</string>
@@ -312,27 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Dozvole"</string>
<string name="notifications_label" msgid="6586089149665170731">"Obaveštenja"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Memorijski prostor i keš"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Obezbedi najbolji učinak"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Daj prioritet učinku aplikacije"</string>
<string name="application_version_label" msgid="8556889839783311649">"Verzija: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nijedna dozvola nije odobrena"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nijedna dozvola nije zahtevana"</string>
<string name="unused_apps" msgid="648471933781010395">"Aplikacije koje se ne koriste"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aplikacija koja se ne koristi</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplikacije koje se ne koriste</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikacija koje se ne koriste</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# aplikacija koja se ne koristi}one{# aplikacija koje se ne koristi}few{# aplikacije koje se ne koriste}other{# aplikacija koje se ne koriste}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Ukloni dozvole i oslobodi prostor"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s u internoj memoriji"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Po potrebi zatvara aplikaciju radi manjeg korišćenja resursa"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Koristi sistemske resurse za davanje prioriteta učinku aplikacije"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Potrošnja podataka"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Potrošnja podataka apl."</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Istorija potrošnje"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Sve aplikacije"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Mobilni podaci i WiFi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Istorija potrošnje"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Ukupna potrošnja"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"U prvom planu"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"U pozadini"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Dozvoli podatke"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Dozvolite aplikaciji da koristi mobilne podatke"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Ograniči podatke"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Mobilni podaci samo kad je aplik. u prvom planu"</string>
<string name="computing_size" msgid="5791407621793083965">"Izračunava se..."</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dodatna dozvola</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatne dozvole</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatnih dozvola</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# dodatna dozvola}one{# dodatna dozvola}few{# dodatne dozvole}other{# dodatnih dozvola}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Napomena: Posle restartovanja ova aplikacija ne može da se pokrene dok ne otključate vozilo."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomoćnik i glasovni unos"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplikacija za pomoć"</string>
@@ -389,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Kontrola WiFi mreže omogućava aplikaciji da uključi ili isključi WiFi, traži i povezuje se na WiFi mreže, dodaje ili uklanja mreže ili pokreće samo lokalni hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Još"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lokacija"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Koristi lokaciju"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Dozvoljava lokaciju za aplikacije koje navedete"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Ako isključite ovo, uklonićete pristup lokaciji za sve aplikacije. Aplikacije pomoći za vozače će i dalje imati pristup."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Koristi lokaciju za pomoć za vozače"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Lokacija vozika je isključena"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Pomoć za vozače ne pristupa lokaciji"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Promeni"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Dozvoljava pristup lokaciji aplikacijama za pomoć u vožnji"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ako isključite ovo, aplikacije pomoći za vozače koje se oslanjaju na informacije o lokaciji će se onemogućiti."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Ipak isključi"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedavni zahtevi za lokaciju"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nema nedavnih zahteva za lokaciju"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Dozvole na nivou aplikacija"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Usluge lokacije"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Koristi lokaciju"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Lokacija može da koristi izvore kao što su GPS, WiFi, mobilne mreže i senzori da bi se lakše odredila lokacija uređaja."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Pomoć za vozače"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Informacije o lokaciji koje se šalju aplikacijama pomoći za vozače ne sadrže informacije koje vas identifikuju. Čuvaju se najviše 2 dana pre nego što se izbrišu."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Koristi mikrofon"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Dozvolite svim aplikacijama da pristupaju mikrofonu"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Upravljajte dozvolama za mikrofon"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Nedavno pristupano"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nema nedavnih aplikacija"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 aplikacija ima pristup"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# od ukupno {total_count} aplikacije koja ima pristup}one{# od ukupno {total_count} aplikacije koja ima pristup}few{# od ukupno {total_count} aplikacije koje imaju pristup}other{# od ukupno {total_count} aplikacija koje imaju pristup}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nedavno pristupano"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Prikaži sve"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Učitava se…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Ažuriranja sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Napredno"</string>
@@ -433,11 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licence trećih strana"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Došlo je do problema pri učitavanju licenci."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Učitava se…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Treba da obavite još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak da biste postali programer.</item>
- <item quantity="few">Treba da obavite još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka da biste postali programer.</item>
- <item quantity="other">Treba da obavite još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka da biste postali programer.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Treba da obavite još # korak da biste postali programer.}one{Treba da obavite još # korak da biste postali programer.}few{Treba da obavite još # koraka da biste postali programer.}other{Treba da obavite još # koraka da biste postali programer.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Postali ste programer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Nema potrebe, već ste programer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opcije za programere"</string>
@@ -506,15 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Kada napravite nov profil, ta osoba treba sama da ga prilagodi."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Aplikacije mogu da se ažuriraju sa bilo kog profila za sve druge profile."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Dostignut maksimalan broj profila"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Možete da napravite najviše <xliff:g id="COUNT">%d</xliff:g> profil.</item>
- <item quantity="few">Možete da napravite najviše <xliff:g id="COUNT">%d</xliff:g> profila.</item>
- <item quantity="other">Možete da napravite najviše <xliff:g id="COUNT">%d</xliff:g> profila.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Možete da napravite samo jedan profil.}one{Možete da napravite najviše # profil.}few{Možete da napravite najviše # profila.}other{Možete da napravite najviše # profila.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Pravljenje novog profila nije uspelo"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Želite da izbrišete ovaj profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Izbrisaćete sve aplikacije i podatke za ovaj profil"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Brisanje profila nije uspelo."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil nije izbrisan. Restartujte uređaj i probajte ponovo."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ovaj profil se briše kada pređete na drugi profil ili restartujete vozilo."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Odbaci"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Probaj ponovo"</string>
@@ -627,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Kako nacrtati šablon za otključavanje"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Greška pri čuvanju šablona"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Previše netačnih pokušaja. Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sek."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Umesto rotirajućeg unosa koristite dodir"</string>
<string name="okay" msgid="4589873324439764349">"Potvrdi"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Uklonićete zaključavanje ekrana?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Tada će svako moći da pristupi vašem nalogu"</string>
@@ -658,36 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"IT administrator blokira česte PIN-ove. Izaberite drugi PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Ne sme da obuhvata nevažeći znak."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Lozinka je nevažeća, mora da sadrži najmanje 4 znaka."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> slovo</item>
- <item quantity="few">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> slova</item>
- <item quantity="other">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> slova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> malo slovo</item>
- <item quantity="few">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> mala slova</item>
- <item quantity="other">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> malih slova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> veliko slovo</item>
- <item quantity="few">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> velika slova</item>
- <item quantity="other">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> velikih slova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> cifru</item>
- <item quantity="few">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> cifre</item>
- <item quantity="other">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> cifara</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> specijalni simbol</item>
- <item quantity="few">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> specijalna simbola</item>
- <item quantity="other">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> specijalnih simbola</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> znak koji nije slovo</item>
- <item quantity="few">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> znaka koji nisu slova</item>
- <item quantity="other">Mora da sadrži najmanje <xliff:g id="COUNT">%d</xliff:g> znakova koji nisu slova</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Administrator uređaja ne dozvoljava upotrebu nedavno korišćene lozinke"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Greška pri čuvanju lozinke"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"IT administrator blokira česte lozinke. Izaberite drugu lozinku."</string>
@@ -730,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Dodaj profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Izbriši ovaj profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Dodajte profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Osvetljenost ekrana"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Da biste videli uređaje, uključite Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Da biste uparili uređaj, otvorite Bluetooth podešavanja"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrator sistema za info-zabavu"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivirane aplikacije"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktivirane aplikacije"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplikacije sa ovom dozvolom imaju pristup podacima o ovom vozilu"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nema aplikacija za administratora automobila"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Ova aplikacija administratora sistema za info-zabavu je aktivna i omogućava aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da obavlja sledeće operacije:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Aktiviranjem ove aplikacije sistema za info-zabavu omogućava se aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da obavlja sledeće operacije:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktiviraćete aplikaciju za info-zabavu?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktiviraj ovu aplikaciju sistema za info-zabavu"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktiviraj i deinstaliraj"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deaktiviraj ovu aplikaciju sistema za info-zabavu"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Još detalja"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Menadžer organizacije može da nadgleda aplikacije i podatke povezane sa ovim profilom, uključujući podešavanja, dozvole, korporativni pristup, mrežnu aktivnost i informacije o lokaciji vozila, kao i da upravlja njima."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Menadžer organizacije može da nadgleda aplikacije i podatke povezane sa ovim profilom, uključujući podešavanja, dozvole, korporativni pristup, mrežnu aktivnost i informacije o lokaciji uređaja, kao i da upravlja njima."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Menadžer organizacije može da nadgleda aplikacije i podatke povezane sa ovim sistemom za info-zabavu, uključujući podešavanja, dozvole, korporativni pristup, aktivnosti na mreži i informacije o lokaciji uređaja, kao i da upravlja njima."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Menadžer organizacije će možda moći da pristupa podacima povezanim sa ovim sistemom za info-zabavu, da upravlja aplikacijama i da menja podešavanja ovog vozila."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"To je nedostupno"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Ne možete da promenite jačinu zvuka u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Ne možete da upućujete pozive u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS nije dozvoljen u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera nije dostupna u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Snimanje snimaka ekrana u ovom vozilu kojim se upravlja nije moguće"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Ne možete da otvorite tu aplikaciju u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blokira dobavljač kredita"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Organizacija je ograničila pristup nekim funkcijama.\n\nAko imate pitanja, obratite se menadžeru organizacije."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Aplikacije administratora vozila"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivirana aplikacija}one{# aktivirana aplikacija}few{# aktivirane aplikacije}other{# aktiviranih aplikacija}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nema aktiviranih aplikacija"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Smernice za vozila organizacije <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Podešavanja kojima upravlja menadžer organizacije"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Saznajte više o: <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Želite li da delite izveštaj o grešci?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Menadžer organizacije za ovo vozilo je zatražio izveštaj o grešci radi lakšeg rešavanja problema u vezi sa ovim uređajem. Aplikacije i podaci mogu da se dele."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Menadžer organizacije za ovo vozilo je zatražio izveštaj o grešci radi lakšeg rešavanja problema u vezi sa ovim uređajem. Aplikacije i podaci mogu da se dele, a uređaj će se privremeno usporiti."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Ovaj izveštaj o grešci se deli sa menadžerom organizacije za ovo vozilo. Obratite mu se za više detalja."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Deli"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Odbij"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Trenutno ne možete da promenite ovo podešavanje"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Pristupačnost"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Titl"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Podešavanja titla"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Isključeno"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Uključeno"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Čitač ekrana"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Prikaži titl"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Veličina teksta"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Veličina i stil titla"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Veoma malo"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Malo"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Podrazumevano"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Veliko"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Veoma veliko"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Stil titla"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Podešava aplikacija"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Belo na crno"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Crno na belo"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Žuto na crno"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Žuto na plavo"</string>
</resources>
diff --git a/res/values-be/arrays.xml b/res/values-be/arrays.xml
index 14c1c5c..885a53d 100644
--- a/res/values-be/arrays.xml
+++ b/res/values-be/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ніколі не дазваляць"</item>
<item msgid="1154273129608299386">"Заўсёды дазваляць"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 74a9094..182cefb 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -27,12 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Начны рэжым"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Сетка і інтэрнэт"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Мабільная сетка"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карта</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карты</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карт</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карты</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-карта}one{# SIM-карта}few{# SIM-карты}many{# SIM-карт}other{# SIM-карты}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Актывавана / SIM-карта"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Не актывавана / SIM-карта"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Актывавана / Спампаваная SIM-карта"</string>
@@ -40,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Дадаць яшчэ"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мабільная перадача даных"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Доступ да даных па мабільнай сетцы"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Мабільная сетка"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Выкарыстоўваць мабільную перадачу даных"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Адключыць мабільную перадачу даных?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Трэба выбраць"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Выкарыстоўваць <xliff:g id="CARRIER">%1$s</xliff:g> для трафіка?"</string>
@@ -55,12 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Папярэджанне перадачы даных: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Абмежаванне трафіка: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Папярэджанне перадачы даных: <xliff:g id="ID_1">^1</xliff:g> / Ліміт трафіка: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Застаўся %d дзень</item>
- <item quantity="few">Засталося %d дні</item>
- <item quantity="many">Засталося %d дзён</item>
- <item quantity="other">Засталося %d дня</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Застаўся # дзень}one{Застаўся # дзень}few{Засталося # дні}many{Засталося # дзён}other{Засталося # дня}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Часу не засталося"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Засталося менш за 1 дзень"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Абноўлена <xliff:g id="ID_2">^2</xliff:g> таму аператарам \"<xliff:g id="ID_1">^1</xliff:g>\""</string>
@@ -75,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Задаць"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Папярэджанне і ліміт трафіка"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Цыкл выкарыстання трафіка праграм"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Выкарыстанне мабільнай перадачы даных"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Папярэджваць пра ліміт трафіка"</string>
<string name="data_warning" msgid="116776633806885370">"Папярэджанне пра ліміт трафіка"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Задаць ліміт трафіка"</string>
@@ -83,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Пасля дасягнення вызначанага ліміту трафіка галаўная прылада аўтамабіля выключыць мабільную перадачу даных.\n\nПаколькі метады разліку выкарыстання трафіка галаўной прыладай і аператарам могуць адрознівацца, мы рэкамендуем устанавіць заніжаны ліміт."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Усталюйце папярэджанне аб выкарыстанні трафіка"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Усталюйце ліміт выкарыстання трафіка"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Выкарыстанне трафіка вымяраецца прыладай. Гэтыя звесткі могуць адрознівацца ад даных аператара мабільнай сувязі."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Задаць"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Захаваць"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Сетка OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Інтэрнэт у аўтамабілі"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Выключэнне інтэрнэту ў аўтамабілі можа заблакіраваць работу пэўных функцый або праграм аўтамабіля.\n\nМінімальны аб\'ём даных, патрэбны для эксплуатацыі аўтамабіля, будзе працягваць перадавацца вытворцу аўтамабіля."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Усё роўна выключыць"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Інтэрнэту ў аўтамабілі выключаны. Гэта можа заблакіраваць работу пэўных функцый або праграм аўтамабіля. Мінімальны аб\'ём даных, патрэбны для эксплуатацыі аўтамабіля, будзе працягваць перадавацца вытворцу аўтамабіля."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"З %2$s да %3$s выкарыстана %1$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Далучыцца да іншай сеткі"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Параметры сеткі"</string>
@@ -98,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Дадаць сетку"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Падключыць"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Ідзе падключэнне…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Не падключана"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Сетка не ў зоне дасягальнасці"</string>
<string name="wifi_password" msgid="5565632142720292397">"Пароль"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Паказваць пароль"</string>
@@ -159,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Выберыце дыяпазон Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Хот-спот і мадэм"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Хот-спот"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Выключана"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Аўтаматычна выключаць хот-спот"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Хот-спот Wi‑Fi выключыцца, калі прылады непадключаныя"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"Уключыце Wi-Fi для праграмы \"<xliff:g id="REQUESTER">%s</xliff:g>\""</string>
@@ -301,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Прымусова спыніць"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Спыніць прымусова?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Прымусовае спыненне дзейнасці праграмы можа прывесці да збою."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Выключыць абарону прадукцыйнасці?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Пасля выключэння праграмнае і апаратнае забеспячэнне таксама могуць перастаць працаваць."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Не выключаць"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Выключыць"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Уключыць прыярытэт прадукцыйнасці праграмы?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Уключэнне гэтай налады можа стаць прычынай нестабільнасці сістэмы або мець доўгатэрміновае ўздзеянне на апаратнае забеспячэнне. Працягнуць?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Так"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Не, дзякуй"</string>
<string name="disable_text" msgid="4358165448648990820">"Адключыць"</string>
<string name="enable_text" msgid="1794971777861881238">"Уключыць"</string>
<string name="uninstall_text" msgid="277907956072833012">"Выдаліць"</string>
@@ -314,29 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Дазволы"</string>
<string name="notifications_label" msgid="6586089149665170731">"Апавяшчэнні"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Сховішча і кэш"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Забяспечваць максімум прадукцыйнасці"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Прыярытэт прадукцыйнасці праграмы"</string>
<string name="application_version_label" msgid="8556889839783311649">"Версія: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Няма дазволаў"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Няма запытаў на дазволы"</string>
<string name="unused_apps" msgid="648471933781010395">"Праграмы, якія не выкарыстоўваюцца"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> праграма не выкарыстоўваецца</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> праграмы не выкарыстоўваюцца</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> праграм не выкарыстоўваюцца</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> праграмы не выкарыстоўваецца</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# праграма не выкарыстоўваецца}one{# праграма не выкарыстоўваецца}few{# праграмы не выкарыстоўваюцца}many{# праграм не выкарыстоўваюцца}other{# праграмы не выкарыстоўваюцца}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Выдаліць дазволы і вызваліць месца"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s ва ўнутраным сховішчы"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Можна закрываць праграму, калі неабходна эканоміць рэсурсы"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Каб аддаваць прыярытэт прадукцыйнасці праграмы, выкарыстоўваюцца сістэмныя рэсурсы"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Выкарыстанне трафіка"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Выкарыстанне трафіка"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Выкарыстанне трафіка"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Усе праграмы"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Мабільны інтэрнэт і Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Выкарыстанне трафіка"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Усяго выкарыстана"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"У актыўным рэжыме"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"У фонавым рэжыме"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Дазволіць перадачу даных"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Дазволіць выкарыстоўваць мабільную перадачу даных"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Абмежаваць перадачу даных"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Выкарыстоўваць маб. інтэрнэт толькі ў акт. рэжыме"</string>
<string name="computing_size" msgid="5791407621793083965">"Вылічэнне…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дадатковы дазвол</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дадатковыя дазволы</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> дадатковых дазволаў</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дадатковага дазволу</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# дадатковы дазвол}one{# дадатковы дазвол}few{# дадатковыя дазволы}many{# дадатковых дазволаў}other{# дадатковага дазволу}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Заўвага! Пасля перазагрузкі гэта праграма не зможа запусціцца, пакуль вы не разблакіруеце аўтамабіль."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Памочнік і галасавы ўвод"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Праграма-памочнік"</string>
@@ -393,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Кантроль Wi-Fi дазваляе праграме ўключаць ці выключаць Wi-Fi, шукаць сеткі Wi-Fi і падключацца да іх, дадаваць або выдаляць сеткі ці запускаць лакальны хот-спот."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Яшчэ"</string>
<string name="location_settings_title" msgid="901334356682423679">"Месцазнаходжанне"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Выкарыстоўваць месцазнаходжанне"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Даць доступ да геаданых выбраным праграмам"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Калі выключыць гэту наладу, доступ да геаданых будзе выдалены для ўсіх праграм, але не для праграм падтрымкі вадзіцеля."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Выкарыстоўваць геаданыя для падтрымкі вадзіцеля"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Геалакацыя аўтамабіля выключана"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Праграмы дапамогі вадзіцелю не маюць доступу да геаданых"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Змяніць"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Даць доступ да геаданых праграмам падтрымкі вадзіцеля"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Калі выключыць гэту наладу, праграмы падтрымкі вадзіцеля, для работы якіх патрабуецца інфармацыя аб месцазнаходжанні, будуць выключаны."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Усё роўна выключыць"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Нядаўнія запыты геаданых"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Няма нядаўніх запытаў геаданых"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Дазволы на ўзроўні праграм"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Службы геалакацыі"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Выкарыстоўваць геалакацыю"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Для вызначэння месцазнаходжання прылады могуць выкарыстоўвацца даныя GPS, Wi-Fi, мабільных сетак і датчыкаў."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Падтрымка вадзіцеля"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Звесткі пра месцазнаходжанне, якія адпраўляюцца праграмам дапамогі вадзіцелю, не змяшчаюць інфармацыі, па якой вас можна ідэнтыфікаваць. Яны захоўваюцца не больш за 2 дні, пасля чаго выдаляюцца."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Мікрафон"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Выкарыстоўваць мікрафон"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Даць усім праграмам доступ да мікрафона"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Кіраваць дазволамі мікрафона"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Нядаўна атрымлівалі доступ"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Ніякія праграмы не выкарыстоўвалі нядаўна мікрафон"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Ні адна праграма не мае доступу"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{У # праграмы з {total_count} ёсць доступ}one{У # праграмы з {total_count} ёсць доступ}few{У # праграм з {total_count} ёсць доступ}many{У # праграм з {total_count} ёсць доступ}other{У # праграмы з {total_count} ёсць доступ}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Нядаўна атрымлівалі доступ"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Праглядзець усе"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Ідзе загрузка…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Сістэма"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Абнаўленне сістэмы"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Дадаткова"</string>
@@ -437,12 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Ліцэнзіі трэціх бакоў"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Немагчыма загрузіць ліцэнзіі."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Загрузка…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Цяпер вы ў <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроку ад таго, каб стаць распрацоўшчыкам.</item>
- <item quantity="few">Цяпер вы ў <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроках ад таго, каб стаць распрацоўшчыкам.</item>
- <item quantity="many">Цяпер вы ў <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроках ад таго, каб стаць распрацоўшчыкам.</item>
- <item quantity="other">Цяпер вы ў <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроку ад таго, каб стаць распрацоўшчыкам.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Цяпер вы ў # кроку ад таго, каб стаць распрацоўшчыкам.}one{Цяпер вы ў # кроку ад таго, каб стаць распрацоўшчыкам.}few{Цяпер вы ў # кроках ад таго, каб стаць распрацоўшчыкам.}many{Цяпер вы ў # кроках ад таго, каб стаць распрацоўшчыкам.}other{Цяпер вы ў # кроку ад таго, каб стаць распрацоўшчыкам.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Цяпер вы распрацоўшчык!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Не трэба, вы ўжо з\'яўляецеся распрацоўшчыкам."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Параметры распрацоўшчыка"</string>
@@ -511,16 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Калі вы створыце новы профіль, карыстальніку профілю трэба будзе яго наладзіць."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"З любога профілю можна абнаўляць праграмы для ўсіх іншых профіляў."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Дасягнуты ліміт колькасці профіляў"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Можна стварыць толькі <xliff:g id="COUNT">%d</xliff:g> профіль.</item>
- <item quantity="few">Можна стварыць толькі <xliff:g id="COUNT">%d</xliff:g> профілі.</item>
- <item quantity="many">Можна стварыць толькі <xliff:g id="COUNT">%d</xliff:g> профіляў.</item>
- <item quantity="other">Можна стварыць толькі <xliff:g id="COUNT">%d</xliff:g> профілю.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Можна стварыць толькі адзін профіль.}one{Можна стварыць толькі # профіль.}few{Можна стварыць толькі # профілі.}many{Можна стварыць толькі # профіляў.}other{Можна стварыць толькі # профілю.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Не ўдалося стварыць новы профіль"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Выдаліць гэты профіль?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Усе праграмы і даныя для гэтага профілю будуць выдалены"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Не ўдалося выдаліць профіль."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Профіль не выдалены. Перазапусціце прыладу і паўтарыце спробу."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Пры пераключэнні на іншы профіль або перазапуску аўтамабіля гэты профіль будзе выдалены."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Закрыць"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Паўтарыць"</string>
@@ -633,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Як нарысаваць узор разблакіроўкі"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Памылка захавання ўзору разблакіроўкі"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Занадта шмат няўдалых спроб. Паспрабуйце яшчэ раз праз <xliff:g id="NUMBER">%d</xliff:g> с."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Паваротны рэгулятар не падтрымліваецца, выкарыстайце сэнсарны ўвод"</string>
<string name="okay" msgid="4589873324439764349">"ОК"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Зняць блакіроўку экрана?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Доступ да вашага ўліковага запісу зможа атрымаць любы чалавек"</string>
@@ -664,42 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"IT-адміністратар блакіруе папулярныя PIN-коды. Паспрабуйце іншы PIN-код."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Выкарыстанне недапушчальных сімвалаў."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Няправільны пароль. Мінімальная колькасць сімвалаў: 4"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> літару</item>
- <item quantity="few">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> літары</item>
- <item quantity="many">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> літар</item>
- <item quantity="other">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> літары</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> малую літару</item>
- <item quantity="few">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> малыя літары</item>
- <item quantity="many">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> малых літар</item>
- <item quantity="other">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> малой літары</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> вялікую літару</item>
- <item quantity="few">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> вялікія літары</item>
- <item quantity="many">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> вялікіх літар</item>
- <item quantity="other">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> вялікай літары</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> лічбу</item>
- <item quantity="few">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> лічбы</item>
- <item quantity="many">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> лічбаў</item>
- <item quantity="other">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> лічбы</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> спецыяльны сімвал</item>
- <item quantity="few">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> спецыяльныя сімвалы</item>
- <item quantity="many">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> спецыяльных сімвалаў</item>
- <item quantity="other">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> спецыяльнага сімвала</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> сімвал, які не з\'яўляецца літарай</item>
- <item quantity="few">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> сімвалы, якія не з\'яўляюцца літарамі</item>
- <item quantity="many">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> сімвалаў, якія не з\'яўляюцца літарамі</item>
- <item quantity="other">Павінен змяшчаць не менш за <xliff:g id="COUNT">%d</xliff:g> сімвала, якія не з\'яўляюцца літарамі</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Адміністратар прылады не дазваляе выкарыстоўваць апошні пароль"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Памылка захавання пароля"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"IT-адміністратар блакіруе папулярныя паролі. Паспрабуйце іншы пароль."</string>
@@ -742,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Дадаць профіль"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Выдаліць гэты профіль"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Дадаць профіль"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Яркасць дысплэя"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Каб пабачыць прылады, уключыце Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Каб спалучыць прыладу, адкрыйце налады Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Адміністратар інфармацыйна-забаўляльнай сістэмы"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Актываваныя праграмы"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Адключаныя праграмы"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Праграмы з гэтым дазволам маюць доступ да даных аўтамабіля"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Няма праграм адміністратара аўтамабіля"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Праграма адміністратара інфармацыйна-забаўляльнай сістэмы актыўная і дазваляе праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" выконваць наступныя дзеянні:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Актывацыя гэтай праграмы інфармацыйна-забаўляльнай сістэмы дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" выконваць наступныя дзеянні:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Актываваць гэту праграму?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Актываваць гэту праграму інфармацыйна-забаўляльнай сістэмы"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Дэактываваць і выдаліць"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Адключыць гэту праграму інфармацыйна-забаўляльнай сістэмы"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Дадатковая інфармацыя"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Менеджар арганізацыі можа адсочваць праграмы і даныя, звязаныя з гэтым профілем (у тым ліку налады, дазволы, параметры карпаратыўнага доступу, дзеянні ў сетцы і месцазнаходжанне аўтамабіля), і кіраваць імі."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Менеджар арганізацыі можа адсочваць праграмы і даныя, звязаныя з гэтым профілем (у тым ліку налады, дазволы, параметры карпаратыўнага доступу, дзеянні ў сетцы і месцазнаходжанне прылады), і кіраваць імі."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Менеджар арганізацыі можа адсочваць праграмы і даныя, звязаныя з гэтай інфармацыйна-забаўляльнай сістэмай (у тым ліку налады, дазволы, параметры карпаратыўнага доступу, сеткавую актыўнасць і месцазнаходжанне аўтамабіля) і кіраваць імі."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Менеджар арганізацыі можа мець магчымасць кіраваць праграмамі, мець доступ да даных, звязаных з гэтай інфармацыйна-забаўляльнай сістэмай, і змяняць налады аўтамабіля."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Гэта налада недаступная"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"У гэтым аўтамабілі пад кіраваннем нельга змяняць гучнасць"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"У гэтым аўтамабілі пад кіраваннем нельга рабіць выклікі"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"У гэтым аўтамабілі пад кіраваннем нельга адпраўляць SMS"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"У гэтым аўтамабілі пад кіраваннем камера недаступная"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"У гэтым аўтамабілі пад кіраваннем нельга рабіць здымкі экрана"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"У гэтым аўтамабілі пад кіраваннем нельга адкрываць дадзеную праграму"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Заблакіравана кампаніяй-крэдыторам"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Арганізацыя абмежавала доступ да пэўных функцый.\n\nКалі ў вас ёсць пытанні, звярніцеся да менеджара арганізацыі."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Праграмы для адміністратара аўтамабіля"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# актываваная праграма}one{# актываваная праграма}few{# актываваныя праграмы}many{# актываваных праграм}other{# актываванай праграмы}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Няма актываваных праграм"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Палітыка кампаніі \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" адносна транспартных сродкаў"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Налады, якімі кіруе менеджар арганізацыі"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Даведацца больш пра сэрвіс \"<xliff:g id="SERVICE">%1$s</xliff:g>\""</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Абагуліць справаздачу пра памылку?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Менеджар арганізацыі, якой належыць гэты аўтамабіль, запытаў справаздачу пра памылку, каб выкарыстаць яе для пошуку і выпраўлення непаладак. Ён можа атрымаць доступ да праграм і даных."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Менеджар арганізацыі, якой належыць гэты аўтамабіль, запытаў справаздачу пра памылку, каб выкарыстаць яе для пошуку і выпраўлення непаладак. Ён можа атрымаць доступ да праграм і даных, а хуткасць работы прылады можа часова знізіцца."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Гэта справаздача пра памылку абагульваецца з менеджарам арганізацыі, якой належыць гэты аўтамабіль. Каб даведацца больш, звяжыцеся з менеджарам."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Абагуліць"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Адхіліць"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Гэту наладу зараз нельга змяніць"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Спецыяльныя магчымасці"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Субцітры"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Налады субцітраў"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Функцыя выключана"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Функцыя ўключана"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Праграма чытання з экрана"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Паказваць субцітры"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Памер тэксту"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Памер і стыль субцітраў"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Вельмі маленькі"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Маленькі"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Стандартна"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Вялікі"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Вельмі вялікі"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Стыль субцітраў"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Зададзена праграмай"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Белы тэкст на чорным фоне"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Чорны тэкст на белым фоне"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Жоўты тэкст на чорным фоне"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Жоўты тэкст на сінім фоне"</string>
</resources>
diff --git a/res/values-bg/arrays.xml b/res/values-bg/arrays.xml
index 1de1476..b880b9b 100644
--- a/res/values-bg/arrays.xml
+++ b/res/values-bg/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Никога да не се разрешава"</item>
<item msgid="1154273129608299386">"Разрешаване винаги"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 4a2fb07..4109ff7 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Нощен режим"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Мрежа и интернет"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Мобилна мрежа"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM карти</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM карта</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM карта}other{# SIM карти}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Активно/SIM карта"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Неактивно/SIM карта"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Активно/изтеглена SIM карта"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Добавяне на още"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобилни данни"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Достъп до данните през мобилната мрежа"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Мобилна мрежа"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Използване на мобилни данни"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Да се изключат ли мобилните данни?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Изборът е задължителен"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Използване на <xliff:g id="CARRIER">%1$s</xliff:g> за моб. данни?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Предупреждение за данните: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Лимит за данните: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Предупреждение за данните: <xliff:g id="ID_1">^1</xliff:g>/ограничение за данните: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Остават %d дни</item>
- <item quantity="one">Остава %d ден</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Остава # ден}other{Остават # дни}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Няма оставащо време"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Остава по-малко от 1 ден"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Актуализирано преди <xliff:g id="ID_2">^2</xliff:g> от <xliff:g id="ID_1">^1</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Задаване"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Предупреждение и лимит за данните"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Цикъл на използване на данни от прилож."</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Пренос на мобилни данни"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Предупр. за данните: Задаване"</string>
<string name="data_warning" msgid="116776633806885370">"Предупреждение за данните"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Задаване на лимит за данните"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Основното устройство на автомобила ви ще изключи мобилните данни, след като достигне зададения от вас лимит.\n\nТъй като преносът им се измерва от основното устройство, а операторът ви може да го отчита по различен начин, добре е да използвате умерен лимит."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Задаване на предупреждение за преноса на данни"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Задаване на ограничение за преноса на данни"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Преносът на данни се измерва по устройството ви. Той може да е различен от данните на мобилния ви оператор."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Задаване"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Запазване"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Мрежа на OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Интернет в колата"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Изключването на интернета в колата може да попречи на работата на някои функции/прил. в нея.\n\nКритичните данни, необх. за работа на колата ви, ще продължат да се споделят с производителя ѝ."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Изключване въпреки това"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Интернетът в колата е изключен. Това може да попречи на работата на някои функции или приложения в нея. Критичните данни, необходими за работа на колата ви, ще продължат да се споделят с производителя ѝ."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"За периода от %2$s до %3$s използвахте %1$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Присъединяване към друга мрежа"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Предпочитания за мрежата"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Добавяне на мрежа"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Свързване"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Свързва се…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Няма връзка"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Мрежата не е в обхват"</string>
<string name="wifi_password" msgid="5565632142720292397">"Парола"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Показване на паролата"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Изберете поне една честота за точката за достъп до Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Точка за достъп и тетъринг"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Точка за достъп"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Изкл."</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Автоматично изключване на точката за достъп"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Точката за достъп до Wi‑Fi ще се изключва, когато няма свързани устройства"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> иска да включи Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Принудително спиране"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Да се спре ли принудително?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ако принудително спрете приложение, то може да не функционира правилно."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Изключване на защитата на ефективността?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ако го направите, софтуерът и хардуерът ви може да не работят толкова добре."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Да остане включено"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Изключване"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Да се приоритизира ли ефектив. на прил.?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Включването може да доведе до потенциални проблеми със стабилността на системата или дълготрайно въздействие върху хардуера. Искате ли да продължите?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Да"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Не, благодаря"</string>
<string name="disable_text" msgid="4358165448648990820">"Деактивиране"</string>
<string name="enable_text" msgid="1794971777861881238">"Активиране"</string>
<string name="uninstall_text" msgid="277907956072833012">"Деинсталиране"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Разрешения"</string>
<string name="notifications_label" msgid="6586089149665170731">"Известия"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Хранилище и кеш"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Осигуряване на най-висока ефективност"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Приоритизиране на ефективността на приложението"</string>
<string name="application_version_label" msgid="8556889839783311649">"Версия: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Няма предоставени разрешения"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Няма заявени разрешения"</string>
<string name="unused_apps" msgid="648471933781010395">"Неизползвани приложения"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> неизползвани приложения</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> неизползвано приложение</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# неизползвано приложение}other{# неизползвани приложения}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Премахване на разреш. и освоб. на място"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s във вътрешното хранилище"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"При необх. затворете прил., за да избегнете прекалена употреба на ресурсите"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Използва системните ресурси с цел приоритизиране на ефективността на приложението"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Пренос на данни"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Прилож.: Пренос на данни"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"История на преноса"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Всички приложения"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Моб. данни/Wi‑Fi: Пренос"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"История на преноса"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Общо пренос на данни"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Преден план"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Заден план"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Разрешаване на моб. данни"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Разрешаване на прилож. да използва мобилни данни"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Ограничав. на моб. данни"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Ползв. на моб. данни само когато прил. е на преден план"</string>
<string name="computing_size" msgid="5791407621793083965">"Изчислява се…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> допълнителни разрешения</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> допълнително разрешение</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# допълнително разрешение}other{# допълнителни разрешения}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Забележка: След рестартиране това приложение не може да се стартира, докато не отключите превозното си средство."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Помощник и гласово въвеждане"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Помощно приложение"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Управлението на Wi-Fi разрешава на дадено приложение да включва и изключва Wi-Fi, да сканира за Wi-Fi мрежи и да се свързва с тях, да добавя или премахва мрежи и да стартира точки за достъп само на локално ниво."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Още"</string>
<string name="location_settings_title" msgid="901334356682423679">"Местоположение"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Използване на местоположението"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Разреш. на достъп до мест. на прил., които посочите"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Ако изключите тази настройка, достъпът до местоположението ще бъде премахнат за всички приложения. Приложенията за помощ за шофьорите ще продължат да имат достъп."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Използв. на мест. за помощ за шофьорите"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Местоположението на автомобила е изкл."</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Прил. за помощ за шофьорите нямат достъп до мест. ви"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Промяна"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Разреш. на достъп до мест. на прил., помагащи при шофир."</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ако изключите тази настройка, функциите за помощ за шофьорите, които разчитат на данните за местоположението, ще бъдат деактивирани."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Изключване въпреки това"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Скорошни заявки за местоположението"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Няма скорошни заявки за местоположението"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Разрешения на ниво приложение"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Услуги за местоположение"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Използване на местоположението"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Функцията за местоположението може да използва източници като GPS, Wi‑Fi, мобилни мрежи и сензори, за да определя къде се намира устройството ви."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Помощ за шофьорите"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Данните за местоположението, които се изпращат до приложенията за помощ за шофьорите, не съдържат информация, която ви идентифицира. Те се съхраняват за максимум 2 дни, преди да бъдат изтрити."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Микрофон"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Използване на микрофона"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Разрешаване на всички приложения да осъществяват достъп до микрофона ви"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Управление на разрешенията за микрофона"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Със скорошен достъп"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Няма скорошни приложения"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 приложения имат достъп"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# от {total_count} приложения има достъп}other{# от {total_count} приложения имат достъп}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Със скорошен достъп"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Преглед на всички"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Зарежда се…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Система"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Системни актуализации"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Разширени"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Лицензи на трети страни"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Възникна проблем при зареждането на лицензите."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Зарежда се…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Вече сте на <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> стъпки от това, да бъдете програмист.</item>
- <item quantity="one">Вече сте на <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> стъпка от това, да бъдете програмист.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Вече сте на # стъпка от това, да бъдете програмист.}other{Вече сте на # стъпки от това, да бъдете програмист.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Вече сте програмист!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Не е необходимо – вече сте програмист."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Опции за програмисти"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"След като създадете нов потр. профил, съответният човек трябва да го персонализира за себе си."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Приложенията могат да се актуал. от всеки потр. профил, за да се използват от всички други профили."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Достигнахте лимита за потр. профили"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Можете да създадете до <xliff:g id="COUNT">%d</xliff:g> потребителски профила.</item>
- <item quantity="one">Може да бъде създаден само един потребителски профил.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Може да бъде създаден само един потребителски профил.}other{Можете да създадете до # потребителски профила.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Не бе създаден нов потребителски профил"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Да се изтрие ли този потр. профил?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Всички приложения и данни, свързани с този потребителски профил, ще бъдат изтрити"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Потребителският профил не бе изтрит."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Потр. профил не бе изтрит. Рестартирайте у-вото и опитайте пак."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Този потр. профил ще бъде изтрит, когато превключите към друг или рестартирате превозното средство."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Отхвърляне"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Нов опит"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Как се чертае фигура за отключване"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Грешка при запазването на фигурата"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Твърде много неправилни опити. Пробвайте отново след <xliff:g id="NUMBER">%d</xliff:g> секунди."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Фигурата не поддържа ротация. Моля, докоснете"</string>
<string name="okay" msgid="4589873324439764349">"ОK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Премахване на закл. на екрана?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Така ще разрешите на всеки да има достъп до профила ви"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Често срещаните ПИН кодове се блокират от системния ви администратор. Опитайте с друг ПИН код."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Не може да включва невалиден знак."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Паролата е невалидна, трябва да съдържа поне 4 знака."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Трябва да съдържа поне <xliff:g id="COUNT">%d</xliff:g> букви</item>
- <item quantity="one">Трябва да съдържа поне една буква</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Трябва да съдържа поне <xliff:g id="COUNT">%d</xliff:g> малки букви</item>
- <item quantity="one">Трябва да съдържа поне 1 малка буква</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Трябва да съдържа поне <xliff:g id="COUNT">%d</xliff:g> главни букви</item>
- <item quantity="one">Трябва да съдържа поне 1 главна буква</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Трябва да съдържа поне <xliff:g id="COUNT">%d</xliff:g> цифри</item>
- <item quantity="one">Трябва да съдържа поне 1 цифра</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Трябва да съдържа поне <xliff:g id="COUNT">%d</xliff:g> специални символа</item>
- <item quantity="one">Трябва да съдържа поне 1 специален символ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Трябва да съдържа поне <xliff:g id="COUNT">%d</xliff:g> небуквени знака</item>
- <item quantity="one">Трябва да съдържа поне 1 небуквен знак</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Администраторът на устройството не разрешава ползването на скорошна парола"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Грешка при запазването на паролата"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Често срещаните пароли се блокират от системния ви администратор. Опитайте с друга парола."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Добавяне на потребителски профил"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Изтриване на този потр. профил"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Добавяне на потребителски профил"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Яркост на екрана"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"За да видите устройствата си, включете Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"За да сдвоите устройство, отворете настройките за Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Администратор на основното устройство"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Активирани приложения"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Деактивирани приложения"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Приложенията с това разрешение имат достъп до данните на превозното средство"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Няма администраторски приложения на превозното средство"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Това приложение за администриране на основното устройство е активно и разрешава на <xliff:g id="APP_NAME">%1$s</xliff:g> да изпълнява следните действия:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Активирането на това приложение за основното устройство ще разреши на <xliff:g id="APP_NAME">%1$s</xliff:g> да изпълнява следните действия:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Да се активира ли това приложение за основното у-во?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Активиране на това приложение за основното устройство"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Деактивиране и деинсталиране"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Деактивиране на това приложение за основното устройство"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Още подробности"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Администраторът на организацията може да наблюдава и управлява приложенията и данните, свързани с този потребителски профил, включително настройките, разрешенията, корпоративния достъп, мрежовата активност и информацията за местоположението на превозното средство."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Администраторът на организацията може да наблюдава и управлява приложенията и данните, свързани с този потребителски профил, включително настройките, разрешенията, корпоративния достъп, мрежовата активност и информацията за местоположението на устройството."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Администраторът на организацията може да наблюдава и управлява приложенията и данните, свързани с това основно устройство, включително настройките, разрешенията, корпоративния достъп, мрежовата активност и информацията за местоположението на превозното средство."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Администраторът на организацията може да има достъп до свързаните с основното устройство данни, да управлява приложенията и да променя настройките на това превозно средство."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Това не е налице"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Силата на звука в това управлявано превозно средство не може да се променя"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Не може да се извършват обаждания в това управлявано превозно средство"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Изпращането на SMS съобщения не е разрешено в това управлявано превозно средство"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Камерата не е налице в това управлявано превозно средство"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"В това управлявано превозно средство не могат да се правят екранни снимки"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Това приложение не може да бъде отворено в това управлявано превозно средство"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Блокирано от кредитодателя"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Достъпът до някои функции е ограничен от организацията.\n\nАко имате въпроси, свържете се с мениджъра ѝ."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Приложения за администриране"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# активирано приложение}other{# активирани приложения}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Няма активирани приложения"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Правила на <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> за превозните средства"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Настройки, управлявани от администратора на организацията"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Научете повече за <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Да се сподели ли сигналът за програмна грешка?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Администраторът на организацията на това превозно средство поиска сигнал за програмна грешка с цел отстраняване на неизправностите на това устройство. Възможно е да бъдат споделени приложения и данни."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Администраторът на организацията на това превозно средство поиска сигнал за програмна грешка с цел отстраняване на неизправностите на това устройство. Възможно е да бъдат споделени приложения и данни и работата на устройството ви временно да се забави."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Този сигнал за програмна грешка се споделя с администратора на организацията на това превозно средство. За повече информация се свържете с него."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Споделяне"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Отхвърляне"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Тази настройка не може да бъде променена в момента"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Достъпност"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Надписи"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Предпочитания за надписите"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Изкл."</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Вкл."</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Екранен четец"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Показване на надписите"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Размер на текста"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Размер и стил на надписите"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Много малък"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Малък"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"По подразбиране"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Голям"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Много голям"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Стил на надписите"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Зададено от приложението"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Бяло върху черно"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Черно върху бяло"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Жълто върху черно"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Жълто върху синьо"</string>
</resources>
diff --git a/res/values-bn/arrays.xml b/res/values-bn/arrays.xml
index 6ead7d8..d0e3ae2 100644
--- a/res/values-bn/arrays.xml
+++ b/res/values-bn/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"কখনও অনুমতি দেবেন না"</item>
<item msgid="1154273129608299386">"সর্বদা অনুমতি দিন"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index cc33756..162983f 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"রাতের মোড"</string>
<string name="network_and_internet" msgid="4229023630498537530">"নেটওয়ার্ক এবং ইন্টারনেট"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"মোবাইল নেটওয়ার্ক"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি সিম</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি সিম</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{#টি সিম কার্ড}one{#টি সিম কার্ড}other{#টি সিম কার্ড}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"অ্যাক্টিভ / সিম"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"অ্যাক্টিভ নয় এমন / সিম"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"অ্যাক্টিভ / ডাউনলোড করা সিম"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"আরও যোগ করুন"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"মোবাইল ডেটা"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"মোবাইল নেটওয়ার্ক ব্যবহার করে ডেটা অ্যাক্সেস করুন"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"মোবাইল নেটওয়ার্ক"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"মোবাইল ডেটা ব্যবহার করুন"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"মোবাইল ডেটা বন্ধ করবেন?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"বেছে নিতে হবে"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"মোবাইল ডেটার জন্য <xliff:g id="CARRIER">%1$s</xliff:g> ব্যবহার করবেন?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> ডেটার বিষয়ে সতর্কতা"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> ডেটার সীমা"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> ডেটার বিষয়ে সতর্কতা / <xliff:g id="ID_2">^2</xliff:g> ডেটার সীমা"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d দিন বাকি আছে</item>
- <item quantity="other">%d দিন বাকি আছে</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# দিন বাকি আছে}one{# দিন বাকি আছে}other{# দিন বাকি আছে}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"আর সময় নেই"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"১ দিনের থেকে কম সময় বাকি"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> আগে আপডেট করেছে"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"সেট করুন"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ডেটা সম্পর্কিত সতর্কতা ও সীমা"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"অ্যাপের ডেটা ব্যবহারের চক্র"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"মোবাইল ডেটার ব্যবহার"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ডেটা সতর্কতা সেট করুন"</string>
<string name="data_warning" msgid="116776633806885370">"ডেটা সম্পর্কিত সতর্কতা"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ডেটার সীমা সেট করুন"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ডেটার ব্যবহার আপনার সেট করা সীমায় পৌঁছলে আপনার গাড়ির হেড ইউনিট মোবাইল ডেটা বন্ধ করে দেবে।.\n\nযেহেতু আপনার গাড়ির হেড ইউনিট আপনার ডেটা ব্যবহারের হিসাব রাখে এবং আপনার পরিষেবা প্রদানকারীর রাখা হিসাব কিছুটা আলাদা হলেও হতে পারে, তাই যাতে কম মোবাইল ডেটা খরচ হোক এমনভাবে সীমা সেট করার কথা ভাবতে পারেন।"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ডেটা ব্যবহারের সতর্কতা সেট করুন"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ডেটা ব্যবহারের সীমা সেট করুন"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"আপনার ডিভাইস ডেটার ব্যবহার হিসেব করে। এর সাথে আপনার মোবাইল পরিষেবা প্রদানকারীর ডেটার পার্থক্য হতে পারে।"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"সেট করুন"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"সেভ করুন"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM নেটওয়ার্ক"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"গাড়ির ইন্টারনেট"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"গাড়ির ইন্টারনেট বন্ধ করে দিলে, গাড়ির কয়েকটি ফিচার অথবা অ্যাপ কাজ নাও করতে পারে।\n\nআপনার গাড়ি অপারেট করা জন্য প্রয়োজনীয় জটিল ডেটা, আপনার গাড়ি প্রস্তুতকারীর সাথে শেয়ার করা হবে।"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"যাইহোক বন্ধ করুন"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"গাড়ির ইন্টারনেট বন্ধ করা আছে। এর ফলে গাড়ির কয়েকটি ফিচার অথবা অ্যাপ কাজ নাও করতে পারে। আপনার গাড়ি অপারেট করা জন্য প্রয়োজনীয় জটিল ডেটা, আপনার গাড়ি প্রস্তুতকারীর সাথে শেয়ার করা হবে।"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s-এর মধ্যে %1$s ব্যবহার করা হয়েছে"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"অন্যান্য নেটওয়ার্কে যোগ করুন"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"নেটওয়ার্ক সংক্রান্ত পছন্দ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"নেটওয়ার্ক যোগ করুন"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"কানেক্ট"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"কানেক্ট করা হচ্ছে…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"কানেক্ট করা নেই"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"নেটওয়ার্ক পরিষেবা সীমার মধ্যে নেই"</string>
<string name="wifi_password" msgid="5565632142720292397">"পাসওয়ার্ড"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"পাসওয়ার্ড দেখুন"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"ওয়াই-ফাই হটস্পটের জন্য অন্তত একটি ব্যান্ড বেছে নিন:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"হটস্পট ও টিথারিং"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"হটস্পট"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"বন্ধ করা আছে"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"নিজে থেকে হটস্পট বন্ধ করুন"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"কোনও ডিভাইস কানেক্ট করা না থাকলে ওয়াই-ফাই হটস্পট বন্ধ হয়ে যাবে"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ওয়াই-ফাই বন্ধ করতে চান"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"জোর করে বন্ধ করুন"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"জোর করে বন্ধ করবেন?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"আপনি একটি অ্যাপকে জোর করে বন্ধ করলে, তা সঠিক ভাবে কাজ নাও করতে পারে।"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"\'পারফর্ম্যান্স সুরক্ষিত করা\' বন্ধ করবেন?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"আপনি এটি করলে, ফোনের সফ্টওয়্যার ও হার্ডওয়্যার সঠিকভাবে কাজ নাও করতে পারে।"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"চালু থাক"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"বন্ধ করুন"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"\'অ্যাপ পারফর্ম্যান্সে অগ্রাধিকার দিন\' বিকল্প চালু করবেন?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"এটা চালু করা হলে সিস্টেম অস্থিতিশীল হওয়ার অথবা হার্ডওয়্যারে দীর্ঘমেয়াদী প্রভাব পড়ার সম্ভাবনা রয়েছে। আপনি কি চালিয়ে যেতে চান?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"হ্যাঁ"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"না, থাক"</string>
<string name="disable_text" msgid="4358165448648990820">"বন্ধ করুন"</string>
<string name="enable_text" msgid="1794971777861881238">"চালু করুন"</string>
<string name="uninstall_text" msgid="277907956072833012">"আনইনস্টল করুন"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"অনুমতিগুলি"</string>
<string name="notifications_label" msgid="6586089149665170731">"বিজ্ঞপ্তি"</string>
<string name="storage_application_label" msgid="5911779903670978586">"স্টোরেজ ও ক্যাশে"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"সর্বোচ্চ পারফর্ম্যান্স নিশ্চিত করুন"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"অ্যাপ পারফর্ম্যান্সে অগ্রাধিকার দেওয়া"</string>
<string name="application_version_label" msgid="8556889839783311649">"ভার্সন: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"কোনও অনুমতি দেওয়া হয় নি"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"কোনও অনুমতির অনুরোধ জানানো হয়নি"</string>
<string name="unused_apps" msgid="648471933781010395">"ব্যবহার করা হয়নি এমন অ্যাপ"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one">ব্যবহার হয়নি এমন <xliff:g id="COUNT_1">%d</xliff:g>টি অ্যাপ</item>
- <item quantity="other">ব্যবহার হয়নি এমন <xliff:g id="COUNT_1">%d</xliff:g>টি অ্যাপ</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{ব্যবহার করা হয়নি এমন #টি অ্যাপ}one{ব্যবহার করা হয়নি এমন #টি অ্যাপ}other{ব্যবহার করা হয়নি এমন #টি অ্যাপ}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"অনুমতি সরান এবং স্পেস খালি করুন"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"ইন্টারনাল স্টোরেজে %s রয়েছে"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"রিসোর্সের অতিরিক্ত ব্যবহার আটকাতে প্রয়োজন মতো অ্যাপ বন্ধ করুন"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"অ্যাপ পারফর্ম্যান্সে অগ্রাধিকার দিতে সিস্টেম রিসোর্স ব্যবহার করা হয়"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ডেটা ব্যবহার"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"অ্যাপ ডেটার ব্যবহার"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"ব্যবহারের ইতিহাস"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"সব অ্যাপ"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ডেটা ও ওয়াই-ফাই ব্যবহার"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"ব্যবহারের ইতিহাস"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"মোট ব্যবহার"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ফোরগ্রাউন্ড"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ব্যাকগ্রাউন্ড"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ডেটা ব্যবহারের অনুমতি দিন"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"এই অ্যাপকে মোবাইল ডেটা ব্যবহার করতে দিন"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ডেটার ব্যবহার সীমিত করুন"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"অ্যাপ ফোরগ্রাউন্ডে থাকলে তবেই মোবাইল ডেটা ব্যবহার করুন"</string>
<string name="computing_size" msgid="5791407621793083965">"কম্পিউটিং..."</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>টি অতিরিক্ত অনুমতি</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>টি অতিরিক্ত অনুমতি</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{#টি অতিরিক্ত অনুমতি}one{#টি অতিরিক্ত অনুমতি}other{#টি অতিরিক্ত অনুমতি}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"দ্রষ্টব্য: রিবুট করার পরে, আপনার গাড়ি আনলক না করা পর্যন্ত আপনি এই অ্যাপটিকে চালু করতে পারবেন না।"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"অ্যাসিস্ট্যান্ট এবং ভয়েস ইনপুট"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"সহায়তা অ্যাপ"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"ওয়াই-ফাই কন্ট্রোল সুবিধাটি কোনও অ্যাপকে ওয়াই-ফাই চালু অথবা বন্ধ করতে, ওয়াই-ফাই নেটওয়ার্ক স্ক্যান করে তাতে কানেক্ট করতে, নেটওয়ার্ক যোগ করতে বা মুছে ফেলতে অথবা শুধুমাত্র স্থানীয় ব্যবহারের জন্য হটস্পট চালু করতে অনুমতি দেয়।"</string>
<string name="more_special_access_title" msgid="166115485446645971">"আরও"</string>
<string name="location_settings_title" msgid="901334356682423679">"লোকেশন"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"লোকেশন ব্যবহার করুন"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"আপনার নির্দিষ্ট করা অ্যাপকে লোকেশন অ্যাক্সেস করার অনুমতি দিন"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"এটি বন্ধ করে দিলে, কোনও অ্যাপই লোকেশন অ্যাক্সেস করতে পারবে না। ড্রাইভার অ্যাসিস্ট্যান্স অ্যাপ এখনও অ্যাক্সেস করতে পারবে।"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"\'ড্রাইভার অ্যাসিস্ট্যান্স\'-এর জন্য লোকেশন ব্যবহার করুন"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"গাড়ির লোকেশন বন্ধ করা আছে"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"\'ড্রাইভার অ্যাসিস্ট্যান্স\' থাকা অ্যাপের লোকেশনে অ্যাক্সেস নেই"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"পরিবর্তন করুন"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"এমন অ্যাপে অনুমতি দিন যা লোকেশন অ্যাক্সেস করে আপনাকে গাড়ি চালানোয় সাহায্য করে"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"আপনি এটি বন্ধ করলে, লোকেশন সংক্রান্ত তথ্যের উপরে নির্ভর করে থাকা সব ড্রাইভার অ্যাসিস্ট্যান্স অ্যাপ বন্ধ হয়ে যাবে।"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"যাইহোক বন্ধ করুন"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"সাম্প্রতিক লোকেশনের অনুরোধ"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"কোনও সাম্প্রতিক লোকেশনের অনুরোধ নেই"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"অ্যাপ-লেবেল অনুমতি"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"লোকেশন পরিষেবা"</string>
<string name="location_use_location_title" msgid="117735895374606680">"লোকেশন ব্যবহার করুন"</string>
<string name="location_settings_footer" msgid="296892848338100051">"আপনি কোথায় আছেন তা জানতে \'লোকেশন\' সেটিংস আপনার মোবাইলের জিপিএস, ওয়াই-ফাই, মোবাইল নেটওয়ার্ক ও সেন্সর ব্যবহার করতে পারে।"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"\'ড্রাইভার অ্যাসিস্ট্যান্স\'"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"\'ড্রাইভার অ্যাসিস্ট্যান্স\' ফিচার থাকা অ্যাপে পাঠানো লোকেশন সম্পর্কিত তথ্যে এমন কোনও তথ্য থাকে না, যা দিয়ে আপনাকে শনাক্ত করা যায়। সর্বাধিক ২ দিন সেভ থাকার পরে এটি মুছে যায়।"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"মাইক্রোফোন"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"মাইক্রোফোন ব্যবহার করুন"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"সব অ্যাপকে আপনার মাইক্রোফোন ব্যবহার করার অনুমতি দিন"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"মাইক্রোফোনের অনুমতি ম্যানেজ করুন"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"সম্প্রতি অ্যাক্সেস করা হয়েছে"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"কোনও সাম্প্রতিক অ্যাপ নেই"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"কোনও অ্যাপের অ্যাক্সেস নেই"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count}টি অ্যাপের মধ্যে #টিতে অ্যাক্সেস আছে}one{{total_count}টি অ্যাপের মধ্যে #টিতে অ্যাক্সেস আছে}other{{total_count}টি অ্যাপের মধ্যে #টিতে অ্যাক্সেস আছে}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"সম্প্রতি অ্যাক্সেস করা হয়েছে"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"সবগুলি দেখুন"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"লোড হচ্ছে…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"সিস্টেম"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"সিস্টেম আপডেট"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"উন্নত"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"তৃতীয় পক্ষের লাইসেন্স"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"লাইসেন্সগুলি লোড হতে সমস্যা হয়েছে।"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"লোড করা হচ্ছে…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">একজন ডেভেলপার হওয়া থেকে আপনি এখন <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ধাপ দূরে রয়েছেন।</item>
- <item quantity="other">একজন ডেভেলপার হওয়া থেকে আপনি এখন <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ধাপ দূরে রয়েছেন।</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ডেভেলপার হওয়া থেকে আপনি এখন # ধাপ দূরে আছেন।}one{ডেভেলপার হওয়া থেকে আপনি এখন # ধাপ দূরে আছেন।}other{ডেভেলপার হওয়া থেকে আপনি এখন # ধাপ দূরে আছেন।}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"আপনি এখন একজন ডেভেলপার!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"কোনও প্রয়োজন নেই, আপনি ইতিমধ্যেই একজন ডেভেলপার।"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ডেভেলপারের জন্য বিকল্প"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"আপনি নতুন প্রোফাইল তৈরি করার পর, সেই ব্যক্তি নিজের জন্য এটি কাস্টমাইজ করতে পারবেন।"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"অন্যান্য সমস্ত প্রোফাইলের জন্য ব্যবহার করতে অ্যাপগুলি যেকোনও প্রোফাইল থেকে আপডেট করা যেতে পারে।"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"আর কোনও প্রোফাইল তৈরি করা যাবে না"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">আপনি সর্বাধিক <xliff:g id="COUNT">%d</xliff:g>টি প্রোফাইল তৈরি করতে পারবেন।</item>
- <item quantity="other">আপনি সর্বাধিক <xliff:g id="COUNT">%d</xliff:g>টি প্রোফাইল তৈরি করতে পারবেন।</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{শুধুমাত্র একটি প্রোফাইল তৈরি করা যাবে।}one{আপনি সর্বাধিক #টি প্রোফাইল তৈরি করতে পারবেন।}other{আপনি সর্বাধিক #টি প্রোফাইল তৈরি করতে পারবেন।}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"নতুন প্রোফাইল তৈরি করা যায়নি"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"এই প্রোফাইল মুছতে চান?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"এই প্রোফাইলের সব অ্যাপ এবং ডেটা মুছে যাবে"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"প্রোফাইল মুছে ফেলা যায়নি।"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"প্রোফাইল মোছা যায়নি। ডিভাইস রিস্টার্ট করে, আবার চেষ্টা করে দেখতে পারেন।"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"আপনার প্রোফাইল পরিবর্তন বা গাড়ি রিস্টার্ট করলে এই প্রোফাইলটি মুছে ফেলা হবে।"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"খারিজ"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"আবার চেষ্টা করুন"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"কীভাবে একটি আনলক প্যাটার্ন আঁকবেন"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"প্যাটার্ন সেভ করার সময় সমস্যা"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"অনেকবার ভুল প্রচেষ্টা করা হয়েছে। <xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"প্যাটার্নে রোটারি কাজ করে না, টাচ ব্যবহার করুন"</string>
<string name="okay" msgid="4589873324439764349">"ঠিক আছে"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"স্ক্রিন লক সরিয়ে দেবেন?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"এর ফলে যেকেউ আপনার অ্যাকাউন্ট অ্যাক্সেস করতে পারবেন"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"আপনার আইটি অ্যাডমিন একই ধরনের পিন ব্লক করে দেয়। অন্য একটি পিন ব্যবহার করে চেষ্টা করুন।"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"কোনও নিষিদ্ধ অক্ষর ব্যবহার করা যাবে না।"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"এই পাসওয়ার্ডটি ব্যবহার করা যাবে না, এতে অন্তত ৪টি অক্ষর থাকতে হবে।"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি অক্ষর থাকতে হবে</item>
- <item quantity="other">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি অক্ষর থাকতে হবে</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি ছোটহাতের অক্ষর থাকতে হবে</item>
- <item quantity="other">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি ছোটহাতের অক্ষর থাকতে হবে</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি বড়হাতের অক্ষর থাকতে হবে</item>
- <item quantity="other">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি বড়হাতের অক্ষর থাকতে হবে</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি সংখ্যা থাকতে হবে</item>
- <item quantity="other">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি সংখ্যা থাকতে হবে</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি বিশেষ চিহ্ন থাকতে হবে</item>
- <item quantity="other">কমপক্ষে <xliff:g id="COUNT">%d</xliff:g>টি বিশেষ চিহ্ন থাকতে হবে</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">কমপক্ষে এমন <xliff:g id="COUNT">%d</xliff:g>টি অক্ষর থাকতে হবে যেটি বর্ণ নয়</item>
- <item quantity="other">কমপক্ষে এমন <xliff:g id="COUNT">%d</xliff:g>টি অক্ষর থাকতে হবে যেটি বর্ণ নয়</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ডিভাইস অ্যাডমিন একটি সাম্প্রতিক পাসওয়ার্ড ব্যবহার করতে দেয় না"</string>
<string name="error_saving_password" msgid="8334882262622500658">"পাসওয়ার্ড সেভ করার সময় সমস্যা"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"আপনার আইটি অ্যাডমিন একই ধরনের পাসওয়ার্ড ব্লক করে দেয়। অন্য একটি পাসওয়ার্ড ব্যবহার করে চেষ্টা করুন।"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"প্রোফাইল যোগ করুন"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"এই প্রোফাইল মুছুন"</string>
<string name="add_profile_text" msgid="9118410102199116969">"প্রোফাইল যোগ করুন"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ডিসপ্লের উজ্জ্বলতা"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"আপনার ডিভাইস দেখার জন্য, ব্লুটুথ চালু করুন"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"ডিভাইস পেয়ার করার জন্য, ব্লুটুথ সেটিংস খুলুন"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"ইনফোটেইনমেন্ট সিস্টেম অ্যাডমিন"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"যেসব অ্যাপ চালু আছে"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"যেসব অ্যাপ চালু নেই"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"যেসব অ্যাপের এই অনুমতি আছে, সেগুলি এই গাড়ির ডেটা অ্যাক্সেস করতে পারবে"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"গাড়ির কোনও অ্যাডমিন অ্যাপ নেই"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"এই ইনফোটেইনমেন্ট সিস্টেম অ্যাডমিন অ্যাপ চালু আছে এবং নিচের কাজগুলি করতে <xliff:g id="APP_NAME">%1$s</xliff:g> নামের অ্যাপকে অনুমতি দেয়:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"এই ইনফোটেইনমেন্ট সিস্টেম অ্যাপ চালু করলে <xliff:g id="APP_NAME">%1$s</xliff:g> নামের অ্যাপ নিচের কাজগুলি করতে পারবে:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"এই ইনফোটেইনমেন্ট সিস্টেম অ্যাপ চালু করবেন?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"এই ইনফোটেইনমেন্ট সিস্টেম অ্যাপ চালু করুন"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"বন্ধ ও আনইনস্টল করুন"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"এই ইনফোটেইনমেন্ট সিস্টেম অ্যাপ বন্ধ করুন"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"আরও বিবরণ দেখুন"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"প্রতিষ্ঠানের ম্যানেজার এই প্রোফাইল সম্পর্কিত অ্যাপ ও ডেটা নজর রাখতে এবং ম্যানেজ করতে পারবেন। এর মধ্যে সেটিংস, অনুমতি, কর্পোরেট অ্যাক্সেস, নেটওয়ার্ক অ্যাক্টিভিটি এবং গাড়ির লোকেশন সম্পর্কিত তথ্য অন্তর্ভুক্ত।"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"প্রতিষ্ঠানের ম্যানেজার এই প্রোফাইল সম্পর্কিত অ্যাপ ও ডেটা নজর রাখতে এবং ম্যানেজ করতে পারবেন। এর মধ্যে সেটিংস, অনুমতি, কর্পোরেট অ্যাক্সেস, নেটওয়ার্ক অ্যাক্টিভিটি এবং ডিভাইসের লোকেশন সম্পর্কিত তথ্য অন্তর্ভুক্ত।"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"প্রতিষ্ঠানের ম্যানেজার এই ইনফোটেইনমেন্ট সিস্টেম সম্পর্কিত অ্যাপ ও ডেটা নজর রাখতে এবং ম্যানেজ করতে পারবেন। এর মধ্যে সেটিংস, অনুমতি, কর্পোরেট অ্যাক্সেস, নেটওয়ার্ক অ্যাক্টিভিটি এবং গাড়ির লোকেশন সম্পর্কিত তথ্য অন্তর্ভুক্ত।"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"প্রতিষ্ঠানের ম্যানেজার হয়ত এই ইনফোটেইনমেন্ট সিস্টেম সম্পর্কিত ডেটা অ্যাক্সেস করতে, অ্যাপ ম্যানেজ করতে এবং গাড়ির সেটিংস পরিবর্তন করতে পারবেন।"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"এটি উপলভ্য নেই"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"এই ম্যানেজ করা গাড়িতে ভলিউম পরিবর্তন করা যাবে না"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"এই ম্যানেজ করা গাড়িতে কল করার সুবিধা পাওয়া যাবে না"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"এই ম্যানেজ করা গাড়িতে এসএমএস করার অনুমতি নেই"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"এই ম্যানেজ করা গাড়িতে ক্যামেরার সুবিধা পাওয়া যাবে না"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"এই ম্যানেজ করা গাড়িতে স্ক্রিনশট নেওয়া যাবে না"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"এই ম্যানেজ করা গাড়িতে এই অ্যাপ খোলা যাবে না"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"ক্রেডিট প্রদানকারীর মাধ্যমে ব্লক করা হয়েছে"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"কিছু ফিচারের অ্যাক্সেস সংস্থার তরফে সীমিত করে দেওয়া হয়েছে।\n\nআপনার কোনও প্রশ্ন থাকলে সংস্থার ম্যানেজারের সাথে যোগাযোগ করুন।"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"গাড়ির অ্যাডমিন অ্যাপ"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{#টি অ্যাপ যা চালু আছে}one{#টি অ্যাপ যা চালু আছে}other{#টি অ্যাপ যা চালু আছে}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"কোনও অ্যাপ চালু নেই"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>-এর গাড়ি সংক্রান্ত নীতি"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"প্রতিষ্ঠানের ম্যানেজার সেটিংস ম্যানেজ করেন"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> সম্পর্কে আরও জানুন"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"ত্রুটির রিপোর্ট শেয়ার করতে চান?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"এই ডিভাইসের সমস্যা সমাধান করতে সাহায্য করার জন্য এই গাড়ির প্রতিষ্ঠানের ম্যানেজার ত্রুটির রিপোর্ট চেয়েছেন। অ্যাপ ও ডেটা শেয়ার করা হতে পারে।"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"এই ডিভাইসের সমস্যা সমাধান করতে সাহায্য করার জন্য এই গাড়ির প্রতিষ্ঠানের ম্যানেজার ত্রুটির রিপোর্ট চেয়েছেন। অ্যাপ ও ডেটা শেয়ার করা হতে পারে ও ডিভাইসটি সাময়িকভাবে ধীরে কাজ করতে পারে।"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"এই ত্রুটির রিপোর্ট এই গাড়ির প্রতিষ্ঠানের ম্যানেজারের সাথে শেয়ার করা হচ্ছে। আরও বিবরণের জন্য তাদের সাথে যোগাযোগ করুন।"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"শেয়ার করুন"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"বাতিল করুন"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"এই সেটিং এই মুহূর্তে পরিবর্তন করা যাবে না"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"অ্যাক্সেসিবিলিটি"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"ক্যাপশন"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"ক্যাপশন সংক্রান্ত অভিরুচি"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"বন্ধ আছে"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"চালু আছে"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"স্ক্রিন রিডার"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"ক্যাপশন দেখুন"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"টেক্সটের সাইজ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"ক্যাপশনের সাইজ এবং স্টাইল"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"খুব ছোট"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"ছোট"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ডিফল্ট"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"বড়"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"খুব বড়"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"ক্যাপশনের স্টাইল"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"অ্যাপের সেট করা"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"কালোর উপর সাদা"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"সাদার উপর কালো"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"কালোর উপর হলুদ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"নীলের উপর হলুদ"</string>
</resources>
diff --git a/res/values-bs/arrays.xml b/res/values-bs/arrays.xml
index 1f15d2d..c315be6 100644
--- a/res/values-bs/arrays.xml
+++ b/res/values-bs/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nikada ne dozvoli"</item>
<item msgid="1154273129608299386">"Uvijek dozvoli"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 4e9d4c9..0742160 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -27,11 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Noćni način rada"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Mreža i internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilna mreža"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-a</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-ova</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}one{# SIM}few{# SIM-a}other{# SIM-ova}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktivno/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Neaktivno/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktivno/preuzet SIM"</string>
@@ -39,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Dodaj još"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilni podaci"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Pristupi podacima putem mobilne mreže"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilna mreža"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Koristi prijenos podataka na mobilnoj mreži"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Isključiti prijenos podataka na mobilnoj mreži?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Potrebno je odabrati"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Koristiti <xliff:g id="CARRIER">%1$s</xliff:g> za mobilne podatke?"</string>
@@ -54,11 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Upozorenje o prijenosu podataka: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Ograničenje prijenosa podataka: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Upozorenje o prijenosu podataka: <xliff:g id="ID_1">^1</xliff:g> / Ograničenje prijenosa podataka: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Još %d dan</item>
- <item quantity="few">Još %d dana</item>
- <item quantity="other">Još %d dana</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Preostao je još # dan}one{Preostao je još # dan}few{Preostala su još # dana}other{Preostalo je još # dana}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Nema preostalog vremena"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Preostalo je manje od 1 dana"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Ažurirao mob. operater <xliff:g id="ID_1">^1</xliff:g> prije <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -73,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Postavi"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Upozorenje na podatke i limit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciklus upotrebe podataka apl."</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Prijenos podataka na mobilnoj mreži"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Postavi upozorenje o podacima"</string>
<string name="data_warning" msgid="116776633806885370">"Upozorenje na podatke"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Postavi ograničenje za podatke"</string>
@@ -81,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Glavna jedinica vozila će isključiti prijenos podataka na mobilnoj mreži nakon što dostigne ograničenje koje ste postavili.\n\nS obzirom na to da glavna jedinica vozila mjeri prijenos podataka te da obračun vašeg operatera može biti drugačiji, uzmite u obzir postavljanje umjerenog ograničenja."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Postavljanje upozorenja o prijenosu podataka"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Postavljanje ograničenja za prijenos podataka"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Vaš uređaj mjeri korištenje podataka. Može se razlikovati od podataka mobilnog operatera."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Postavi"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Sačuvaj"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Mreža za OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet vozila"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Ako isključite internet vozila, može se zaustaviti rad određenih funkcija ili aplikacija vozila.\n\nKritični podaci potrebni za rad vašeg vozila će se nastaviti dijeliti s njegovim proizvođačem."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Svejedno isključi"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet vozila je isključen. To može spriječiti rad određenih funkcija ili aplikacija vozila. Kritični podaci potrebni za rad vašeg vozila će se nastaviti dijeliti s njegovim proizvođačem."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Iskorišteno %1$s %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Pridružite se drugoj mreži"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Postavke mreže"</string>
@@ -96,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj mrežu"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Poveži"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Povezivanje…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nije povezano"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Mreža nije u dometu"</string>
<string name="wifi_password" msgid="5565632142720292397">"Lozinka"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Prikaži lozinku"</string>
@@ -157,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Odaberite barem jedan frekvencijski pojas za WiFi pristupnu tačku:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Pristupna tačka i povezivanje putem mobitela"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Pristupna tačka"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Isključeno"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Automatski isključi pristupnu tačku"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"WiFi pristupna tačka će se isključiti ako nijedan uređaj nije povezan"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> želi uključiti WiFi"</string>
@@ -299,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Prisilno zaustavi"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Prisilno zaustaviti?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ako prisilno zaustavite aplikaciju, moguće je da će nepravilno funkcionirati."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Isključiti zaštitu performansi?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ako to uradite, vaš softver i hardver možda neće funkcionirati kako je namijenjeno."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Ostavi uključeno"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Isključi"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Uključiti prioritet performansi aplikacije?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Ako uključite, to može prouzrokovati potencijalnu nestabilnost sistema ili dugotrajni uticaj na hardver. Želite li nastaviti?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Da"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ne, hvala"</string>
<string name="disable_text" msgid="4358165448648990820">"Onemogući"</string>
<string name="enable_text" msgid="1794971777861881238">"Omogući"</string>
<string name="uninstall_text" msgid="277907956072833012">"Deinstaliraj"</string>
@@ -312,27 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Odobrenja"</string>
<string name="notifications_label" msgid="6586089149665170731">"Obavještenja"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Pohrana i keš memorija"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Najbolje performanse"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Dodijeli prioritet performansama aplikacije"</string>
<string name="application_version_label" msgid="8556889839783311649">"Verzija: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nema dodijeljenih odobrenja"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nema zatraženih odobrenja"</string>
<string name="unused_apps" msgid="648471933781010395">"Nekorištene aplikacije"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> nekorištena aplikacija</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> nekorištene aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> nekorištenih aplikacija</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# nekorištena aplikacija}one{# nekorištena aplikacija}few{# nekorištene aplikacije}other{# nekorištenih aplikacija}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Ukloni odobrenja i oslobodi prostor"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s u unutrašnjoj pohrani"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Po potrebi zatvara aplikaciju da ne koristi izvore prekomjerno"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Koristi izvore sistema da dodijeli prioritet performansama aplikacije"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Prijenos podataka"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Prijenos podataka za apl."</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historija korištenja"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Sve aplikacije"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Korištenje: podaci i WiFi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historija korištenja"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Ukupno je iskorišteno"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Prvi plan"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Pozadina"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Dozvolite podatke"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Dozvolite aplikaciji da koristi mobilne podatke"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Ograničite podatke"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Korištenje podataka samo kada je apl. u 1. planu"</string>
<string name="computing_size" msgid="5791407621793083965">"Računanje…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dodatno odobrenje</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatna odobrenja</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatnih odobrenja</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# dodatno odobrenje}one{# dodatno odobrenje}few{# dodatna odobrenja}other{# dodatnih odobrenja}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Napomena: Nakon ponovnog pokretanja, ova aplikacija se neće moći pokrenuti dok ne otključate vozilo."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomoć i glasovni unos"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplikacija za pomoć"</string>
@@ -389,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Kontroliranje WiFi mreže omogućava aplikaciji da uključi ili isključi WiFi, skenira i da se poveže na WiFi, doda ili ukloni mreže te pokrene lokalnu pristupnu tačku."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Više"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lokacija"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Koristi lokaciju"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Dozvolite odabranim aplikacijama pristup lokaciji"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Ako isključite ovu funkciju, uklonit će se pristup lokaciji za sve aplikacije. Aplikacije pomoći za vozače će i dalje imati pristup."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Koristi lokaciju za pomoć za vozače"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Lokacija vozila je isključena"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Aplik. pomoći za vozače ne mogu pristupiti lokaciji"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Promijeni"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Dozvolite aplikacijama za vožnju da pristupe lokaciji"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ako isključite ovu funkciju, onemogućit će se aplikacije pomoći za vozače koje se oslanjaju na podatke o lokaciji."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Svejedno isključi"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedavni zahtjevi za lokaciju"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nema nedavnih zahtjeva za lokaciju"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Odobrenja na nivou aplikacija"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Usluge lokacije"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Koristi lokaciju"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Lokacija može koristiti izvore kao što su GPS, WiFi, mobilne mreže i senzori za lakšu procjenu lokacije uređaja."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Pomoć za vozače"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Informacije o lokaciji koje se šalju aplikacijama pomoći za vozače ne sadržavaju informacije pomoću kojih vas je moguće identificirati. Pohranjuju se najduže 2 dana prije nego što se izbrišu."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Koristite mikrofon"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Dozvolite svim aplikacijama da pristupaju mikrofonu"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Upravljajte odobrenjima za mikrofon"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Nedavno pristupano"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nema nedavnih aplikacija"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Nijedna aplikacija nema pristup"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# aplikacija od {total_count} ima pristup}one{# aplikacija od {total_count} ima pristup}few{# aplikacije od {total_count} imaju pristup}other{# aplikacija od {total_count} ima pristup}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nedavno pristupano"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Prikaži sve"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Učitavanje…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Ažuriranja sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Napredno"</string>
@@ -433,11 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licence trećih strana"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Došlo je do problema s učitavanjem licenci."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Učitavanje…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak vas dijeli od toga da postanete programer.</item>
- <item quantity="few">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka vas dijele od toga da postanete programer.</item>
- <item quantity="other">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka vas dijeli od toga da postanete programer.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Još # korak vas dijeli od toga da postanete programer.}one{Još # korak vas dijeli od toga da postanete programer.}few{Još # koraka vas dijele od toga da postanete programer.}other{Još # koraka vas dijeli od toga da postanete programer.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Sada ste programer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Nema potrebe, već ste programer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opcije za programere"</string>
@@ -506,15 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Kada kreirate novi profil, korisnik ga treba samostalno prilagoditi."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Aplikacije se mogu ažurirati s bilo kojeg profila da se koriste na svim drugim profilima."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Dosegnuli ste maksimalni broj profila"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Možete kreirati najviše <xliff:g id="COUNT">%d</xliff:g> profil.</item>
- <item quantity="few">Možete kreirati najviše <xliff:g id="COUNT">%d</xliff:g> profila.</item>
- <item quantity="other">Možete kreirati najviše <xliff:g id="COUNT">%d</xliff:g> profila.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Možete kreirati samo jedan profil.}one{Možete kreirati najviše # profil.}few{Možete kreirati najviše # profila.}other{Možete kreirati najviše # profila.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Kreiranje novog profila nije uspjelo"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Izbrisati ovaj profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Sve aplikacije i podaci za ovaj profil će se izbrisati"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Brisanje profila nije uspjelo."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil nije izbrisan. Ponovo pokrenite uređaj i pokušajte ponovo."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ovaj profil će se izbrisati kada zamijenite profile ili ponovo pokrenete vozilo."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Odbaci"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Pokušaj ponovo"</string>
@@ -627,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Kako nacrtati uzorak za otključavanje"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Greška prilikom pohrane uzorka"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Previše pogrešnih pokušaja. Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Obrazac ne podržava brojčanik. Koristite dodir"</string>
<string name="okay" msgid="4589873324439764349">"UREDU"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Ukloniti zaključavanje ekrana?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Svi će imati pristup vašem računu"</string>
@@ -658,36 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Vaš IT administrator je blokirao česte PIN kodove. Probajte drugi PIN kôd."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Ne može sadržavati nevažeći znak."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Lozinka je nevažeća. Mora sadržavati najmanje 4 znaka."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> slovo</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> slova</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> slova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> malo slovo</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> mala slova</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> malih slova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> veliko slovo</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> velika slova</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> velikih slova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> cifru</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> cifre</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> cifri</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> posebni znak</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> posebna znaka</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> posebnih znakova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> znak koji nije slovo</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> znaka koja nisu slova</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> znakova koji nisu slova</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Administrator uređaja ne dozvoljava korištenje nedavne lozinke"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Greška prilikom pohrane lozinke"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Vaš IT administrator je blokirao česte lozinke. Probajte drugu lozinku."</string>
@@ -730,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Dodaj profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Izbriši ovaj profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Dodaj profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Osvjetljenje ekrana"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Da vidite svoje uređaje, uključite Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Da uparite uređaj, otvorite postavke Bluetootha"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrator informativno-zabavnog sistema"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivirane aplikacije"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktivirane aplikacije"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplikacije s ovim odobrenjem imaju pristup podacima ovog vozila"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nema aplikacija administratora vozila"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Aplikacija administratora informativno-zabavnog sistema je aktivna i dozvoljava aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da vrši sljedeće operacije:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Aktiviranjem aplikacije informativno-zabavnog sistema dozvolit će se aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da izvršava sljedeće operacije:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktivirati ovu aplikaciju?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktiviraj ovu aplikaciju informativno-zabavnog sistema"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktiviraj i deinstaliraj"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deaktivirajte ovu aplikaciju informativno-zabavnog sistema"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Više detalja"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Upravitelj organizacije može nadzirati aplikacije i podatke povezane s ovim profilom te upravljati njima, uključujući postavke, odobrenja, korporativni pristup, aktivnost na mreži i informacije o lokaciji vozila."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Upravitelj organizacije može nadzirati aplikacije i podatke povezane s ovim profilom te upravljati njima, uključujući postavke, odobrenja, korporativni pristup, aktivnost na mreži i informacije o lokaciji uređaja."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Upravitelj organizacije može nadzirati aplikacije i podatke povezane s ovim informativno-zabavnim sistemom te upravljati njima, uključujući postavke, odobrenja, korporativni pristup, aktivnost na mreži i informacije o lokaciji vozila."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Upravitelj organizacije će možda moći pristupati podacima povezanim s ovim informativno-zabavnim sistemom, upravljati aplikacijama i mijenjati postavke ovog vozila."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"To nije dostupno"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Nije moguće promijeniti jačinu zvuka u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Nije moguće upućivati pozive u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS poruke nisu dozvoljene u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera nije dostupna u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Nije moguće praviti snimke ekrana u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Nije moguće otvoriti ovu aplikaciju u ovom vozilu kojim se upravlja"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blokirao vaš dobavljač kredita"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Vaša organizacija je ograničila pristup nekim funkcijama.\n\nAko imate pitanja, kontaktirajte upravitelja organizacije."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Aplikacije administratora vozila"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivirana aplikacija}one{# aktivirana aplikacija}few{# aktivirane aplikacije}other{# aktiviranih aplikacija}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nema aktiviranih aplikacija"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Pravila o vozilima organizacije <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Postavkama upravlja upravitelj organizacije"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Saznajte više o usluzi <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Podijeliti izvještaj o grešci?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Upravitelj organizacije za ovo vozilo je zatražio izvještaj o grešci radi lakšeg rješavanja problema ovog uređaja. To može uzrokovati dijeljenje aplikacija i podataka."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Upravitelj organizacije za ovo vozilo je zatražio izvještaj o grešci radi lakšeg rješavanja problema ovog uređaja. To može uzrokovati dijeljenje aplikacija i podataka te privremeno usporiti vaš uređaj."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Ovaj izvještaj o grešci se dijeli s upraviteljem organizacije za ovo vozilo. Kontaktirajte ga da dobijete više detalja."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Dijeli"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Odbij"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Ovu postavku trenutno nije moguće promijeniti"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Pristupačnost"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Titlovi"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Postavke titlova"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Isključeno"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Uključeno"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Čitač ekrana"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Prikaži titlove"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Veličina teksta"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Veličina i stil titlova"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Veoma malo"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Malo"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Zadano"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Veliko"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Veoma veliko"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Stil titlova"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Postavila aplikacija"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Bijelo na crnoj podlozi"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Crno na bijeloj podlozi"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Žuto na crnoj podlozi"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Žuto na plavoj podlozi"</string>
</resources>
diff --git a/res/values-ca/arrays.xml b/res/values-ca/arrays.xml
index f2103ea..6b6778b 100644
--- a/res/values-ca/arrays.xml
+++ b/res/values-ca/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"No permetis mai"</item>
<item msgid="1154273129608299386">"Permet sempre"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index f8d63e9..ded41f3 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Mode nocturn"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Xarxa i Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Xarxa mòbil"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> targetes SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> targeta SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# targeta SIM}other{# targetes SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Actiu / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactiu / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Actiu / SIM baixada"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Afegeix-ne més"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dades mòbils"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accedeix a les dades amb la xarxa mòbil"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Xarxa mòbil"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Utilitza dades mòbils"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vols desactivar les dades mòbils?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Has de seleccionar una preferència"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Utilitzar <xliff:g id="CARRIER">%1$s</xliff:g> per a dades mòbils?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Advertiment de dades: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Límit de dades: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Advertiment de dades: <xliff:g id="ID_1">^1</xliff:g> / Límit de dades: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Queden %d dies</item>
- <item quantity="one">Queda %d dia</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Queda # dia}other{Queden # dies}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"S\'ha acabat el temps"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Queda menys d\'1 dia"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Actualitzat per <xliff:g id="ID_1">^1</xliff:g> fa <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Defineix"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Advertiment i límit de dades"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cicle d\'ús de dades d\'aplicacions"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Ús de dades mòbils"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Defineix un advertiment de dades"</string>
<string name="data_warning" msgid="116776633806885370">"Advertiment de dades"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Defineix un límit de dades"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Es desactivaran les dades mòbils de la unitat principal del vehicle quan s\'arribi al límit que has establert.\n\nCom que la unitat principal mesura l\'ús de dades i és possible que l\'operador de telefonia mòbil en faci un recompte diferent, et recomanem que estableixis un límit prudent."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Estableix un advertiment d\'ús de dades"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Estableix un límit d\'ús de dades"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"El dispositiu mesura l\'ús de dades. Pot variar segons les dades del teu operador de telefonia mòbil."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Estableix"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Desa"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Xarxa OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Connexió a Internet del vehicle"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Si desactives l\'Internet del vehicle, pot ser que algunes funcions o apps no funcionin.\n\nLes dades essencials necessàries perquè el vehicle funcioni es continuaran compartint amb el fabricant."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Desactiva igualment"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"S\'ha desactivat la connexió a Internet del vehicle. Això pot impedir el funcionament d\'algunes aplicacions o funcions del vehicle. Les dades essencials que són necessàries perquè el vehicle funcioni es continuaran compartint amb el fabricant."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"S\'han utilitzat %1$s (%2$s - %3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Uneix-me a una altra xarxa"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferències de xarxa"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Afegeix una xarxa"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Connecta"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"S\'està connectant…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"No connectada"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"La xarxa està fora de l\'abast"</string>
<string name="wifi_password" msgid="5565632142720292397">"Contrasenya"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Mostra la contrasenya"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Tria almenys una banda per al punt d\'accés Wi-Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Punt d\'accés Wi-Fi i compartició de xarxa"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Punt d\'accés Wi‑Fi"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Desactivat"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Desactiva el punt d\'accés Wi‑Fi automàticament"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"El punt d\'accés Wi‑Fi es desactivarà si no hi ha cap dispositiu connectat"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> vol activar la Wi‑Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Força l\'aturada"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Vols forçar l\'aturada?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Si forces l\'aturada d\'una aplicació, és possible que no funcioni correctament."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Vols desactivar la protecció de rendiment?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Si la desactives, el programari i el maquinari no funcionaran tan bé."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Mantén activada"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Desactiva"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Activar Prioritza el rendiment de l\'app?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Si actives aquesta opció, pot provocar inestabilitat al sistema o afectar el maquinari a llarg termini. Vols continuar?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Sí"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"No, gràcies"</string>
<string name="disable_text" msgid="4358165448648990820">"Desactiva"</string>
<string name="enable_text" msgid="1794971777861881238">"Activa"</string>
<string name="uninstall_text" msgid="277907956072833012">"Desinstal·la"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permisos"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notificacions"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Emmagatzematge i memòria cau"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Garanteix rendiment òptim"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritza el rendiment de l\'aplicació"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versió: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No s\'ha concedit cap permís"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No s\'ha sol·licitat cap permís"</string>
<string name="unused_apps" msgid="648471933781010395">"Aplicacions no utilitzades"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicacions no utilitzades</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicació no utilitzada</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# aplicació no utilitzada}other{# aplicacions no utilitzades}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Suprimeix els permisos i allibera espai"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s a l\'emmagatzematge intern"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Quan calgui, tanca l\'app per evitar l\'ús excessiu de recursos"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Utilitza recursos del sistema per prioritzar el rendiment de l\'aplicació"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Ús de dades"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Ús de dades de l\'aplicació"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historial d\'ús"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Totes les aplicacions"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Ús de dades i Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historial d\'ús"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Ús total"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"En primer pla"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"En segon pla"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Permet l\'ús de dades"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Permet que aquesta aplicació utilitzi dades mòbils"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restringeix les dades"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Utilitza dades només si l\'app està en primer pla"</string>
<string name="computing_size" msgid="5791407621793083965">"S\'està calculant…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permisos addicionals</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permís addicional</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# permís addicional}other{# permisos addicionals}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Nota: després de reiniciar, l\'aplicació no s\'iniciarà fins que no desbloquegis el vehicle."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistència i entrada de veu"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplicació d\'assistència"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"El control de la Wi‑Fi permet que una aplicació activi o desactivi la Wi‑Fi, cerqui xarxes Wi‑Fi, s\'hi connecti, n\'afegeixi o en suprimeixi, o que iniciï un punt d\'accés Wi‑Fi només local."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Més"</string>
<string name="location_settings_title" msgid="901334356682423679">"Ubicació"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Utilitza la ubicació"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Permet l\'accés a la ubicació a algunes apps"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Si desactives aquesta opció, se suprimirà l\'accés a la ubicació per a totes les aplicacions. Les aplicacions d\'assistència al conductor continuaran tenint-hi accés."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Usa ubicació per a assistència al conductor"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"La ubicació del vehicle està desactivada"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Assistència al conductor no té accés a la ubicació"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Canvia"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Permet a apps d\'assistència al conductor accedir a la ubicació"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Si desactives aquesta opció, les aplicacions d\'assistència al conductor que depenen de la informació d\'ubicació es desactivaran."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Desactiva igualment"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Sol·licituds d\'ubicació recents"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No hi ha cap sol·licitud d\'ubicació recent"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisos al nivell de l\'aplicació"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Serveis d\'ubicació"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Utilitza la ubicació"</string>
<string name="location_settings_footer" msgid="296892848338100051">"La ubicació pot utilitzar fonts com el GPS, la connexió Wi‑Fi, les xarxes mòbils i els sensors per calcular la ubicació del dispositiu."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Assistència al conductor"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"La informació d\'ubicació enviada a les aplicacions d\'assistència al conductor no inclou cap dada que t\'identifiqui. S\'emmagatzema durant 2 dies com a màxim abans de suprimir-se."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Micròfon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Utilitza el micròfon"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Permet que totes les aplicacions accedeixin al teu micròfon"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Gestiona els permisos del micròfon"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"S\'hi ha accedit fa poc"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"No hi ha aplicacions recents"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Cap aplicació no té accés"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# de {total_count} aplicacions té accés}other{# de {total_count} aplicacions tenen accés}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"S\'hi ha accedit fa poc"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Mostra-ho tot"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"S\'està carregant…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Actualitzacions del sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Configuració avançada"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Llicències de tercers"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"S\'ha produït un problema en carregar les llicències."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"S\'està carregant…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Ara ja només et queden <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> passos per convertir-te en desenvolupador.</item>
- <item quantity="one">Ara ja només et queda <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> pas per convertir-te en desenvolupador.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Ara ja només et queda # pas per convertir-te en desenvolupador.}other{Ara ja només et queden # passos per convertir-te en desenvolupador.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Ara ja ets desenvolupador!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"No és necessari, ja ets desenvolupador."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opcions per a desenvolupadors"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Un cop hagis creat un perfil per a una altra persona, aquesta persona l\'hauria de personalitzar."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Les apps es poden actualitzar des de qualsevol perfil perquè la resta de perfils puguin utilitzar-les."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"S\'ha assolit el límit de perfils"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Pots crear fins a <xliff:g id="COUNT">%d</xliff:g> perfils.</item>
- <item quantity="one">Només es pot crear un perfil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Només es pot crear 1 perfil.}other{Pots crear fins a # perfils.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"No s\'ha pogut crear el perfil"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Vols suprimir aquest perfil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Totes les aplicacions i dades d\'aquest perfil se suprimiran"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"No s\'ha pogut suprimir el perfil"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"El perfil no s\'ha suprimit. Reinicia el dispositiu i torna-hi."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Aquest perfil se suprimirà quan canviïs de perfil o quan tornis a engegar el vehicle."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignora"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Torna-ho a provar"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Com es dibuixa un patró de desbloqueig"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"S\'ha produït un error en desar el patró"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Has superat el nombre d\'intents incorrectes permesos. Torna-ho a provar d\'aquí a <xliff:g id="NUMBER">%d</xliff:g> segons."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Patró de rotació no admès; utilitza un tàctil"</string>
<string name="okay" msgid="4589873324439764349">"D\'acord"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Suprimir bloqueig de pantalla?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Qualsevol persona podrà accedir al teu compte"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"L\'administrador de TI ha bloquejat els PIN més comuns. Prova un altre PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"No pot incloure un caràcter no vàlid."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"La contrasenya no és vàlida; ha de tenir com a mínim 4 caràcters."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Ha de contenir com a mínim <xliff:g id="COUNT">%d</xliff:g> lletres</item>
- <item quantity="one">Ha de contenir com a mínim 1 lletra</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Ha de contenir com a mínim <xliff:g id="COUNT">%d</xliff:g> lletres minúscules</item>
- <item quantity="one">Ha de contenir com a mínim 1 lletra minúscula</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Ha de contenir com a mínim <xliff:g id="COUNT">%d</xliff:g> lletres majúscules</item>
- <item quantity="one">Ha de contenir com a mínim 1 lletra majúscula</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Ha de contenir com a mínim <xliff:g id="COUNT">%d</xliff:g> dígits numèrics</item>
- <item quantity="one">Ha de contenir com a mínim 1 dígit numèric</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Ha de contenir com a mínim <xliff:g id="COUNT">%d</xliff:g> símbols especials</item>
- <item quantity="one">Ha de contenir com a mínim 1 símbol especial</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Ha de contenir com a mínim <xliff:g id="COUNT">%d</xliff:g> caràcters que no siguin lletres</item>
- <item quantity="one">Ha de contenir com a mínim 1 caràcter que no sigui una lletra</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"L\'administrador del dispositiu no permet que s\'utilitzi una contrasenya recent"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Error en desar la contrasenya"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"L\'administrador de TI ha bloquejat les contrasenyes més comunes. Prova una altra contrasenya."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Afegeix un perfil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Suprimeix aquest perfil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Afegeix un perfil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Brillantor de la pantalla"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Per veure els teus dispositius, activa el Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Per vincular un dispositiu, obre la configuració del Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrador del sistema d\'informació i entreteniment"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aplicacions activades"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Aplicacions desactivades"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Les aplicacions amb aquest permís tenen accés a les dades d\'aquest vehicle"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"No hi ha cap aplicació d\'administració de vehicles"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Aquesta aplicació d\'administració del sistema d\'informació i entreteniment està activa i permet que l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> faci les operacions següents:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"L\'activació d\'aquesta aplicació del sistema d\'informació i entreteniment permetrà que l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> faci les operacions següents:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Vols activar aquesta aplicació?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activa aquesta aplicació del sistema d\'informació i entreteniment"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Desactiva i desinstal·la"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Desactiva aquesta aplicació del sistema d\'informació i entreteniment"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Més detalls"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"El gestor de l\'organització pot supervisar i gestionar les aplicacions i les dades associades a aquest perfil, inclosos els permisos, la configuració, l\'accés corporatiu, l\'activitat de xarxa i la informació d\'ubicació del vehicle."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"El gestor de l\'organització pot supervisar i gestionar les aplicacions i les dades associades a aquest perfil, inclosos els permisos, la configuració, l\'accés corporatiu, l\'activitat de xarxa i la informació d\'ubicació del dispositiu."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"El gestor de l\'organització pot supervisar i gestionar les aplicacions i les dades associades a aquest sistema d\'informació i entreteniment, inclosos els permisos, la configuració, l\'accés corporatiu, l\'activitat de xarxa i la informació d\'ubicació del vehicle."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"És possible que el gestor de l\'organització pugui accedir a les dades associades a aquest sistema d\'informació i entreteniment, gestionar les aplicacions i canviar la configuració d\'aquest vehicle."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"No està disponible"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"No es pot canviar el volum d\'aquest vehicle gestionat"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"No es poden fer trucades en aquest vehicle gestionat"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"No es permeten els SMS en aquest vehicle gestionat"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"La càmera no està disponible en aquest vehicle gestionat"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"No es poden fer captures de pantalla en aquest vehicle gestionat"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"No es pot obrir aquesta aplicació en aquest vehicle gestionat"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Bloquejat per la teva entitat de crèdit"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"L\'organització té limitat l\'accés a algunes funcions.\n\nSi tens dubtes, contacta amb el gestor de l\'organització."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Aplicacions d\'administració de vehicles"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aplicació activada}other{# aplicacions activades}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"No hi ha cap aplicació activada"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Política del vehicle <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Configuració gestionada pel gestor de l\'organització"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Més informació sobre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Vols compartir l\'informe d\'errors?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"El gestor de l\'organització d\'aquest vehicle ha sol·licitat un informe d\'errors per resoldre els problemes d\'aquest dispositiu. És possible que es comparteixin aplicacions i dades."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"El gestor de l\'organització d\'aquest vehicle ha sol·licitat un informe d\'errors per resoldre els problemes d\'aquest dispositiu. És possible que es comparteixin aplicacions i dades, i que el dispositiu funcioni més a poc a poc durant una estona."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Aquest informe d\'errors es compartirà amb el gestor de l\'organització d\'aquest vehicle. Contacta-hi per obtenir més informació."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Comparteix"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Rebutja"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Aquesta configuració no es pot canviar ara mateix"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibilitat"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Subtítols"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferències dels subtítols"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Desactivats"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Activats"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Lector de pantalla"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Mostra els subtítols"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Mida del text"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Mida i estil dels subtítols"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Molt petita"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Petita"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Predeterminada"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Gran"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Molt gran"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Estil dels subtítols"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Definit per l\'aplicació"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Blanc sobre negre"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Negre sobre blanc"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Groc sobre negre"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Groc sobre blau"</string>
</resources>
diff --git a/res/values-cs/arrays.xml b/res/values-cs/arrays.xml
index 9d0b27a..cbf8871 100644
--- a/res/values-cs/arrays.xml
+++ b/res/values-cs/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nepovolit nikdy"</item>
<item msgid="1154273129608299386">"Vždy povolit"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index b8876f8..575d987 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -27,12 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Noční režim"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Síť a internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilní síť"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM karty</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM karty</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM karet</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM karta</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM karta}few{# SIM karty}many{# SIM karty}other{# SIM karet}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktivní / SIM karta"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Neaktivní / SIM karta"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktivní stažená SIM karta"</string>
@@ -40,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Přidat další"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilní data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Používat datové připojení přes mobilní síť"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilní síť"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Použít mobilní data"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vypnout mobilní data?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Je vyžadován výběr"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Používat pro mobilní data <xliff:g id="CARRIER">%1$s</xliff:g>?"</string>
@@ -55,12 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Upozornění na data: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Limit dat: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Upozornění na data: <xliff:g id="ID_1">^1</xliff:g> / limit dat: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="few">Zbývají %d dny</item>
- <item quantity="many">Zbývá %d dne</item>
- <item quantity="other">Zbývá %d dní</item>
- <item quantity="one">Zbývá %d den</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Zbývá # den}few{Zbývají # dny}many{Zbývá # dne}other{Zbývá # dní}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Nezbývá žádný čas"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Zbývá méně než 1 den"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Aktualizováno operátorem <xliff:g id="ID_1">^1</xliff:g> před <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -75,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Nastaveno"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Limit dat a upozornění"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cyklus využití dat aplikacemi"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Využití mobilních dat"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Nastavit upozornění na data"</string>
<string name="data_warning" msgid="116776633806885370">"Upozornění na data"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Nastavit limit dat"</string>
@@ -83,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Jakmile dosáhnete stanoveného limitu dat, řídicí jednotka auta mobilní data vypne.\n\nVyužití dat je měřeno řídicí jednotkou, ale váš operátor ho může měřit jinak, doporučujeme proto nastavit konzervativní limit."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Nastavení upozornění na využití dat"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Nastavení limitu datových přenosů"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Využití dat je měřeno zařízením. Od statistik operátora se může lišit."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Nastavit"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Uložit"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Síť OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet ve vozidlu"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Když ve vozidle vypnete internet, některé funkce nebo aplikace nebudou fungovat.\n\nKritická data nezbytná k provozu vozidla budou nadále sdílena s výrobcem."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Přesto vypnout"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet ve vozidlu je vypnutý. Některé funkce nebo aplikace nebudou fungovat. Kritická data nezbytná k provozu vozidla budou nadále sdílena s výrobcem."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s využito %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Připojit k jiné síti"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Možnosti sítě"</string>
@@ -98,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Přidat síť"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Připojit"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Připojování…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nepřipojeno"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Síť není v dosahu"</string>
<string name="wifi_password" msgid="5565632142720292397">"Heslo"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Zobrazit heslo"</string>
@@ -159,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Vyberte alespoň jedno pásmo pro hotspot Wi-Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot a tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Vypnuto"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Automatické vypnutí hotspotu"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Pokud nebudou připojena žádná zařízení, hotspot Wi-Fi se vypne"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"Aplikace <xliff:g id="REQUESTER">%s</xliff:g> chce zapnout Wi-Fi"</string>
@@ -301,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Vynutit ukončení"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Vynutit ukončení?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Vynucené ukončení může způsobit nepředvídatelné chování aplikace."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Vypnout ochranu výkonu?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Pokud ji vypnete, váš software a hardware nemusí fungovat tak dobře."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Ponechat zapnutou"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Vypnout"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Zapnout upřednostnění výkonu aplikace?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Zapnutí může potenciálně způsobit nestabilitu systému nebo mít dlouhodobý dopad na hardware. Chcete pokračovat?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ano"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ne, děkuji"</string>
<string name="disable_text" msgid="4358165448648990820">"Zakázat"</string>
<string name="enable_text" msgid="1794971777861881238">"Povolit"</string>
<string name="uninstall_text" msgid="277907956072833012">"Odinstalovat"</string>
@@ -314,29 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Oprávnění"</string>
<string name="notifications_label" msgid="6586089149665170731">"Oznámení"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Úložiště a mezipaměť"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Zajistit maximální výkon"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Upřednostnit výkon aplikace"</string>
<string name="application_version_label" msgid="8556889839783311649">"Verze: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nebyla udělena žádná oprávnění"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nevyžaduje žádná oprávnění"</string>
<string name="unused_apps" msgid="648471933781010395">"Nepoužívané aplikace"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> nepoužívané aplikace</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> nepoužívané aplikace</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> nepoužívaných aplikací</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> nepoužívaná aplikace</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# nepoužívaná aplikace}few{# nepoužívané aplikace}many{# nepoužívané aplikace}other{# nepoužívaných aplikací}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Odebrat oprávnění a uvolnit místo"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s v interním úložišti"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"V případě potřeby zavřít aplikaci, aby se předešlo nadměrnému využití prostředků"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Používá systémové zdroje k upřednostnění výkonu aplikace"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Využití dat"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Využití dat aplikací"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historie využití"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Všechny aplikace"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Využití dat a Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historie využití"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Celkové využití"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Na popředí"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Na pozadí"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Povolit data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Povolit aplikaci používat mobilní data"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Omezit data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Používat mobilní data jen na popředí"</string>
<string name="computing_size" msgid="5791407621793083965">"Probíhá výpočet…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> další oprávnění</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> dalšího oprávnění</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dalších oprávnění</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> další oprávnění</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# další oprávnění}few{# další oprávnění}many{# dalšího oprávnění}other{# dalších oprávnění}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Poznámka: Po restartování se tato aplikace nespustí, dokud vozidlo neodemknete."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistence a hlasový vstup"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Asistenční aplikace"</string>
@@ -393,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Ovládání sítí Wi-Fi této aplikaci umožňuje zapínat a vypínat Wi-Fi, vyhledávat sítě Wi-Fi a připojovat se k nim, přidávat nebo odstraňovat sítě nebo nastavit místní hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Více"</string>
<string name="location_settings_title" msgid="901334356682423679">"Poloha"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Používat polohu"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Přístup k poloze pro vybrané aplikace"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Pokud tuto možnost vypnete, o přístup k poloze přijdou všechny aplikace. Asistence pro řidiče bude mít přístup i nadále."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Používat polohu při asistenci pro řidiče"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Poloha vozidla je vypnutá"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Aplikace pro řidiče nevidí vaši polohu"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Změnit"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Povolit přístup k poloze"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Pokud tuto možnost vypnete, budou deaktivovány funkce asistentce pro řidiče, které vyžadují údaje o poloze."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Přesto vypnout"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedávné žádosti o určení polohy"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Žádné nedávné žádosti o určení polohy"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Oprávnění na úrovni aplikace"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Služby určování polohy"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Používat polohu"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Poloha zařízení se určuje pomocí zdrojů, jako je systém GPS, sítě Wi-Fi, mobilní sítě a senzory."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Asistence pro řidiče"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Informace o poloze odesílané do aplikací asistence pro řidiče nezahrnují údaje umožňující zjistit vaši totožnost. Informace jsou ukládány nejvýše 2 dny a pak jsou smazány."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Použít mikrofon"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Povolit všem aplikacím přístup k mikrofonu"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Spravovat oprávnění pro přístup k mikrofonu"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Nedávno používáno"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Žádné nedávné aplikace"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Žádná aplikace nemá přístup"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Přístup má # z {total_count} aplikací}few{Přístup mají # z {total_count} aplikací}many{Přístup má # z {total_count} aplikací}other{Přístup má # z {total_count} aplikací}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nedávno používáno"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Zobrazit vše"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Načítání…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Systém"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Aktualizace systému"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Rozšířená nastavení"</string>
@@ -437,12 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licence třetích stran"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Při načítání licencí došlo k chybě."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Načítání…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="few">Jste <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> klepnutí od toho, abyste se stali vývojářem.</item>
- <item quantity="many">Jste <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> klepnutí od toho, abyste se stali vývojářem.</item>
- <item quantity="other">Jste <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> klepnutí od toho, abyste se stali vývojářem.</item>
- <item quantity="one">Jste <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> klepnutí od toho, abyste se stali vývojářem.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Jste # krok od toho, abyste se stali vývojářem.}few{Jste # kroky od toho, abyste se stali vývojářem.}many{Jste # kroku od toho, abyste se stali vývojářem.}other{Jste # kroků od toho, abyste se stali vývojářem.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Voilà! Stal se z vás vývojář."</string>
<string name="show_dev_already" msgid="1678087328973865736">"Není potřeba, už jste vývojář."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Pro vývojáře"</string>
@@ -511,16 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Uživatel si svůj nově vytvořený profil může přizpůsobit."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Aplikace lze aktualizovat z libovolného profilu k použití všemi profily."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Maximální počet profilů dosažen"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="few">Můžete vytvořit až <xliff:g id="COUNT">%d</xliff:g> profily.</item>
- <item quantity="many">Můžete vytvořit až <xliff:g id="COUNT">%d</xliff:g> profilu.</item>
- <item quantity="other">Můžete vytvořit až <xliff:g id="COUNT">%d</xliff:g> profilů.</item>
- <item quantity="one">Můžete vytvořit jen jeden profil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Můžete vytvořit jen jeden profil.}few{Můžete vytvořit až # profily.}many{Můžete vytvořit až # profilu.}other{Můžete vytvořit až # profilů.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Nový profil se nepodařilo vytvořit"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Vymazat tento profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Veškeré aplikace a data v tomto profilu budou vymazána"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profil se nepodařilo smazat."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil nebyl smazán. Restartujte zařízení a zkuste to znovu."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Když přepnete profily nebo restartujete vozidlo, tento profil bude smazán."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Zavřít"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Zkusit znovu"</string>
@@ -633,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Zadání bezpečnostního gesta"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Při ukládání gesta došlo k chybě"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Příliš mnoho neplatných pokusů. Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Nelze použít otáčivý vstup, použijte dotykový"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Odstranit zámek obrazovky?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Kdokoli bude mít přístup k vašemu účtu"</string>
@@ -664,42 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Obvyklé kódy PIN jsou blokovány administrátorem IT. Použijte jiný PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Heslo nesmí obsahovat neplatné znaky."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Heslo není platné, musí obsahovat nejméně 4 znaky."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="few">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> písmena</item>
- <item quantity="many">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> písmena</item>
- <item quantity="other">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> písmen</item>
- <item quantity="one">Heslo musí obsahovat alespoň 1 písmeno</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="few">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> malá písmena</item>
- <item quantity="many">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> malého písmena</item>
- <item quantity="other">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> malých písmen</item>
- <item quantity="one">Heslo musí obsahovat alespoň 1 malé písmeno</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="few">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> velká písmena</item>
- <item quantity="many">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> velkého písmena</item>
- <item quantity="other">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> velkých písmen</item>
- <item quantity="one">Heslo musí obsahovat alespoň 1 velké písmeno</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="few">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> číslice</item>
- <item quantity="many">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> číslice</item>
- <item quantity="other">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> číslic</item>
- <item quantity="one">Heslo musí obsahovat alespoň 1 číslici</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="few">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> speciální symboly</item>
- <item quantity="many">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> speciálního symbolu</item>
- <item quantity="other">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> speciálních symbolů</item>
- <item quantity="one">Heslo musí obsahovat alespoň 1 speciální symbol</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="few">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> znaky jiné než písmeno</item>
- <item quantity="many">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> znaku jiného než písmeno</item>
- <item quantity="other">Heslo musí obsahovat alespoň <xliff:g id="COUNT">%d</xliff:g> znaků jiných než písmeno</item>
- <item quantity="one">Heslo musí obsahovat alespoň 1 znak jiný než písmeno</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Administrátor zařízení neumožňuje použít heslo, které jste použili nedávno"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Při ukládání hesla došlo k chybě"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Obvyklá hesla jsou blokována administrátorem IT. Použijte jiné heslo."</string>
@@ -742,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Přidat profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Smazat tento profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Přidat profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Jas displeje"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Pokud chcete zobrazit svá zařízení, zapněte Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Pokud spárovat zařízení, zapněte nastavení Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrátor informačního a zábavního systému"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivované aplikace"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktivované aplikace"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplikace s tímto oprávněním mají přístup k datům vozidla"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Žádné administrátorské aplikace vozidla"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Tato administrátorská aplikace informačního a zábavního systému pro správu je aktivní a umožňuje aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> provádět následující operace:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Aktivací této administrátorské aplikace informačního a zábavního systému pro správu umožníte aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> provádět následující operace:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktivovat tuto aplikaci?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktivovat tuto aplikaci informačního a zábavního systému"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktivovat a odinstalovat"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deaktivovat tuto aplikaci informačního a zábavního systému"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Další podrobnosti"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Správce organizace může sledovat a spravovat aplikace a data přidružená k tomuto profilu, včetně nastavení, oprávnění, firemního přístupu, aktivity v síti a informací o poloze vozidla."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Správce organizace může sledovat a spravovat aplikace a data přidružená k tomuto profilu, včetně nastavení, oprávnění, firemního přístupu, aktivity v síti a informací o poloze zařízení."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Správce organizace může sledovat a spravovat aplikace a data přidružená k tomuto informačnímu a zábavnímu systému, včetně nastavení, oprávnění, firemního přístupu, aktivity v síti a informací o poloze vozidla."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Správce organizace má přístup k datům spojeným s tímto informačním a zábavním systémem, může měnit nastavení vozidla a spravovat aplikace."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Toto nastavení není k dispozici"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"V tomto spravovaném vozidle nelze změnit hlasitost"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"V tomto spravovaném vozidle nelze uskutečňovat odchozí hovory"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"V tomto spravovaném vozidle nejsou SMS povoleny"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"V tomto spravovaném vozidle kamera není k dispozici"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"V tomto spravovaném vozidle nelze pořizovat snímky obrazovky"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"V tomto spravovaném vozidle tuto aplikaci nelze otevřít"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blokováno vaším poskytovatelem úvěru"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Přístup k některým funkcím je omezen organizací.\n\nV případě dotazů kontaktujte správce organizace."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Administrátorské aplikace pro vozidlo"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivovaná aplikace}few{# aktivované aplikace}many{# aktivované aplikace}other{# aktivovaných aplikací}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Žádné aktivované aplikace"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Zásady organizace <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> pro vozidla"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Nastavení spravovaná správcem organizace"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Další informace o službě <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Sdílet zprávu o chybě?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Správce organizace tohoto vozidla požádal o zprávu o chybě, aby mohl problém odstranit. Mohou být sdíleny aplikace a data."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Správce organizace tohoto vozidla požádal o zprávu o chybě, aby mohl problém odstranit. Mohou být sdíleny aplikace a data a zařízení se může dočasně zpomalit."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Tato zpráva o chybě je sdílení se správcem organizace tohoto vozidla. Ten vám také poskytne další informace."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Sdílet"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Odmítnout"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Toto nastavení teď nelze změnit"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Přístupnost"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Titulky"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Předvolby titulků"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Vypnuto"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Zapnuto"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Čtečka obrazovky"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Zobrazovat titulky"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Velikost textu"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Velikost a styl titulků"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Velmi malé"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Malé"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Výchozí"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Velké"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Velmi velké"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Styl titulků"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Nastaveno aplikací"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Bílé na černém"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Černé na bílém"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Žluté na černém"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Žluté na modrém"</string>
</resources>
diff --git a/res/values-da/arrays.xml b/res/values-da/arrays.xml
index 79d23c6..f1f53e6 100644
--- a/res/values-da/arrays.xml
+++ b/res/values-da/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Tillad aldrig"</item>
<item msgid="1154273129608299386">"Tillad altid"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index cf672c1..6598c0f 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Nattilstand"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Netværk og internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilnetværk"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-kort</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-kort</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-kort}one{# SIM-kort}other{# SIM-kort}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktiv/knyttet til SIM-kort"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inaktiv/knyttet til SIM-kort"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktiv/knyttet til downloadet SIM-kort"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Tilføj flere"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobildata"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Brug data via mobilnetværk"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilnetværk"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Brug mobildata"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vil du deaktivere mobildata?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Du har ikke valgt endnu"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Vil du bruge <xliff:g id="CARRIER">%1$s</xliff:g> til mobildata?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Dataadvarsel ved <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Datagrænse på <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Dataadvarsel ved <xliff:g id="ID_1">^1</xliff:g>/datagrænse på <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d dag tilbage</item>
- <item quantity="other">%d dage tilbage</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# dag tilbage}one{# dag tilbage}other{# dage tilbage}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Der er ingen resterende tid"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Der er mindre end 1 dag tilbage"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Opdateret af <xliff:g id="ID_1">^1</xliff:g> for <xliff:g id="ID_2">^2</xliff:g> siden"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Angiv"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Advarsel om dataforbrug og datagrænse"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cyklus for appdataforbrug"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobildataforbrug"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Angiv advarsel om dataforbrug"</string>
<string name="data_warning" msgid="116776633806885370">"Advarsel om dataforbrug"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Angiv datagrænse"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Dit køretøjs hovedenhed deaktiverer mobildata, når den angivne grænse er nået.\n\nEftersom dataforbruget måles af hovedenheden, og dit mobilselskab muligvis beregner forbrug på en anden måde, kan du overveje at angive en lav grænse."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Angiv en advarsel om dataforbrug"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Angiv en grænse for dataforbrug"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Dataforbruget måles af din enhed. Målingen varierer muligvis fra den måling, dit mobilselskab udfører."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Angiv"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Gem"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-netværk"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internetforbindelsen i bilen"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Hvis du deaktiverer internetforbindelsen i bilen, virker visse funktioner og apps muligvis ikke.\n\nKritiske data, som kræves i forbindelse med driften af bilen, deles fortsat med bilproducenten."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Deaktiver alligevel"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internetforbindelsen i bilen er deaktiveret. Visse funktioner og apps i bilen virker muligvis ikke. Kritiske data, som kræves i forbindelse med driften af bilen, deles fortsat med bilproducenten."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s brugt i perioden %2$s til %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Opret forbindelse til et andet netværk"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Netværkspræferencer"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Tilføj netværk"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Forbind"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Tilslutter…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Ikke tilsluttet"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Netværket er ikke inden for rækkevidde"</string>
<string name="wifi_password" msgid="5565632142720292397">"Adgangskode"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Vis adgangskode"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Vælg mindst ét bånd til Wi‑Fi-hotspottet:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot og netdeling"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Deaktiveret"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Deaktiver hotspot automatisk"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi-hotspot deaktiveres, hvis der ikke er nogen forbundne enheder"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ønsker at aktivere Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Tving til at standse"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Vil du tvinge appen til at standse?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Hvis du tvinger en app til at standse, kan det medføre, at den ikke fungerer korrekt."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Vil du deaktivere ydelsesbeskyttelse?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Hvis du gør det, vil din software og hardware muligvis heller ikke fungere."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Lad den være aktiveret"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Deaktiver"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Vil du aktivere prioritering af app-ydeevne?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Aktivering af denne indstilling kan muligvis medføre, at systemet bliver ustabilt eller have en langvarig effekt på hardwaren. Vil du fortsætte?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ja"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nej tak"</string>
<string name="disable_text" msgid="4358165448648990820">"Deaktiver"</string>
<string name="enable_text" msgid="1794971777861881238">"Aktivér"</string>
<string name="uninstall_text" msgid="277907956072833012">"Afinstaller"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Tilladelser"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifikationer"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Lagerplads og cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Opnå optimal ydelse"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioriter app-ydeevne"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Der er ikke givet nogen tilladelser"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Der er ikke anmodet om nogen tilladelser"</string>
<string name="unused_apps" msgid="648471933781010395">"Apps, du ikke bruger"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> app, du ikke bruger</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps, du ikke bruger</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ubrugt app}one{# ubrugt app}other{# ubrugte apps}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Fjern tilladelser, og frigør plads"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s i intern lagerplads"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Luk appen for at undgå ressourcespild"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Bruger systemressourcer til at prioritere app-ydeevne"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Dataforbrug"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Dataforbrug i apps"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Forbrugshistorik"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Alle apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Brug af data og Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Forbrugshistorik"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Samlet forbrug"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"I forgrunden"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"I baggrunden"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Tillad brug af mobildata"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Giv denne app tilladelse til at bruge mobildata"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Begræns brug af data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Brug kun mobildata, når appen er i forgrunden"</string>
<string name="computing_size" msgid="5791407621793083965">"Beregner…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ekstra tilladelse</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ekstra tilladelser</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# yderligere tilladelse}one{# yderligere tilladelse}other{# yderligere tilladelser}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Bemærk! Efter en genstart kan denne app ikke starte, før du låser dit køretøj op."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistance og indtaling"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assistanceapp"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi-styring giver en app tilladelse til at aktivere og deaktivere Wi-Fi, søge efter og oprette forbindelse til Wi-Fi-netværk, tilføje og fjerne netværk eller starte et lokalt hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Mere"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lokation"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Anvend lokation"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Giv visse apps adgang til din lokation"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Hvis du deaktiverer lokation, fjernes lokationsadgang for alle apps. Apps til førerassistance har fortsat adgang."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Brug lokation til førerassistance"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Bilens lokation er deaktiveret"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Apps til førerassistance har ikke lokationsadgang"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Skift"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Giv apps, der hjælper under kørsel, adgang til din lokation"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Hvis du deaktiverer dette, deaktiveres apps til førerassistance, som kræver lokationsoplysninger."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Deaktiver alligevel"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Seneste lokationsanmodninger"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Der er ingen seneste lokationsanmodninger"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Tilladelser på appniveau"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Lokationstjenester"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Brug lokation"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Lokation kan anvende kilder som f.eks. GPS, Wi‑Fi, mobilnetværk og sensorer til at anslå din enheds lokation."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Førerassistance"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Lokationsoplysninger, der sendes til førerassistanceapps, indeholder ingen oplysninger, der identificerer dig. De gemmes i højst 2 dage, før de slettes."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Brug mikrofonen"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Giv alle apps adgang til din mikrofon"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Administrer adgangstilladelser til mikrofonen"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Tilgået for nylig"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Ingen apps har brugt mikrofonen for nylig"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apps har adgang"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# af {total_count} app har adgang}one{# af {total_count} app har adgang}other{# af {total_count} apps har adgang}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Tilgået for nylig"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Se alle"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Indlæser…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Systemopdateringer"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Avanceret"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Tredjepartslicenser"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Der er problemer med at indlæse licenserne."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Indlæser…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Du er nu <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skridt fra at være udvikler.</item>
- <item quantity="other">Du er nu <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skridt fra at være udvikler.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Du er nu # skridt fra at være udvikler.}one{Du er nu # skridt fra at være udvikler.}other{Du er nu # skridt fra at være udvikler.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Nu er du udvikler."</string>
<string name="show_dev_already" msgid="1678087328973865736">"Det behøver du ikke. Du er allerede udvikler."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Indstillinger for udviklere"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Når du har oprettet en ny profil til en bruger, kan vedkommende tilpasse den til sig selv."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apps kan opdateres via en hvilken som helst profil, så de øvrige profiler kan bruge dem."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Grænsen for profiler er nået"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Du kan oprette <xliff:g id="COUNT">%d</xliff:g> profil.</item>
- <item quantity="other">Du kan oprette op til <xliff:g id="COUNT">%d</xliff:g> profiler.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Der kan kun oprettes én profil.}one{Du kan oprette op til # profil.}other{Du kan oprette op til # profiler.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Den nye profil kunne ikke oprettes"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Vil du slette denne profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Alle apps og data, der er knyttet til denne profil, slettes"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profilen kunne ikke oprettes."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil blev ikke slettet. Genstart enhed, og prøv igen."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Denne profil slettes, når du skifter profil eller starter køretøjet igen."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Luk"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Prøv igen"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Sådan tegnes et mønster til at låse op"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Mønsteret kunne ikke gemmes"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"For mange mislykkede forsøg. Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Mønster understøtter ikke drejeinput – brug berøring"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Vil du fjerne skærmlåsen?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Dette vil betyde, at alle kan få adgang til din konto"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Brug af almindelige pinkoder er blokeret af din it-administrator. Prøv en anden pinkode."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Der må ikke bruges et ugyldigt tegn."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Adgangskoden er ugyldig. Den skal fylde mindst 4 tegn."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> bogstav</item>
- <item quantity="other">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> bogstaver</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> lille bogstav</item>
- <item quantity="other">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> små bogstaver</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> stort bogstav</item>
- <item quantity="other">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> store bogstaver</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> tal</item>
- <item quantity="other">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> tal</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> specialtegn</item>
- <item quantity="other">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> specialtegn</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> tegn, der ikke er et bogstav</item>
- <item quantity="other">Skal indeholde mindst <xliff:g id="COUNT">%d</xliff:g> tegn, der ikke er bogstaver</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Enhedens administrator tillader ikke brug af en nylig brugt adgangskode"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Adgangskoden kunne ikke gemmes"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Brug af almindelige adgangskoder er blokeret af din it-administrator. Prøv en anden adgangskode."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Tilføj en profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Slet denne profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Tilføj profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Skærmens lysstyrke"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Aktivér Bluetooth for at se dine enheder"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Åbn Bluetooth-indstillingerne for at parre en enhed"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrator af infotainmentsystemet"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktiverede apps"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktiverede apps"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apps med denne tilladelse har adgang til denne bils data"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Der er ingen apps til administration af biler"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Denne app til administration af infotainmentsystem er aktiv og giver appen <xliff:g id="APP_NAME">%1$s</xliff:g> tilladelse til at udføre følgende handlinger:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Hvis du aktiverer denne app til infotainmentsystem, giver du <xliff:g id="APP_NAME">%1$s</xliff:g> tilladelse til at udføre følgende handlinger:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Vil du aktivere denne app til infotainmentsystem?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktivér denne app til infotainmentsystem"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktiver og afinstaller"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deaktiver denne app til infotainmentsystem"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Mere info"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Administratoren af organisationen kan overvåge og administrere apps og data, som er tilknyttet denne profil, herunder indstillinger, tilladelser, virksomhedsadgang, netværksaktivitet og oplysninger om køretøjets lokation."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Administratoren af organisationen kan overvåge og administrere apps og data, som er tilknyttet denne profil, herunder indstillinger, tilladelser, virksomhedsadgang, netværksaktivitet og oplysninger om enhedens lokation."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Administratoren af organisationen kan overvåge og administrere apps og data, som er tilknyttet dette infotainmentsystem, herunder indstillinger, tilladelser, virksomhedsadgang, netværksaktivitet og oplysninger om køretøjets lokation."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Administratoren af organisationen kan muligvis tilgå data, som er tilknyttet dette infotainmentsystem, administrere apps og ændre indstillingerne for køretøjet."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Denne indstilling er ikke tilgængelig"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Du kan ikke ændre lydstyrken i dette administrerede køretøj"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Du kan ikke foretage opkald i dette administrerede køretøj"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Du kan ikke sende sms i dette administrerede køretøj"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Du kan ikke bruge kameraet i dette administrerede køretøj"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Du kan ikke tage screenshots i dette administrerede køretøj"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Du kan ikke åbne denne app i dette administrerede køretøj"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blokeret af dit kreditinstitut"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Organisationen har begrænset adgangen til visse funktioner.\n\nHvis du har nogen spørgsmål, skal du kontakte organisationens administrator."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Apps til administration af køretøj"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktiveret app}one{# aktiveret app}other{# aktiverede apps}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Ingen aktiverede apps"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Politik for køretøjer hos <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Indstillingerne administreres af administratoren af organisationen"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Få flere oplysninger om <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Vil du dele fejlrapporten?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Administratoren af dette køretøjs organisation har anmodet om en fejlrapport for at finde og rette fejl på denne enhed. Der deles muligvis apps og data."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Administratoren af dette køretøjs organisation har anmodet om en fejlrapport for at finde og rette fejl på denne enhed. Der deles muligvis apps og data, og din enhed kan midlertidigt blive langsom."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Denne fejlrapport deles med administratoren af dette køretøjs organisation. Kontakt administratoren for at få flere oplysninger."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Del"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Afvis"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Denne indstilling kan ikke ændres lige nu"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Tilgængelighed"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Undertekster"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Præferencer for undertekster"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Fra"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Til"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Skærmlæser"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Vis undertekster"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Tekststørrelse"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Tekststørrelse og -format"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Meget lille"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Lille"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Standard"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Stor"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Meget stor"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Tekstformat"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Angivet af appen"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Hvidt på sort"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Sort på hvidt"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Gult på sort"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Gult på blåt"</string>
</resources>
diff --git a/res/values-de/arrays.xml b/res/values-de/arrays.xml
index 63301c0..228b5f8 100644
--- a/res/values-de/arrays.xml
+++ b/res/values-de/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nie zulassen"</item>
<item msgid="1154273129608299386">"Immer zulassen"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 92767b5..a7d5b66 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Nachtmodus"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Netzwerk und Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilfunknetz"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-Karten</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM-Karte</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-Karte}other{# SIM-Karten}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktiv/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inaktiv/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktiv/Heruntergeladene SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Weitere hinzufügen"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile Daten"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Datenzugriff über Mobilfunknetz"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilfunknetz"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Mobile Daten nutzen"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobile Daten deaktivieren?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Auswahl erforderlich"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"<xliff:g id="CARRIER">%1$s</xliff:g> für mobile Daten nutzen?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Warnlimit für mobile Datennutzung: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Datenlimit: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Warnlimit für mobile Datennutzung: <xliff:g id="ID_1">^1</xliff:g>/Datenlimit: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Noch %d Tage</item>
- <item quantity="one">Noch %d Tag</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Noch # Tag}other{Noch # Tage}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Keine Zeit übrig"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Noch weniger als 1 Tag"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Vor <xliff:g id="ID_2">^2</xliff:g> von <xliff:g id="ID_1">^1</xliff:g> aktualisiert"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Festlegen"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Datenwarnung & Datenlimit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Datennutzungszyklus der App"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobile Datennutzung"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Datenwarnung festlegen"</string>
<string name="data_warning" msgid="116776633806885370">"Datenwarnung"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Datenlimit festlegen"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Die Haupteinheit deines Fahrzeugs deaktiviert mobile Daten, sobald das von dir festgelegte Limit erreicht wurde.\n\nDa die Datennutzung von der Haupteinheit gemessen wird und dein Mobilfunkanbieter sie möglicherweise anders berechnet, solltest du von einem eher etwas niedrigeren Limit ausgehen."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Warnung für Datennutzung festlegen"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Limit für Datennutzung festlegen"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Die Datennutzung wird von deinem Gerät gemessen. Diese Messung kann von derjenigen deines Mobilfunkanbieters abweichen."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Festlegen"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Speichern"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-Netzwerk"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Fahrzeuginternet"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Wenn du das Fahrzeuginternet deaktivierst, funktionieren einige Funktionen oder Apps des Fahrzeugs eventuell nicht mehr.\n\nWichtige, für den Betrieb deines Fahrzeugs erforderliche Daten werden auch weiterhin mit dem Fahrzeughersteller geteilt."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Trotzdem deaktivieren"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Das Fahrzeuginternet ist deaktiviert. Dadurch funktionieren einige Funktionen oder Apps des Fahrzeugs eventuell nicht mehr. Wichtige, für den Betrieb deines Fahrzeugs erforderliche Daten werden auch weiterhin mit dem Fahrzeughersteller geteilt."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s zwischen dem %2$s und dem %3$s verbraucht"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Anderem Netzwerk beitreten"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Netzwerkeinstellungen"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"WLAN hinzufügen"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Verbinden"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Wird verbunden…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nicht verbunden"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Netzwerk außer Reichweite"</string>
<string name="wifi_password" msgid="5565632142720292397">"Passwort"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Passwort anzeigen"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Mindestens ein Band für WLAN-Hotspot wählen:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot und Tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Aus"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Hotspot automatisch deaktivieren"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Der WLAN-Hotspot wird deaktiviert, wenn keine Geräte verbunden sind"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> möchte die WLAN-Funktion aktivieren"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Beenden erzwingen"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Beenden erzwingen?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Das Beenden der App zu erzwingen kann zu unerwünschtem Verhalten führen."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Leistungsschutz deaktivieren?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Wenn du die Funktion deaktivierst, werden deine Software und Hardware möglicherweise ebenfalls nicht mehr funktionieren."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Aktiviert lassen"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Deaktivieren"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"„App-Leistung priorisieren“ aktivieren?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Wenn du diese Einstellung aktivierst, kann dies dazu führen, dass das System instabil wird oder die Hardware auf lange Sicht beeinträchtigt wird. Möchtest du fortfahren?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ja"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nein danke"</string>
<string name="disable_text" msgid="4358165448648990820">"Deaktivieren"</string>
<string name="enable_text" msgid="1794971777861881238">"Aktivieren"</string>
<string name="uninstall_text" msgid="277907956072833012">"Deinstallieren"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Berechtigungen"</string>
<string name="notifications_label" msgid="6586089149665170731">"Benachrichtigungen"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Speicher und Cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Für optimale Leistung sorgen"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"App-Leistung priorisieren"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Keine Berechtigungen gewährt"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Keine Berechtigungen angefordert"</string>
<string name="unused_apps" msgid="648471933781010395">"Nicht verwendete Apps"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> nicht verwendete Apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> nicht verwendete App</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# nicht verwendete App}other{# nicht verwendete Apps}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Berechtigungen löschen/Speicher freigeben"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s in internem Speicher"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Wenn nötig, App schließen, um Ressourcennutzung zu verringern"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Verwendet Systemressourcen, um die App-Leistung zu priorisieren"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Datennutzung"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Datenverbrauch durch Apps"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Nutzungsverlauf"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Alle Apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Daten- und WLAN-Nutzung"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Nutzungsverlauf"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Gesamtnutzung"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Vordergrund"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Hintergrund"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Daten zulassen"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Diese App darf mobile Daten nutzen"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Daten beschränken"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"App darf mobile Daten nur im Vordergrund nutzen"</string>
<string name="computing_size" msgid="5791407621793083965">"Berechnung läuft…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"> zusätzliche Berechtigungen</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> zusätzliche Berechtigung</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# zusätzliche Berechtigung}other{# zusätzliche Berechtigungen}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Hinweis: Nach einem Neustart wird diese App erst gestartet, wenn du dein Fahrzeug entsperrst."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistent & Spracheingabe"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assistent-App"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Die WLAN-Steuerung erlaubt einer App, die WLAN-Funktion zu aktivieren oder zu deaktivieren, nach WLANs zu scannen und eine Verbindung zu ihnen herzustellen, Netzwerke hinzuzufügen oder zu entfernen oder einen lokal beschränkten Hotspot zu starten."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Mehr"</string>
<string name="location_settings_title" msgid="901334356682423679">"Standort"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Standort verwenden"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Angegebenen Apps Standortzugriff erlauben"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Wenn du diese Funktion deaktivierst, wird der Standortzugriff für alle Anwendungen entfernt. Das Fahrassistenzsystem hat auch weiterhin Zugriff."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Standort für Fahrassistenzsystem verwenden"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Fahrzeugstandort ist deaktiviert"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Fahrassistenzsystem-Apps: kein Standortzugriff"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Ändern"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Fahrassistenzsystem Zugriff auf Standort erlauben"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Wenn du das Fahrassistenzsystem ausschaltest, werden die Funktionen des Systems deaktiviert, die Standortinformationen benötigen."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Trotzdem deaktivieren"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Letzte Standortanfragen"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Keine letzten Standortanfragen"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Berechtigungen auf App-Ebene"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Standortdienste"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Standort verwenden"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Der Standortdienst kann Quellen wie GPS, WLANs, Mobilfunknetze und Sensoren nutzen, um den Standort deines Geräts zu ermitteln."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Fahrassistenzsystem"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Standortinformationen, die an Fahrassistenzsystem-Apps gesendet werden, enthalten keine Daten, anhand derer du identifiziert werden kannst. Die Informationen werden vor dem Löschen höchstens 2 Tage lang gespeichert."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Mikrofon verwenden"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Allen Apps den Zugriff auf dein Mikrofon gewähren"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Mikrofonberechtigungen verwalten"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Vor Kurzem zugegriffen"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Keine neuen Apps"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 Apps haben Zugriff"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# von {total_count} Apps hat Zugriff}other{# von {total_count} Apps haben Zugriff}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Vor Kurzem zugegriffen"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Alle ansehen"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Wird geladen…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Systemupdates"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Erweitert"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Lizenzen Dritter"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Beim Laden der Lizenzen ist ein Problem aufgetreten."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Wird geladen…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Nur noch <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> Schritte und du bist Entwickler.</item>
- <item quantity="one">Nur noch <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> Schritt und bist du Entwickler.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Nur noch # Schritt und du bist Entwickler.}other{Nur noch # Schritte und du bist Entwickler.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Du bist jetzt Entwickler!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Okay, du bist bereits Entwickler."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Entwickleroptionen"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Wenn du ein neues Profil hinzufügst, sollte diese Person ihr Profil noch selbst einrichten."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apps können von jedem Profil aus aktualisiert und dann von allen Profilen genutzt werden."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Maximale Profilanzahl erreicht"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Du kannst bis zu <xliff:g id="COUNT">%d</xliff:g> Profile erstellen.</item>
- <item quantity="one">Nur ein Profil kann erstellt werden.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Du kannst maximal ein Profil erstellen.}other{Du kannst bis zu # Profile erstellen.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Profil konnte nicht erstellt werden"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Dieses Profil löschen?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Alle Apps und Daten für dieses Profil werden gelöscht"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profil konnte nicht gelöscht werden."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Das Profil wurde nicht gelöscht. Starte das Gerät neu und versuch es noch einmal."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Dieses Profil wird gelöscht, wenn das Profil gewechselt oder das Fahrzeug wieder gestartet wird."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Schließen"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Noch einmal versuchen"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Zeichnen eines Entsperrungsmusters"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Fehler beim Speichern des Musters"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Zu viele fehlerhafte Versuche. Bitte versuch es in <xliff:g id="NUMBER">%d</xliff:g> Sekunden noch einmal."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Dreheingabe nicht möglich, Touch nutzen"</string>
<string name="okay" msgid="4589873324439764349">"Ok"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Displaysperre entfernen?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Dadurch können andere auf dein Konto zugreifen"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Dein IT-Administrator hat die Verwendung allzu häufiger PINs blockiert. Versuch es mit einer anderen PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Ungültige Zeichen sind nicht zulässig."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Ungültiges Passwort – muss mindestens 4 Zeichen haben."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Passwort muss mindestens <xliff:g id="COUNT">%d</xliff:g> Buchstaben enthalten</item>
- <item quantity="one">Passwort muss mindestens einen Buchstaben enthalten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Passwort muss mindestens <xliff:g id="COUNT">%d</xliff:g> Kleinbuchstaben enthalten</item>
- <item quantity="one">Passwort muss mindestens einen Kleinbuchstaben enthalten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Passwort muss mindestens <xliff:g id="COUNT">%d</xliff:g> Großbuchstaben enthalten</item>
- <item quantity="one">Passwort muss mindestens einen Großbuchstaben enthalten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Passwort muss mindestens <xliff:g id="COUNT">%d</xliff:g> Ziffern enthalten</item>
- <item quantity="one">Passwort muss mindestens eine Ziffer enthalten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Passwort muss mindestens <xliff:g id="COUNT">%d</xliff:g> Sonderzeichen enthalten</item>
- <item quantity="one">Passwort muss mindestens ein Sonderzeichen enthalten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Passwort muss mindestens <xliff:g id="COUNT">%d</xliff:g> Zeichen enthalten, die keine Buchstaben sind</item>
- <item quantity="one">Passwort muss mindestens ein Zeichen enthalten, das kein Buchstabe ist</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Der Geräteadministrator hat festgelegt, dass bereits verwendete Passwörter nicht noch einmal verwendet werden dürfen"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Fehler beim Speichern des Passworts"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Dein IT-Administrator hat die Verwendung allzu häufiger Passwörter blockiert. Versuch es mit einem anderen Passwort."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Profil hinzufügen"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Profil löschen"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Profil hinzufügen"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Helligkeit des Displays"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Aktiviere Bluetooth, um deine Geräte anzuzeigen"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Öffne die Bluetooth-Einstellungen, um ein Gerät zu koppeln"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrator des Infotainmentsystems"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivierte Apps"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktivierte Apps"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apps mit dieser Berechtigung dürfen auf die Daten dieses Fahrzeugs zugreifen"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Keine Admin-Apps für das Fahrzeug"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Diese App zur Verwaltung des Infotainmentsystems ist aktiv und lässt zu, dass die App „<xliff:g id="APP_NAME">%1$s</xliff:g>“ Folgendes tun kann:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Wenn diese App zur Verwaltung des Infotainmentsystems aktiviert wird, kann die App „<xliff:g id="APP_NAME">%1$s</xliff:g>“ Folgendes tun:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Diese Infotainmentsystem-App aktivieren?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Diese Infotainmentsystem-App aktivieren"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktivieren und deinstallieren"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Diese Infotainmentsystem-App deaktivieren"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Weitere Informationen"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Der Manager der Organisation kann die mit diesem Profil verknüpften Apps und Daten überwachen und verwalten, einschließlich der Einstellungen, Berechtigungen, Zugriffe auf Unternehmensinhalte, Netzwerkaktivitäten und Standortdaten des Fahrzeugs."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Der Manager der Organisation kann die mit diesem Profil verknüpften Apps und Daten überwachen und verwalten, einschließlich der Einstellungen, Berechtigungen, Zugriffe auf Unternehmensinhalte, Netzwerkaktivitäten und Standortdaten des Geräts."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Der Manager der Organisation kann die mit diesem Infotainmentsystem verknüpften Apps und Daten überwachen und verwalten, einschließlich der Einstellungen, Berechtigungen, Zugriffe auf Unternehmensinhalte, Netzwerkaktivitäten und Standortdaten des Fahrzeugs."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Möglicherweise kann der Manager der Organisation auf Daten zugreifen, die mit diesem Infotainmentsystem verknüpft sind, Apps verwalten und die Fahrzeugeinstellungen ändern."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Nicht verfügbar"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Die Lautstärke kann in diesem verwalteten Fahrzeug nicht geändert werden"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Anrufe sind in diesem verwalteten Fahrzeug nicht möglich"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS sind in diesem verwalteten Fahrzeug nicht zulässig"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Die Kamera ist in diesem verwalteten Fahrzeug nicht verfügbar"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"In diesem verwalteten Fahrzeug können keine Screenshots erstellt werden"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Diese App kann in diesem verwalteten Fahrzeug nicht geöffnet werden"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Von deinem Kreditinstitut blockiert"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Der Zugriff auf manche Funktionen wird durch die Organisation eingeschränkt.\n\nWende dich bei Fragen an den Manager der Organisation."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Apps für die Verwaltung von Fahrzeugen"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivierte App}other{# aktivierte Apps}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Keine aktivierten Apps"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Fahrzeugrichtlinien von <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Einstellungen, die vom Manager der Organisation verwaltet werden"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Weitere Informationen zu <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Fehlerbericht teilen?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Der Manager der Organisation für dieses Fahrzeug hat einen Fehlerbericht zur Fehlerbehebung für dieses Gerät angefordert. Apps und Daten werden unter Umständen geteilt."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Der Manager der Organisation für dieses Fahrzeug hat einen Fehlerbericht zur Fehlerbehebung für dieses Gerät angefordert. Apps und Daten werden unter Umständen geteilt und dein Gerät wird möglicherweise vorübergehend langsamer."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Dieser Fehlerbericht wird mit dem Manager der Organisation für dieses Fahrzeug geteilt. Wende dich an ihn, wenn du nähere Informationen wünschst."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Teilen"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Ablehnen"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Diese Einstellung kann momentan nicht geändert werden"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Bedienungshilfen"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Untertitel"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Untertitel-Einstellungen"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Aus"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"An"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Screenreader"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Untertitel anzeigen"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Textgröße"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Untertitelgröße und -stil"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Sehr klein"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Klein"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Standard"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Groß"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Sehr groß"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Untertitelstil"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Von App festgelegt"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Weiß auf Schwarz"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Schwarz auf Weiß"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Gelb auf Schwarz"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Gelb auf Blau"</string>
</resources>
diff --git a/res/values-el/arrays.xml b/res/values-el/arrays.xml
index 5dd28e0..7d3a33d 100644
--- a/res/values-el/arrays.xml
+++ b/res/values-el/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Να μην επιτρέπεται ποτέ"</item>
<item msgid="1154273129608299386">"Να επιτρέπεται πάντα"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 6dea5ee..5168330 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Νυχτερινή λειτουργία"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Δίκτυο και διαδίκτυο"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Δίκτυο κινητής τηλεφωνίας"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Ενεργή/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Ανενεργή/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Ενεργή/Ληφθείσα SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Προσθήκη περισσότερων"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Δεδομένα κινητής τηλεφωνίας"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Πρόσβαση σε δεδομένα μέσω δικτύου κινητής τηλεφ."</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Δίκτυο κινητής τηλεφωνίας"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Να χρησιμοποιούνται δεδομένα κινητής τηλεφωνίας"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Απενεργοποίηση δεδομένων κινητής τηλεφωνίας;"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Απαιτείται επιλογή"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Χρήση <xliff:g id="CARRIER">%1$s</xliff:g> για δεδoμένα κιν. τηλ.;"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Προειδοποίηση <xliff:g id="ID_1">^1</xliff:g> δεδομένων"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Όριο <xliff:g id="ID_1">^1</xliff:g> δεδομένων"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Προειδοποίηση <xliff:g id="ID_1">^1</xliff:g> δεδομένων / Όριο <xliff:g id="ID_2">^2</xliff:g> δεδομένων"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Απομένουν %d ημέρες</item>
- <item quantity="one">Απομένει %d ημέρα</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Απομένει # ημέρα.}other{Απομένουν # ημέρες.}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Δεν απομένει χρόνος"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Απομένει λιγότερο από 1 ημέρα"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Ενημερώθηκε από <xliff:g id="ID_1">^1</xliff:g> πριν από <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Ορισμός"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Προειδοποίηση και όριο δεδομένων"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Κύκλος χρήσης δεδομένων εφαρμογής"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Χρήση δεδομένων κινητής τηλεφωνίας"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Ορισμός προειδοπ. δεδομένων"</string>
<string name="data_warning" msgid="116776633806885370">"Προειδοποίηση δεδομένων"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Ορισμός ορίου δεδομένων"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Η κεντρική μονάδα του οχήματός σας θα απενεργοποιήσει τα δεδομένα κινητής τηλεφωνίας μόλις συμπληρωθεί το καθορισμένο όριο.\n\nΕπειδή η χρήση δεδομένων μετράται από την κεντρική μονάδα σας και ενδέχεται η εταιρεία κινητής τηλεφωνίας να την υπολογίζει με διαφορετικό τρόπο, σκεφτείτε το ενδεχόμενο να ορίσετε ένα συντηρητικό όριο."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Ορισμός προειδοποίησης χρήσης δεδομένων"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Ορισμός ορίου χρήσης δεδομένων"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Η χρήση δεδομένων καταμετράται από τη συσκευή σας. Ενδέχεται να διαφέρει από τα δεδομένα της εταιρείας κινητής τηλεφωνίας σας."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Ορισμός"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Αποθήκευση"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Δίκτυο OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Σύνδεση οχήματος στο διαδίκτυο"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Η απενεργ. της σύνδεσης διαδικτ. του οχήματος μπορεί να αποτρέψει τη λειτουργία κάποιων δυνατοτήτων ή εφαρμ. του.\n\nΣημαντικά δεδομένα που απαιτούνται για τη λειτουργία του οχήματος θα συνεχίσουν να κοινοποιούνται στον κατασκευαστή του."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Να απενεργοποιηθεί ούτως ή άλλως"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Η σύνδεση διαδικτύου του οχήματος είναι απενεργοποιημένη. Αυτό μπορεί να αποτρέψει τη λειτουργία ορισμένων δυνατοτήτων ή εφαρμογών. Σημαντικά δεδομένα που απαιτούνται για τη λειτουργία του οχήματος θα συνεχίσουν να κοινοποιούνται στον κατασκευαστή του."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s χρησιμοποιήθηκαν %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Σύνδεση σε άλλο δίκτυο"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Προτιμήσεις δικτύου"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Προσθήκη δικτύου"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Σύνδεση"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Σύνδεση…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Δεν συνδέθηκε"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Το δίκτυο δεν βρίσκεται εντός εμβέλειας"</string>
<string name="wifi_password" msgid="5565632142720292397">"Κωδικός πρόσβασης"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Εμφάνιση κωδικού πρόσβασης"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Επιλέξτε τουλ. ένα εύρος για το ΣΠ Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Σημείο πρόσβασης Wi-Fi και σύνδεση"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Σημείο πρόσβασης Wi-Fi"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Ανενεργό"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Αυτόματη απενεργοποίηση σημείου πρόσβασης Wi-Fi"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Το σημείο πρόσβασης Wi‑Fi θα απενεργοποιηθεί εάν δεν υπάρχουν συνδεδεμένες συσκευές"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"Η εφαρμογή <xliff:g id="REQUESTER">%s</xliff:g> θέλει να ενεργοποιήσει το Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Αναγκαστική διακοπή"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Αναγκαστική διακοπή;"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Εάν επιβάλετε τη διακοπή μιας εφαρμογής, ενδέχεται να μην λειτουργήσει σωστά."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Απενεργοποίηση προστασίας απόδοσης;"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Εάν το κάνετε αυτό, το λογισμικό και ο εξοπλισμός σας μπορεί να μην λειτουργούν σωστά."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Διατήρηση ενεργοποίησης"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Απενεργοποίηση"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Ενεργοποίηση προτεραιότητας απόδοσης εφαρμογών;"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Η ενεργοποίηση της ρύθμισης μπορεί να προκαλέσει πιθανή αστάθεια συστήματος ή να έχει μακροπρόθεσμο αντίκτυπο στον εξοπλισμό. Θέλετε να συνεχίσετε;"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ναι"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Όχι, ευχαριστώ"</string>
<string name="disable_text" msgid="4358165448648990820">"Απενεργοποίηση"</string>
<string name="enable_text" msgid="1794971777861881238">"Ενεργοποίηση"</string>
<string name="uninstall_text" msgid="277907956072833012">"Απεγκατάσταση"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Δικαιώματα"</string>
<string name="notifications_label" msgid="6586089149665170731">"Ειδοποιήσεις"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Αποθηκευτικός χώρος και κρυφή μνήμη"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Διασφ. μέγ. απόδοσης"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Προτεραιότητα απόδοσης εφαρμογών"</string>
<string name="application_version_label" msgid="8556889839783311649">"Έκδοση: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Δεν έχουν εκχωρηθεί δικαιώματα"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Δεν ζητήθηκαν δικαιώματα"</string>
<string name="unused_apps" msgid="648471933781010395">"Εφαρμογές που δεν χρησιμοποιούνται"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> εφαρμογές που δεν χρησιμοποιούνται</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> εφαρμογή που δεν χρησιμοποιείται</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# εφαρμογή που δεν χρησιμοποιείται}other{# εφαρμογές που δεν χρησιμοποιούνται}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Κατάργηση αδειών και απελευθέρωση χώρου"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s εσωτερικού αποθηκευτικού χώρου"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Αν είναι απαραίτ., κλείστε την εφαρμ. για μη υπερβ. χρήση πόρων"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Χρησιμοποιεί τους πόρους του συστήματος δίνοντας προτεραιότητα στην απόδοση των εφαρμογών."</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Χρήση δεδομένων"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Χρήση δεδομένων εφαρμογών"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Ιστορικό χρήσης"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Όλες οι εφαρμογές"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Χρήση δεδομένων και Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Ιστορικό χρήσης"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Συνολική χρήση"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Προσκήνιο"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Παρασκήνιο"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Να επιτρέπονται τα δεδομ."</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Να επιτρέπεται στην εφαρμ. η χρήση δεδ. κιν. τηλ."</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Περιορισμός δεδομένων"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Δεδ. κιν. τηλ. μόνο με την εφαρμ. στο προσκήνιο"</string>
<string name="computing_size" msgid="5791407621793083965">"Υπολογισμός…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> επιπλέον δικαιώματα</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> επιπλέον δικαίωμα</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# επιπλέον άδεια}other{# επιπλέον άδειες}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Σημείωση: Μετά από μια επανεκκίνηση, δεν είναι δυνατή η έναρξη αυτής της εφαρμογής προτού ξεκλειδώσετε το όχημά σας"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Βοήθεια και φωνητικές εντολές"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Εφαρμογή υποβοήθειας"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Ο έλεγχος Wi-Fi επιτρέπει σε μια εφαρμογή να ενεργοποιεί ή να απενεργοποιεί το Wi-Fi, να κάνει σάρωση για δίκτυα Wi-Fi και να συνδέεται σε αυτά, να προσθέτει ή να καταργεί δίκτυα ή να ξεκινά τοπικά σημεία πρόσβασης Wi-Fi."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Περισσότερα"</string>
<string name="location_settings_title" msgid="901334356682423679">"Τοποθεσία"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Χρήση τοποθεσίας"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Να επιτρέπεται στις εφαρμογές που καθορίζετε η πρόσβαση στην τοποθεσία σας."</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Αν απενεργοποιήσετε αυτήν τη επιλογή, θα καταργηθεί η πρόσβαση στην τοποθεσία για όλες τις εφαρμογές. Οι εφαρμογές υποβοήθησης οδηγού θα εξακολουθήσουν να έχουν πρόσβαση."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Χρήση τοποθεσίας για υποβοήθηση οδηγού"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Η τοποθεσία οχήματος είναι ανενεργή"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Η υποβ. οδηγού δεν έχει πρόσβ. στην τοπ."</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Αλλαγή"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Να επιτρέπεται στις εφαρμογές υποβοήθησης οδήγησης η πρόσβαση στην τοποθεσία σας."</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Αν απενεργοποιήσετε αυτήν τη επιλογή, οι εφαρμογές υποβοήθησης οδηγού που βασίζονται στις πληροφορίες τοποθεσίας θα απενεργοποιηθούν."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Απενεργοποίηση ούτως ή άλλως"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Πρόσφατα αιτήματα τοποθεσίας"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Δεν υπάρχουν πρόσφατα αιτήματα τοποθεσίας"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Άδειες επιπέδου εφαρμογής"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Υπηρεσίες τοποθεσίας"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Χρήση τοποθεσίας"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Η τοποθεσία μπορεί να χρησιμοποιεί πηγές όπως GPS, Wi-Fi, δίκτυα κινητής τηλεφωνίας και αισθητήρες για την εκτίμηση της τοποθεσίας της συσκευής σας."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Υποβοήθηση οδηγού"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Οι πληροφορίες τοποθεσίας που αποστέλλονται στις εφαρμογές υποβοήθησης οδηγού δεν περιέχουν πληροφορίες που προσδιορίζουν την ταυτότητά σας. Παραμένουν αποθηκευμένες έως δύο ημέρες προτού διαγραφούν."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Μικρόφωνο"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Χρήση μικροφώνου"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Επιτρέψτε σε όλες τις εφαρμογές να έχουν πρόσβαση στο μικρόφωνο"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Διαχείριση αδειών μικροφώνου"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Πρόσφατη πρόσβαση"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Καμία πρόσφατη εφαρμογή"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Πρόσβαση έχουν 0 εφαρμογές"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Πρόσβαση έχει # από {total_count} εφαρμογές.}other{Πρόσβαση έχουν # από {total_count} εφαρμογές.}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Πρόσφατη πρόσβαση"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Προβολή όλων"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Φόρτωση…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Σύστημα"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Ενημερώσεις συστήματος"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Σύνθετες"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Άδειες τρίτου μέρους"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Παρουσιάστηκε κάποιο πρόβλημα κατά τη φόρτωση των αδειών."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Φόρτωση…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Απομένουν <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> βήματα για να γίνετε προγραμματιστής.</item>
- <item quantity="one">Απομένει <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> βήμα για να γίνετε προγραμματιστής.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Απομένει # βήμα για να γίνετε προγραμματιστής.}other{Απομένουν # βήματα για να γίνετε προγραμματιστής.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Είστε πλέον προγραμματιστής!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Δεν χρειάζεται, είστε ήδη προγραμματιστής."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Επιλογές για προγραμματιστές"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Μετά τη δημιουργία νέου προφίλ, ο κάτοχος του προφίλ πρέπει να το προσαρμόσει βάσει των αναγκών του."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Οι εφαρμογές μπορούν να ενημερωθούν από οποιοδήποτε προφίλ, για χρήση από όλα τα άλλα προφίλ."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Συμπληρώθηκε το όριο προφίλ"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Μπορείτε να δημιουργήσετε έως <xliff:g id="COUNT">%d</xliff:g> προφίλ.</item>
- <item quantity="one">Μπορείτε να δημιουργήσετε μόνο ένα προφίλ.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Είναι δυνατή η δημιουργία μόνο ενός προφίλ.}other{Μπορείτε να δημιουργήσετε έως # προφίλ.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Δεν ήταν δυνατή η δημιουργία νέου προφίλ"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Διαγραφή αυτού του προφίλ;"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Θα διαγραφούν όλες οι εφαρμογές και τα δεδομένα αυτού του προφίλ"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Δεν ήταν δυνατή η διαγραφή του προφίλ."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Το προφίλ δεν διαγράφηκε. Επανεκκινήστε τη συσκευή και δοκιμάστε ξανά."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Αυτό το προφίλ θα διαγραφεί μόλις αλλάξετε προφίλ ή όταν βάλετε ξανά σε λειτουργία το όχημα."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Παράβλεψη"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Επανάληψη"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Τρόπος σχεδίασης μοτίβου ξεκλειδώματος"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Σφάλμα κατά την αποθήκευση του μοτίβου"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Πάρα πολλές αποτυχημένες προσπάθειες. Δοκιμάστε ξανά σε <xliff:g id="NUMBER">%d</xliff:g> δευτερόλεπτα."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Το μοτίβο δεν υποστ. περιστρ. Χρησ. αφή"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Κατάργηση κλειδώματος οθόνης;"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Έτσι όλοι οι χρήστες θα έχουν πρόσβαση στον λογαριασμό σας"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Τα συνηθισμένα PIN αποκλείονται από τον διαχειριστή IT. Δοκιμάστε να χρησιμοποιήσετε διαφορετικό PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Δεν μπορεί να περιλαμβάνει μη έγκυρο χαρακτήρα."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Μη έγκυρος κωδικός πρόσβασης. Πρέπει να αποτελείται από τουλάχιστον 4 χαρακτήρες."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Πρέπει να περιέχει τουλάχιστον <xliff:g id="COUNT">%d</xliff:g> γράμματα</item>
- <item quantity="one">Πρέπει να περιέχει τουλάχιστον 1 γράμμα</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Πρέπει να περιέχει τουλάχιστον <xliff:g id="COUNT">%d</xliff:g> πεζά γράμματα</item>
- <item quantity="one">Πρέπει να περιέχει τουλάχιστον 1 πεζό γράμμα</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Πρέπει να περιέχει τουλάχιστον <xliff:g id="COUNT">%d</xliff:g> κεφαλαία γράμματα</item>
- <item quantity="one">Πρέπει να περιέχει τουλάχιστον 1 κεφαλαίο γράμμα</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Πρέπει να περιέχει τουλάχιστον <xliff:g id="COUNT">%d</xliff:g> αριθμητικά ψηφία</item>
- <item quantity="one">Πρέπει να περιέχει τουλάχιστον 1 αριθμητικό ψηφίο</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Πρέπει να περιέχει τουλάχιστον <xliff:g id="COUNT">%d</xliff:g> ειδικά σύμβολα</item>
- <item quantity="one">Πρέπει να περιέχει τουλάχιστον 1 ειδικό σύμβολο</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Πρέπει να περιέχει τουλάχιστον <xliff:g id="COUNT">%d</xliff:g> χαρακτήρες που δεν είναι γράμματα</item>
- <item quantity="one">Πρέπει να περιέχει τουλάχιστον 1 χαρακτήρα που δεν είναι γράμμα</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Ο διαχειριστής της συσκευής δεν επιτρέπει τη χρήση πρόσφατου κωδικού πρόσβασης"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Σφάλμα κατά την αποθ. του κωδ. πρόσβασης"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Οι συνηθισμένοι κωδικοί πρόσβασης αποκλείονται από τον διαχειριστή IT. Δοκιμάστε να χρησιμοποιήσετε διαφορετικό κωδικό πρόσβασης."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Προσθέστε ένα προφίλ"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Διαγραφή αυτού του προφίλ"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Προσθήκη προφίλ"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Φωτεινότητα οθόνης"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Για εμφάνιση των συσκευών σας, ενεργοποιήστε το Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Για σύζευξη μιας συσκευής, ανοίξτε τις ρυθμίσεις του Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Διαχειριστής συστήματος ενημέρωσης και ψυχαγωγίας"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Ενεργοποιημένες εφαρμογές"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Απενεργοποιημένες εφαρμογές"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Οι εφαρμογές με αυτήν την άδεια έχουν πρόσβαση στα δεδομένα αυτού του οχήματος"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Δεν υπάρχουν εφαρμογές διαχείρισης οχημάτων"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Αυτή η εφαρμογή διαχείρισης συστήματος ενημέρωσης και ψυχαγωγίας είναι ενεργοποιημένη και επιτρέπει στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να εκτελεί τις παρακάτω ενέργειες:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Η ενεργοποίηση της εφαρμογής συστήματος ενημέρωσης και ψυχαγωγίας θα επιτρέψει στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να εκτελεί τις παρακάτω λειτουργίες:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Ενεργ. εφαρμ. συστ. ενημέρ. και ψυχαγ.;"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Ενεργοποίηση αυτής της εφαρμογής συστήματος ενημέρωσης και ψυχαγωγίας"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Απενεργοποίηση και απεγκατάσταση"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Απενεργοποιήστε αυτήν την εφαρμογή συστήματος ενημέρωσης και ψυχαγωγίας"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Περισσότερες λεπτομέρειες"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Ο διαχειριστής οργανισμού μπορεί να παρακολουθεί και να διαχειρίζεται εφαρμογές και δεδομένα που σχετίζονται με αυτό το προφίλ, συμπεριλαμβανομένων των ρυθμίσεων, των αδειών, της εταιρικής πρόσβασης, της δραστηριότητας δικτύου και των πληροφοριών τοποθεσίας του οχήματος."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Ο διαχειριστής οργανισμού μπορεί να παρακολουθεί και να διαχειρίζεται εφαρμογές και δεδομένα που συσχετίζονται με αυτό το προφίλ, συμπεριλαμβανομένων των ρυθμίσεων, των αδειών, της εταιρικής πρόσβασης, της δραστηριότητας δικτύου και των πληροφοριών τοποθεσίας της συσκευής."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Ο διαχειριστής οργανισμού μπορεί να παρακολουθεί και να διαχειρίζεται εφαρμογές και δεδομένα που σχετίζονται με αυτό το σύστημα ενημέρωσης και ψυχαγωγίας, συμπεριλαμβανομένων των ρυθμίσεων, των αδειών, της εταιρικής πρόσβασης, της δραστηριότητας δικτύου και των πληροφοριών τοποθεσίας του οχήματος."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Ο διαχειριστής οργανισμού μπορεί να έχει πρόσβαση σε δεδομένα που σχετίζονται με αυτό το σύστημα ενημέρωσης και ψυχαγωγίας, να διαχειρίζεται εφαρμογές και να αλλάζει τις ρυθμίσεις αυτού του οχήματος."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Μη διαθέσιμη"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Δεν είναι δυνατή η αλλαγή της έντασης του ήχου σε αυτό το διαχειριζόμενο όχημα"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Δεν είναι δυνατή η πραγματοποίηση κλήσεων σε αυτό το διαχειριζόμενο όχημα"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Δεν επιτρέπονται τα SMS σε αυτό το διαχειριζόμενο όχημα"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Η κάμερα δεν είναι διαθέσιμη σε αυτό το διαχειριζόμενο όχημα"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Δεν είναι δυνατή η λήψη στιγμιότυπων οθόνης σε αυτό το διαχειριζόμενο όχημα"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Δεν είναι δυνατό το άνοιγμα της εφαρμογής σε αυτό το διαχειριζόμενο όχημα"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Αποκλείστηκε από τον πωλητή συσκευών με πίστωση"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Η πρόσβαση σε ορισμένες λειτουργίες περιορίζεται από τον οργανισμό.\n\nΕάν έχετε ερωτήσεις, επικοινωνήστε με τον διαχειριστή του οργανισμού."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Εφαρμογές διαχείρισης οχημάτων"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# ενεργοποιημένη εφαρμογή}other{# ενεργοποιημένες εφαρμογές}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Δεν υπάρχουν ενεργοποιημένες εφαρμογές."</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Πολιτική οχημάτων του οργανισμού <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Η διαχείριση των ρυθμίσεων πραγματοποιείται από τον διαχειριστή οργανισμού"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Μάθετε περισσότερα για την υπηρεσία <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Να κοινοποιηθεί η αναφορά σφάλματος;"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Ο διαχειριστής οργανισμού του οχήματος ζήτησε μια αναφορά σφάλματος για να συμβάλει στην αντιμετώπιση του προβλήματος αυτής της συσκευής. Ενδέχεται να κοινοποιηθούν οι εφαρμογές και τα δεδομένα."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Ο διαχειριστής οργανισμού του οχήματος ζήτησε μια αναφορά σφάλματος για να συμβάλει στην αντιμετώπιση του προβλήματος αυτής της συσκευής. Ενδέχεται να κοινοποιηθούν οι εφαρμογές και τα δεδομένα και να επιβραδυνθεί προσωρινά η λειτουργία της συσκευής σας."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Αυτή η αναφορά σφάλματος κοινοποιήθηκε στον διαχειριστή οργανισμού αυτού του οχήματος. Επικοινωνήστε μαζί του για περισσότερες λεπτομέρειες."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Κοινοποίηση"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Απόρριψη"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Δεν είναι δυνατή η αλλαγή της ρύθμισης αυτήν τη στιγμή"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Προσβασιμότητα"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Υπότιτλοι"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Προτιμήσεις υποτίτλων"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Ανενεργό"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Ενεργό"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Αναγνώστης οθόνης"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Εμφάνιση υποτίτλων"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Μέγεθος κειμένου"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Μέγεθος και στιλ υποτίτλων"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Πολύ μικρό"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Μικρό"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Προεπιλογή"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Μεγάλο"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Πολύ μεγάλο"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Στιλ υποτίτλων"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Ορισμός κατά εφαρμογή"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Λευκό σε μαύρο"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Μαύρο σε λευκό"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Κίτρινο σε μαύρο"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Κίτρινο σε μπλε"</string>
</resources>
diff --git a/res/values-en-rAU/arrays.xml b/res/values-en-rAU/arrays.xml
index 6768dfa..b73994c 100644
--- a/res/values-en-rAU/arrays.xml
+++ b/res/values-en-rAU/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Never allow"</item>
<item msgid="1154273129608299386">"Always allow"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 1f17b04..b28e606 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Network and internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIMs}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Active/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactive/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Active/Downloaded SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Add more"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Access data using mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Use mobile data"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Turn off mobile data?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Selection required"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Use <xliff:g id="CARRIER">%1$s</xliff:g> for mobile data?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> data warning"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> data limit"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> data warning/<xliff:g id="ID_2">^2</xliff:g> data limit"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d days left</item>
- <item quantity="one">%d day left</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# day left}other{# days left}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"No time remaining"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Less than one day left"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Updated by <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ago"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Set"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Data warning and limit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"App data usage cycle"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobile data usage"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Set data warning"</string>
<string name="data_warning" msgid="116776633806885370">"Data warning"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Set data limit"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Your vehicle’s head unit will turn off mobile data once it reaches the limit that you set.\n\nSince data usage is measured by the head unit, and your operator may account for usage differently, consider setting a conservative limit."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Set data usage warning"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Set data usage limit"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Data usage is measured by your device. It may vary from your mobile operator’s data."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Set"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Save"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM network"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Vehicle Internet"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Turning off the vehicle Internet may prevent some vehicle features or apps from working.\n\nCritical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Turn off anyway"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Vehicle Internet is turned off. This may prevent some vehicle features or apps from working. Critical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s used %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Join other network"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Network preferences"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Add network"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Connecting…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Not connected"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Network not in range"</string>
<string name="wifi_password" msgid="5565632142720292397">"Password"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Show password"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Choose at least one band for Wi‑Fi hotspot:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot and tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Off"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Turn off hotspot automatically"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi hotspot will turn off if no devices are connected"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> wants to turn on Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Force stop?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"If you force-stop an app, it may misbehave."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Turn off performance protection?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"If you do, your software and hardware may not work as well."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Leave on"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Turn off"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Turn on prioritise app performance?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Turning it on can cause potential system instability or long-term hardware impact. Do you want to continue?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Yes"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"No thanks"</string>
<string name="disable_text" msgid="4358165448648990820">"Disable"</string>
<string name="enable_text" msgid="1794971777861881238">"Enable"</string>
<string name="uninstall_text" msgid="277907956072833012">"Uninstall"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permission"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifications"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Storage and cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Ensure peak performance"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritise app performance"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No permissions granted"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No permissions requested"</string>
<string name="unused_apps" msgid="648471933781010395">"Unused apps"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> unused apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> unused app</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# unused app}other{# unused apps}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Remove permissions and free up space"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s in internal storage"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"When necessary, close app to avoid excessive use of resources"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Uses system resources to prioritise app performance"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Data usage"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"App data usage"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Usage history"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"All apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data & Wi‑Fi usage"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Usage history"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Total usage"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Foreground"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Background"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Allow data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Let this app use mobile data"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restrict data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Use mobile data only when app is in the foreground"</string>
<string name="computing_size" msgid="5791407621793083965">"Computing…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> additional permission</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# additional permission}other{# additional permissions}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Note: After a reboot, this app can\'t start until you unlock your vehicle."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist & voice input"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi control allows an app to turn Wi-Fi on or off, scan and connect to Wi-Fi networks add or remove networks, or start a local-only hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"More"</string>
<string name="location_settings_title" msgid="901334356682423679">"Location"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Use location"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Allow apps that you specify to access your location"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"If you turn this off, it will remove location access for all apps. Driver assistance apps will still have access."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Use location for driver assistance"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Vehicle location is off"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Driver assistance apps cannot access your location"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Change"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Allow apps that help with driving to access your location"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"If you turn this off, driver assistance apps that rely on location information will be disabled."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Turn off anyway"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recent location requests"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No recent location requests"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"App-level permissions"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Location Services"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Use location"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Location may use sources like GPS, Wi‑Fi, mobile networks and sensors to help estimate your device’s location."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Driver assistance"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Location information sent to driver assistance apps doesn’t contain information that identifies you. It’s stored for a maximum of two days before being deleted."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microphone"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Use microphone"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Allow all apps to access your microphone"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Manage microphone permissions"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Recently accessed"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"No recent apps"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apps have access"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# of {total_count} apps has access}other{# of {total_count} apps have access}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Recently accessed"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"View all"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Loading…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Advanced"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Loading…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
- <item quantity="one">You are now <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> step away from being a developer.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{You are now # step away from being a developer.}other{You are now # steps away from being a developer.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"You are now a developer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"No need, you are already a developer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Developer options"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"After you create a new profile, that person should customise it for themselves."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apps can be updated from any profile for use by all other profiles."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profile limit reached"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">You can create up to <xliff:g id="COUNT">%d</xliff:g> profiles.</item>
- <item quantity="one">Only one profile can be created.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Only one profile can be created.}other{You can create up to # profiles.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Couldn\'t create new profile"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Delete this profile?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"All apps and data for this profile will be deleted"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Couldn\'t delete profile."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profile wasn\'t deleted. You can restart device and try again."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"This profile will be deleted when you switch profiles or restart the vehicle."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Dismiss"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Retry"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"How to draw an unlock pattern"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Error saving pattern"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Too many incorrect attempts. Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Pattern does not support rotary; please use touch"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Remove screen lock?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"This will allow anyone to access your account"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Common PINs are blocked by your IT admin. Try a different PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"This can\'t include an invalid character."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Password invalid. Must be at least four characters."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
- <item quantity="one">Must contain at least one letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
- <item quantity="one">Must contain at least one lowercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
- <item quantity="one">Must contain at least 1 uppercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
- <item quantity="one">Must contain at least 1 numerical digit</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
- <item quantity="one">Must contain at least 1 special symbol</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
- <item quantity="one">Must contain at least 1 non-letter character</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Device admin doesn\'t allow using a recent password"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Error saving password"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Common passwords are blocked by your IT admin. Try a different password."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Add a profile"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Delete this profile"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Add profile"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Display brightness"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"To see your devices, turn on Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"To pair a device, open Bluetooth settings"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Infotainment system admin"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Activated apps"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deactivated apps"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apps with this permission have access to this vehicle\'s data"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"No vehicle admin apps"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"This infotainment system admin app is active and allows the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Activating this infotainment system app will allow the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Activate this infotainment system app?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activate this infotainment system app"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deactivate & uninstall"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deactivate this infotainment system app"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"More details"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"The organisation manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity and the vehicle\'s location information."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"The organisation manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity and the device\'s location information."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"The organisation manager can monitor and manage apps and data associated with this infotainment system, including settings, permissions, corporate access, network activity and the vehicle\'s location information."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"The organisation manager may be able to access data associated with this infotainment system, manage apps and change this vehicle\'s settings."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"That’s unavailable"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Can’t change volume in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Can’t make calls in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS not allowed in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Camera is unavailable in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Can’t take screenshots in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Can’t open this app in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blocked by your credit provider"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Access to some features is limited by the organisation.\n\nIf you have questions, contact the organisation manager."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Vehicle admin apps"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# activated app}other{# activated apps}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"No activated apps"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> vehicle policy"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Settings managed by the organisation manager"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Learn more about <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Share bug report?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"This vehicle\'s organisation manager requested a bug report to help troubleshoot this device. Apps and data may be shared."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"This vehicle\'s organisation manager requested a bug report to help troubleshoot this device. Apps and data may be shared, and your device may temporarily slow down."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"This bug report is being shared with this vehicle\'s organisation manager. Contact them for more details."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Share"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Decline"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"This setting can\'t be changed at the moment"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibility"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Captions"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Caption preferences"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Off"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"On"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Screen reader"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Show captions"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Text size"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Caption size and style"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Very small"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Small"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Default"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Large"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Very large"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Caption style"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Set by app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"White on black"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Black on white"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Yellow on black"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Yellow on blue"</string>
</resources>
diff --git a/res/values-en-rCA/arrays.xml b/res/values-en-rCA/arrays.xml
index 6768dfa..b73994c 100644
--- a/res/values-en-rCA/arrays.xml
+++ b/res/values-en-rCA/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Never allow"</item>
<item msgid="1154273129608299386">"Always allow"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 78aec6e..385d824 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Network and Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIMs}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Active/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactive/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Active/Downloaded SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Add more"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Access data using mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Use mobile data"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Turn off mobile data?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Selection required"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Use <xliff:g id="CARRIER">%1$s</xliff:g> for mobile data?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> data warning"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> data limit"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> data warning/<xliff:g id="ID_2">^2</xliff:g> data limit"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d days left</item>
- <item quantity="one">%d day left</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# day left}other{# days left}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"No time remaining"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Less than one day left"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Updated by <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ago"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Set"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Data warning and limit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"App data usage cycle"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobile data usage"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Set data warning"</string>
<string name="data_warning" msgid="116776633806885370">"Data warning"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Set data limit"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Your vehicle’s head unit will turn off mobile data once it reaches the limit that you set.\n\nSince data usage is measured by the head unit, and your operator may account for usage differently, consider setting a conservative limit."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Set data usage warning"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Set data usage limit"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Data usage is measured by your device. It may vary from your mobile operator’s data."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Set"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Save"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM network"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Vehicle Internet"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Turning off the vehicle Internet may prevent some vehicle features or apps from working.\n\nCritical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Turn off anyway"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Vehicle Internet is turned off. This may prevent some vehicle features or apps from working. Critical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s used %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Join other network"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Network preferences"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Add network"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Connecting…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Not connected"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Network not in range"</string>
<string name="wifi_password" msgid="5565632142720292397">"Password"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Show password"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Choose at least one band for Wi‑Fi hotspot:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot and tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Off"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Turn off hotspot automatically"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi hotspot will turn off if no devices are connected"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> wants to turn on Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Force stop?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"If you force-stop an app, it may misbehave."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Turn off performance protection?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"If you do, your software and hardware may not work as well."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Leave on"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Turn off"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Turn on prioritise app performance?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Turning it on can cause potential system instability or long-term hardware impact. Do you want to continue?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Yes"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"No thanks"</string>
<string name="disable_text" msgid="4358165448648990820">"Disable"</string>
<string name="enable_text" msgid="1794971777861881238">"Enable"</string>
<string name="uninstall_text" msgid="277907956072833012">"Uninstall"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permission"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifications"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Storage and cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Ensure peak performance"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritise app performance"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No permissions granted"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No permissions requested"</string>
<string name="unused_apps" msgid="648471933781010395">"Unused apps"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> unused apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> unused app</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# unused app}other{# unused apps}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Remove permissions and free up space"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s in internal storage"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"When necessary, close app to avoid excessive use of resources"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Uses system resources to prioritise app performance"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Data usage"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"App data usage"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Usage history"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"All apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data & Wi‑Fi usage"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Usage history"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Total usage"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Foreground"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Background"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Allow data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Let this app use mobile data"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restrict data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Use mobile data only when app is in the foreground"</string>
<string name="computing_size" msgid="5791407621793083965">"Computing…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> additional permission</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# additional permission}other{# additional permissions}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Note: After a reboot, this app can\'t start until you unlock your vehicle."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist & voice input"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi control allows an app to turn Wi-Fi on or off, scan and connect to Wi-Fi networks add or remove networks, or start a local-only hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"More"</string>
<string name="location_settings_title" msgid="901334356682423679">"Location"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Use location"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Allow apps that you specify to access your location"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"If you turn this off, it will remove location access for all apps. Driver assistance apps will still have access."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Use location for driver assistance"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Vehicle location is off"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Driver assistance apps cannot access your location"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Change"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Allow apps that help with driving to access your location"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"If you turn this off, driver assistance apps that rely on location information will be disabled."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Turn off anyway"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recent location requests"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No recent location requests"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"App-level permissions"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Location Services"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Use location"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Location may use sources like GPS, Wi‑Fi, mobile networks and sensors to help estimate your device’s location."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Driver assistance"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Location information sent to driver assistance apps doesn’t contain information that identifies you. It’s stored for a maximum of two days before being deleted."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microphone"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Use microphone"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Allow all apps to access your microphone"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Manage microphone permissions"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Recently accessed"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"No recent apps"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apps have access"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# of {total_count} apps has access}other{# of {total_count} apps have access}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Recently accessed"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"View all"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Loading…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Advanced"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Loading…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
- <item quantity="one">You are now <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> step away from being a developer.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{You are now # step away from being a developer.}other{You are now # steps away from being a developer.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"You are now a developer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"No need, you are already a developer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Developer options"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"After you create a new profile, that person should customise it for themselves."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apps can be updated from any profile for use by all other profiles."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profile limit reached"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">You can create up to <xliff:g id="COUNT">%d</xliff:g> profiles.</item>
- <item quantity="one">Only one profile can be created.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Only one profile can be created.}other{You can create up to # profiles.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Couldn\'t create new profile"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Delete this profile?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"All apps and data for this profile will be deleted"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Couldn\'t delete profile."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profile wasn\'t deleted. You can restart device and try again."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"This profile will be deleted when you switch profiles or restart the vehicle."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Dismiss"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Retry"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"How to draw an unlock pattern"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Error saving pattern"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Too many incorrect attempts. Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Pattern does not support rotary; please use touch"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Remove screen lock?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"This will allow anyone to access your account"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Common PINs are blocked by your IT admin. Try a different PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"This can\'t include an invalid character."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Password invalid. Must be at least four characters."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
- <item quantity="one">Must contain at least one letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
- <item quantity="one">Must contain at least one lowercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
- <item quantity="one">Must contain at least 1 uppercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
- <item quantity="one">Must contain at least 1 numerical digit</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
- <item quantity="one">Must contain at least 1 special symbol</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
- <item quantity="one">Must contain at least 1 non-letter character</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Device admin doesn\'t allow using a recent password"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Error saving password"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Common passwords are blocked by your IT admin. Try a different password."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Add a profile"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Delete this profile"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Add profile"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Display brightness"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"To see your devices, turn on Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"To pair a device, open Bluetooth settings"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Infotainment system admin"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Activated apps"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deactivated apps"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apps with this permission have access to this vehicle\'s data"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"No vehicle admin apps"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"This infotainment system admin app is active and allows the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Activating this infotainment system app will allow the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Activate this infotainment system app?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activate this infotainment system app"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deactivate & uninstall"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deactivate this infotainment system app"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"More details"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"The organisation manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity and the vehicle\'s location information."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"The organisation manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity and the device\'s location information."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"The organisation manager can monitor and manage apps and data associated with this infotainment system, including settings, permissions, corporate access, network activity and the vehicle\'s location information."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"The organisation manager may be able to access data associated with this infotainment system, manage apps and change this vehicle\'s settings."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"That’s unavailable"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Can’t change volume in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Can’t make calls in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS not allowed in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Camera is unavailable in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Can’t take screenshots in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Can’t open this app in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blocked by your credit provider"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Access to some features is limited by the organisation.\n\nIf you have questions, contact the organisation manager."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Vehicle admin apps"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# activated app}other{# activated apps}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"No activated apps"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> vehicle policy"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Settings managed by the organisation manager"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Learn more about <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Share bug report?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"This vehicle\'s organisation manager requested a bug report to help troubleshoot this device. Apps and data may be shared."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"This vehicle\'s organisation manager requested a bug report to help troubleshoot this device. Apps and data may be shared, and your device may temporarily slow down."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"This bug report is being shared with this vehicle\'s organisation manager. Contact them for more details."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Share"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Decline"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"This setting can\'t be changed at the moment"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibility"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Captions"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Caption preferences"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Off"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"On"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Screen reader"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Show captions"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Text size"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Caption size and style"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Very small"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Small"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Default"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Large"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Very large"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Caption style"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Set by app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"White on black"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Black on white"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Yellow on black"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Yellow on blue"</string>
</resources>
diff --git a/res/values-en-rGB/arrays.xml b/res/values-en-rGB/arrays.xml
index 6768dfa..b73994c 100644
--- a/res/values-en-rGB/arrays.xml
+++ b/res/values-en-rGB/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Never allow"</item>
<item msgid="1154273129608299386">"Always allow"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index db6d01a..ed66b24 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Network and Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIMs}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Active/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactive/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Active/Downloaded SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Add more"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Access data using mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Use mobile data"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Turn off mobile data?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Selection required"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Use <xliff:g id="CARRIER">%1$s</xliff:g> for mobile data?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> data warning"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> data limit"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> data warning/<xliff:g id="ID_2">^2</xliff:g> data limit"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d days left</item>
- <item quantity="one">%d day left</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# day left}other{# days left}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"No time remaining"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Less than one day left"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Updated by <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ago"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Set"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Data warning limit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"App data usage cycle"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobile data usage"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Set data warning"</string>
<string name="data_warning" msgid="116776633806885370">"Data warning"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Set data limit"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Your vehicle’s head unit will turn off mobile data once it reaches the limit that you set.\n\nSince data usage is measured by the head unit, and your operator may account for usage differently, consider setting a conservative limit."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Set data usage warning"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Set data usage limit"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Data usage is measured by your device. It may vary from your mobile operator’s data."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Set"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Save"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM network"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Vehicle Internet"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Turning off the vehicle Internet may prevent some vehicle features or apps from working.\n\nCritical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Turn off anyway"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Vehicle Internet is turned off. This may prevent some vehicle features or apps from working. Critical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s used %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Join other network"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Network preferences"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Add network"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Connecting…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Not connected"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Network not in range"</string>
<string name="wifi_password" msgid="5565632142720292397">"Password"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Show password"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Choose at least one band for Wi‑Fi hotspot:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot and tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Off"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Turn off hotspot automatically"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi hotspot will turn off if no devices are connected"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> wants to turn on Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Force stop?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"If you force-stop an app, it may misbehave."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Turn off performance protection?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"If you do, your software and hardware may not work as well."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Leave on"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Turn off"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Turn on prioritise app performance?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Turning it on can cause potential system instability or long-term hardware impact. Do you want to continue?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Yes"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"No thanks"</string>
<string name="disable_text" msgid="4358165448648990820">"Disable"</string>
<string name="enable_text" msgid="1794971777861881238">"Enable"</string>
<string name="uninstall_text" msgid="277907956072833012">"Uninstall"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permission"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifications"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Storage and cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Ensure peak performance"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritise app performance"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No permissions granted"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No permissions requested"</string>
<string name="unused_apps" msgid="648471933781010395">"Unused apps"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> unused apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> unused app</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# unused app}other{# unused apps}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Remove permissions and free up space"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s in internal storage"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"When necessary, close app to avoid excessive use of resources"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Uses system resources to prioritise app performance"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Data usage"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"App data usage"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Usage history"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"All apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data & Wi‑Fi usage"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Usage history"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Total usage"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Foreground"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Background"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Allow data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Let this app use mobile data"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restrict data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Use mobile data only when app is in the foreground"</string>
<string name="computing_size" msgid="5791407621793083965">"Computing…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> additional permission</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# additional permission}other{# additional permissions}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Note: After a reboot, this app can\'t start until you unlock your vehicle."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist & voice input"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi control allows an app to turn Wi-Fi on or off, scan and connect to Wi-Fi networks add or remove networks, or start a local-only hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"More"</string>
<string name="location_settings_title" msgid="901334356682423679">"Location"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Use location"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Allow apps that you specify to access your location"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"If you turn this off, it will remove location access for all apps. Driver assistance apps will still have access."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Use location for driver assistance"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Vehicle location is off"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Driver assistance apps cannot access your location"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Change"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Allow apps that help with driving to access your location"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"If you turn this off, driver assistance apps that rely on location information will be disabled."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Turn off anyway"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recent location requests"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No recent location requests"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"App-level permissions"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Location Services"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Use location"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Location may use sources like GPS, Wi‑Fi, mobile networks and sensors to help estimate your device’s location."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Driver assistance"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Location information sent to driver assistance apps doesn’t contain information that identifies you. It’s stored for a maximum of two days before being deleted."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microphone"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Use microphone"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Allow all apps to access your microphone"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Manage microphone permissions"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Recently accessed"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"No recent apps"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apps have access"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# of {total_count} apps has access}other{# of {total_count} apps have access}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Recently accessed"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"View all"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Loading…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Advanced"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Loading…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
- <item quantity="one">You are now <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> step away from being a developer.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{You are now # step away from being a developer.}other{You are now # steps away from being a developer.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"You are now a developer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"No need, you are already a developer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Developer options"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"After you create a new profile, that person should customise it for themselves."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apps can be updated from any profile for use by all other profiles."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profile limit reached"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">You can create up to <xliff:g id="COUNT">%d</xliff:g> profiles.</item>
- <item quantity="one">Only one profile can be created.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Only one profile can be created.}other{You can create up to # profiles.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Couldn\'t create new profile"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Delete this profile?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"All apps and data for this profile will be deleted"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Couldn\'t delete profile."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profile wasn\'t deleted. You can restart device and try again."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"This profile will be deleted when you switch profiles or restart the vehicle."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Dismiss"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Retry"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"How to draw an unlock pattern"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Error saving pattern"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Too many incorrect attempts. Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Pattern does not support rotary; please use touch"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Remove screen lock?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"This will allow anyone to access your account"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Common PINs are blocked by your IT admin. Try a different PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"This can\'t include an invalid character."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Password invalid. Must be at least four characters."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
- <item quantity="one">Must contain at least one letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
- <item quantity="one">Must contain at least one lowercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
- <item quantity="one">Must contain at least 1 uppercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
- <item quantity="one">Must contain at least 1 numerical digit</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
- <item quantity="one">Must contain at least 1 special symbol</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
- <item quantity="one">Must contain at least 1 non-letter character</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Device admin doesn\'t allow using a recent password"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Error saving password"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Common passwords are blocked by your IT admin. Try a different password."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Add a profile"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Delete this profile"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Add profile"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Display brightness"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"To see your devices, turn on Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"To pair a device, open Bluetooth settings"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Infotainment system admin"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Activated apps"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deactivated apps"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apps with this permission have access to this vehicle\'s data"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"No vehicle admin apps"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"This infotainment system admin app is active and allows the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Activating this infotainment system app will allow the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Activate this infotainment system app?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activate this infotainment system app"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deactivate & uninstall"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deactivate this infotainment system app"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"More details"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"The organisation manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity and the vehicle\'s location information."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"The organisation manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity and the device\'s location information."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"The organisation manager can monitor and manage apps and data associated with this infotainment system, including settings, permissions, corporate access, network activity and the vehicle\'s location information."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"The organisation manager may be able to access data associated with this infotainment system, manage apps and change this vehicle\'s settings."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"That’s unavailable"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Can’t change volume in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Can’t make calls in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS not allowed in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Camera is unavailable in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Can’t take screenshots in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Can’t open this app in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blocked by your credit provider"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Access to some features is limited by the organisation.\n\nIf you have questions, contact the organisation manager."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Vehicle admin apps"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# activated app}other{# activated apps}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"No activated apps"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> vehicle policy"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Settings managed by the organisation manager"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Learn more about <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Share bug report?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"This vehicle\'s organisation manager requested a bug report to help troubleshoot this device. Apps and data may be shared."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"This vehicle\'s organisation manager requested a bug report to help troubleshoot this device. Apps and data may be shared, and your device may temporarily slow down."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"This bug report is being shared with this vehicle\'s organisation manager. Contact them for more details."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Share"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Decline"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"This setting can\'t be changed at the moment"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibility"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Captions"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Caption preferences"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Off"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"On"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Screen reader"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Show captions"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Text size"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Caption size and style"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Very small"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Small"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Default"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Large"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Very large"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Caption style"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Set by app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"White on black"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Black on white"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Yellow on black"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Yellow on blue"</string>
</resources>
diff --git a/res/values-en-rIN/arrays.xml b/res/values-en-rIN/arrays.xml
index 6768dfa..b73994c 100644
--- a/res/values-en-rIN/arrays.xml
+++ b/res/values-en-rIN/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Never allow"</item>
<item msgid="1154273129608299386">"Always allow"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index bc32d93..c1f4115 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Network and internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIMs}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Active/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactive/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Active/Downloaded SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Add more"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Access data using mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Use mobile data"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Turn off mobile data?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Selection required"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Use <xliff:g id="CARRIER">%1$s</xliff:g> for mobile data?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> data warning"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> data limit"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> data warning/<xliff:g id="ID_2">^2</xliff:g> data limit"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d days left</item>
- <item quantity="one">%d day left</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# day left}other{# days left}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"No time remaining"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Less than one day left"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Updated by <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ago"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Set"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Data warning and limit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"App data usage cycle"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobile data usage"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Set data warning"</string>
<string name="data_warning" msgid="116776633806885370">"Data warning"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Set data limit"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Your vehicle’s head unit will turn off mobile data once it reaches the limit that you set.\n\nSince data usage is measured by the head unit, and your operator may account for usage differently, consider setting a conservative limit."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Set data usage warning"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Set data usage limit"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Data usage is measured by your device. It may vary from your mobile operator’s data."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Set"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Save"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM network"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Vehicle Internet"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Turning off the vehicle Internet may prevent some vehicle features or apps from working.\n\nCritical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Turn off anyway"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Vehicle Internet is turned off. This may prevent some vehicle features or apps from working. Critical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s used %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Join other network"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Network preferences"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Add network"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Connecting…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Not connected"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Network not in range"</string>
<string name="wifi_password" msgid="5565632142720292397">"Password"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Show password"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Choose at least one band for Wi‑Fi hotspot:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot and tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Off"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Turn off hotspot automatically"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi hotspot will turn off if no devices are connected"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> wants to turn on Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Force stop?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"If you force-stop an app, it may misbehave."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Turn off performance protection?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"If you do, your software and hardware may not work as well."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Leave on"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Turn off"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Turn on prioritise app performance?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Turning it on can cause potential system instability or long-term hardware impact. Do you want to continue?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Yes"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"No thanks"</string>
<string name="disable_text" msgid="4358165448648990820">"Disable"</string>
<string name="enable_text" msgid="1794971777861881238">"Enable"</string>
<string name="uninstall_text" msgid="277907956072833012">"Uninstall"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permission"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifications"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Storage and cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Ensure peak performance"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritise app performance"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No permissions granted"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No permissions requested"</string>
<string name="unused_apps" msgid="648471933781010395">"Unused apps"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> unused apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> unused app</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# unused app}other{# unused apps}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Remove permissions and free up space"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s in internal storage"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"When necessary, close app to avoid excessive use of resources"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Uses system resources to prioritise app performance"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Data usage"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"App data usage"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Usage history"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"All apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data & Wi‑Fi usage"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Usage history"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Total usage"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Foreground"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Background"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Allow data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Let this app use mobile data"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restrict data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Use mobile data only when app is in the foreground"</string>
<string name="computing_size" msgid="5791407621793083965">"Computing…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> additional permission</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# additional permission}other{# additional permissions}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Note: After a reboot, this app can\'t start until you unlock your vehicle."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist & voice input"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi control allows an app to turn Wi-Fi on or off, scan and connect to Wi-Fi networks add or remove networks, or start a local-only hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"More"</string>
<string name="location_settings_title" msgid="901334356682423679">"Location"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Use location"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Allow apps that you specify to access your location"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"If you turn this off, it will remove location access for all apps. Driver assistance apps will still have access."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Use location for driver assistance"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Vehicle location is off"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Driver assistance apps cannot access your location"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Change"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Allow apps that help with driving to access your location"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"If you turn this off, driver assistance apps that rely on location information will be disabled."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Turn off anyway"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recent location requests"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No recent location requests"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"App-level permissions"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Location Services"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Use location"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Location may use sources like GPS, Wi‑Fi, mobile networks and sensors to help estimate your device’s location."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Driver assistance"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Location information sent to driver assistance apps doesn’t contain information that identifies you. It’s stored for a maximum of two days before being deleted."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microphone"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Use microphone"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Allow all apps to access your microphone"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Manage microphone permissions"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Recently accessed"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"No recent apps"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apps have access"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# of {total_count} apps has access}other{# of {total_count} apps have access}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Recently accessed"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"View all"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Loading…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Advanced"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Loading…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
- <item quantity="one">You are now <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> step away from being a developer.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{You are now # step away from being a developer.}other{You are now # steps away from being a developer.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"You are now a developer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"No need, you are already a developer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Developer options"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"After you create a new profile, that person should customise it for themselves."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apps can be updated from any profile for use by all other profiles."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profile limit reached"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">You can create up to <xliff:g id="COUNT">%d</xliff:g> profiles.</item>
- <item quantity="one">Only one profile can be created.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Only one profile can be created.}other{You can create up to # profiles.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Couldn\'t create new profile"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Delete this profile?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"All apps and data for this profile will be deleted"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Couldn\'t delete profile."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profile wasn\'t deleted. You can restart device and try again."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"This profile will be deleted when you switch profiles or restart the vehicle."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Dismiss"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Retry"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"How to draw an unlock pattern"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Error saving pattern"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Too many incorrect attempts. Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Pattern does not support rotary; please use touch"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Remove screen lock?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"This will allow anyone to access your account"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Common PINs are blocked by your IT admin. Try a different PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"This can\'t include an invalid character."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Password invalid. Must be at least four characters."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
- <item quantity="one">Must contain at least one letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
- <item quantity="one">Must contain at least one lowercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
- <item quantity="one">Must contain at least 1 uppercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
- <item quantity="one">Must contain at least 1 numerical digit</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
- <item quantity="one">Must contain at least 1 special symbol</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
- <item quantity="one">Must contain at least 1 non-letter character</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Device admin doesn\'t allow using a recent password"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Error saving password"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Common passwords are blocked by your IT admin. Try a different password."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Add a profile"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Delete this profile"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Add profile"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Display brightness"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"To see your devices, turn on Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"To pair a device, open Bluetooth settings"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Infotainment system admin"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Activated apps"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deactivated apps"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apps with this permission have access to this vehicle\'s data"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"No vehicle admin apps"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"This infotainment system admin app is active and allows the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Activating this infotainment system app will allow the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Activate this infotainment system app?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activate this infotainment system app"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deactivate & uninstall"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deactivate this infotainment system app"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"More details"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"The organisation manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity and the vehicle\'s location information."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"The organisation manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity and the device\'s location information."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"The organisation manager can monitor and manage apps and data associated with this infotainment system, including settings, permissions, corporate access, network activity and the vehicle\'s location information."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"The organisation manager may be able to access data associated with this infotainment system, manage apps and change this vehicle\'s settings."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"That’s unavailable"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Can’t change volume in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Can’t make calls in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS not allowed in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Camera is unavailable in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Can’t take screenshots in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Can’t open this app in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blocked by your credit provider"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Access to some features is limited by the organisation.\n\nIf you have questions, contact the organisation manager."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Vehicle admin apps"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# activated app}other{# activated apps}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"No activated apps"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> vehicle policy"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Settings managed by the organisation manager"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Learn more about <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Share bug report?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"This vehicle\'s organisation manager requested a bug report to help troubleshoot this device. Apps and data may be shared."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"This vehicle\'s organisation manager requested a bug report to help troubleshoot this device. Apps and data may be shared, and your device may temporarily slow down."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"This bug report is being shared with this vehicle\'s organisation manager. Contact them for more details."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Share"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Decline"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"This setting can\'t be changed at the moment"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibility"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Captions"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Caption preferences"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Off"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"On"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Screen reader"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Show captions"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Text size"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Caption size and style"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Very small"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Small"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Default"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Large"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Very large"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Caption style"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Set by app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"White on black"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Black on white"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Yellow on black"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Yellow on blue"</string>
</resources>
diff --git a/res/values-en-rXC/arrays.xml b/res/values-en-rXC/arrays.xml
index dddcb43..8884623 100644
--- a/res/values-en-rXC/arrays.xml
+++ b/res/values-en-rXC/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Never allow"</item>
<item msgid="1154273129608299386">"Always allow"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 09f33c4..0d492d9 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Network & internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIMs}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Active / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactive / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Active / Downloaded SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Add more"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Access data using mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Use mobile data"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Turn off mobile data?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Selection required"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Use <xliff:g id="CARRIER">%1$s</xliff:g> for mobile data?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> data warning"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> data limit"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> data warning / <xliff:g id="ID_2">^2</xliff:g> data limit"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d days left</item>
- <item quantity="one">%d day left</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# day left}other{# days left}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"No time remaining"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Less than 1 day left"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Updated by <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ago"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Set"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Data warning & limit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"App data usage cycle"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobile data usage"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Set data warning"</string>
<string name="data_warning" msgid="116776633806885370">"Data warning"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Set data limit"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Your vehicle’s head unit will turn off mobile data once it reaches the limit you set.\n\nSince data usage is measured by the head unit, and your carrier may account for usage differently, consider setting a conservative limit."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Set data usage warning"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Set data usage limit"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Data usage is measured by your device. It may vary from your mobile carrier’s data."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Set"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Save"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM network"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Vehicle internet"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Turning off the vehicle internet may prevent some vehicle features or apps from working.\n\nCritical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Turn off anyway"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Vehicle internet is turned off. This may prevent some vehicle features or apps from working. Critical data required to operate your vehicle will continue to be shared with the vehicle manufacturer."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s used %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Join other network"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Network preferences"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Add network"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Connecting…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Not connected"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Network not in range"</string>
<string name="wifi_password" msgid="5565632142720292397">"Password"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Show password"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Choose at least one band for Wi‑Fi hotspot:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot & tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Off"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Turn off hotspot automatically"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi hotspot will turn off if no devices are connected"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> wants to turn on Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Force stop?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"If you force stop an app, it may misbehave."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Turn off performance protection?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"If you do, your software and hardware may not work as well."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Leave on"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Turn off"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Turn on prioritize app performance?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Turning it on can cause potential system instability or long-term hardware impact. Do you want to continue?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Yes"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"No, thanks"</string>
<string name="disable_text" msgid="4358165448648990820">"Disable"</string>
<string name="enable_text" msgid="1794971777861881238">"Enable"</string>
<string name="uninstall_text" msgid="277907956072833012">"Uninstall"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permissions"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifications"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Storage & cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Ensure peak performance"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritize app performance"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No permissions granted"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No permissions requested"</string>
<string name="unused_apps" msgid="648471933781010395">"Unused apps"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> unused apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> unused app</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# unused app}other{# unused apps}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Remove permissions and free up space"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s in internal storage"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"When necessary, close app to avoid excessive use of resources"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Uses system resources to prioritize app performance"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Data usage"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"App data usage"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Usage history"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"All apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data & Wi‑Fi usage"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Usage history"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Total usage"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Foreground"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Background"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Allow data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Let this app use mobile data"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restrict data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Use mobile data only when app is in the foreground"</string>
<string name="computing_size" msgid="5791407621793083965">"Computing…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> additional permission</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# additional permission}other{# additional permissions}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Note: After a reboot, this app can\'t start until you unlock your vehicle."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist & voice input"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi control allows an app to turn Wi-Fi on or off, scan and connect to Wi-Fi networks, add or remove networks, or start a local-only hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"More"</string>
<string name="location_settings_title" msgid="901334356682423679">"Location"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Use location"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Allow apps you specify to access your location"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"If you turn this off, it will remove location access for all apps. Driver Assistance apps will still have access."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Use location for Driver Assistance"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Vehicle location is off"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Driver Assistance apps cannot access your location"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Change"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Allow apps that help with driving to access your location"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"If you turn this off, Driver Assistance apps that rely on location information will be disabled."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Turn off anyway"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recent Location Requests"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No recent location requests"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"App-level permissions"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Location Services"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Use location"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Location may use sources like GPS, Wi‑Fi, mobile networks, and sensors to help estimate your device’s location."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Driver assistance"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Location information sent to Driver Assistance apps doesn’t contain information that identifies you. It’s stored for a maximum of 2 days before being deleted."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microphone"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Use microphone"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Allow all apps to access your microphone"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Manage microphone permissions"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Recently accessed"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"No recent apps"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apps have access"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# of {total_count} apps has access}other{# of {total_count} apps have access}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Recently accessed"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"View all"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Loading…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Advanced"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licenses"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licenses."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Loading…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
- <item quantity="one">You are now <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> step away from being a developer.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{You are now # step away from being a developer.}other{You are now # steps away from being a developer.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"You are now a developer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"No need, you are already a developer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Developer options"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"After you create a new profile, that person should customize it for themselves."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apps can be updated from any profile for use by all other profiles."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profile limit reached"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">You can create up to <xliff:g id="COUNT">%d</xliff:g> profiles.</item>
- <item quantity="one">Only one profile can be created.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Only one profile can be created.}other{You can create up to # profiles.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Couldn\'t create new profile"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Delete this profile?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"All apps and data for this profile will be deleted"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Couldn\'t delete profile."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profile wasn\'t deleted. You can restart the device and try again."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"This profile will be deleted when you switch profiles or restart the vehicle."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Dismiss"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Retry"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"How to draw an unlock pattern"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Error saving pattern"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Too many incorrect attempts. Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Pattern does not support rotary, please use touch"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Remove screen lock?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"This will allow anyone to access your account"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Common PINs are blocked by your IT admin. Try a different PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"This can\'t include an invalid character."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Password invalid, must be at least 4 characters."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
- <item quantity="one">Must contain at least 1 letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
- <item quantity="one">Must contain at least 1 lowercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
- <item quantity="one">Must contain at least 1 uppercase letter</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
- <item quantity="one">Must contain at least 1 numerical digit</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
- <item quantity="one">Must contain at least 1 special symbol</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
- <item quantity="one">Must contain at least 1 non-letter character</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Device admin doesn\'t allow using a recent password"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Error saving password"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Common passwords are blocked by your IT admin. Try a different password."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Add a profile"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Delete this profile"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Add profile"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Display brightness"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"To see your devices, turn on Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"To pair a device, open Bluetooth settings"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Infotainment system admin"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Activated apps"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deactivated apps"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apps with this permission have access to this vehicle\'s data"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"No vehicle admin apps"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"This infotainment system admin app is active and allows the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Activating this infotainment system app will allow the app <xliff:g id="APP_NAME">%1$s</xliff:g> to perform the following operations:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Activate this infotainment system app?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activate this infotainment system app"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deactivate & uninstall"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deactivate this infotainment system app"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"More details"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"The organization manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity, and the vehicle\'s location information."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"The organization manager can monitor and manage apps and data associated with this profile, including settings, permissions, corporate access, network activity, and the device\'s location information."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"The organization manager can monitor and manage apps and data associated with this infotainment system, including settings, permissions, corporate access, network activity, and the vehicle\'s location information."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"The organization manager may be able to access data associated with this infotainment system, manage apps, and change this vehicles settings."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"That’s unavailable"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Can’t change volume in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Can’t make calls in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS not allowed in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Camera is unavailable in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Can’t take screenshots in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Can’t open this app in this managed vehicle"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blocked by your credit provider"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Access to some features is limited by the organization.\n\nIf you have questions, contact the organization manager."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Vehicle admin apps"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# activated app}other{# activated apps}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"No activated apps"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> vehicle policy"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Settings managed by the organization manager"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Learn more about <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Share bug report?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"This vehicle\'s organization manager requested a bug report to help troubleshoot this device. Apps and data may be shared."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"This vehicle\'s organization manager requested a bug report to help troubleshoot this device. Apps and data may be shared, and your device may temporarily slow down."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"This bug report is being shared with this vehicle\'s organization manager. Contact them for more details."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Share"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Decline"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"This setting can\'t be changed right now"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibility"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Captions"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Caption preferences"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Off"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"On"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Screen reader"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Show captions"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Text size"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Caption size and style"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Very small"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Small"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Default"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Large"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Very large"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Caption style"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Set by app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"White on black"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Black on white"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Yellow on black"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Yellow on blue"</string>
</resources>
diff --git a/res/values-es-rUS/arrays.xml b/res/values-es-rUS/arrays.xml
index 1ee6785..87e03f1 100644
--- a/res/values-es-rUS/arrays.xml
+++ b/res/values-es-rUS/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"No permitir nunca"</item>
<item msgid="1154273129608299386">"Permitir siempre"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 8a53c23..2f0ec10 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Modo nocturno"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Internet y red"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Red móvil"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Activo/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactivo/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Activo/SIM descargada"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Agregar más"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Datos móviles"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Acceder a los datos mediante la red móvil"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Red móvil"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Usar datos móviles"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"¿Desactivar los datos móviles?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Debes seleccionar una opción"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"¿Usar <xliff:g id="CARRIER">%1$s</xliff:g> para datos móviles?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Advertencia de datos: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Límite de datos: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Advertencia de datos: <xliff:g id="ID_1">^1</xliff:g>/Límite de datos: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Quedan %d días</item>
- <item quantity="one">Queda %d día</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# día restante}other{# días restantes}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"No queda tiempo"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Queda menos de 1 día"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Última actualización: hace <xliff:g id="ID_2">^2</xliff:g> por <xliff:g id="ID_1">^1</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Establecer"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Advertencia de límite de datos"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de uso de datos de las apps"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Uso de datos móviles"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Config. advertencia de datos"</string>
<string name="data_warning" msgid="116776633806885370">"Advertencia de datos"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Establecer límite de datos"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"La unidad principal del vehículo desactivará los datos móviles cuando llegue al límite que establezcas.\n\nComo es posible que la unidad principal y tu proveedor midan el uso de datos de manera distinta, te recomendamos establecer un límite prudente."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Establecer advertencia de uso de datos"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Límite del uso de datos"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Tu dispositivo mide el uso de datos. Es posible que varíe según los datos del operador de telefonía celular."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Establecer"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Guardar"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Red del OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet del vehículo"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Si desactivas el servicio de Internet del vehículo, es posible que dejen de ejecutarse algunas funciones o apps.\n\nSe seguirán compartiendo con el fabricante los datos críticos necesarios para que el vehículo funcione correctamente."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Desactivar de todos modos"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"El servicio de Internet del vehículo está desactivado. Es posible que dejen de ejecutarse algunas funciones y apps. Se seguirán compartiendo con el fabricante los datos críticos necesarios para que el vehículo funcione correctamente."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Datos usados: %1$s entre el %2$s y el %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Unirse a otra red"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferencias de red"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Agregar red"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Conectar"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Conectando…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"No conectado"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Red fuera de alcance"</string>
<string name="wifi_password" msgid="5565632142720292397">"Contraseña"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Mostrar contraseña"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Elige al menos una banda para el hotspot de Wi-Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot y conexión mediante dispositivo móvil"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Desactivado"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Desactivar hotspot automáticamente"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Si no hay dispositivos conectados, se desactivará el hotspot de Wi‑Fi"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> quiere activar la conexión Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Forzar detención"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"¿Deseas forzar la detención?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Si fuerzas la detención de una app, es posible que no funcione correctamente."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"¿Desactivar protección de rendimiento?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Si lo haces, es posible que tampoco funcionen el hardware ni el software."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Dejar habilitado"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Desactivar"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"¿Priorizar el rendimiento de la app?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"La activación podría generar inestabilidad en el sistema o un impacto en el hardware a largo plazo. ¿Deseas continuar?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Sí"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"No, gracias"</string>
<string name="disable_text" msgid="4358165448648990820">"Inhabilitar"</string>
<string name="enable_text" msgid="1794971777861881238">"Habilitar"</string>
<string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permisos"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notificaciones"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Almacenamiento y caché"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Asegurar rendimiento"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Priorizar rendimiento de la app"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versión: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No se otorgaron permisos"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No se solicitaron permisos"</string>
<string name="unused_apps" msgid="648471933781010395">"Apps que no usas"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps en desuso</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app en desuso</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# app en desuso}other{# apps en desuso}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Quitar permisos y liberar espacio"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s de almacenamiento interno"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Cerrar app para no consumir recursos"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Usa los recursos del sistema para priorizar el rendimiento de la app"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Uso de datos"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uso de datos de la app"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historial de uso"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Todas las apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Wi-Fi y datos móviles"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historial de uso"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Uso total"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Primer plano"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Segundo plano"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Permitir datos móviles"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Permitir que esta app use datos móviles"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restringir datos"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Usar datos solo si la app está en primer plano"</string>
<string name="computing_size" msgid="5791407621793083965">"Calculando…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permisos adicionales</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permiso adicional</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# permiso adicional}other{# permisos adicionales}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Nota: Luego de reiniciar el dispositivo, esta app no podrá iniciarse hasta que desbloquees el vehículo."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistencia y entrada de voz"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplicación de asistencia"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Control de Wi-Fi permite que esta app active o desactive la conexión Wi-Fi, busque redes Wi-Fi y se conecte a ellas, agregue o quite redes, o inicie un hotspot de acceso local exclusivo."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Más"</string>
<string name="location_settings_title" msgid="901334356682423679">"Ubicación"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Usar ubicación"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Permitir apps espec. acceder a ubicación"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Si desactivas la asistencia al conductor, se quitará el acceso a tu ubicación para todas las apps. De todos modos, las apps de asistencia al conductor tendrán acceso."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Usar ubicación para asist. al conductor"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Ubicación del vehículo desactivada"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Apps sin acceso a tu ubicación"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Cambiar"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Permitir apps de asist. acceder a ubic."</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Si desactivas las apps de asistencia al conductor, se inhabilitarán las funciones que dependan de la información de ubicación."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Desactivar de todos modos"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitudes de ubicación recientes"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No hay solicitudes de ubicación recientes"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisos en las apps"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Servicios de ubicación"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Usar ubicación"</string>
<string name="location_settings_footer" msgid="296892848338100051">"La ubicación puede usar fuentes como GPS, Wi-Fi, redes móviles y sensores para obtener la ubicación estimada del dispositivo."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Asistencia al conductor"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Los datos de ubicación enviados a las apps de asistencia al conductor no contienen información que permita identificarte. Se almacenan durante un máximo de 2 días antes de que se los borre."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Micrófono"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Usar micrófono"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Permitir que todas las apps accedan al micrófono"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Administrar permisos del micrófono"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Con acceso reciente"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Ninguna app reciente"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apps tienen acceso"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# de {total_count} apps tiene acceso}other{# de {total_count} apps tienen acceso}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Con acceso reciente"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Ver todo"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Cargando…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Actualizaciones del sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Configuración avanzada"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licencias de terceros"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Se produjo un error al cargar las licencias."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Cargando…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Ahora estás a <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pasos de convertirte en desarrollador.</item>
- <item quantity="one">Ahora estás a <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> paso de convertirte en desarrollador.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Ahora estás a # paso de convertirte en desarrollador.}other{Ahora estás a # pasos de convertirte en desarrollador.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"¡Ya eres desarrollador!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"No es necesario, ya eres desarrollador."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opciones para desarrolladores"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Luego de crear un perfil nuevo, deberías personalizarlo."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Las apps se pueden actualizar desde cualquier perfil y usarse desde todos los demás perfiles."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Se alcanzó el límite de perfiles"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Puedes crear hasta <xliff:g id="COUNT">%d</xliff:g> perfiles.</item>
- <item quantity="one">Solo se puede crear un perfil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Solo se puede crear un perfil.}other{Puedes crear hasta # perfiles.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"No se pudo crear un perfil nuevo"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"¿Quieres borrar este perfil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Se borrarán todas las apps y los datos de este perfil"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"No se pudo borrar el perfil."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Perfil no borrado. Reinicia el dispositivo y vuelve a intentarlo."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Este perfil se borrará si cambias de perfil o reinicias el vehículo"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Descartar"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Reintentar"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Cómo dibujar un patrón de desbloqueo"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Error al guardar el patrón"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Demasiados intentos incorrectos. Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"No se admite patrón rotativo; usa táctil"</string>
<string name="okay" msgid="4589873324439764349">"Aceptar"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"¿Quitar bloqueo de pantalla?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Si lo haces, cualquiera podrá acceder a tu cuenta"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Tu administrador de TI bloquea los PIN comunes. Prueba con otro."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"No puede incluir un carácter no válido."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"La contraseña no es válida, ya que debe tener al menos 4 caracteres."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> letras</item>
- <item quantity="one">Debe tener al menos 1 letra</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> letras en minúscula</item>
- <item quantity="one">Debe tener al menos 1 letra en minúscula</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> letras en mayúscula</item>
- <item quantity="one">Debe tener al menos 1 letra en mayúscula</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> dígitos</item>
- <item quantity="one">Debe tener al menos 1 dígito</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> símbolos especiales</item>
- <item quantity="one">Debe tener al menos 1 símbolo especial</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> caracteres que no sean letras</item>
- <item quantity="one">Debe tener al menos 1 carácter que no sea una letra</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"El administrador del dispositivo no permite el uso de contraseñas recientes"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Error al guardar la contraseña"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Tu administrador de TI bloquea las contraseñas comunes. Prueba con otra."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Agregar un perfil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Borrar este perfil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Agregar perfil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Brillo de pantalla"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Para ver tus dispositivos, activa Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Para vincular un dispositivo, abre la configuración de Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrador del sistema de infoentretenimiento"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Apps activadas"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Apps desactivadas"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Las apps a las que se les otorgó este permiso pueden acceder a los datos del vehículo"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"No hay ninguna app de administración del vehículo"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Esta app de administración del sistema de infoentretenimiento está activa y permite que la app de <xliff:g id="APP_NAME">%1$s</xliff:g> realice las siguientes operaciones:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Si activas esta app del sistema de infoentretenimiento, la app de <xliff:g id="APP_NAME">%1$s</xliff:g> podrá realizar las siguientes operaciones:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"¿Activar app sist. infoentretenimiento?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activar esta app del sistema de infoentretenimiento"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Desactivar y desinstalar"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Desactivar esta app del sistema de infoentretenimiento"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Más detalles"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"El administrador de la organización puede supervisar y administrar las apps y los datos asociados con este perfil, lo que incluye la configuración, los permisos, el acceso corporativo, la actividad de la red y la información de la ubicación del dispositivo."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"El administrador de la organización puede supervisar y administrar las apps y los datos asociados con este perfil, lo que incluye la configuración, los permisos, el acceso corporativo, la actividad de la red y la información de la ubicación del vehículo."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"El administrador de la organización puede supervisar y administrar las apps y los datos asociados con este sistema de infoentretenimiento, lo que incluye la configuración, los permisos, el acceso corporativo, la actividad de la red y la información de la ubicación del vehículo."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Es posible que el administrador de la organización pueda acceder a los datos asociados con este sistema de infoentretenimiento, administrar las apps y cambiar la configuración del vehículo."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"No disponible"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"No se puede cambiar el volumen en este vehículo administrado"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"No se puede realizar llamadas en este vehículo administrado"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"No se permiten SMS en este vehículo administrado"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"La cámara no está disponible en este vehículo administrado"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"No se pueden tomar capturas de pantalla en este vehículo administrado"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"No se puede abrir esta app en este vehículo administrado"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Opción bloqueada por tu proveedor de crédito"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"La organización limita el acceso a algunas funciones.\n\nSi tienes preguntas, comunícate con el administrador."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Apps de administración de vehículos"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# app activada}other{# apps activadas}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Ninguna app activada"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Política sobre vehículos de <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"El administrador de la organización administra la configuración"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Más información sobre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"¿Deseas compartir el informe de errores?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"El administrador de la organización de este vehículo solicitó un informe de errores para solucionar problemas en este dispositivo. Es posible que se compartan las apps y los datos."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"El administrador de la organización de este vehículo solicitó un informe de errores para solucionar problemas en este dispositivo. Es posible que se compartan las apps y los datos, y que el dispositivo se ralentice temporalmente."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Este informe de errores se compartirá con el administrador de la organización de este vehículo. Comunícate para obtener más detalles."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Compartir"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Rechazar"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"En este momento, no se puede cambiar esta opción de configuración"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accesibilidad"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Subtítulos"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferencias de subtítulos"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"No"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Sí"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Lector de pantalla"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Mostrar subtítulos"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Tamaño del texto"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Estilo y tamaño de los subtítulos"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Muy pequeño"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Pequeño"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Predeterminado"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Grande"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Muy grande"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Estilo de subtítulos"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Predeterminado de la app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Blanco sobre negro"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Negro sobre blanco"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Amarillo sobre negro"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Amarillo sobre azul"</string>
</resources>
diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml
index 1ee6785..87e03f1 100644
--- a/res/values-es/arrays.xml
+++ b/res/values-es/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"No permitir nunca"</item>
<item msgid="1154273129608299386">"Permitir siempre"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index acd2fea..fe9674d 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Modo nocturno"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Redes e Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Red móvil"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> tarjetas SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> tarjeta SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIMs}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Activo/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactivo/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Activo/SIM descargada"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Añadir más"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Datos móviles"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Acceder a datos con la red móvil"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Red móvil"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Usar datos móviles"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"¿Desactivar los datos móviles?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Debes seleccionar una opción"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"¿Usar <xliff:g id="CARRIER">%1$s</xliff:g> para los datos móviles?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Advertencia de datos: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Límite de datos: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Advertencia de datos: <xliff:g id="ID_1">^1</xliff:g>/Límite de datos: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Quedan %d días</item>
- <item quantity="one">Queda %d día</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Queda # día}other{Quedan # días}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"No queda tiempo"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Queda menos de 1 día"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Actualizado por <xliff:g id="ID_1">^1</xliff:g> hace <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Definir"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Límite y advertencia de datos"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de uso de datos de aplicaciones"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Uso de datos móviles"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Establecer advertencia de datos"</string>
<string name="data_warning" msgid="116776633806885370">"Advertencia de datos"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Establecer límite de datos"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"La unidad principal de tu vehículo desactivará los datos móviles cuando se alcance el límite que configures.\n\nSe tiene en cuenta el uso de datos medido por la unidad principal, aunque tu operador podría registrarlo de forma diferente. Por tanto, debes ser prudente al establecer un límite."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Establece la advertencia de uso de datos"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Limitar uso de datos"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"El dispositivo mide el uso de datos. Puede que tu operador móvil mida el uso de datos de otra forma."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Definir"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Guardar"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Red del fabricante"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Conexión a Internet del vehículo"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Puede que algunas funciones y aplicaciones no se inicien si desactivas la conexión del vehículo.\n\nLos datos necesarios para que funcione el vehículo se seguirán compartiendo con el fabricante."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Desactivar de todas formas"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Se ha desactivado la conexión a Internet del vehículo. Puede que algunas funciones y aplicaciones del vehículo no se inicien. Los datos necesarios para que funcione el vehículo se seguirán compartiendo con el fabricante."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s usados entre el %2$s y el %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Conectarse a otra red"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferencias de red"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Añadir red"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Conectar"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Conectando…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"No conectado"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"La red está fuera de alcance"</string>
<string name="wifi_password" msgid="5565632142720292397">"Contraseña"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Mostrar contraseña"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Elige al menos 1 banda para Compartir Internet:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Compartir Internet"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Compartir Internet"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Desactivado"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Desactivar Compartir Internet automáticamente"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Compartir Internet se desactivará si no hay dispositivos conectados"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> quiere activar la conexión Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Forzar detención"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"¿Quieres forzar la detención?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Si se fuerza la detención de una aplicación, es posible que no funcione correctamente."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"¿Desactivar protección del rendimiento?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Si lo haces, puede que el software y el hardware no funcionen de manera óptima."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Mantener activada"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Desactivar"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"¿Activar Priorizar rendimiento de la app?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Activarlo puede provocar inestabilidad en el sistema o afectar al hardware a largo plazo. ¿Quieres continuar?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Sí"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"No, gracias"</string>
<string name="disable_text" msgid="4358165448648990820">"Inhabilitar"</string>
<string name="enable_text" msgid="1794971777861881238">"Habilitar"</string>
<string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permisos"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notificaciones"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Almacenamiento y caché"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Rendimiento óptimo"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Priorizar rendimiento de la app"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versión: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No se han concedido permisos"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No se han solicitado permisos"</string>
<string name="unused_apps" msgid="648471933781010395">"Aplicaciones no usadas"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicaciones no usadas</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicación no usada</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# aplicación no usada}other{# aplicaciones no usadas}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Quitar permisos y liberar espacio"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s en el almacenamiento interno"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Cerrar apps cuando haga falta para no usar recursos en exceso"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Usa recursos del sistema para priorizar el rendimiento de la aplicación"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Uso de datos"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uso de datos de la app"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historial de uso"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Todas las aplicaciones"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Uso de datos y Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historial de uso"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Uso total"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"En primer plano"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Fondo"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Permitir el uso de datos"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Permitir que la aplicación utilice datos móviles"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restringir datos"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Usar datos solo si la app está en primer plano"</string>
<string name="computing_size" msgid="5791407621793083965">"Calculando…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permisos adicionales</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permiso adicional</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# permiso adicional}other{# permisos adicionales}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Nota: Después de reiniciar, tienes que desbloquear el vehículo para que esta aplicación se pueda iniciar."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistencia y entrada de voz"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplicación de asistencia"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"El control de la conexión Wi‑Fi permite que una aplicación active o desactive la red Wi‑Fi, busque redes inalámbricas y se conecte a ellas, añada o quite redes o inicie un punto de acceso local."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Más"</string>
<string name="location_settings_title" msgid="901334356682423679">"Ubicación"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Usar ubicación"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Permitir acceso a la ubicación de algunas apps"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Si la desactivas, se retirará el acceso a la ubicación de todas las aplicaciones. Las aplicaciones de asistencia en la conducción seguirán teniendo acceso a ella."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Ubicación en Asistencia en la conducción"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Ubicación de vehículo desactivada"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Las apps de asistencia en la conducción no pueden acceder a tu ubicación"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Cambiar"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Permitir acceso a la ubicación de las apps de asistencia en la conducción"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Si la desactivas, se inhabilitarán las aplicaciones de asistencia en la conducción que usan información de la ubicación."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Desactivar de todas formas"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitudes de ubicación recientes"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ninguna solicitud de ubicación reciente"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisos de las aplicaciones"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Servicios de ubicación"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Usar ubicación"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Se pueden utilizar distintas fuentes, como el GPS, sensores y redes Wi‑Fi y móviles, para determinar la ubicación de este dispositivo."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Asistencia en la conducción"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"La información de la ubicación enviada a las aplicaciones de asistencia en la conducción no contiene datos que te identifiquen. Se ha almacenado durante un máximo de 2 días antes de eliminarse."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Micrófono"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Usar micrófono"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Permite que todas las aplicaciones accedan al micrófono"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Gestionar permisos de micrófono"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Accesos recientes"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"No hay aplicaciones recientes"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Ninguna aplicación tiene acceso"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# de {total_count} aplicaciones tiene acceso}other{# de {total_count} aplicaciones tienen acceso}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Accesos recientes"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Ver todo"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Cargando…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Actualizaciones del sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Ajustes avanzados"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licencias de terceros"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"No se han podido cargar las licencias."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Cargando…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Solo te quedan <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pasos para habilitar las opciones para desarrolladores.</item>
- <item quantity="one">Solo te queda <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> paso para habilitar las opciones para desarrolladores.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Solo te queda # paso para habilitar las opciones para desarrolladores.}other{Solo te quedan # pasos para habilitar las opciones para desarrolladores.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"¡Ya están activadas las opciones para desarrolladores!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Las opciones para desarrolladores ya están activadas."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opciones para desarrolladores"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Una vez que hayas creado un perfil para alguien, esa persona debería personalizarlo."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Se pueden actualizar aplicaciones en cualquier perfil y estarán actualizadas en todos."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Límite de perfiles alcanzado"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Puedes crear hasta <xliff:g id="COUNT">%d</xliff:g> perfiles.</item>
- <item quantity="one">Solo se puede crear un perfil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Solo se puede crear un perfil.}other{Puedes crear un máximo de # perfiles.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"No se ha podido crear el perfil"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"¿Eliminar este perfil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Se eliminarán todas las aplicaciones y los datos asociados a este perfil."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"No se ha podido eliminar el perfil."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"No se ha eliminado el perfil. Reinicia e inténtalo de nuevo."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Este perfil se eliminará cuando cambies a otro o reinicies el vehículo."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Cerrar"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Reintentar"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Cómo crear un patrón de desbloqueo"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"No se ha podido guardar el patrón"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Demasiados intentos fallidos. Vuelve a intentarlo dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"No puede usarse patrón de rotación; usa uno táctil"</string>
<string name="okay" msgid="4589873324439764349">"Aceptar"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"¿Quitar bloqueo de pantalla?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Cualquier usuario podrá acceder a tu cuenta"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Tu administrador de TI ha bloqueado los PINs más habituales. Prueba con otro."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"No puede incluir un carácter que no sea válido."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"La contraseña no es válida porque debe tener al menos 4 caracteres."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> letras</item>
- <item quantity="one">Debe tener al menos 1 letra</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> letras minúsculas</item>
- <item quantity="one">Debe tener al menos 1 letra minúscula</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> letras mayúsculas</item>
- <item quantity="one">Debe tener al menos 1 letra mayúscula</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> dígitos numéricos</item>
- <item quantity="one">Debe tener al menos 1 dígito numérico</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> símbolos especiales</item>
- <item quantity="one">Debe tener al menos 1 símbolo especial</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Debe tener al menos <xliff:g id="COUNT">%d</xliff:g> caracteres que no sean una letra</item>
- <item quantity="one">Debe tener al menos 1 carácter que no sea una letra</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"El administrador de dispositivos no permite utilizar una contraseña reciente"</string>
<string name="error_saving_password" msgid="8334882262622500658">"No se ha podido guardar la contraseña"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Tu administrador de TI ha bloqueado las contraseñas más habituales. Prueba con otra."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Añadir un perfil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Eliminar este perfil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Añadir perfil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Brillo de la pantalla"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Para ver tus dispositivos, activa el Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Para emparejar un dispositivo, abre los ajustes de Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrador del sistema de infoentretenimiento"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aplicaciones activadas"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Aplicaciones desactivadas"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Las aplicaciones que tienen este permiso pueden acceder a los datos de este vehículo"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"No hay ninguna aplicación para administradores del vehículo"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Esta aplicación de administrador del sistema de infoentretenimiento está activa y permite que la aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> haga lo siguiente:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Activar esta aplicación del sistema de infoentretenimiento permitirá que la aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> haga lo siguiente:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"¿Activar esta app de infoentretenimiento?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activar esta aplicación del sistema de infoentretenimiento"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Desactivar y desinstalar"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Desactivar esta aplicación del sistema de infoentretenimiento"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Más detalles"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"El administrador de la organización puede monitorizar y gestionar aplicaciones y datos asociados a este perfil, como ajustes, permisos, acceso corporativo, actividad en la red e información sobre la ubicación del vehículo."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"El administrador de la organización puede monitorizar y gestionar aplicaciones y datos asociados a este perfil, como ajustes, permisos, acceso corporativo, actividad en la red e información sobre la ubicación del dispositivo."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"El administrador de la organización puede monitorizar y gestionar aplicaciones y datos asociados a este sistema de infoentretenimiento, como ajustes, permisos, acceso corporativo, actividad en la red e información sobre la ubicación del vehículo."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Es posible que el administrador de la organización pueda acceder a datos asociados a este sistema de infoentretenimiento, gestionar aplicaciones y editar ajustes de este vehículo."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"No está disponible"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"No se puede cambiar el volumen de este vehículo gestionado"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"No se pueden hacer llamadas en este vehículo gestionado"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"No se puede enviar SMS en este vehículo gestionado"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"La cámara no está disponible en este vehículo gestionado"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"No se pueden hacer capturas de pantalla en este vehículo gestionado"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"No se puede abrir esta aplicación en este vehículo gestionado"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Bloqueado por tu entidad de crédito"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"La organización ha limitado el acceso a algunas funciones.\n\nSi tienes alguna duda, ponte en contacto con el administrador de la organización."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Apps para administradores de vehículos"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aplicación activada}other{# aplicaciones activadas}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"No hay ninguna aplicación activada"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Política del vehículo <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Ajustes gestionados por el administrador de la organización"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Más información sobre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"¿Compartir informe de errores?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"El administrador de la organización de este vehículo ha solicitado un informe de errores para solucionar problemas en este dispositivo. Es posible que se compartan las aplicaciones y los datos."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"El administrador de la organización de este vehículo ha solicitado un informe de errores para solucionar problemas en este dispositivo. Es posible que se compartan las aplicaciones y los datos, y que el dispositivo funcione más lento de forma temporal."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Este informe de errores se comparte con el administrador de la organización de este vehículo. Ponte en contacto con él para obtener más información."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Compartir"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Rechazar"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"No se puede modificar este ajuste en estos momentos"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accesibilidad"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Subtítulos"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferencias de subtítulos"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Desactivado"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Activado"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Lector de pantalla"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Mostrar subtítulos"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Tamaño del texto"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Tamaño y estilo de los subtítulos"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Muy pequeño"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Pequeño"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Predeterminado"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Grande"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Muy grande"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Estilo de los subtítulos"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Definido por la aplicación"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Blanco sobre negro"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Negro sobre blanco"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Amarillo sobre negro"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Amarillo sobre azul"</string>
</resources>
diff --git a/res/values-et/arrays.xml b/res/values-et/arrays.xml
index 3887b75..a6f7fed 100644
--- a/res/values-et/arrays.xml
+++ b/res/values-et/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ära luba kunagi"</item>
<item msgid="1154273129608299386">"Luba alati"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index dc13aea..35ac019 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Öörežiim"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Võrk ja internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobiilsidevõrk"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-kaarti</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM-kaart</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM-i}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktiivne / SIM-kaart"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inaktiivne / SIM-kaart"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktiivne / allalaaditud SIM-kaart"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Lisage rohkem"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiilne andmeside"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Andmesideühendus mobiilsidevõrgu abil"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobiilsidevõrk"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Kasuta mobiilset andmesidet"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Kas lülitada mobiilne andmeside välja?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Valik on nõutav"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Kas kasutada op. <xliff:g id="CARRIER">%1$s</xliff:g> andmesidet?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> – andmemahu hoiatus"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> – andmemahu piirang"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> – andmemahu hoiatus / <xliff:g id="ID_2">^2</xliff:g> – andmemahu piirang"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d päeva jäänud</item>
- <item quantity="one">%d päev jäänud</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Jäänud on # päev}other{Jäänud on # päeva}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Rohkem aega pole jäänud"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Jäänud on vähem kui üks päev"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Operaator <xliff:g id="ID_1">^1</xliff:g> värskendas <xliff:g id="ID_2">^2</xliff:g> tagasi"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Määra"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Andmekasutuse hoiatus ja piirang"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Rakenduse andmekasutuse tsükkel"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobiilse andmeside kasutus"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Määra andmekasutuse hoiatus"</string>
<string name="data_warning" msgid="116776633806885370">"Andmekasutuse hoiatus"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Määra andmekasutuse piirang"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Kui määratud limiit on täis, lülitab sõiduki keskseade mobiilse andmeside välja.\n\nKuna andmekasutust mõõdab keskseade ja teie operaator võib kasutust teisiti arvestada, võiksite määrata konservatiivse limiidi."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Andmekasutuse hoiatuse määramine"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Andmekasutuse piirangu määramine"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Andmekasutust mõõdab teie seade. See võib teie mobiilioperaatori andmetest erineda."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Määra"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Salvesta"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-i võrk"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Sõiduki internetiühendus"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Sõiduki internetiühenduse väljalülitamine võib piirata sõiduki mõne funktsiooni või rakenduse tööd.\n\nKriitilisi andmeid, mis on vajalikud sõiduki juhtimiseks, jagatakse jätkuvalt sõiduki tootjaga."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Lülita ikkagi välja"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Sõiduki internetiühendus on välja lülitatud. See võib piirata sõiduki mõne funktsiooni või rakenduse tööd. Kriitilisi andmeid, mis on vajalikud sõiduki juhtimiseks, jagatakse jätkuvalt sõiduki tootjaga."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Vahemikus %2$s kuni %3$s kasutati %1$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Muu võrguga liitumine"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Võrgueelistused"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Lisa võrk"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Ühenda"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Ühendamine …"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Pole ühendatud"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Te ei ole võrgu levialas"</string>
<string name="wifi_password" msgid="5565632142720292397">"Parool"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Kuva parool"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Valige WiFi-kuumkohale vähemalt üks riba:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Kuumkoht ja jagamine"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Kuumkoht"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Väljas"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Lülita kuumkoht automaatselt välja"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Kui ükski seade pole ühendatud, lülitatakse WiFi-kuumkoht välja"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"Rakendus <xliff:g id="REQUESTER">%s</xliff:g> soovib WiFi sisse lülitada"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Sundpeata"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Kas sundpeatada?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Kui sundpeatate rakenduse, võib see toimida valesti."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Kas lülitada toimivuskaitse välja?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Sellised juhul ei pruugi teie tarkvara ja riistvara niisama hästi toimida."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Jäta sisselülitatuks"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Lülita välja"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Rakenduse toimivuse prioriseerim. sisse?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Selle sisselülitamine võib põhjustada ebastabiilsust süsteemis või pikaajaliselt riistvara mõjutada. Kas soovite jätkata?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Jah"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Tänan, ei"</string>
<string name="disable_text" msgid="4358165448648990820">"Keela"</string>
<string name="enable_text" msgid="1794971777861881238">"Luba"</string>
<string name="uninstall_text" msgid="277907956072833012">"Desinstalli"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Load"</string>
<string name="notifications_label" msgid="6586089149665170731">"Märguanded"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Salvestusruum ja vahemälu"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Tipptoimivuse tagamine"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Rakenduse toimivuse prioriseerimine"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versioon: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Lube pole antud"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Lube pole taotletud"</string>
<string name="unused_apps" msgid="648471933781010395">"Kasutamata rakendused"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kasutamata rakendust</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> kasutamata rakendus</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# kasutamata rakendus}other{# kasutamata rakendust}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Eemalda load ja vabasta ruumi"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s sisemist salvestusruumi"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Vajaduse korral sulgege rakendus, et vältida ressursside liigset kasutust"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Kasutab rakenduse toimivuse prioriseerimiseks süsteemi ressursse"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Andmekasutus"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Rakenduste andmekasutus"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Kasutuse ajalugu"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Kõik rakendused"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Andmeside ja WiFi kasutus"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Kasutuse ajalugu"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Kogukasutus"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Esiplaanil"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Taustal"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Luba andmeside"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Luba rakendusel kasutada mobiilset andmesidet"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Piira andmesidet"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Kasuta mobiilset andmesidet ainult esiplaanil"</string>
<string name="computing_size" msgid="5791407621793083965">"Arvutamine …"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> täiendavat luba</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> täiendav luba</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# lisaluba}other{# lisaluba}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Märkus. Pärast taaskäivitamist ei saa see rakendus käivituda enne, kui olete sõiduki avanud."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Abirakendus ja häälsisend"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Abirakendus"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"WiFi-seadete juhtimine lubab rakendusel WiFi sisse või välja lülitada, WiFi-võrke otsida ja nendega ühenduse luua, võrke lisada või eemaldada või kohaliku kuumkoha luua."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Rohkem"</string>
<string name="location_settings_title" msgid="901334356682423679">"Asukoht"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Asukoha kasutamine"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Anna valitud rakendustele juurdepääs asukohale"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Kui selle välja lülitate, eemaldatakse juurdepääs asukohale kõigi rakenduste jaoks. Juhiabirakendustel on siiski juurdepääs."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Juhiabifunkts. puhul asukoha kasutamine"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Sõiduki asukoht on välja lülitatud"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Juhiabirakendused ei pääse teie asukohale juurde."</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Muuda"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Anna juhiabirakendustele juurdepääs minu asukohale"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Kui selle välja lülitate, keelatakse juhiabifunktsioonid, mis kasutavad asukohateavet."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Lülita ikkagi välja"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Hiljutised asukohapäringud"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ühtegi hiljutist asukohapäringut pole"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Rakendusetasemel load"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Asukohateenused"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Asukoha kasutamine"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Funktsioon Asukoht võib teie seadme asukoha tuvastamiseks kasutada selliseid allikaid nagu GPS, WiFi- ja mobiilsidevõrgud ning andurid."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Juhiabifunktsioonid"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Juhiabirakendustele saadetav asukohateave ei sisalda teid tuvastavat teavet. See talletatakse maksimaalselt kaheks päevaks, pärast mida see kustutatakse."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Kasuta mikrofoni"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Andke kõigile rakendustele juurdepääs oma mikrofonile"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Mikrofoni lubade haldamine"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Hiljuti juurde pääsetud"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Hiljutisi rakendusi pole"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 rakendusel on juurdepääs"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# rakendusel {total_count}-st on juurdepääs}other{# rakendusel {total_count}-st on juurdepääs}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Hiljuti juurde pääsetud"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Kuva kõik"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Laadimine …"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Süsteem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Süsteemivärskendused"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Täpsemad"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Kolmanda osapoole litsentsid"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Litsentside laadimisega on probleem."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Laadimine …"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> toimingut veel ja olete arendaja.</item>
- <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> toiming veel ja olete arendaja.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{# toiming veel ja olete arendaja.}other{# toimingut veel ja olete arendaja.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Olete nüüd arendaja!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Ei ole vaja, olete juba arendaja."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Arendaja valikud"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Pärast uue profiili loomist saab kasutaja selle endale sobivaks kohandada."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Rakendusi saab värskendada mis tahes profiililt ja neid saavad kasutada kõik muud profiilid."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profiilide maksimaalne arv on täis"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Saate luua kuni <xliff:g id="COUNT">%d</xliff:g> profiili.</item>
- <item quantity="one">Luua saab ainult ühe profiili.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Luua saab ainult ühe profiili.}other{Luua saab ainult kuni # profiili.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Uut profiili ei õnnestunud luua"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Kas kustutada see profiil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Kõik selle profiili rakendused ja andmed kustutatakse"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profiili ei õnnestunud kustutada."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profiili ei kustutatud. Taaskäivitage seade ja proovige uuesti."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Profiili vahetamisel või sõiduki taaskäivitamisel see profiil kustutatakse"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Loobu"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Proovi uuesti"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Kuidas joonistada avamismustrit?"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Viga mustri salvestamisel"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Liiga palju valesid katseid. Proovige uuesti <xliff:g id="NUMBER">%d</xliff:g> sekundi pärast."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Muster ei toeta pöördvalijat, kasutage puudutust."</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Kas eemaldada ekraanilukk?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"See lubab igaühel teie kontole juurde pääseda"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"IT-administraator on levinud PIN-koodid blokeerinud. Proovige muud PIN-koodi."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"See ei tohi sisaldada sobimatut tähemärki."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Parool on sobimatu, peab olema vähemalt neli tähemärki."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Peab sisaldama vähemalt <xliff:g id="COUNT">%d</xliff:g> tähte</item>
- <item quantity="one">Peab sisaldama vähemalt 1 tähte</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Peab sisaldama vähemalt <xliff:g id="COUNT">%d</xliff:g> väiketähte</item>
- <item quantity="one">Peab sisaldama vähemalt 1 väiketähte</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Peab sisaldama vähemalt <xliff:g id="COUNT">%d</xliff:g> suurtähte</item>
- <item quantity="one">Peab sisaldama vähemalt 1 suurtähte</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Peab sisaldama vähemalt <xliff:g id="COUNT">%d</xliff:g> numbrit</item>
- <item quantity="one">Peab sisaldama vähemalt 1 numbrit</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Peab sisaldama vähemalt <xliff:g id="COUNT">%d</xliff:g> erisümbolit</item>
- <item quantity="one">Peab sisaldama vähemalt 1 erisümbolit</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Peab sisaldama vähemalt <xliff:g id="COUNT">%d</xliff:g> tähemärki, mis ei ole täht</item>
- <item quantity="one">Peab sisaldama vähemalt 1 tähemärki, mis ei ole täht</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Seadme administraator ei luba kasutada hiljutist parooli"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Viga parooli salvestamisel"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"IT-administraator on levinud paroolid blokeerinud. Proovige muud parooli."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Lisa profiil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Kustuta see profiil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Profiili lisamine"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Ekraanikuva heledus"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Oma seadmete nägemiseks lülitage Bluetooth sisse"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Seadme sidumiseks avage Bluetoothi seaded"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Teabe ja meelelahutuse süsteemi administraator"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktiveeritud rakendused"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Inaktiveeritud rakendused"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Selle loaga rakendustel on juurdepääs selle sõiduki andmetele"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Sõiduki administraatorirakendusi pole"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"See teabe ja meelelahutuse süsteemi administraatorirakendus on aktiivne ja lubab rakendusel <xliff:g id="APP_NAME">%1$s</xliff:g> teha järgmisi toiminguid."</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Selle teabe ja meelelahutuse süsteemi rakenduse aktiveerimisel lubatakse rakendusel <xliff:g id="APP_NAME">%1$s</xliff:g> teha järgmisi toiminguid:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Kas aktiveerida see rakendus?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktiveeri see teabe ja meelelahutuse süsteemi rakendus"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Inaktiveeri ja desinstalli"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Inaktiveeri see teabe ja meelelahutuse süsteemi rakendus"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Rohkem üksikasju"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Organisatsiooni haldur saab jälgida ning hallata selle profiiliga seotud rakendusi ja andmeid, sh seadeid, lube, ettevõtte juurdepääsu, võrgutegevusi ja sõiduki asukohateavet."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Organisatsiooni haldur saab jälgida ja hallata selle profiiliga seotud rakendusi ning andmeid, sh seadeid, lube, ettevõtte juurdepääsu, võrgutegevusi ja seadme asukohateavet."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Organisatsiooni haldur saab jälgida ja hallata selle teabe ja meelelahutuse süsteemiga seotud rakendusi ning andmeid, sh seadeid, lube, ettevõtte juurdepääsu, võrgutegevusi ja sõiduki asukohateavet."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Organisatsiooni haldur võib pääseda juurde selle teabe ja meelelahutuse süsteemiga seotud andmetele, hallata rakendusi ja muuta selle sõiduki seadeid."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"See pole saadaval"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Selles hallatud sõidukis ei saa helitugevust muuta"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Selles hallatud sõidukis ei saa kõnesid teha"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Selles hallatud sõidukis ei ole SMS-id lubatud"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Selles hallatud sõidukis ei ole kaamera saadaval"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Selles hallatud sõidukis ei saa ekraanipilte jäädvustada"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Seda rakendust ei saa selles hallatud sõidukis avada"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blokeeris teie krediidipakkuja"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Organisatsioon on juurdepääsu teatud funktsioonidele piiranud.\n\nKui teil on küsimusi, võtke ühendust organisatsiooni halduriga."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Sõiduki administraatorirakendused"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktiveeritud rakendus}other{# aktiveeritud rakendust}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Aktiveeritud rakendusi pole"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Organisatsiooni <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> sõiduki kasutamise eeskirjad"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Seadeid haldab organisatsiooni haldur"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Lisateave: <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Kas jagada veaaruannet?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Selle sõiduki organisatsiooni haldur taotles veaaruannet, mis aitaks seadmes vigu otsida. Rakendusi ja andmeid võidakse jagada."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Selle sõiduki organisatsiooni haldur taotles veaaruannet, mis aitaks seadmes vigu otsida. Rakendusi ja andmeid võidakse jagada ning see võib ajutiselt teie seadet aeglustada."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Veaaruannet jagatakse sõiduki organisatsiooni halduriga. Lisateabe saamiseks võtke nendega ühendust."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Jaga"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Keeldu"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Seda seadet ei saa praegu muuta"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Juurdepääsetavus"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Subtiitrid"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Subtiitrite eelistused"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Väljas"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Sees"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Ekraanilugeja"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Kuva subtiitrid"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Teksti suurus"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Subtiitrite suurus ja stiil"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Väga väike"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Väike"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Vaikeseade"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Suur"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Väga suur"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Subtiitri stiil"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Rakenduse määratud"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Valge mustal"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Must valgel"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Kollane mustal"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Kollane sinisel"</string>
</resources>
diff --git a/res/values-eu/arrays.xml b/res/values-eu/arrays.xml
index 3518809..faaa29b 100644
--- a/res/values-eu/arrays.xml
+++ b/res/values-eu/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ukatu beti"</item>
<item msgid="1154273129608299386">"Eman baimena beti"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 36fd19f..15b938d 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Gau modua"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Sareak eta Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Sare mugikorra"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM txartel</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM txartel</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktibo / SIM txartela"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inaktibo / SIM txartela"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktibo / Deskargatutako SIMa"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Gehitu beste batzuk"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Datu-konexioa"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Atzitu datuak datu-konexioaren bidez"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Sare mugikorra"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Erabili datu-konexioa"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Datu-konexioa desaktibatu nahi duzu?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Hautatu egin behar da"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"<xliff:g id="CARRIER">%1$s</xliff:g> erabili nahi duzu datu-konexiorako?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Datuen erabileraren abisua: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Datuen muga: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Datuen erabileraren abisua: <xliff:g id="ID_1">^1</xliff:g>. Datuen muga: <xliff:g id="ID_2">^2</xliff:g>."</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d egun gelditzen dira</item>
- <item quantity="one">%d egun gelditzen da</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# egun geratzen da}other{# egun geratzen dira}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Ez da gelditzen denborarik"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Egun bat baino gutxiago gelditzen da"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> operadoreak duela <xliff:g id="ID_2">^2</xliff:g> eguneratu du"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Ezarri"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Datuen erabileraren abisua eta muga"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Aplikazioetako datuen erabilera-zikloa"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Datu-konexioaren erabilera"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Ezarri datuen erabileraren abisua"</string>
<string name="data_warning" msgid="116776633806885370">"Datuen erabileraren abisua"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Ezarri datuen muga"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Ibilgailua ezarri duzun datuen mugara heltzen denean, ibilgailuaren unitate nagusiak datu-konexioa desaktibatuko du.\n\nIbilgailuaren unitate nagusiak datuen erabilera neurtzen du, baina baliteke operadoreak erabilera hori beste era batera neurtzea. Horregatik, muga zuhurra ezartzea gomendatzen dugu."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Ezarri datuen erabileraren abisua"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Ezarri datuen erabilera-muga"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Gailuak neurtzen du datu-konexioaren erabilera. Baliteke telefonia mugikorreko operadoreak eskainitako datu-konexioaren arabera aldatzea."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Ezarri"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Gorde"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM sarea"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Ibilgailuan dagoen Interneteko konexioa"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Ibilgailuan dagoen Interneteko konexioa desaktibatzen baduzu, baliteke ibilgailuko eginbide edo aplikazio batzuek ez funtzionatzea.\n\nIbilgailua gidatzeko behar diren funtsezko datuak haren fabrikatzailearekin partekatzen jarraituko da."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Desaktibatu, halere"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Ibilgailuan dagoen Interneteko konexioa desaktibatuta dago. Ondorioz, baliteke ibilgailuko eginbide edo aplikazio batzuek ez funtzionatzea. Ibilgailua gidatzeko behar diren funtsezko datuak haren fabrikatzailearekin partekatzen jarraituko da."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s erabili zen (%2$s - %3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Konektatu beste sare batera"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Sarearen hobespenak"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Gehitu sarea"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Konektatu"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Konektatzen…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Konektatu gabe"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Sarea urrunegi dago"</string>
<string name="wifi_password" msgid="5565632142720292397">"Pasahitza"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Erakutsi pasahitza"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Aukeratu gutxienez banda bat wifi-gunerako:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Wifi-gunea eta konexioa partekatzea"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Wifi-gunea"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Desaktibatuta"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Desaktibatu automatikoki wifi-gunea"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wifi-gunea desaktibatu egingo da ez badauka gailurik konektatuta"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> aplikazioak wifia aktibatu nahi du"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Behartu gelditzera"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Gelditzera behartu nahi duzu?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Aplikazioak gelditzera behartzen badituzu, baliteke behar bezala ez funtzionatzea."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Funtzionamenduaren babesa desaktibatu nahi duzu?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Aurrera eginez gero, baliteke softwareak edo hardwareak behar bezala ez funtzionatzea."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Utzi aktibatuta"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Desaktibatu"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Aplikazioen errendimendua lehenesteko eginbidea aktibatu nahi duzu?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Aktibatzen baduzu, baliteke sistema ezegonkortzea edo eginbideak epe luzerako eragina edukitzea hardwarean. Aurrera egin nahi duzu?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Bai"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ez, eskerrik asko"</string>
<string name="disable_text" msgid="4358165448648990820">"Desgaitu"</string>
<string name="enable_text" msgid="1794971777861881238">"Gaitu"</string>
<string name="uninstall_text" msgid="277907956072833012">"Desinstalatu"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Baimenak"</string>
<string name="notifications_label" msgid="6586089149665170731">"Jakinarazpenak"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Memoria eta cachea"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Ziurtatu errendimendu hoberena"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Lehenetsi aplikazioen errendimendua"</string>
<string name="application_version_label" msgid="8556889839783311649">"Bertsioa: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ez du baimenik"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ez da baimenik eskatu"</string>
<string name="unused_apps" msgid="648471933781010395">"Erabiltzen ez diren aplikazioak"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">Erabiltzen ez diren <xliff:g id="COUNT_1">%d</xliff:g> aplikazio</item>
- <item quantity="one">Erabiltzen ez den <xliff:g id="COUNT_0">%d</xliff:g> aplikazio</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{Erabiltzen ez den # aplikazio}other{Erabiltzen ez diren # aplikazio}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Kendu baimenak eta egin tokia"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s barneko memorian"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Behar izanez gero, itxi aplikazioa baliabide gehiegi erabiltzea saihesteko"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Sistemaren baliabideak erabiltzen ditu aplikazioen errendimendua lehenesteko"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Datuen erabilera"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Aplik. datuen erabilera"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Erabileraren historia"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Aplikazio guztiak"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Datu- eta wifi-konexioen erabilera"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Erabileraren historia"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Erabilera, guztira"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Aurreko planoan dagoenean"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Atzeko planoan dagoenean"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Eman datu-konexioa erabiltzeko baimena"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Eman datu-konexioa erabiltzeko baimena aplikazioari"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Mugatu datu-konexioa"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Erabili datu-konexioa aplikazioa aurreko planoan dagoenean soilik"</string>
<string name="computing_size" msgid="5791407621793083965">"Kalkulatzen…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> baimen gehigarri</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> baimen gehigarri</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# baimen gehigarri}other{# baimen gehigarri}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Oharra: berrabiarazi ondoren, ezin izango da abiarazi aplikazio hau ibilgailua desblokeatzen duzun arte."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Laguntza eta ahozko idazketa"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Laguntza-aplikazioa"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wifi-konexioa kontrolatzeko aukerarekin, aplikazioak hauek egin ditzake: wifi-konexioa aktibatu edo desaktibatu, wifi-sareak bilatu eta haietara konektatu, sareak gehitu edo kendu, edota wifi-gune lokalak sortu."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Gehiago"</string>
<string name="location_settings_title" msgid="901334356682423679">"Kokapena"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Erabili kokapena"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Eman kokapena atzitzeko baimena zehazten dituzun aplikazioei"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Aukera hau desaktibatuz gero, kokapena atzitzeko baimena kenduko zaie aplikazio guztiei. Alabaina, gidatzeko laguntzarekin erlazionatutako aplikazioek kokapena atzitzen jarraitu ahalko dute."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Gidatzeko laguntza abian denean, erabili kokapena"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Ibilgailuaren kokapena desaktibatuta dago"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Gidatzeko laguntzarekin erlazionatutako aplikazioek ezin dute atzitu kokapena"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Aldatu"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Eman kokapena atzitzeko baimena gidatzeko laguntza ematen duten aplikazioei"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Aukera hau desaktibatuz gero, kokapenari buruzko informazioa erabiltzen duten gidatzeko laguntzarekin erlazionatutako aplikazioak desgaituko dira."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Desaktibatu, halere"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Azken kokapen-eskaerak"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ez da egin kokapen-eskaerarik azkenaldian"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Aplikazio-mailako baimenak"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Kokapen-zerbitzuak"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Erabili kokapena"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Gailuaren kokapena zehazteko, GPSa, wifi-sarea, sare mugikorrak, sentsoreak eta antzeko iturburuak erabiltzen ditu kokapenaren eginbideak."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Gidatzeko laguntza"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Gidatzeko laguntzarekin erlazionatutako aplikazioei bidaltzen zaien kokapen-informazioak ez dauka identifikatzen zaituen informaziorik. Gehienez bi egunean gordetzen da. Gero, ezabatu egiten da."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofonoa"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Erabili mikrofonoa"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Eman mikrofonoa atzitzeko baimena aplikazio guztiei"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Kudeatu mikrofonoaren baimenak"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Berriki mikrofonoa atzitu dutenak"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Ez dago azkenaldian atzitutako aplikaziorik"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Ez dago sarbidea duen aplikaziorik"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{#/{total_count} aplikaziok du sarbidea}other{#/{total_count} aplikaziok dute sarbidea}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Berriki mikrofonoa atzitu dutenak"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Ikusi guztiak"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Kargatzen…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Sistemaren eguneratzeak"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Aurreratuak"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Hirugarrenen lizentziak"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Arazo bat izan da lizentziak kargatzean."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Kargatzen…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> urrats falta zaizkizu garatzaile izateko.</item>
- <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> urrats falta zaizu garatzaile izateko.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{# urrats falta zaizu garatzaile izateko.}other{# urrats falta zaizkizu garatzaile izateko.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Garatzailea zara!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Ez dago zertan, dagoeneko zara garatzaile."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Garatzaileentzako aukerak"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Zuk profil berria sortu ondoren, erabiltzaileak berak pertsonalizatu beharko luke."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Edozein profilek egunera ditzake aplikazioak, beste profil guztiek erabiltzeko."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profilen mugara iritsi zara"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> profil sor ditzakezu gehienez.</item>
- <item quantity="one">Profil bakarra sor daiteke.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Profil bakarra sor dezakezu.}other{# profil sor ditzakezu gehienez.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Ezin izan da sortu profil berria"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Profila ezabatu nahi duzu?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Profileko aplikazio eta datu guztiak ezabatuko dira"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Ezin izan da ezabatu profila."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Ez da ezabatu profila. Berrabiarazi gailua eta saiatu berriro."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Profila aldatzen duzunean edo ibilgailua berriro abiarazten duzunean ezabatuko da profila."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Baztertu"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Saiatu berriro"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Desblokeatzeko eredu bat nola marraztu"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Errore bat gertatu da eredua gordetzean"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Saiakera oker gehiegi egin dituzu. Saiatu berriro <xliff:g id="NUMBER">%d</xliff:g> segundo barru."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Ezin da erabili biratze bidezko idazketa; erabili ukipen-keinuak"</string>
<string name="okay" msgid="4589873324439764349">"Ados"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Pantailaren blokeoa kendu?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Edonork atzitu ahalko du zure kontua"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"IKT administratzaileak blokeatu egiten ditu asmatzen errazak diren PIN kodeak. Erabili beste PIN bat."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Ezin da erabili onartzen ez den karaktererik."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Pasahitzak ez du balio; lau karaktere izan behar ditu gutxienez."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Gutxienez <xliff:g id="COUNT">%d</xliff:g> hizki izan behar ditu</item>
- <item quantity="one">Gutxienez 1 hizki izan behar du</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Gutxienez <xliff:g id="COUNT">%d</xliff:g> minuskula izan behar ditu</item>
- <item quantity="one">Gutxienez 1 minuskula izan behar du</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Gutxienez <xliff:g id="COUNT">%d</xliff:g> maiuskula izan behar ditu</item>
- <item quantity="one">Gutxienez 1 maiuskula izan behar du</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Gutxienez <xliff:g id="COUNT">%d</xliff:g> zenbaki izan behar ditu</item>
- <item quantity="one">Gutxienez 1 zenbaki izan behar du</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Gutxienez <xliff:g id="COUNT">%d</xliff:g> karaktere berezi izan behar ditu</item>
- <item quantity="one">Gutxienez 1 karaktere berezi izan behar du</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Gutxienez, hizkiak ez diren <xliff:g id="COUNT">%d</xliff:g> karaktere izan behar ditu</item>
- <item quantity="one">Gutxienez, hizkia ez den 1 karaktere izan behar du</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Gailuaren administratzaileak ez du eman beste pasahitz bat erabiltzeko baimenik"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Errore bat gertatu da pasahitza gordetzean"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"IKT administratzaileak blokeatu egiten ditu asmatzen errazak diren pasahitzak. Erabili beste pasahitz bat."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Gehitu profil bat"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Ezabatu profila"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Gehitu profila"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Bistaratu distira"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Aktibatu Bluetooth-a gailuak ikusteko"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Ireki Bluetooth-aren ezarpenak gailu batekin parekatzeko"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Informazio- eta aisia-sistemaren administratzailea"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktibatutako aplikazioak"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Desaktibatutako aplikazioak"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Baimen hau duten aplikazioek ibilgailuaren datuetarako sarbidea dute"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Ez dago ibilgailua administratzeko aplikaziorik"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Informazio- eta aisia-sistemaren administratzailearen aplikazio hau aktibo dago eta eragiketa hauek egiteko baimena ematen dio <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Informazio- eta aisia-sistemaren aplikazio hau aktibatzen baduzu, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak eragiketa hauek egiteko baimena izango du:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Informazio- eta aisia-sistemaren aplikazioa aktibatu nahi duzu?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktibatu informazio- eta aisia-sistemaren aplikazioa"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Desaktibatu eta desinstalatu"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Desaktibatu informazio- eta aisia-sistemaren aplikazioa"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Xehetasun gehiago"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Erakundearen kudeatzaileak profilarekin erlazionatutako aplikazioak eta datuak gainbegiratu eta kudea ditzake; besteak beste, ezarpenak, baimenak, enpresen sarbide-maila, sareko jarduerak eta ibilgailuaren kokapenari buruzko informazioa."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Erakundearen kudeatzaileak profilarekin erlazionatutako aplikazioak eta datuak gainbegiratu eta kudea ditzake; besteak beste, ezarpenak, baimenak, enpresen sarbide-maila, sareko jarduerak eta gailuaren kokapenari buruzko informazioa."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Erakundearen kudeatzaileak informazio- eta aisia-sistemarekin erlazionatutako aplikazioak eta datuak gainbegiratu eta kudea ditzake; besteak beste, ezarpenak, baimenak, enpresen sarbide-maila, sareko jarduerak eta ibilgailuaren kokapenari buruzko informazioa."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Baliteke erakundearen kudeatzaileak informazio- eta aisia-sistemarekin erlazionatutako datuak atzitu, aplikazioak kudeatu eta ibilgailuaren ezarpenak aldatu ahal izatea."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Ez dago erabilgarri"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Ezin da aldatu bolumena kudeatutako ibilgailu honetan"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Ezin da egin deirik kudeatutako ibilgailu honetan"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Ezin da bidali SMSrik kudeatutako ibilgailu honetan"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera ez dago erabilgarri kudeatutako ibilgailu honetan"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Ezin da atera pantaila-argazkirik kudeatutako ibilgailu honetan"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Ezin da ireki aplikazioa kudeatutako ibilgailu honetan"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Kreditu bidezko gailu-hornitzaileak blokeatu du"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Erakundeak mugatuta dauka eginbide batzuetarako sarbidea.\n\nGalderarik izanez gero, jarri erakundearen kudeatzailearekin harremanetan."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Ibilgailu-administratzailearen aplikazioak"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aplikazio aktibatu}other{# aplikazio aktibatu}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Ez dago aplikaziorik aktibatuta"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> markako ibilgailuen gidalerroak"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Erakundearen kudeatzaileak kudeatutako ezarpenak"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Lortu informazio gehiago <xliff:g id="SERVICE">%1$s</xliff:g> eginbideari buruz"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Akatsen txostena partekatu nahi duzu?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Ibilgailuaren erakundearen kudeatzaileak akatsen txosten bat eskatu du gailuko arazoa konpontzeko. Baliteke aplikazioak eta datuak partekatzea."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Ibilgailuaren erakundearen kudeatzaileak akatsen txosten bat eskatu du gailuko arazoa konpontzeko. Baliteke aplikazioak eta datuak partekatzea, eta gailua motelago ibiltzea aldi batez."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Ibilgailuaren erakundearen kudeatzailearekin partekatu dugu akatsen txostena. Xehetasun gehiago lortzeko, jarri harekin harremanetan."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Partekatu"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Baztertu"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Une honetan ezin da aldatu ezarpena"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Erabilerraztasuna"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Azpitituluak"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Azpitituluen hobespenak"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Desaktibatuta"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Aktibatuta"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Pantaila-irakurgailua"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Erakutsi azpitituluak"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Testuaren tamaina"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Azpitituluen tamaina eta estiloa"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Oso txikia"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Txikia"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Lehenetsia"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Handia"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Oso handia"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Azpitituluen estiloa"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Aplikazioak ezarritakoa"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Zuria beltzaren gainean"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Beltza zuriaren gainean"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Horia beltzaren gainean"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Horia urdinaren gainean"</string>
</resources>
diff --git a/res/values-fa/arrays.xml b/res/values-fa/arrays.xml
index 8a70b92..20a85d1 100644
--- a/res/values-fa/arrays.xml
+++ b/res/values-fa/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"همیشه غیرمجاز"</item>
<item msgid="1154273129608299386">"همیشه مجاز"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 1cc72bd..7f52cba 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"حالت شب"</string>
<string name="network_and_internet" msgid="4229023630498537530">"شبکه و اینترنت"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"شبکه تلفن همراه"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> سیمکارت</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> سیمکارت</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# سیمکارت}one{# سیمکارت}other{# سیمکارت}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"فعال / سیمکارت"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"غیرفعال / سیمکارت"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"فعال / سیمکارت بارگیریشده"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"افزودن موارد بیشتر"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"داده تلفن همراه"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"دسترسی به دادهها با استفاده از شبکه تلفن همراه"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"شبکه تلفن همراه"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"استفاده از داده تلفن همراه"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"داده تلفن همراه خاموش شود؟"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"انتخاب ضروری است"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"استفاده از <xliff:g id="CARRIER">%1$s</xliff:g> برای داده همراه؟"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> هشدار داده"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> محدودیت داده"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> هشدار داده / <xliff:g id="ID_2">^2</xliff:g> محدودیت داده"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d روز باقیمانده است</item>
- <item quantity="other">%d روز باقیمانده است</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# روز باقی مانده است}one{# روز باقی مانده است}other{# روز باقی مانده است}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"هیچ زمانی باقی نمانده است"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"کمتر از ۱ روز باقی مانده است"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> قبل <xliff:g id="ID_1">^1</xliff:g> بهروزرسانی کرد"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"تنظیم"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"محدودیت و هشدار داده"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"دوره مصرف داده برنامه"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"مصرف داده تلفن همراه"</string>
<string name="set_data_warning" msgid="6628236612886588097">"تنظیم هشدار داده"</string>
<string name="data_warning" msgid="116776633806885370">"هشدار داده"</string>
<string name="set_data_limit" msgid="7136539812414500084">"تنظیم محدودیت داده"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"وقتی داده تلفن همراهتان به محدودیتی که تنظیم کردهاید برسد، سیستم صوتی خودروی شما خاموش خواهد شد.\n\nاز آنجاییکه سیستم صوتی شما مصرف داده را محاسبه میکند و ممکن است شرکت مخابراتیتان مصرف داده را به روش دیگری محاسبه کند، سعی کنید محدودیت محافظهکارانهای تنظیم کنید."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"تنظیم هشدار مصرف داده"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"تنظیم حد مصرف داده"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"دستگاهتان میزان مصرف داده را اندازهگیری میکند. این میزان ممکن است با میزانی که شرکت مخابراتی تلفن همراهتان اندازهگیری میکند متفاوت باشد."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"تنظیم کردن"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"ذخیره"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"شبکه OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"اینترنت خودرو"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"اگر اینترنت خودرو خاموش شود، ممکن است برخیاز برنامهها یا ویژگیهای خودرو کار نکنند.\n\nدادههای مهمی که برای عملکرد خودرو ضروری هستند همچنان با سازنده خودرو همرسانی خواهند شد."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"درهرصورت خاموش شود"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"اینترنت خودرو خاموش است. این موضوع ممکن است برخیاز برنامهها یا ویژگیهای خودرو را از کار بیندازد. دادههای مهمی که برای عملکرد خودرو ضروری هستند همچنان با سازنده خودرو همرسانی خواهند شد."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s مصرف داده از %2$s تا %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"پیوستن به شبکهای دیگر"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"اولویتهای شبکه"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"افزودن شبکه"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"اتصال"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"درحال اتصال…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"متصل نیست"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"شبکه در محدوده نیست"</string>
<string name="wifi_password" msgid="5565632142720292397">"گذرواژه"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"نمایش گذرواژه"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"حداقل یک باند برای نقطه اتصال Wi‑Fi انتخاب کنید:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"نقطه اتصال و اشتراکگذاری اینترنت"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"نقطه اتصال"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"خاموش"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"خاموش شدن خودکار نقطه اتصال"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"اگر دستگاهی متصل نباشد، نقطه اتصال Wi‑Fi خاموش خواهد شد"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> میخواهد Wi-Fi را روشن کند"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"توقف اجباری"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"توقف اجباری؟"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"توقف اجباری یک برنامه ممکن است باعث عملکرد نادرست آن شود."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"محافظت از عملکرد خاموش شود؟"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"اگر این کار را انجام دهید، ممکن است نرمافزار و سختافزارتان هم دیگر کار نکنند."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"روشن بماند"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"خاموش شود"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"اولویتبندی عملکرد برنامه روشن شود؟"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"خاموش کردن آن میتواند منجر به ناپایداری احتمالی سیستم یا تأثیرات سختافزاری بلندمدت شود. میخواهید ادامه دهید؟"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"بله"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"نه متشکرم"</string>
<string name="disable_text" msgid="4358165448648990820">"غیرفعال کردن"</string>
<string name="enable_text" msgid="1794971777861881238">"فعال کردن"</string>
<string name="uninstall_text" msgid="277907956072833012">"حذف نصب"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"مجوزها"</string>
<string name="notifications_label" msgid="6586089149665170731">"اعلانها"</string>
<string name="storage_application_label" msgid="5911779903670978586">"فضای ذخیرهسازی و حافظه پنهان"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"تضمین عملکرد بهینه"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"اولویتبندی عملکرد برنامه"</string>
<string name="application_version_label" msgid="8556889839783311649">"نسخه: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"اجازهای داده نشده"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"اجازهای درخواست نشده"</string>
<string name="unused_apps" msgid="648471933781010395">"برنامههای استفادهنشده"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> برنامه استفادهنشده</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> برنامه استفادهنشده</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# برنامه استفادهنشده}one{# برنامه استفادهنشده}other{# برنامه استفادهنشده}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"برداشتن اجازهها و آزاد کردن فضا"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s در حافظه داخلی"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"درصورت لزوم، برنامه برای جلوگیری از استفاده بیشازحد از منابع بسته میشود"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"از منابع سیستم برای اولویتبندی عملکرد برنامه استفاده میکند"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"مصرف داده"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"مصرف داده برنامه"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"سابقه مصرف"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"همه برنامهها"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"مصرف داده و Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"سابقه مصرف"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"میزان کل مصرف"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"پیشنما"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"پسزمینه"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"مجاز کردن داده"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"این برنامه میتواند از داده تلفن همراه استفاده کند"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"محدود کردن داده"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"فقط در پیشنما میتواند از داده همراه استفاده کند"</string>
<string name="computing_size" msgid="5791407621793083965">"درحال محاسبه..."</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> اجازه تکمیلی</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> اجازههای تکمیلی</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# مجوز اضافی}one{# مجوز اضافی}other{# مجوز اضافی}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"توجه: پس از راهاندازی مجدد، تا قفل وسیلهتان را باز نکنید، این برنامه نمیتواند شروع به کار کند."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"همیار و ورودی گفتاری"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"برنامه همیار"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"کنترل Wi-Fi به برنامه اجازه میدهد Wi-Fi را روشن یا خاموش کند، شبکههای Wi-Fi را اسکن کند و به آنها متصل شود، شبکهها را اضافه یا حذف کند یا نقطه اتصالی فقط محلی راهاندازی کند."</string>
<string name="more_special_access_title" msgid="166115485446645971">"بیشتر"</string>
<string name="location_settings_title" msgid="901334356682423679">"مکان"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"استفاده از مکان"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"به برنامههای انتخابیتان اجازه دسترسی به مکان داده میشود"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"اگر این ویژگی را خاموش کنید، دسترسی به مکان را برای همه برنامه حذف خواهد کرد. برنامههای «دستیار راننده» همچنان دسترسی خواهند داشت."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"استفاده از مکان برای «دستیار راننده»"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"مکان خودرو خاموش است"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"برنامههای «دستیار راننده» نمیتوانند به مکانتان دسترسی پیدا کنند"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"تغییر"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"به برنامههای یاریرسان رانندگی اجازه دسترسی به مکان داده میشود"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"اگر این تنظیم را خاموش کنید، برنامههای «دستیار راننده» که بر اطلاعات مکان متکیاند غیرفعال خواهد شد."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"درهرصورت خاموش شود"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"درخواستهای اخیر مکان"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"درخواست مکان جدیدی وجود ندارد"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"اجازههای سطح برنامه"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"خدمات مکان"</string>
<string name="location_use_location_title" msgid="117735895374606680">"استفاده از مکان"</string>
<string name="location_settings_footer" msgid="296892848338100051">"«مکان» ممکن است برای تخمین مکان دستگاهتان از منابعی مانند GPS، Wi-Fi، شبکه تلفن همراه و حسگرها استفاده کند."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"دستیار راننده"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"اطلاعات مکان ارسالشده به برنامههای «دستیار راننده» حاوی اطلاعات شناساننده هویت شما نیستند. این اطلاعات حداکثر ۲ روز ذخیره میمانند و بعداز آن حذف میشوند."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"میکروفون"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"استفاده از میکروفون"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"همه برنامهها مجاز میشوند به میکروفون دسترسی داشته باشند"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"مدیریت مجوزهای میکروفون"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"برنامههایی که اخیراً دسترسی داشتهاند"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"هیچ برنامه جدیدی موجود نیست"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"هیچ برنامهای دسترسی ندارد"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# برنامه از {total_count} برنامه دسترسی دارد}one{# برنامه از {total_count} برنامه دسترسی دارد}other{# برنامه از {total_count} برنامه دسترسی دارد}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"برنامههایی که اخیراً دسترسی داشتهاند"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"نمایش همه"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"درحال بارگیری…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"سیستم"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"بهروزرسانیهای سیستم"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"پیشرفته"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"مجوزهای شخص ثالث"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"مشکلی در بارگیری مجوزها وجود دارد."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"درحال بار کردن…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">اکنون <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> قدم تا برنامهنویس شدن فاصله دارید.</item>
- <item quantity="other">اکنون <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> قدم تا برنامهنویس شدن فاصله دارید.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{اکنون # گام تا توسعهدهنده شدن فاصله دارید.}one{اکنون # گام تا توسعهدهنده شدن فاصله دارید.}other{اکنون # گام تا توسعهدهنده شدن فاصله دارید.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"شما اکنون یک برنامهنویس هستید!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"نیازی نیست، شما اکنون برنامهنویس هستید."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"گزینههای تولیدکننده"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"بعداز اینکه نمایه جدیدی ایجاد کردید، آن فرد باید نمایه را برای خودش سفارشی کند."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"هر نمایهای میتواند برنامهها را برای استفاده همه نمایههای دیگر بهروزرسانی کند."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"تعداد نمایه به حد مجاز رسیده است"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">حداکثر <xliff:g id="COUNT">%d</xliff:g> نمایه میتوانید ایجاد کنید.</item>
- <item quantity="other">حداکثر <xliff:g id="COUNT">%d</xliff:g> نمایه میتوانید ایجاد کنید.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{فقط یک نمایه میتوانید ایجاد کنید.}one{حداکثر # نمایه میتوانید ایجاد کنید.}other{حداکثر # نمایه میتوانید ایجاد کنید.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"نمایه جدید ایجاد نشد"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"این نمایه حذف شود؟"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"همه برنامهها و دادههای این نمایه حذف خواهند شد"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"نمایه حذف نشد."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"نمایه حذف نشد. میتوانید دستگاه را بازراهاندازی و دوباره امتحان کنید."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"وقتی به نمایه دیگری بروید یا خودرو را بازراهاندازی کنید، این نمایه حذف خواهد شد."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"نپذیرفتن"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"امتحان مجدد"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"نحوه ترسیم الگوی بازگشایی قفل"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"خطای ذخیره الگو"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"تلاشهای نادرست زیادی انجام شده است. <xliff:g id="NUMBER">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"الگو از چرخش پشتیبانی نمیکند، لطفاً از لمس کردن استفاده کنید"</string>
<string name="okay" msgid="4589873324439764349">"تأیید"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"قفل صفحه برداشته شود؟"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"این کار به همه افراد اجازه میدهد به حسابتان دسترسی پیدا کنند"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"پینهای رایج توسط سرپرست سیستمتان شما مسدود شدهاند. پین متفاوتی را امتحان کنید."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"نمیتواند نویسه نامعتبر داشته باشد."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"گذرواژه نامعتبر است، گذرواژه باید حداقل ۴ نویسه داشته باشد."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">باید حداقل <xliff:g id="COUNT">%d</xliff:g> حرف داشته باشد</item>
- <item quantity="other">باید حداقل <xliff:g id="COUNT">%d</xliff:g> حرف داشته باشد</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">باید حداقل <xliff:g id="COUNT">%d</xliff:g> حرف کوچک داشته باشد</item>
- <item quantity="other">باید حداقل <xliff:g id="COUNT">%d</xliff:g> حرف کوچک داشته باشد</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">باید حداقل <xliff:g id="COUNT">%d</xliff:g> حرف بزرگ داشته باشد</item>
- <item quantity="other">باید حداقل <xliff:g id="COUNT">%d</xliff:g> حرف بزرگ داشته باشد</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">باید حداقل <xliff:g id="COUNT">%d</xliff:g> عدد داشته باشد</item>
- <item quantity="other">باید حداقل <xliff:g id="COUNT">%d</xliff:g> عدد داشته باشد</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">باید حداقل <xliff:g id="COUNT">%d</xliff:g> نماد ویژه داشته باشد</item>
- <item quantity="other">باید حداقل <xliff:g id="COUNT">%d</xliff:g> نماد ویژه داشته باشد</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">باید حداقل <xliff:g id="COUNT">%d</xliff:g> نویسه غیرحرف داشته باشد</item>
- <item quantity="other">باید حداقل <xliff:g id="COUNT">%d</xliff:g> نویسه غیرحرف داشته باشد</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"سرپرست دستگاه اجازه استفاده از گذرواژه اخیر را نمیدهد"</string>
<string name="error_saving_password" msgid="8334882262622500658">"خطای ذخیره گذرواژه"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"گذرواژههای رایج توسط سرپرست سیستمتان مسدود شدهاند. گذرواژه متفاوتی را امتحان کنید."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"افزودن یک نمایه"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"حذف کردن این نمایه"</string>
<string name="add_profile_text" msgid="9118410102199116969">"افزودن نمایه"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"روشنایی نمایشگر"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"برای دیدن دستگاهها، بلوتوث را روشن کنید"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"برای مرتبط کردن دستگاه، تنظیمات بلوتوث را باز کنید"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"سرپرست سیستم اطلاعات-سرگرمی"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"برنامههای فعال"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"برنامههای غیرفعال"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"برنامههایی که این اجازه را داشته باشند به دادههای این خودرو دسترسی دارند"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"هیچ برنامهای برای سرپرست خودرو وجود ندارد"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"این برنامه سرپرست سیستم اطلاعات-سرگرمی فعال است و به برنامه <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه میدهد عملکردهای زیر را انجام دهد:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"فعال کردن این برنامه سیستم اطلاعات-سرگرمی به برنامه <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه میدهد عملکردهای زیر را انجام دهد:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"برنامه سیستم اطلاعات-سرگرمی فعال شود؟"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"فعال کردن این برنامه سیستم اطلاعات-سرگرمی"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"غیرفعال کردن و حذف کردن نصب"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"غیرفعال کردن این برنامه سیستم اطلاعات-سرگرمی"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"جزئیات بیشتر"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"مدیر سازمان میتواند بر برنامهها و دادههای مرتبط با این نمایه، ازجمله تنظیمات، اجازهها، دسترسی شرکتی، فعالیت شبکه، و اطلاعات مکان خودرو نظارت داشته باشد و آنها را مدیریت کند."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"مدیر سازمان میتواند بر برنامهها و دادههای مرتبط با این نمایه، ازجمله تنظیمات، اجازهها، دسترسی شرکتی، فعالیت شبکه، و اطلاعات مکان دستگاه نظارت داشته باشد و آنها را مدیریت کند."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"مدیر سازمان میتواند بر برنامهها و دادههای مرتبط با این سیستم اطلاعات-سرگرمی، ازجمله تنظیمات، اجازهها، دسترسی شرکتی، فعالیت شبکه، و اطلاعات مکان خودرو نظارت داشته باشد و آنها را مدیریت کند."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"مدیر سازمان ممکن است بتواند به دادههای مرتبط با این سیستم اطلاعات-سرگرمی دسترسی داشته باشد، برنامهها را مدیریت کند، و تنظیمات این خودرو را تغییر دهد."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"دردسترس نیست"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"نمیتوانید میزان صدا را در این خودروی تحتمدیریت تغییر دهید"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"نمیتوانید در این خودروی تحتمدیریت تماس برقرار کنید"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"پیامک در این خودروی تحتمدیریت مجاز نیست"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"دوربین در این خودروی تحتمدیریت دردسترس نیست"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"در این خودروی تحتمدیریت نمیتوانید نماگرفت بگیرید"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"نمیتوانید این برنامه را در این خودروی تحتمدیریت باز کنید"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"ارائهدهنده اعتبارتان آن را مسدود کرده است"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"سازمانتان دسترسی به برخیاز ویژگیها را محدود کرده است.\n\nاگر سؤالی دارید، با مدیر سازمان تماس بگیرید."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"برنامههای سرپرست خودرو"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# برنامه فعال}one{# برنامه فعال}other{# برنامه فعال}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"برنامه فعالی وجود ندارد"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"خطمشی وسیله نقلیه <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"تنظیمات تحتکنترل مدیر سازمان"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"درباره <xliff:g id="SERVICE">%1$s</xliff:g> بیشتر بدانید"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"گزارش اشکال بهاشتراک گذاشته شود؟"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"مدیر سازمان این خودرو برای کمک به عیبیابی این دستگاه، گزارش اشکال درخواست کرده است. ممکن است برنامهها و دادهها همرسانی شود."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"مدیر سازمان این خودرو برای کمک به عیبیابی این دستگاه، گزارش اشکال درخواست کرده است. ممکن است برنامهها و دادهها همرسانی شود و سرعت دستگاهتان موقتاً کاهش یابد."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"این گزارش اشکال درحال همرسانی با مدیر سازمان این خودرو است. برای جزئیات بیشتر با او تماس بگیرید."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"همرسانی"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"رد کردن"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"درحالحاضر نمیتوان این تنظیم را تغییر داد"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"دسترسپذیری"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"زیرنویس ناشنوایان"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"اولویتهای زیرنویس ناشنوایان"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"خاموش"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"روشن"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"صفحهخوان"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"نشان دادن زیرنویس ناشنوایان"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"اندازه متن"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"اندازه و سبک زیرنویس"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"بسیار کوچک"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"کوچک"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"پیشفرض"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"بزرگ"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"بسیار بزرگ"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"سبک زیرنویس"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"تنظیمشده توسط برنامه"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"سفید در سیاه"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"سیاه در سفید"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"زرد در سیاه"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"زرد در آبی"</string>
</resources>
diff --git a/res/values-fi/arrays.xml b/res/values-fi/arrays.xml
index c6fe33b..a203615 100644
--- a/res/values-fi/arrays.xml
+++ b/res/values-fi/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Älä salli koskaan"</item>
<item msgid="1154273129608299386">"Salli aina"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index a5e8c24..4b2c20a 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Yötila"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Verkko ja internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobiiliverkko"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-korttia</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM-kortti</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-kortti}other{# SIM-korttia}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktiivinen / SIM-kortti"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Ei-aktiivinen / SIM-kortti"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktiivinen / Ladattu SIM-kortti"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Lisää"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiilidata"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Käytä mobiiliverkon dataa"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobiiliverkko"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Käytä mobiilidataa"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Laitetaanko mobiilidata pois päältä?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Valinta on pakollinen"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Käytetäänkö mobiilidataa (<xliff:g id="CARRIER">%1$s</xliff:g>)?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Datavaroitus <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Dataraja <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Datavaroitus <xliff:g id="ID_1">^1</xliff:g> / Dataraja <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d päivää jäljellä</item>
- <item quantity="one">%d päivä jäljellä</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# päivä jäljellä}other{# päivää jäljellä}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Ei aikaa jäljellä"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Alle 1 päivä jäljellä"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> asensi päivityksen <xliff:g id="ID_2">^2</xliff:g> sitten"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Määritä"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Datavaroitus ja käyttöraja"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Sovellustietojen käyttösykli"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobiilidatan käyttö"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Aseta datankäyttövaroitus"</string>
<string name="data_warning" msgid="116776633806885370">"Datavaroitus"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Aseta dataraja"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Pääyksikkö poistaa mobiilidatan käytöstä, kun asetettu raja saavutetaan.\n\nPääyksikkö mittaa tiedonsiirron. Operaattorisi voi kuitenkin käyttää eri mittaustapaa, joten suosittelemme määrittämään rajan todellista ylärajaa tiukemmaksi."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Aseta datankäyttövaroitus"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Aseta datankäyttöraja"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Laitteesi mittaa datan käyttöä. Mittaustulos voi olla erilainen kuin mobiilioperaattorilla."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Aseta"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Tallenna"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-verkko"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Ajoneuvon internet"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Jos ajoneuvon internet on poissa päältä, osa ominaisuuksista tai sovelluksista ei ehkä toimi.\n\nAjoneuvon valmistajalle jaetaan jatkossakin tärkeää dataa, jota ajoneuvon toiminta edellyttää."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Laita pois päältä"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Ajoneuvon internetyhteys on poissa päältä. Tämä voi estää joitakin ominaisuuksia tai sovelluksia toimimasta. Ajoneuvon valmistajalle jaetaan jatkossakin tärkeää dataa, jota ajoneuvon toiminta edellyttää."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s käytetty (%2$s – %3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Liity toiseen verkkoon"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Verkkoasetukset"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Lisää verkko"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Yhdistä"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Yhdistetään…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Ei yhdistetty"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Verkko ei ole kantoalueella"</string>
<string name="wifi_password" msgid="5565632142720292397">"Salasana"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Näytä salasana"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Valitse väh. yksi kaista Wi‑Fi-hotspotille:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot ja yhteyden jako"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Poissa päältä"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Laita hotspot pois päältä automaattisesti"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi-hotspot poistetaan käytöstä, jos laitteita ei ole yhdistetty"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> haluaa käynnistää Wi-Fin"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Pakota sulkeutumaan"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Pakotetaanko sulkeutumaan?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Jos pakotat sovelluksen sulkeutumaan, se ei välttämättä enää toimi oikein."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Laitetaanko suorituskyvyn suojaus pois?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Jos valitset tämän, ohjelmisto ja laitteisto eivät ehkä toimi yhtä hyvin."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Pidä päällä"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Laita pois päältä"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Laitetaanko päälle sovelluksen suorituskyvyn priorisointi?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Päälle laittaminen saattaa aiheuttaa järjestelmän epävakautta tai pitkäaikaisia laitteistovaikutuksia. Haluatko jatkaa?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Kyllä"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ei kiitos"</string>
<string name="disable_text" msgid="4358165448648990820">"Poista käytöstä"</string>
<string name="enable_text" msgid="1794971777861881238">"Käytä"</string>
<string name="uninstall_text" msgid="277907956072833012">"Poista"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Luvat"</string>
<string name="notifications_label" msgid="6586089149665170731">"Ilmoitukset"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Tallennustila ja välimuisti"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Huippusuorituskyky"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Priorisoi sovelluksen suorituskykyä"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versio: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Käyttöoikeuksia ei ole myönnetty."</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Käyttöoikeuksia ei ole pyydetty."</string>
<string name="unused_apps" msgid="648471933781010395">"Käyttämättömät sovellukset"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> käyttämätöntä sovellusta</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> käyttämätön sovellus</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# käyttämätön sovellus}other{# käyttämätöntä sovellusta}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Poista lupia ja vapauta tilaa"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s sisäisessä tallennustilassa"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Sulje sovellus resurssien säästämiseksi"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Käyttää järjestelmän resursseja sovelluksen suorituskyvyn priorisointiin"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Datan käyttö"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Sovelluksen datan käyttö"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Käyttöhistoria"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Kaikki sovellukset"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Datan ja Wi-Fin käyttö"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Käyttöhistoria"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Käytetty yhteensä"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Etualalla"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Taustalla"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Salli data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Anna sovelluksen käyttää mobiilidataa"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Rajoita datan käyttöä"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Käytä mobiilidataa vain, kun sovellus on etualalla"</string>
<string name="computing_size" msgid="5791407621793083965">"Lasketaan…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> lisäkäyttölupaa</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> lisäkäyttölupa</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# lisälupa}other{# lisälupaa}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Huom. Jotta voit käynnistää tämän sovelluksen uudelleenkäynnistyksen jälkeen, sinun on avattava ajoneuvon lukitus."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistant ja äänisyöte"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Avustajasovellus"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi-hallinta antaa sovelluksen asettaa Wi-Fi päälle ja pois päältä, hakea Wi-Fi-verkkoja ja yhdistää niihin, lisätä ja poistaa verkkoja ja käynnistää paikallisen hotspotin."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Lisää"</string>
<string name="location_settings_title" msgid="901334356682423679">"Sijainti"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Käytä sijaintia"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Salli sijainti tietyille sovelluksille"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Jos laitat sijainnin pois päältä, sen pääsyoikeus poistetaan kaikilta sovelluksilta. Ajoavustinsovelluksilla on kuitenkin edelleen pääsy sijaintiin."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Käytä sijaintia ajoavustimessa"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Ajoneuvon sijainti on pois päältä"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Ajoavustimilla ei pääsyä sijaintiisi"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Muuta"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Salli sijainti ajoavustinsovelluksille"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Jos laitat tämän pois päältä, sijaintia käyttävät ajoavustinsovellukset poistetaan käytöstä."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Laita pois päältä"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Viimeisimmät sijaintipyynnöt"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ei viimeaikaisia sijaintipyyntöjä"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Sovellustason käyttöoikeudet"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Sijaintipalvelut"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Käytä sijaintia"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Sijainti voi käyttää esimerkiksi GPS:ää, Wi‑Fi- ja mobiiliverkkoja sekä antureita laitteesi sijainnin arvioimiseen."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Ajoavustin"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Sinua ei voi tunnistaa ajoavustinsovelluksiin lähetettävistä sijaintitiedoista. Tiedot tallennetaan enintään kahdeksi päiväksi ennen niiden poistamista."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofoni"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Käytä mikrofonia"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Anna kaikille sovelluksille mikrofonin pääsyoikeudet"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Muuta mikrofonilupia"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Käytetty äskettäin"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Ei viimeisimpiä sovelluksia"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Yhdelläkään sovelluksella ei ole pääsyoikeuksia"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{#/{total_count} sovelluksella on pääsyoikeus}other{#/{total_count} sovelluksella on pääsyoikeus}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Käytetty äskettäin"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Katso kaikki"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Ladataan…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Järjestelmä"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Järjestelmäpäivitykset"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Lisäasetukset"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Kolmannen osapuolen lisenssit"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ongelma ladattaessa lisenssejä"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Ladataan…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Enää <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> vaihetta, niin sinusta tulee kehittäjä.</item>
- <item quantity="one">Enää <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> vaihe, niin sinusta tulee kehittäjä.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Enää # vaihe, niin sinusta tulee kehittäjä.}other{Enää # vaihetta, niin sinusta tulee kehittäjä.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Olet nyt kehittäjä."</string>
<string name="show_dev_already" msgid="1678087328973865736">"Ei tarvitse jatkaa, olet jo kehittäjä."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Kehittäjäasetukset"</string>
@@ -464,7 +494,7 @@
<string name="factory_reset_button_text" msgid="2626666247051368256">"Poista kaikki data"</string>
<string name="factory_reset_confirm_title" msgid="3354542161765761879">"Poistetaanko kaikki data?"</string>
<string name="factory_reset_confirm_desc" msgid="2037199381372030510">"Kaikki tämän infotainment-järjestelmän henkilökohtainen profiilidata, tilit ja ladatut sovellukset poistetaan.\n\nToimintoa ei voi kumota."</string>
- <string name="factory_reset_confirm_button_text" msgid="1797490544756481809">"Tyhjennä kaikki"</string>
+ <string name="factory_reset_confirm_button_text" msgid="1797490544756481809">"Poista kaikki"</string>
<string name="factory_reset_progress_title" msgid="4580937077054738173">"Poistetaan"</string>
<string name="factory_reset_progress_text" msgid="7704636573522634757">"Odota…"</string>
<string name="date_and_time_settings_title" msgid="4058492663544475485">"Päivämäärä ja aika"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Kun olet luonut uuden profiilin, sen omistajan pitäisi personoida se itselleen sopivaksi."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Sovelluksia voi päivittää mistä tahansa profiilista kaikkien muiden profiilien käytettäväksi."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profiiliraja saavutettu"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Voit luoda enintään <xliff:g id="COUNT">%d</xliff:g> profiilia.</item>
- <item quantity="one">Voit luoda vain yhden profiilin.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Voit luoda vain yhden profiilin.}other{Voit luoda korkeintaan # profiilia.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Uuden profiilin luominen ei onnistunut"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Poistetaanko tämä profiili?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Kaikki tämän profiilin sovellukset ja data poistetaan"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profiilin poistaminen ei onnistunut."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profiilia ei poistettu. Kokeile käynnistää laite uudelleen."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Tämä profiili poistetaan, kun vaihdat profiilia tai käynnistät ajoneuvon uudelleen."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Ohita"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Yritä uudelleen"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Lukituksenpoistokuvion piirtäminen"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Virhe tallennettaessa kuviota"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Liian monta virheellistä yritystä. Yritä uudelleen <xliff:g id="NUMBER">%d</xliff:g> sekunnin kuluttua."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Kuvio ei tue kiertoa – käytä kosketusta"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Poistetaanko näytön lukitus?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Kuka tahansa voi päästä tilillesi"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"IT-järjestelmänvalvoja on estänyt yleiset PIN-koodit. Kokeile eri PIN-koodia."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Salasanassa ei saa olla virheellisiä merkkejä."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Virheellinen salasana. Vähimmäispituus on 4 merkkiä."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Salasanassa on oltava vähintään <xliff:g id="COUNT">%d</xliff:g> kirjainta.</item>
- <item quantity="one">Salasanassa on oltava vähintään 1 kirjain.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Salasanassa on oltava vähintään <xliff:g id="COUNT">%d</xliff:g> pientä kirjainta.</item>
- <item quantity="one">Salasanassa on oltava vähintään 1 pieni kirjain.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Salasanassa on oltava vähintään <xliff:g id="COUNT">%d</xliff:g> isoa kirjainta.</item>
- <item quantity="one">Salasanassa on oltava vähintään 1 iso kirjain.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Salasanassa on oltava vähintään <xliff:g id="COUNT">%d</xliff:g> numeroa.</item>
- <item quantity="one">Salasanassa on oltava vähintään 1 numero.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Salasanassa on oltava vähintään <xliff:g id="COUNT">%d</xliff:g> erikoismerkkiä.</item>
- <item quantity="one">Salasanassa on oltava vähintään 1 erikoismerkki.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Salasanassa on oltava vähintään <xliff:g id="COUNT">%d</xliff:g> merkkiä, jotka eivät ole kirjaimia.</item>
- <item quantity="one">Salasanassa on oltava vähintään 1 merkki, joka ei ole kirjain.</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Järjestelmänvalvoja esti salasanan, koska sitä on käytetty viime aikoina."</string>
<string name="error_saving_password" msgid="8334882262622500658">"Virhe tallennettaessa salasanaa"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"IT-järjestelmänvalvoja on estänyt yleiset salasanat. Kokeile eri salasanaa."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Lisää profiili"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Poista tämä profiili"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Lisää profiili"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Näytön kirkkaus"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Laita Bluetooth päälle, jotta voit nähdä laitteesi"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Avaa Bluetooth-asetukset, jotta voit muodostaa laiteparin"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Infotainment-järjestelmän valvoja"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivoidut sovellukset"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Käytöstä poistetut sovellukset"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Tämän luvan saaneilla sovelluksilla on pääsy ajoneuvon dataan"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Ei ajoneuvon hallintasovelluksia"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Tämä infotainment-järjestelmä on aktiivinen, ja se on antanut sovellukselle <xliff:g id="APP_NAME">%1$s</xliff:g> oikeuden suorittaa seuraavat toiminnot:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Jos tämä infotainment-järjestelmä aktivoidaan, <xliff:g id="APP_NAME">%1$s</xliff:g> saa oikeuden suorittaa seuraavat toiminnot:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktivoi infotainment-järjestelmäsov.?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktivoi infotainment-järjestelmäsovellus"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Poista käytöstä ja kokonaan laitteelta"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Poista infotainment-järjestelmä käytöstä"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Lisätietoja"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Organisaation ylläpitäjä voi hallita tähän profiiliin liittyviä sovelluksia ja tietoja, mukaan lukien asetuksia, käyttöoikeuksia, yrityskäyttöä, verkkotoimintaa ja kulkuneuvon sijaintitietoja."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Organisaation ylläpitäjä voi hallita tähän profiiliin liittyviä sovelluksia ja tietoja, mukaan lukien asetuksia, käyttöoikeuksia, yrityskäyttöä, verkkotoimintaa ja laitteen sijaintitietoja."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Organisaation ylläpitäjä voi valvoa ja ylläpitää tähän infotainment-järjestelmään yhdistettyjä sovelluksia ja tietoja, kuten asetuksia, käyttöoikeuksia, yrityskäyttöoikeutta, verkkotoimintaa ja kulkuneuvon sijaintitietoja."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Organisaation ylläpitäjä voi saada pääsyn tähän infotainment-järjestelmään liittyvään dataan, ylläpitää sovelluksia ja muuttaa kulkuneuvon asetuksia."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Se ei ole käytettävissä"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Tämän hallinnoidun ajoneuvon äänenvoimakkuutta ei voi muuttaa"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Puheluita ei voi soittaa tässä hallinnoidussa ajoneuvossa"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Tekstiviestejä ei sallita tässä hallinnoidussa ajoneuvossa"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera ei ole käytettävissä tässä hallinnoidussa ajoneuvossa"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Kuvakaappauksia ei voi ottaa tässä hallinnoidussa ajoneuvossa"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Sovellusta ei voi avata tässä hallinnoidussa ajoneuvossa"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Luoton myöntäjän estämä"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Organisaatio on rajoittanut pääsyä tiettyihin ominaisuuksiin.\n\nJos sinulla on kysymyksiä, ota yhteyttä organisaation ylläpitäjään."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Kulkuneuvonhallintasovellukset"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivoitu sovellus}other{# aktivoitua sovellusta}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Ei aktivoituja sovelluksia"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Ajoneuvokäytäntö / <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Organisaation ylläpitäjän hallinnoimat asetukset"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Lue lisää: <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Jaetaanko virheraportti?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Ajoneuvon organisaation ylläpitäjä pyysi virheraporttia ongelmankorjauksen avuksi. Sovelluksia ja dataa voidaan jakaa."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Ajoneuvon organisaation ylläpitäjä pyysi virheraporttia ongelmankorjauksen avuksi. Sovelluksia ja dataa voidaan jakaa, ja laitteen toiminta voi hidastua väliaikaisesti."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Tämä virheraportti jaetaan ajoneuvon organisaation ylläpitäjälle. Pyydä häneltä lisätietoja."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Jaa"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Hylkää"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Tätä asetusta ei voi juuri nyt muuttaa"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Esteettömyys"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Tekstitykset"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Tekstitysvalinnat"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Poissa päältä"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Päällä"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Näytönlukuohjelma"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Näytä tekstitykset"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Tekstin koko"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Tekstitysten koko ja tyyli"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Hyvin pieni"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Pieni"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Oletus"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Suuri"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Hyvin suuri"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Tekstityksen tyyli"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Sovelluksen asettama"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Valkoinen mustalla"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Musta valkoisella"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Keltainen mustalla"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Keltainen sinisellä"</string>
</resources>
diff --git a/res/values-fr-rCA/arrays.xml b/res/values-fr-rCA/arrays.xml
index 98f96af..dad8e2b 100644
--- a/res/values-fr-rCA/arrays.xml
+++ b/res/values-fr-rCA/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ne jamais autoriser"</item>
<item msgid="1154273129608299386">"Toujours autoriser"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index c337324..fb15c67 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Mode Nuit"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Réseau et Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Réseau cellulaire"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> carte SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> cartes SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# carte SIM}one{# carte SIM}other{# cartes SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Services actifs/Carte SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Services inactifs/Carte SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Services actifs/Carte SIM téléchargée"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Ajouter"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Données mobiles"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accéder aux données sur réseau cellulaire"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Réseau cellulaire"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Utiliser des données cellulaires"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Désactiver les données mobiles?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Sélection requise"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Utiliser <xliff:g id="CARRIER">%1$s</xliff:g> pour donn. mob.?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Avertiss. d\'utilisation de données : <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Limite d\'utilisation de données : <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Avertissement d\'utilisation de données : <xliff:g id="ID_1">^1</xliff:g> / Limite d\'utilisation de données : <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d jour restant</item>
- <item quantity="other">%d jours restants</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# jour restant}one{# jour restant}other{# jours restants}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Aucun temps restant"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Il reste moins d\'un jour"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Mis à jour par <xliff:g id="ID_1">^1</xliff:g> il y a <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Définir"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Avertissement et limites de données"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cycle d\'util. données d\'appli."</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Utilisation de données cellulaires"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Définir avertiss. de données"</string>
<string name="data_warning" msgid="116776633806885370">"Avertiss. utilisation données"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Définir. lim. d\'util. données"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"L\'unité principale de votre véhicule désactivera les données mobiles lorsque la limite que vous définissez sera atteinte.\n\nComme c\'est l\'unité principale qui mesure l\'utilisation de données, et que votre fournisseur de services peut utiliser un système de mesure différent, nous vous conseillons de faire preuve de prudence en définissant votre limite."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Définir avertissement d\'utilisation des données"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Définir la limite de consommation des données"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"L\'utilisation de données est mesurée par votre appareil. Cette mesure peut être différente de celle de votre fournisseur de services cellulaires."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Définir"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Enregistrer"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Réseau OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet du véhicule"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"La désactivation de l\'Internet du véhicule peut empêcher le fonctionnement de certaines fonctionnalités/applications du véhicule.\n\nLes données essentielles au fonctionnement du véhicule continueront d\'être partagées avec son fabricant."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Désactiver quand même"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"L\'Internet du véhicule est désactivé. Cela peut empêcher certaines fonctionnalités/applications du véhicule de fonctionner. Les données essentielles au fonctionnement du véhicule continueront d\'être partagées avec son fabricant."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s utilisés du %2$s au %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Se connecter à un autre réseau"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Préférences réseau"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Ajouter un réseau"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Associer"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Connexion en cours…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Non connecté"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Réseau hors de portée"</string>
<string name="wifi_password" msgid="5565632142720292397">"Mot de passe"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Afficher le mot de passe"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Choisir au moins une bande de PA Wi-Fi :"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Point d\'accès et partage de connexion"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Point d\'accès sans fil"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Désactivé"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Désactiver automatiquement le point d\'accès Wi‑Fi"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Le point d\'accès Wi‑Fi se désactive si aucun appareil n\'y est connecté"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> souhaite activer le Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Forcer l\'arrêt"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Voulez-vous forcer l\'arrêt?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"L\'arrêt forcé d\'une application peut provoquer un fonctionnement instable."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Désactiver protection des performances?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Si vous le faites, votre logiciel et votre matériel pourraient ne pas fonctionner aussi bien."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Laisser activé"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Désactiver"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Prioriser la performance de l\'appli?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"L\'activation de ce paramètre peut engendrer une instabilité système ou avoir un effet à long terme sur le matériel. Voulez-vous continuer?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Oui"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Non merci"</string>
<string name="disable_text" msgid="4358165448648990820">"Désactiver"</string>
<string name="enable_text" msgid="1794971777861881238">"Activer"</string>
<string name="uninstall_text" msgid="277907956072833012">"Désinstaller"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Autorisations"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifications"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Stockage et mise en cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Performances opti."</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Priorisation de la performance de l\'application"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version : %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Aucune autorisation accordée"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Aucune autorisation demandée"</string>
<string name="unused_apps" msgid="648471933781010395">"Applications non utilisées"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> application non utilisée</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applications non utilisées</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# application non utilisée}one{# application non utilisée}other{# applications non utilisées}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Retirer autorisations et libérer espace"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s de mémoire de stockage interne"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Fermez appli pour éviter utilisation excessive des ressources"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Utilise les ressources système pour prioriser la performance de l\'application"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Utilisation des données"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Util. données applications"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historique d\'utilisation"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Toutes les applications"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Utilisation données/Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historique d\'utilisation"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Quantité totale utilisée"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Avant-plan"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Arrière-plan"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Autoriser les données"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Autorisez appli à utiliser des données cellulaires"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Données en arrière-plan"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Util. données cell. juste quand appli avant-plan"</string>
<string name="computing_size" msgid="5791407621793083965">"Traitement en cours…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> autorisation supplémentaire</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorisations supplémentaires</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# autorisation supplémentaire}one{# autorisation supplémentaire}other{# autorisations supplémentaires}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Remarque : Après un redémarrage, vous ne pouvez pas lancer cette application tant que vous n\'avez pas déverrouillé votre véhicule."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistance et entrée vocale"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Application d\'assistance"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Le contrôle Wi-Fi permet d\'autoriser une application à activer ou à désactiver le Wi-Fi, à rechercher les réseaux Wi-Fi et à s\'y connecter, à ajouter ou retirer des réseaux, ou à lancer un point d\'accès local uniquement."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Plus"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lieu"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Utiliser ma position"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Autoriser les applis que vous précisez à accéder à votre position"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Si vous désactivez ce paramètre, l\'accès de toutes les applications à votre position sera retiré. Les applications ayant la fonctionnalité d\'assistance au conducteur auront toutefois toujours accès."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Utiliser la position pour l\'assistance au conducteur"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"La position du véhicule est désactivée"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Applis d\'assist. au conducteur ne peuvent accéder à votre position"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Modifier"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Autoriser les applis d\'aide à la conduite à accéder à votre position"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Si vous désactivez cette option, les fonctionnalités d\'assistance au conducteur qui dépendent des renseignements de lieu seront désactivées."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Désactiver quand même"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Récentes demandes de localisation"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Aucune demande de localisation récente"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Autorisations à l\'échelle des applis"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Services de localisation"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Utiliser ma position"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Les services de localisation peuvent utiliser des sources comme le GPS, le Wi-Fi, les réseaux cellulaires et les capteurs pour estimer la position de votre appareil."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Assistance au conducteur"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Les données de localisation envoyées aux applications d\'assistance au conducteur ne contiennent aucune information permettant de déterminer votre identité. Elles sont stockées un maximum de deux jours, puis elles sont supprimées."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microphone"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Utiliser le microphone"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Autoriser toutes les applications à accéder à votre microphone"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Gérer les autorisations du microphone"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Accédé récemment"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Aucune application récente"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Aucune application n\'a accès"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# application sur {total_count} a accès}one{# application sur {total_count} a accès}other{# applications sur {total_count} ont accès}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Accédé récemment"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Tout afficher"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Chargement en cours…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Système"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Mises à jour du système"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Avancé"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licences tierces"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Problème lors du chargement des licences."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Chargement en cours…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étape pour devenir un développeur.</item>
- <item quantity="other">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étapes pour devenir un développeur.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Plus que # étape pour devenir un développeur.}one{Plus que # étape pour devenir un développeur.}other{Plus que # étapes pour devenir un développeur.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Vous êtes désormais un développeur!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Inutile, vous êtes déjà un développeur."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Options pour concepteurs"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Une fois que vous aurez créé un profil, cette personne devra le configurer elle-même."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Les applis peuvent être mises à jour à partir de tout profil pour tous les autres profils."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Nombre maximal de profils atteint"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Vous pouvez créer jusqu\'à <xliff:g id="COUNT">%d</xliff:g> profil.</item>
- <item quantity="other">Vous pouvez créer jusqu\'à <xliff:g id="COUNT">%d</xliff:g> profils.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Un seul profil peut être créé.}one{Vous pouvez créer jusqu\'à # profil.}other{Vous pouvez créer jusqu\'à # profils.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Impossible de créer un profil"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Supprimer ce profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"L\'intégralité des applications et des données de ce profil seront supprimées"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Impossible de supprimer le profil."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil non supprimé. Redémarrez l\'appareil et réessayez."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ce profil sera supprimé lorsque vous changerez de profil ou que vous redémarrerez le véhicule."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Fermer"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Réessayer"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Comment dessiner un schéma de déverr."</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Erreur lors de l\'enregistrement du schéma"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Trop de tentatives incorrectes. Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Schéma ne prend pas en charge la rotation, utilisez le toucher"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Suppr. le verrouill. de l\'écran?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Cela permettra à quiconque d\'accéder à votre compte"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Les NIP communs sont bloqués par votre administrateur informatique. Essayez un NIP différent."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Vous ne pouvez pas inclure de caractère non valide."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Le mot de passe doit comprendre au moins quatre caractères"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettre</item>
- <item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettres</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettre minuscule</item>
- <item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettres minuscules</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettre majuscule</item>
- <item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettres majuscules</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> chiffre</item>
- <item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> chiffres</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractère spécial</item>
- <item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractères spéciaux</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractère autre qu\'une lettre</item>
- <item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractères autres qu\'une lettre</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"L\'administrateur de l\'appareil ne permet pas l\'utilisation d\'un mot de passe récent"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Erreur lors de l\'enreg. du mot de passe"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Les mots de passe communs sont bloqués par votre administrateur informatique. Essayez un mot de passe différent."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Ajouter un profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Supprimer ce profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Ajouter un profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Luminosité de l\'écran"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Pour afficher vos appareils, activez le Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Pour associer un appareil, ouvrez les paramètres Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrateur du système d\'infodivertissement"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Applications activées"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Applications désactivées"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Les applications disposant de cette autorisation ont accès aux données du véhicule"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Aucune application d\'administration de véhicule"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Cette application d\'administration du système d\'infodivertissement est active et elle permet à l\'application <xliff:g id="APP_NAME">%1$s</xliff:g> d\'effectuer les opérations suivantes :"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"L\'activation de cette application d\'administration du système d\'infodivertissement permettra à <xliff:g id="APP_NAME">%1$s</xliff:g> d\'effectuer les opérations suivantes :"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Activer l\'appli d\'infodivertissement?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activer cette application du système d\'infodivertissement"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Désactiver et désinstaller"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Désactiver cette application de système d\'infodivertissement"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Plus de détails"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Le gestionnaire de l\'organisation peut surveiller et gérer les applications ainsi que les données associées à ce profil, y compris les paramètres, les autorisations, l\'accès aux contenus de l\'entreprise, l\'activité réseau et les données de localisation du véhicule."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Le gestionnaire de l\'organisation peut surveiller et gérer les applications ainsi que les données associées à ce profil, y compris les paramètres, les autorisations, l\'accès aux contenus de l\'entreprise, l\'activité réseau et les données de localisation de l\'appareil."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Le gestionnaire de l\'organisation peut surveiller et gérer les applications et les données associées à ce système d\'infodivertissement, y compris les paramètres, les autorisations, l\'accès aux contenus de l\'entreprise, l\'activité réseau et les données de localisation du véhicule."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Le gestionnaire de l\'organisation pourrait être en mesure d\'accéder aux données associées à ce système d\'infodivertissement, de gérer les applications et de modifier les paramètres de ce véhicule."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"C\'est indisponible"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Impossible de modifier le volume dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Impossible de faire des appels dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Les messages texte ne sont pas autorisés dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"L\'appareil photo n\'est pas accessible dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Impossible de prendre des captures d\'écran dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Impossible d\'ouvrir cette application dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Bloqué par votre fournisseur de crédit"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"L\'accès à certaines fonctionnalités est limité par l\'organisation.\n\nSi vous avez des questions, communiquez avec le gestionnaire de l\'organisation."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Applis d\'administration du véhicule"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# application activée}one{# application activée}other{# applications activées}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Aucune application activée"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Politique des véhicules de <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Les paramètres sont gérés par le gestionnaire de l\'organisation"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"En savoir plus sur : <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Partager le rapport de bogue?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Le gestionnaire de l\'organisation de ce véhicule a demandé un rapport de bogue pour aider à dépanner cet appareil. Les applications et les données peuvent être partagées."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Le gestionnaire de l\'organisation de ce véhicule a demandé un rapport de bogue pour aider à dépanner cet appareil. Les applications et les données peuvent être partagées. Cela pourrait temporairement ralentir votre appareil."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Ce rapport de bogue est partagé avec le gestionnaire de l\'organisation de ce véhicule. Pour en savoir plus, communiquez avec lui."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Partager"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Refuser"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Ce paramètre ne peut pas être modifié pour le moment"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibilité"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Sous-titres"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Préférences en matière de sous-titres"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Désactivés"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Activés"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Lecteur d\'écran"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Afficher les sous-titres"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Taille du texte"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Taille et style des sous-titres"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Très petite"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Petite"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Par défaut"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Grande"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Très grande"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Style de sous-titres"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Défini par l\'application"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Texte blanc sur fond noir"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Texte noir sur fond blanc"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Texte jaune sur fond noir"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Texte jaune sur fond bleu"</string>
</resources>
diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml
index 98f96af..dad8e2b 100644
--- a/res/values-fr/arrays.xml
+++ b/res/values-fr/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ne jamais autoriser"</item>
<item msgid="1154273129608299386">"Toujours autoriser"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index aa2c71c..1c38c14 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Mode Nuit"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Réseau et Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Réseau mobile"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> carte SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> cartes SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}one{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Actif/Carte SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactif/Carte SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Actif/Carte SIM téléchargée"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Ajouter"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Données mobiles"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accéder aux données via le réseau mobile"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Réseau mobile"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Utiliser les données mobiles"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Désactiver les données mobiles ?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Sélection requise"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Utiliser <xliff:g id="CARRIER">%1$s</xliff:g> pour les données mobiles ?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Avertissement de conso données : <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Limite de données : <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Avertissement de consommation des données : <xliff:g id="ID_1">^1</xliff:g> - Limite de données : <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d jour restant</item>
- <item quantity="other">%d jours restants</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# jour restant}one{# jour restant}other{# jours restants}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Cycle de facturation arrivé à échéance"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Moins de 1 jour restant"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Mis à jour par <xliff:g id="ID_1">^1</xliff:g> il y a <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Définir"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Avertissement et limite pour les données"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cycle de consommation des données"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Consommation des données mobiles"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Activer l\'avertissement"</string>
<string name="data_warning" msgid="116776633806885370">"Avertissement de conso données"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Définir la limite des données"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Les données mobiles sont désactivées par l\'unité principale du véhicule lorsque la limite de consommation des données que vous avez définie est atteinte.\n\nLa consommation mesurée par l\'unité principale pouvant différer de celle mesurée par votre opérateur, nous vous recommandons de définir une limite stricte."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Définir l\'avertissement sur la conso des données"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Définir la limite de consommation des données"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"La consommation des données est mesurée par votre appareil. Elle peut être différente des données de votre opérateur mobile."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Définir"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Enregistrer"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Réseau OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet du véhicule"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Désactiver Internet sur le véhicule peut entraver l\'exécution de certaines de ses fonctionnalités ou applis.\n\nLes données essentielles à son fonctionnement continueront d\'être partagées avec son fabricant."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Désactiver malgré tout"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet est désactivé sur le véhicule. Cela peut entraver l\'exécution de certaines de ses fonctionnalités ou applis. Les données essentielles au fonctionnement du véhicule continueront d\'être partagées avec son fabricant."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s utilisé(s), %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Rejoindre un autre réseau"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Préférences réseau"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Ajouter un réseau"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Connexion"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Connexion…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Non connecté"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Réseau hors de portée"</string>
<string name="wifi_password" msgid="5565632142720292397">"Mot de passe"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Afficher le mot de passe"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Sélectionnez au moins une bande pour le point d\'accès Wi-Fi :"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Point d\'accès et partage de connexion"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Point d\'accès"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Désactivé"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Désactiver le point d\'accès automatiquement"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Le point d\'accès Wi-Fi se désactive si aucun appareil n\'est connecté"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> requiert l\'activation du Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Forcer l\'arrêt"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Forcer l\'arrêt ?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"L\'arrêt forcé d\'une application peut provoquer un fonctionnement instable."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Désactiver protection des performances ?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Si vous faites cela, votre logiciel et votre matériel risquent de ne pas fonctionner aussi bien."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Laisser activée"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Désactiver"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Prioriser les performances de l\'appli ?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Ce paramètre peut engendrer une instabilité système ou avoir un impact à long terme sur le matériel. Voulez-vous continuer ?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Oui"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Non, merci"</string>
<string name="disable_text" msgid="4358165448648990820">"Désactiver"</string>
<string name="enable_text" msgid="1794971777861881238">"Activer"</string>
<string name="uninstall_text" msgid="277907956072833012">"Désinstaller"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Autorisations"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifications"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Espace de stockage et cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Optimiser performances"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioriser les performances de l\'appli"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Aucune autorisation accordée"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Aucune autorisation demandée"</string>
<string name="unused_apps" msgid="648471933781010395">"Applis inutilisées"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> appli inutilisée</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applis inutilisées</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# appli inutilisée}one{# appli inutilisée}other{# applis inutilisées}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Supprimer autorisations et libérer espace"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s de mémoire de stockage interne"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Lorsque nécessaire, fermez appli pour éviter utilisation excessive ressources"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Utiliser les ressources système pour prioriser les performances de l\'appli"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Consommation des données"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Conso des données applis"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historique consommation"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Toutes les applis"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Utilisation données et Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historique consommation"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Consommation totale"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Premier plan"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Arrière-plan"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Autoriser les données"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Autoriser l\'appli à utiliser les données mobiles"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Limiter les données"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Utiliser données mobiles uniquement si appli au premier plan"</string>
<string name="computing_size" msgid="5791407621793083965">"Calcul…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> autorisation supplémentaire</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorisations supplémentaires</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# autorisation supplémentaire}one{# autorisation supplémentaire}other{# autorisations supplémentaires}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Remarque : Après un redémarrage, vous ne pouvez pas lancer cette application tant que vous n\'avez pas déverrouillé votre véhicule."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistance et saisie vocale"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Application d\'assistance"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Le contrôle Wi-Fi permet d\'autoriser une application à activer ou à désactiver le Wi-Fi, à rechercher les réseaux Wi-Fi et à s\'y connecter, à ajouter ou supprimer des réseaux, ou à lancer un point d\'accès local."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Plus"</string>
<string name="location_settings_title" msgid="901334356682423679">"Position"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Utiliser la position"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Autoriser applis spécifiées à accéder à position"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Si vous désactivez cela, l\'accès à la position sera supprimé pour toutes les applis, sauf les applis d\'aide à la conduite."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Utiliser position pour aide à conduite"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Localisation du véhicule désactivée"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Applis d\'aide à conduite ne peuvent pas accéder à position"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Modifier"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Autoriser applis d\'aide à conduite à accéder à position"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Si vous désactivez cela, les applis d\'aide à la conduite basées sur les informations de localisation seront désactivées."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Désactiver malgré tout"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Demandes de localisation récentes"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Aucune demande de localisation récente"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Autorisations des applis"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Services de localisation"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Utiliser ma position"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Les services de localisation peuvent utiliser des sources telles que le GPS, le Wi-Fi, les réseaux mobiles et les capteurs pour estimer la position de votre appareil."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Aide à la conduite"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Les informations de localisation envoyées aux applis d\'aide à la conduite ne contiennent aucun détail vous identifiant. Elles sont stockées pendant deux jours au maximum, puis supprimées."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Micro"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Utiliser le micro"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Autoriser toutes les applis à accéder à votre micro"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Gérer les autorisations d\'accès au micro"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Accès récent(s)"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Aucune appli récente"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 appli a accès"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# appli sur {total_count} a accès}one{# appli sur {total_count} a accès}other{# applis sur {total_count} ont accès}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Accès récent(s)"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Tout afficher"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Chargement…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Système"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Mises à jour du système"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Paramètres avancés"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licences tierces"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Problème lors du chargement des licences."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Chargement…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étape pour devenir un développeur.</item>
- <item quantity="other">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étapes pour devenir un développeur.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Plus que # étape pour devenir un développeur.}one{Plus que # étape pour devenir un développeur.}other{Plus que # étapes pour devenir un développeur.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Vous êtes désormais un développeur !"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Inutile, vous êtes déjà développeur."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Options pour développeurs"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Lorsque vous aurez créé un profil, cette personne devra le configurer elle-même."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Les applis peuvent être mises à jour depuis un profil pour tous les autres profils."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Nombre maximal de profils atteint"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Vous pouvez créer jusqu\'à <xliff:g id="COUNT">%d</xliff:g> profil.</item>
- <item quantity="other">Vous pouvez créer jusqu\'à <xliff:g id="COUNT">%d</xliff:g> profils.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Vous ne pouvez créer qu\'un seul profil.}one{Vous pouvez créer jusqu\'à # profil.}other{Vous pouvez créer jusqu\'à # profils.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Impossible de créer un profil"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Supprimer ce profil ?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Toutes les applis et données associées à ce profil seront supprimées"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Impossible de supprimer le profil"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil non supprimé. Redémarrez et réessayez."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ce profil sera supprimé lorsque vous changerez de profil ou que vous redémarrerez le véhicule."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignorer"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Réessayer"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Pour dessiner un schéma de déverrouillage"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Erreur d\'enregistrement du schéma"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Trop de tentatives incorrectes. Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Schéma incompatible avec dispositif rotatif, appuyez"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Annuler le verrouillage écran ?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Si vous continuez, n\'importe qui pourra accéder à votre compte"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Les codes courants sont bloqués par votre administrateur informatique. Choisissez un autre code."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Vous ne pouvez pas inclure de caractère non valide."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Mot de passe non valide : il doit comporter au moins 4 caractères."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettre</item>
- <item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettres</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettre minuscule</item>
- <item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettres minuscules</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettre majuscule</item>
- <item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettres majuscules</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> chiffre</item>
- <item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> chiffres</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> symbole spécial</item>
- <item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> symboles spéciaux</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> caractère autre qu\'une lettre</item>
- <item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> caractères autres qu\'une lettre</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"L\'administrateur de l\'appareil n\'autorise pas l\'utilisation d\'un mot de passe récent"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Erreur d\'enregistrement du mot de passe"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Les mots de passe courants sont bloqués par votre administrateur informatique. Choisissez un autre mot de passe."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Ajouter un profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Supprimer ce profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Ajouter un profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Luminosité de l\'affichage"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Pour voir vos appareils, activez le Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Pour associer un appareil, ouvrez les paramètres du Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administration du système d\'infoloisirs"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Applis activées"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Applis désactivées"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Les applications disposant de cette autorisation ont accès aux données de ce véhicule"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Aucune application d\'administration du véhicule"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Cette application d\'administration du système d\'infoloisirs est active et permet à l\'appli <xliff:g id="APP_NAME">%1$s</xliff:g> d\'effectuer les opérations suivantes :"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Si vous activez l\'appli d\'administration du système d\'infoloisirs, l\'appli <xliff:g id="APP_NAME">%1$s</xliff:g> pourra effectuer les opérations suivantes :"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Activer appli du système d\'infoloisirs ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activer l\'appli du système d\'infoloisirs"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Désactiver et désinstaller"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Désactiver l\'appli du système d\'infoloisirs"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Plus d\'informations"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Le gestionnaire de l\'organisation peut contrôler et gérer les applis et les données associées à ce profil, y compris les paramètres, les autorisations, l\'accès aux contenus de l\'entreprise, l\'activité réseau et les informations de localisation du véhicule."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Le gestionnaire de l\'organisation peut contrôler et gérer les applis et les données associées à ce profil, y compris les paramètres, les autorisations, l\'accès aux contenus de l\'entreprise, l\'activité réseau et les informations de localisation de l\'appareil."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Le gestionnaire de l\'organisation peut contrôler et gérer les applis et les données associées au système d\'infoloisirs, y compris les paramètres, les autorisations, l\'accès aux contenus de l\'entreprise, l\'activité réseau et les informations de localisation du véhicule."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Il est possible que le gestionnaire de l\'organisation puisse accéder aux données associées au système d\'infoloisirs, gérer les applis et modifier les paramètres de ce véhicule."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Paramètre non disponible"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Impossible de modifier le volume dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Impossible de passer des appels dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS non autorisés dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Caméra indisponible dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Impossible de prendre des captures d\'écran dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Impossible d\'ouvrir cette appli dans ce véhicule géré"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Bloqué par votre société de crédit"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"L\'accès à certaines fonctionnalités est limité par l\'organisation.\n\nSi vous avez des questions, contactez le responsable de l\'organisation."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Applis d\'administration de véhicules"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# appli activée}one{# appli activée}other{# applis activées}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Aucune appli activée"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Règlement <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> concernant les véhicules"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Paramètres gérés par le gestionnaire de l\'organisation"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"En savoir plus sur <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Partager le rapport de bug ?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Le gestionnaire de l\'organisation du véhicule a demandé un rapport de bug pour l\'aider à résoudre le problème lié à cet appareil. Il est possible que des applis et des données soient partagées."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Le gestionnaire de l\'organisation du véhicule a demandé un rapport de bug pour l\'aider à résoudre le problème lié à cet appareil. Il est possible que des applis et des données soient partagées et que votre appareil ralentisse temporairement."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Ce rapport de bug est en cours de partage avec le gestionnaire de l\'organisation du véhicule. Contactez-le pour en savoir plus."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Partager"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Refuser"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Impossible de modifier ce paramètre pour l\'instant"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibilité"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Sous-titres"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Préférences pour les sous-titres"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Désactivés"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Activés"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Lecteur d\'écran"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Afficher les sous-titres"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Taille du texte"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Style et taille des sous-titres"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Très petite"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Petite"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Par défaut"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Grande"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Très grande"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Style des sous-titres"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Définir par appli"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Blanc sur noir"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Noir sur blanc"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Jaune sur noir"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Jaune sur bleu"</string>
</resources>
diff --git a/res/values-gl/arrays.xml b/res/values-gl/arrays.xml
index cd2786c..39074f5 100644
--- a/res/values-gl/arrays.xml
+++ b/res/values-gl/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Non permitir nunca"</item>
<item msgid="1154273129608299386">"Permitir sempre"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index df677c8..233ec7d 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Modo nocturno"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Rede e Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Rede de telefonía móbil"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Servizo activado/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Servizo desactivado/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Servizo activado/SIM descargada"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Engadir máis"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Datos móbiles"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Acceder aos datos cunha rede de telefonía móbil"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Rede de telefonía móbil"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Usar datos móbiles"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Queres desactivar os datos móbiles?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"É necesario seleccionar unha opción"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Usar <xliff:g id="CARRIER">%1$s</xliff:g> para os datos móbiles?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Aviso de consumo de datos: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Límite de datos: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Aviso de consumo de datos: <xliff:g id="ID_1">^1</xliff:g>/Límite de datos: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Quedan %d días</item>
- <item quantity="one">Queda %d día</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Queda # día}other{Quedan # días}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Non queda tempo"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Queda menos de 1 día"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Actualizado por <xliff:g id="ID_1">^1</xliff:g> hai <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Establecer"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Aviso e límite de uso de datos"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de uso de datos das aplicacións"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Uso de datos móbiles"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Definir aviso de uso de datos"</string>
<string name="data_warning" msgid="116776633806885370">"Aviso de uso de datos"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Definir límite de uso de datos"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Desactivaranse os datos móbiles na unidade principal do vehículo unha vez que se acade o límite que estableceses.\n\nPosto que a unidade principal mide o uso de datos e que posiblemente o teu operador contabilice o uso de forma diferente, considera a posibilidade de configurar un límite conservador."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Definir advertencia de uso de datos"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Definir límite de uso de datos"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"A medición do uso de datos provén do teu dispositivo. Pode diferir con respecto á información do teu operador móbil."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Definir"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Gardar"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Rede do OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Conexión a Internet do vehículo"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Se desactivas Internet no vehículo, poderían deixar de responder algunhas funcións ou aplicacións.\n\nSeguirán compartíndose co fabricante do vehículo os datos necesarios para o seu funcionamento."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Desactivar de todos os xeitos"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"A conexión a Internet do vehículo está desactivada. En consecuencia, pode que algunhas das funcións ou aplicacións deste non respondan. Seguirán compartíndose co fabricante do vehículo os datos clave necesarios para o seu funcionamento."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Uso de %1$s: %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Conectarse a outra rede"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferencias de rede"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Engadir rede"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Conectar"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Conectando…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Desconectada"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Estás fóra da zona de cobertura da rede"</string>
<string name="wifi_password" msgid="5565632142720292397">"Contrasinal"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Mostrar contrasinal"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Escolle mínimo unha banda para a zona wifi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Zona wifi e conexión compartida"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Zona wifi"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Desactivada"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Desactivar a zona wifi automaticamente"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Desactivarase a zona wifi se non se conecta ningún dispositivo"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> quere activar a wifi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Forzar parada"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Queres forzar a parada?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Se forzas a parada dunha aplicación, é posible que non funcione correctamente."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Desactivar a protección do rendemento?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Desta forma, é posible que o software e o hardware non funcionen tan ben."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Deixar activado"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Apagar"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Activar Priorizar rendemento da app?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Activala pode provocar inestabilidade no sistema ou afectar ao hardware a longo prazo. Queres continuar?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Si"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Non, grazas"</string>
<string name="disable_text" msgid="4358165448648990820">"Desactivar"</string>
<string name="enable_text" msgid="1794971777861881238">"Activar"</string>
<string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permisos"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notificacións"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Almacenamento e memoria caché"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Garantir rendemento máximo"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Priorizar rendemento da aplicación"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versión %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Non se outorgou ningún permiso"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Non se solicitou ningún permiso"</string>
<string name="unused_apps" msgid="648471933781010395">"Aplicacións que non se usan"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicacións que non se usan</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicación que non se usa</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# aplicación que non se usa}other{# aplicacións que non se usan}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Quitar permisos e liberar espazo"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s do almacenamento interno"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Se é necesario, pecha a aplicación para evitar un uso excesivo de recursos"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Utiliza recursos do sistema para priorizar o rendemento da aplicación"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Uso de datos"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uso de datos da aplicación"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historial de uso"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Todas as aplicacións"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Uso de datos e da wifi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historial de uso"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Uso total"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Primeiro plano"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Segundo plano"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Permitir usar datos"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Permite que esta aplicación use datos móbiles"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restrinxir datos"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Usa datos móbiles só coa app en primeiro plano"</string>
<string name="computing_size" msgid="5791407621793083965">"Calculando…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permisos adicionais</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permiso adicional</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# permiso adicional}other{# permisos adicionais}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Nota: Tras un reinicio, non se pode iniciar esta aplicación ata que desbloquees o vehículo."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistente e entrada de voz"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplicación de asistencia"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Co control da wifi, as aplicacións poden activar ou desactivar a wifi, buscar redes wifi, conectarse a elas, engadir ou eliminar redes e iniciar unha zona wifi local."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Máis"</string>
<string name="location_settings_title" msgid="901334356682423679">"Localización"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Usar localización"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Deixa que as apps elixidas accedan á posición"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Se desactivas esta opción, quitarase o permiso de localización en todas as aplicacións. As aplicacións de asistencia para a condución conservarán o acceso."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Usar localización para a condución"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Localización do vehículo desactivada"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"As apps de asistencia non acceden á localización"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Cambiar"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Permite que as apps de condución accedan á localización"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Se desactivas esta opción, deshabilitaranse as funcións de asistencia para a condución que utilizan a información de localización."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Desactivar de todos os xeitos"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitudes de localización recentes"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Non hai solicitudes de localización recentes"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisos para as aplicacións"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Servizos de localización"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Utilizar localización"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Os servizos de localización poden usar fontes como o GPS, a wifi, as redes de telefonía móbil e os sensores para determinar onde está o teu dispositivo."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Asistencia para a condución"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Os datos sobre a localización que se envían ás aplicacións de asistencia para a condución non conteñen información que permita identificarte. Almacénanse durante un máximo de 2 días e despois elimínanse."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Micrófono"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Usar micrófono"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Permitir que todas as aplicacións accedan ao micrófono"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Xestionar permisos relativos ao micrófono"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Accedeuse recentemente"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Ningunha aplicación recente"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Ningunha aplicación ten acceso"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Aplicacións con acceso: # de {total_count}}other{Aplicacións con acceso: # de {total_count}}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Solicitudes de acceso recentes"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Ver todas as solicitudes de acceso"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Cargando…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Actualizacións do sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Configuración avanzada"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licenzas de terceiros"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Hai un problema para cargar as licenzas."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Cargando…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Agora estás a <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pasos de converterte en programador.</item>
- <item quantity="one">Agora estás a <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> paso de converterte en programador</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Agora estás a # paso de converterte en programador.}other{Agora estás a # pasos de converterte en programador.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Agora es programador."</string>
<string name="show_dev_already" msgid="1678087328973865736">"Non é necesario, xa es programador."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opcións para programadores"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Despois de que crees un perfil novo, debe personalizalo a persoa á que lle pertence."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"As aplicacións poden actualizarse desde calquera perfil para o seu uso no resto de perfís."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Alcanzouse o límite de perfís"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Pódense crear ata <xliff:g id="COUNT">%d</xliff:g> perfís.</item>
- <item quantity="one">Só se pode crear 1 perfil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Só se pode crear 1 perfil.}other{Pódense crear ata # perfís.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Non se puido crear un novo perfil"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Queres eliminar este perfil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Eliminaranse todas as aplicacións e os datos deste perfil"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Non se puido eliminar o perfil."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Non se eliminou o perfil. Reinicia o dispositivo e volve tentalo."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Este perfil eliminarase cando cambies de perfil ou reinicies o vehículo."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignorar"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Tentar de novo"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Como debuxar un padrón de desbloqueo"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Erro ao gardar o padrón"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Realizáronse demasiados intentos incorrectos. Téntao de novo en <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"O padrón non é compatible co manexo xiratorio; usa un táctil"</string>
<string name="okay" msgid="4589873324439764349">"Aceptar"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Eliminar bloqueo de pantalla?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Desta forma calquera poderá acceder á túa conta"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"O teu administrador de TI bloqueou os PIN comúns. Proba cun PIN diferente."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Non pode conter un carácter que non é válido."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"O contrasinal non é válido. Debe ter como mínimo 4 caracteres."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Debe conter polo menos <xliff:g id="COUNT">%d</xliff:g> letras</item>
- <item quantity="one">Debe conter polo menos 1 letra</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Debe conter polo menos <xliff:g id="COUNT">%d</xliff:g> letras minúsculas</item>
- <item quantity="one">Debe conter polo menos 1 letra minúscula</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Debe conter polo menos <xliff:g id="COUNT">%d</xliff:g> letras maiúsculas</item>
- <item quantity="one">Debe conter polo menos 1 letra maiúscula</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Debe conter polo menos <xliff:g id="COUNT">%d</xliff:g> díxitos</item>
- <item quantity="one">Debe conter polo menos 1 díxito</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Debe conter polo menos <xliff:g id="COUNT">%d</xliff:g> símbolos especiais</item>
- <item quantity="one">Debe conter polo menos 1 símbolo especial</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Debe conter polo menos <xliff:g id="COUNT">%d</xliff:g> caracteres que non sexan letras</item>
- <item quantity="one">Debe conter polo menos 1 carácter que non sexa unha letra</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"O administrador de dispositivos non permite o uso dun contrasinal recente"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Erro ao gardar o contrasinal"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"O teu administrador de TI bloqueou os contrasinais comúns. Proba cun contrasinal diferente."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Engadir perfil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Eliminar este perfil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Engadir perfil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Brillo de pantalla"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Para ver os teus dispositivos, activa o Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Para vincular un dispositivo, abre a configuración do Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrador do sistema de información e entretemento"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aplicacións activadas"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Aplicacións desactivadas"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"As aplicacións que teñen este permiso poden acceder ao datos deste vehículo"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Non hai ningunha aplicación de administración do vehículo"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Esta aplicación de administración do sistema de información e entretemento está activa e permite á aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> levar a cabo as seguintes operacións:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"A activación desta aplicación do sistema de información e entretemento permitirá á aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> levar a cabo as seguintes operacións:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Queres activar esta aplicación?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activar esta aplicación do sistema de información e entretemento"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Desactivar e desinstalar"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Desactivar esta aplicación do sistema de información e entretemento"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Máis detalles"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"O xestor da organización pode supervisar e xestionar as aplicacións e os datos asociados a este perfil (por exemplo, os permisos, a configuración, o acceso corporativo, a actividade da rede e a información de localización do vehículo)."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"O xestor da organización pode supervisar e xestionar as aplicacións e os datos asociados a este perfil (por exemplo, os permisos, a configuración, o acceso corporativo, a actividade da rede e a información de localización do dispositivo)."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"O xestor da organización pode supervisar e xestionar as aplicacións e os datos asociados a este sistema de información e entretemento (por exemplo, os permisos, a configuración, o acceso corporativo, a actividade da rede e a información de localización do vehículo)."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"É posible que o xestor da organización poida acceder aos datos asociados ao sistema de información e entretemento, xestionar as aplicacións e cambiar a configuración deste vehículo."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Non está dispoñible"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Non se pode cambiar o volume neste vehículo xestionado"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Non se poden realizar chamadas neste vehículo xestionado"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Non se poden enviar SMS neste vehículo xestionado"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"A cámara non está dispoñible neste vehículo xestionado"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Neste vehículo xestionado non se poden facer capturas de pantalla"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Non se pode abrir esta aplicación neste vehículo xestionado"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Opción bloqueada pola túa entidade de crédito"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"A organización limitou o acceso a algunhas funcións.\n\nSe tes preguntas, ponte en contacto con quen xestiona a organización."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Apps de administración do vehículo"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aplicación activada}other{# aplicacións activadas}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Non hai ningunha aplicación activada"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Política do vehículo de <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Configuración xestionada polo xestor da organización"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Máis información sobre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Queres compartir o informe de erros?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"O xestor da organización do vehículo solicitou un informe de erros para axudar a solucionar os problemas deste dispositivo. Pódense compartir aplicacións e datos."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"O xestor da organización do vehículo solicitou un informe de erros para axudar a solucionar os problemas deste dispositivo. Pódense compartir aplicacións e datos e, ademais, é posible que se reduza a velocidade do dispositivo temporalmente."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Este informe de erros estase compartindo co xestor da organización do vehículo. Contacta co xestor para obter máis información."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Compartir"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Rexeitar"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Non se pode cambiar esta opción de configuración neste momento"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accesibilidade"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Subtítulos"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferencias dos subtítulos"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Desactivados"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Activados"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Lector de pantalla"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Mostrar subtítulos"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Tamaño do texto"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Tamaño e estilo dos subtítulos"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Moi pequeno"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Pequeno"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Predeterminado"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Grande"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Moi grande"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Estilo dos subtítulos"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Definido pola aplicación"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Branco sobre negro"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Negro sobre branco"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Amarelo sobre negro"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Amarelo sobre azul"</string>
</resources>
diff --git a/res/values-gu/arrays.xml b/res/values-gu/arrays.xml
index fa80e76..adf7d6d 100644
--- a/res/values-gu/arrays.xml
+++ b/res/values-gu/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"ક્યારેય મંજૂરી આપશો નહીં"</item>
<item msgid="1154273129608299386">"હંમેશા મંજૂરી આપો"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 530b5a0..19c23cd 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"રાત્રિ મોડ"</string>
<string name="network_and_internet" msgid="4229023630498537530">"નેટવર્ક અને ઇન્ટરનેટ"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"મોબાઇલ નેટવર્ક"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> સિમ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> સિમ</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# સિમ કાર્ડ}one{# સિમ}other{# સિમ}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"સક્રિય / સિમ"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"નિષ્ક્રિય / સિમ"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"સક્રિય / ડાઉનલોડ કરેલું સિમ"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"વધુ ઉમેરો"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"મોબાઇલ ડેટા"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"મોબાઇલ નેટવર્કનો ઉપયોગ કરીને ડેટા ઍક્સેસ કરો"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"મોબાઇલ નેટવર્ક"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"મોબાઇલ ડેટાનો ઉપયોગ કરો"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"મોબાઇલ ડેટા બંધ કરીએ?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"પસંદગી કરવી જરૂરી છે"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"મોબાઇલ ડેટા માટે <xliff:g id="CARRIER">%1$s</xliff:g>નો ઉપયોગ કરીએ?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"ડેટા સંબંધી ચેતવણી <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"ડેટાની મર્યાદા <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"ડેટા સંબંધી ચેતવણી <xliff:g id="ID_1">^1</xliff:g> / ડેટાની મર્યાદા <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d દિવસ બાકી</item>
- <item quantity="other">%d દિવસ બાકી</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# દિવસ બાકી}one{# દિવસ બાકી}other{# દિવસ બાકી}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"કોઈ સમય બાકી નથી"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 દિવસ કરતાં પણ ઓછો સમય બાકી"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> પહેલાં <xliff:g id="ID_1">^1</xliff:g> દ્વારા અપડેટ થયેલ"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"સેટ કરો"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ડેટા સંબંધી ચેતવણી અને મર્યાદા"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"ઍપ ડેટા વપરાશનું ચક્ર"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"મોબાઇલ ડેટાનો વપરાશ"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ડેટા વિશેની ચેતવણી સેટ કરો"</string>
<string name="data_warning" msgid="116776633806885370">"ડેટા વિશે ચેતવણી"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ડેટાની મર્યાદા સેટ કરો"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"તમે સેટ કરેલી મર્યાદાએ, તમારા વાહનનું હેડ એકમ મોબાઇલનો ડેટા બંધ કરી દેશે.\n\nવાહનના હેડ એકમ અને તમારા કૅરિઅર દ્વારા થતી ડેટા વપરાશની ગણતરીમાં ફરક હોઈ શકવાને કારણે માફકસરની મર્યાદા સેટ કરવાનું વિચારો."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ડેટા વપરાશની ચેતવણી સેટ કરો"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ડેટા વપરાશની મર્યાદા સેટ કરો"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"તમારા ડિવાઇસ દ્વારા ડેટા વપરાશ માપવામાં આવે છે. તે તમારા મોબાઇલ ઑપરેટરના ડેટા કરતાં અલગ હોઈ શકે છે."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"સેટ કરો"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"સાચવો"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM નેટવર્ક"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"વાહનનું ઇન્ટરનેટ"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"વાહનનું ઇન્ટરનેટ બંધ કરવાથી તેની અમુક સુવિધાઓ અથવા ઍપ કાર્ય કરતી અટકી શકે છે.\n\nતમારું વાહન ઑપરેટ કરવા માટે જરૂરી મહત્ત્વપૂર્ણ ડેટા, વાહન નિર્માતા સાથે સતત શેર કરવામાં આવતો રહેશે."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"કોઈપણ રીતે બંધ કરો"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"વાહનનું ઇન્ટરનેટ બંધ કરવામાં આવ્યું છે. આને કારણે વાહનની અમુક સુવિધાઓ અથવા ઍપ કાર્ય કરતી અટકી શકે છે. તમારું વાહન ઑપરેટ કરવા માટે જરૂરી મહત્ત્વપૂર્ણ ડેટા, વાહન નિર્માતા સાથે સતત શેર કરવામાં આવતો રહેશે."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$sનો વપરાશ થયો %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"અન્ય નેટવર્કમાં જોડાઓ"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"નેટવર્કની પસંદગીઓ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"નેટવર્ક ઉમેરો"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"કનેક્ટ કરો"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"કનેક્ટ થઈ રહી છે…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"કનેક્ટ થયેલું નથી"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"નેટવર્ક રેન્જમાં નથી"</string>
<string name="wifi_password" msgid="5565632142720292397">"પાસવર્ડ"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"પાસવર્ડ બતાવો"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"વાઇ-ફાઇ હૉટસ્પૉટ માટે ઓછામાં ઓછું એક બૅન્ડ પસંદ કરો:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"હૉટસ્પૉટ અને ઇન્ટરનેટ શેર કરવાની સુવિધા"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"હૉટસ્પૉટ"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"બંધ છે"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"હૉટસ્પૉટ ઑટોમૅટિક રીતે બંધ કરો"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"જો કોઈ ડિવાઇસ કનેક્ટ કરેલું ન હોય, તો વાઇ-ફાઇ હૉટસ્પૉટ બંધ થઈ જશે"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g>, વાઇ-ફાઇ ચાલુ કરવા માગે છે"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"ફરજિયાત બંધ કરો"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"ફરજિયાત બંધ કરીએ?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"જો તમે કોઈ ઍપને ફરજિયાત બંધ કરો છો, તો તે બરાબર ચાલશે નહીં."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"કાર્યપ્રદર્શનનું સંરક્ષણ બંધ કરીએ?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"જો તમે આમ કરશો, તો કદાચ તમારું સૉફ્ટવેર અને હાર્ડવેર સારી રીતે કાર્ય કરશે નહીં."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ચાલુ છોડો"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"બંધ કરો"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"ઍપના પર્ફોર્મન્સને પ્રાધાન્ય આપવાનું સેટિંગ ચાલુ કરૂએ?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"તેને ચાલુ કરવાથી સંભંવિત રીતે સિસ્ટમમાં અસ્થિરતા આવી શકે છે અથવા લાંબાગાળે હાર્ડવેરને અસર થઈ શકે છે. શું તમે ચાલુ રાખવા માગો છો?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"હા"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"ના, આભાર"</string>
<string name="disable_text" msgid="4358165448648990820">"બંધ કરો"</string>
<string name="enable_text" msgid="1794971777861881238">"ચાલુ કરો"</string>
<string name="uninstall_text" msgid="277907956072833012">"અનઇન્સ્ટૉલ કરો"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"પરવાનગીઓ"</string>
<string name="notifications_label" msgid="6586089149665170731">"નોટિફિકેશન"</string>
<string name="storage_application_label" msgid="5911779903670978586">"સ્ટોરેજ અને કૅશ મેમરી"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"શ્રેષ્ઠ કાર્યપ્રદર્શનની ખાતરી કરો"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ઍપ પર્ફોર્મન્સને પ્રાધાન્ય આપો"</string>
<string name="application_version_label" msgid="8556889839783311649">"વર્ઝન: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"કોઈ પરવાનગીઓ આપેલ નથી"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"કોઈ પરવાનગીઓની વિનંતી કરી નથી"</string>
<string name="unused_apps" msgid="648471933781010395">"બિનવપરાયેલી ઍપ"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one">બિનવપરાયેલી <xliff:g id="COUNT_1">%d</xliff:g> ઍપ</item>
- <item quantity="other">બિનવપરાયેલી <xliff:g id="COUNT_1">%d</xliff:g> ઍપ</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{બિનવપરાયેલી # ઍપ}one{બિનવપરાયેલી # ઍપ}other{બિનવપરાયેલી # ઍપ}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"પરવાનગીઓ કાઢી નાખો અને જગ્યા ખાલી કરો"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s આંતરિક સ્ટોરેજમાં"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"જરૂરી હોય, ત્યારે સાધનોનો વધુ વપરાશ ટાળવા ઍપ બંધ કરો"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ઍપના પર્ફોર્મન્સને પ્રાધાન્ય આપવા સિસ્ટમના સંસાધનોનો ઉપયોગ કરો"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ડેટા વપરાશ"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ઍપ ડેટા વપરાશ"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"વપરાશનો ઇતિહાસ"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"બધી ઍપ"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ડેટા અને વાઇ-ફાઇનો વપરાશ"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"વપરાશનો ઇતિહાસ"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"કુલ વપરાશ"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ફૉરગ્રાઉન્ડ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"બૅકગ્રાઉન્ડ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ડેટા વપરાશની મંજૂરી આપો"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"આ ઍપને મોબાઇલ ડેટાનો ઉપયોગ કરવા દો"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ડેટા વપરાશ મર્યાદિત કરો"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ઍપ ફૉરગ્રાઉન્ડમાં હોય ત્યારે જ મોબાઇલ ડેટા વાપરો"</string>
<string name="computing_size" msgid="5791407621793083965">"ગણતરી કરી રહ્યાં છીએ…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> વધારાની પરવાનગીઓ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> વધારાની પરવાનગીઓ</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{વધારાની # પરવાનગી}one{વધારાની # પરવાનગી}other{વધારાની # પરવાનગી}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"નોંધ: રીબૂટ કર્યાં પછી, જ્યાં સુધી તમે તમારું વાહન અનલૉક નહીં કરો ત્યાં સુધી આ ઍપ શરૂ થઈ શકશે નહીં."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"સહાય અને વૉઇસ ઇનપુટ"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"સહાયક ઍપ"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"વાઇ-ફાઇ નિયંત્રણ ઍપને વાઇ-ફાઇ ચાલુ અથવા બંધ કરવાની, વાઇ-ફાઇ નેટવર્કને સ્કૅન કરીને કનેક્ટ કરવાની, નેટવર્ક ઉમેરવાની કે કાઢી નાખવાની અથવા માત્ર-સ્થાનિક હૉટસ્પૉટ શરૂ કરવાની મંજૂરી આપે છે."</string>
<string name="more_special_access_title" msgid="166115485446645971">"વધુ"</string>
<string name="location_settings_title" msgid="901334356682423679">"સ્થાન"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"સ્થાનનો ઉપયોગ કરો"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"તમે ઉલ્લેખ કરો તે ઍપને તમારું સ્થાન ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"જો તમે આને બંધ કરશો, તો તે બધી ઍપ માટે સ્થાનનો ઍક્સેસ કાઢી નાખશે. ડ્રાઇવર માટે સહાયતા ઍપ પાસે હજી પણ ઍક્સેસ રહેશે."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ડ્રાઇવર માટે સહાયતા માટે સ્થાનનો ઉપયોગ કરો"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"વાહનના સ્થાનની સુવિધા બંધ છે"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ડ્રાઇવર સહાયતા ઍપમાં સ્થાન ઍક્સેસ અશક્ય"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"બદલો"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"ડ્રાઇવિંગ માટે સહાય કરતી ઍપને તમારું સ્થાન ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"જો તમે આને બંધ કરશો, તો સ્થાનની માહિતી પર આધારિત ડ્રાઇવર માટે સહાયતાની સુવિધાઓ બંધ કરવામાં આવશે."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"કોઈપણ રીતે બંધ કરો"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"સ્થાન માટે તાજેતરની વિનંતીઓ"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"સ્થાન માટે તાજેતરમાં કોઈ વિનંતી નથી"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ઍપ લેવલની પરવાનગીઓ"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"જગ્યાની સેવાઓ"</string>
<string name="location_use_location_title" msgid="117735895374606680">"સ્થાનનો ઉપયોગ કરો"</string>
<string name="location_settings_footer" msgid="296892848338100051">"સ્થાન સેવામાં તમારા ડિવાઇસનું સ્થાન નક્કી કરવામાં સહાય કરવા માટે GPS, વાઇ-ફાઇ, મોબાઇલ નેટવર્ક અને સેન્સર જેવા સૉર્સનો ઉપયોગ કરવામાં આવી શકે છે."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ડ્રાઇવર માટે સહાયતા"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"\'ડ્રાઇવર માટે સહાયતા\' ઍપને મોકલવામાં આવતી સ્થાનની માહિતીમાં તમારી ઓળખ આપતી માહિતી શામેલ હોતી નથી. તેને ડિલીટ કરતા પહેલાં વધુમાં વધુ 2 દિવસ સ્ટોર કરવામાં આવે છે."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"માઇક્રોફોન"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"માઇક્રોફોનનો ઉપયોગ કરો"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"બધી ઍપને તમારા માઇક્રોફોનના ઍક્સેસની મંજૂરી આપો"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"માઇક્રોફોનની પરવાનગીઓ મેનેજ કરો"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"તાજેતરમાં અૅક્સેસ કર્યો"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"ઍક્સેસ હોય એવી તાજેતરની કોઈ ઍપ નથી"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"કોઈપણ ઍપ પાસે ઍક્સેસ નથી"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count}માંથી # ઍપ પાસે ઍક્સેસ છે}one{{total_count}માંથી # ઍપ પાસે ઍક્સેસ છે}other{{total_count}માંથી # ઍપ પાસે ઍક્સેસ છે}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"તાજેતરમાં અૅક્સેસ કર્યો"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"તમામ જુઓ"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"લોડ કરી રહ્યાં છીએ…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"સિસ્ટમ"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"સિસ્ટમ અપડેટ"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"વિગતવાર"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"ત્રીજા પક્ષના લાઇસન્સ"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"લાઇસન્સ લોડ કરવામાં સમસ્યા છે."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"લોડ કરી રહ્યાં છીએ…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">હવે તમે ડેવલપર બનવાથી <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> પગલું દૂર છો.</item>
- <item quantity="other">હવે તમે ડેવલપર બનવાથી <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> પગલાં દૂર છો.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{હવે તમે ડેવલપર બનવાથી # પગલું દૂર છો.}one{હવે તમે ડેવલપર બનવાથી # પગલું દૂર છો.}other{હવે તમે ડેવલપર બનવાથી # પગલાં દૂર છો.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"તમે હવે ડેવલપર છો!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"કોઈ જરૂર નથી, તમે પહેલાંથી જ ડેવલપર છો."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ડેવલપરના વિકલ્પો"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"તમે નવી પ્રોફાઇલ બનાવો તે પછી, વપરાશકર્તાએ આ પ્રોફાઇલને પોતાને માટે કસ્ટમાઇઝ કરવી જોઈએ."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"અન્ય બધી પ્રોફાઇલ દ્વારા ઉપયોગ કરવા માટે, ઍપને કોઈપણ પ્રોફાઇલથી અપડેટ કરી શકાય છે."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"પ્રોફાઇલની મર્યાદા સુધી પહોંચ્યા"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">તમે વધુમાં વધુ <xliff:g id="COUNT">%d</xliff:g> પ્રોફાઇલ બનાવી શકો છો.</item>
- <item quantity="other">તમે વધુમાં વધુ <xliff:g id="COUNT">%d</xliff:g> પ્રોફાઇલ બનાવી શકો છો.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{માત્ર એક પ્રોફાઇલ બનાવી શકાય છે.}one{તમે વધુમાં વધુ # પ્રોફાઇલ બનાવી શકો છો.}other{તમે વધુમાં વધુ # પ્રોફાઇલ બનાવી શકો છો.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"નવી પ્રોફાઇલ બનાવી શકાઈ નથી"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"આ પ્રોફાઇલ ડિલીટ કરીએ?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"આ પ્રોફાઇલ માટેની તમામ ઍપ અને ડેટા ડિલીટ કરવામાં આવશે"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"પ્રોફાઇલ ડિલીટ કરી શકાઈ નથી."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"પ્રોફાઇલ ડિલીટ થઈ નથી. ડિવાઇસ ફરી શરૂ કરી ફરી પ્રયાસ કરો."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"જ્યારે તમે પ્રોફાઇલ સ્વિચ કરો કે વાહન ફરી ચાલુ કરો ત્યારે આ પ્રોફાઇલ ડિલીટ કરવામાં આવશે."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"છોડી દો"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ફરી પ્રયાસ કરો"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"એક અનલૉક પૅટર્ન કેવી રીતે દોરવી"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"પૅટર્ન સાચવવામાં ભૂલ"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"વધુ પડતા અયોગ્ય પ્રયાસો. <xliff:g id="NUMBER">%d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"પૅટર્ન રોટરીને સપોર્ટ કરતી નથી, ટચ વાપરો"</string>
<string name="okay" msgid="4589873324439764349">"ઓકે"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"સ્ક્રીન લૉક કાઢી નાખીએ?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"આ ક્રિયા તમારા એકાઉન્ટને ઍક્સેસ કરવાની મંજૂરી કોઈને પણ આપશે"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"સામાન્ય પિન તમારા IT વ્યવસ્થાપક દ્વારા બ્લૉક કરવામાં આવ્યા છે. કોઈ બીજો પિન અજમાવી જુઓ."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"આમાં અમાન્ય અક્ષરોનો સમાવેશ થઈ શકતો નથી."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"પાસવર્ડ અમાન્ય છે, ઓછામાં ઓછા 4 અક્ષર હોવા આવશ્યક છે."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> અક્ષર ધરાવતો હોવો જોઈએ</item>
- <item quantity="other">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> અક્ષર ધરાવતો હોવો જોઈએ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> લોઅરકેસ અક્ષર ધરાવતો હોવો જોઈએ</item>
- <item quantity="other">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> લોઅરકેસ અક્ષર ધરાવતો હોવો જોઈએ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> અપરકેસ અક્ષર ધરાવતો હોવો જોઈએ</item>
- <item quantity="other">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> અપરકેસ અક્ષર ધરાવતો હોવો જોઈએ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> સંખ્યાવાચક અંક ધરાવતો હોવો જોઈએ</item>
- <item quantity="other">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> સંખ્યાવાચક અંક ધરાવતો હોવો જોઈએ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> વિશિષ્ટ પ્રતીક ધરાવતો હોવો જોઈએ</item>
- <item quantity="other">ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> વિશિષ્ટ પ્રતીક ધરાવતો હોવો જોઈએ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">વર્ણ સિવાયના ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> અક્ષર ધરાવતો હોવો જોઈએ</item>
- <item quantity="other">વર્ણ સિવાયના ઓછામાં ઓછા <xliff:g id="COUNT">%d</xliff:g> અક્ષર ધરાવતો હોવો જોઈએ</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ઉપકરણ વ્યવસ્થાપક તાજેતરના પાસવર્ડનો ઉપયોગ કરવાની મંજૂરી આપતા નથી"</string>
<string name="error_saving_password" msgid="8334882262622500658">"પાસવર્ડ સાચવવામાં ભૂલ"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"સામાન્ય પાસવર્ડ તમારા IT વ્યવસ્થાપક દ્વારા બ્લૉક કરવામાં આવ્યા છે. કોઈ બીજો પાસવર્ડ અજમાવી જુઓ."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"પ્રોફાઇલ ઉમેરો"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"આ પ્રોફાઇલ ડિલીટ કરો"</string>
<string name="add_profile_text" msgid="9118410102199116969">"પ્રોફાઇલ ઉમેરો"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ડિસ્પ્લે બ્રાઇટનેસ"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"તમારા ડિવાઇસ જોવા માટે, બ્લૂટૂથ ચાલુ કરો"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"ડિવાઇસનું જોડાણ કરવા માટે, બ્લૂટૂથ સેટિંગ ખોલો"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"ઇન્ફોટેનમેન્ટ સિસ્ટમ વ્યવસ્થાપક"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"સક્રિય ઍપ"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"નિષ્ક્રિય કરેલી ઍપ"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"આ પરવાનગી ધરાવતી ઍપ પાસે આ વાહનના ડેટાનો ઍક્સેસ હોય છે"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"વ્યવસ્થાપક માટે વાહન સંબંધિત કોઈ ઍપ નથી"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"આ ઇન્ફોટેનમેન્ટ સિસ્ટમ વ્યવસ્થાપક ઍપ સક્રિય છે અને ઍપ <xliff:g id="APP_NAME">%1$s</xliff:g>ને નીચેની ક્રિયાઓ કરવાની મંજૂરી આપે છે:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"આ ઇન્ફોટેનમેન્ટ સિસ્ટમ ઍપને સક્રિય કરવાથી, ઍપ <xliff:g id="APP_NAME">%1$s</xliff:g>ને નીચેની ક્રિયાઓ કરવાની મંજૂરી આપવામાં આવશે:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"આ ઇન્ફોટેનમેન્ટ સિસ્ટમ ઍપ સક્રિય કરીએ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"આ ઇન્ફોટેનમેન્ટ સિસ્ટમ ઍપ સક્રિય કરો"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"નિષ્ક્રિય અને અનઇન્સ્ટૉલ કરો"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"આ ઇન્ફોટેનમેન્ટ સિસ્ટમ ઍપને નિષ્ક્રિય કરો"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"વધુ વિગતો"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"સંસ્થાના મેનેજર સેટિંગ, પરવાનગીઓ, કૉર્પોરેટ ઍક્સેસ, નેટવર્ક પ્રવૃત્તિ અને વાહનના સ્થાનની માહિતી સહિત આ પ્રોફાઇલ સાથે સંકળાયેલી ઍપ અને ડેટાનું નિરીક્ષણ કરી શકે છે અને મેનેજ કરી શકે છે."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"સંસ્થાના મેનેજર સેટિંગ, પરવાનગીઓ, કૉર્પોરેટ ઍક્સેસ, નેટવર્ક પ્રવૃત્તિ અને ડિવાઇસના સ્થાનની માહિતી સહિત આ પ્રોફાઇલ સાથે સંકળાયેલી ઍપ અને ડેટાનું નિરીક્ષણ કરી શકે છે અને મેનેજ કરી શકે છે."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"સંસ્થાના મેનેજર સેટિંગ, પરવાનગીઓ, કૉર્પોરેટ ઍક્સેસ, નેટવર્ક પ્રવૃત્તિ અને વાહનના સ્થાનની માહિતી સહિત આ ઇન્ફોટેનમેન્ટ સિસ્ટમ સાથે સંકળાયેલી ઍપ અને ડેટાનું નિરીક્ષણ કરી શકે છે અને મેનેજ કરી શકે છે."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"સંસ્થાના મેનેજર આ ઇન્ફોટેનમેન્ટ સિસ્ટમ સાથે સંકળાયેલા ડેટાને ઍક્સેસ, ઍપને મેનેજ કરી શકશે અને આ વાહનના સેટિંગને બદલી શકશે."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"તે અનુપલબ્ધ છે"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"મેનેજ કરવામાં આવેલા આ વાહનમાં વૉલ્યૂમ બદલી શકાતું નથી"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"મેનેજ કરવામાં આવેલા આ વાહનમાં કૉલ કરી શકાતા નથી"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"મેનેજ કરવામાં આવેલા આ વાહનમાં SMSની મંજૂરી નથી"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"મેનેજ કરવામાં આવેલા આ વાહનમાં કૅમેરા ઉપલબ્ધ નથી"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"મેનેજ કરવામાં આવેલા આ વાહનમાં સ્ક્રીનશૉટ લઈ શકતા નથી"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"મેનેજ કરવામાં આવેલા આ વાહનમાં આ ઍપ ખોલી શકાતી નથી"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"તમને ક્રેડિટ પર વેચાણ કરનારે બ્લૉક કર્યું છે"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"સંસ્થા દ્વારા કેટલીક સુવિધાઓનો ઍક્સેસ મર્યાદિત કરવામાં આવ્યો છે.\n\nજો તમને પ્રશ્નો હોય, તો સંસ્થાના મેનેજરનો સંપર્ક કરો."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"વાહન વ્યવસ્થાપક ઍપ"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# સક્રિય ઍપ}one{# સક્રિય ઍપ}other{# સક્રિય ઍપ}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"કોઈ સક્રિય ઍપ નથી"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ની વાહનની પૉલિસી"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"સંસ્થાના મેનેજર દ્વારા મેનેજ કરાતા સેટિંગ"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> વિશે વધુ જાણો"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"બગ રિપોર્ટ શેર કરીએ?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"આ વાહનની સંસ્થાના મેનેજરે આ ડિવાઇસની સમસ્યા નિવારણમાં સહાય માટે બગ રિપોર્ટની વિનંતી કરી છે. ઍપ અને ડેટા શેર કરવામાં આવી શકે છે."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"આ વાહનની સંસ્થાના મેનેજરે આ ડિવાઇસની સમસ્યા નિવારણમાં સહાય માટે બગ રિપોર્ટની વિનંતી કરી છે. ઍપ અને ડેટા શેર કરવામાં આવી શકે છે અને તમારું ડિવાઇસ હંગામી રીતે ધીમું થઈ શકે છે."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"આ બગ રિપોર્ટ આ વાહનની સંસ્થાના મેનેજર સાથે શેર કરવામાં આવી શકે છે. વધુ વિગતો માટે તેમનો સંપર્ક કરો."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"શેર કરો"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"નકારો"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"હમણાં આ સેટિંગમાં ફેરફાર કરી શકાશે નહીં"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ઍક્સેસિબિલિટી"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"કૅપ્શન"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"કૅપ્શનની પસંદગીઓ"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"બંધ છે"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ચાલુ છે"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"સ્ક્રીન રીડર"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"કૅપ્શન બતાવો"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ટેક્સ્ટનું કદ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"કૅપ્શનનું કદ અને શૈલી"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"ઘણી નાની ટેક્સ્ટ"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"નાની ટેક્સ્ટ"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ડિફૉલ્ટ"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"મોટી ટેક્સ્ટ"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ઘણી મોટી ટેક્સ્ટ"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"કૅપ્શનની શૈલી"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ઍપ મુજબ સેટ કરવામાં આવશે"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"કાળા પર સફેદ ટેક્સ્ટ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"સફેદ પર કાળી ટેક્સ્ટ"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"કાળા પર પીળી ટેક્સ્ટ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"વાદળી પર પીળી ટેક્સ્ટ"</string>
</resources>
diff --git a/res/values-hi/arrays.xml b/res/values-hi/arrays.xml
index e71b2bd..d910c2d 100644
--- a/res/values-hi/arrays.xml
+++ b/res/values-hi/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"कभी अनुमति ना दें"</item>
<item msgid="1154273129608299386">"हमेशा अनुमति दें"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 8b92bc4..5ca8853 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"रात वाला मोड"</string>
<string name="network_and_internet" msgid="4229023630498537530">"नेटवर्क और इंटरनेट"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"मोबाइल नेटवर्क"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> सिम</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> सिम</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# सिम}one{# सिम}other{# सिम}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"चालू / सिम"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"बंद / सिम"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"चालू / डाउनलोड किया गया सिम"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"ज़्यादा जोड़ें"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"मोबाइल डेटा"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"मोबाइल नेटवर्क का इस्तेमाल करके डेटा ऐक्सेस करें"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"मोबाइल नेटवर्क"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"मोबाइल डेटा का इस्तेमाल करें"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"मोबाइल डेटा बंद करना चाहते हैं?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"चुनना ज़रूरी है"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"मोबाइल डेटा के लिए <xliff:g id="CARRIER">%1$s</xliff:g> इस्तेमाल करें?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> डेटा खर्च की चेतावनी"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> डेटा सीमा"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> डेटा खर्च की चेतावनी / <xliff:g id="ID_2">^2</xliff:g> डेटा की सीमा"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d दिन बचे हैं</item>
- <item quantity="other">%d दिन बचे हैं</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# दिन बचा है}one{# दिन बचा है}other{# दिन बचे हैं}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"बिलिंग साइकिल पूरा हो चुका है"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"एक दिन से कम समय बचा है"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> ने <xliff:g id="ID_2">^2</xliff:g> पहले अपडेट किया"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"सेट करें"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"डेटा खर्च की चेतावनी और सीमा"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"ऐप्लिकेशन के डेटा खर्च की साइकिल"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"मोबाइल डेटा खर्च"</string>
<string name="set_data_warning" msgid="6628236612886588097">"डेटा चेतावनी सेट करें"</string>
<string name="data_warning" msgid="116776633806885370">"डेटा खर्च की चेतावनी"</string>
<string name="set_data_limit" msgid="7136539812414500084">"डेटा सीमा सेट करें"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"आपकी तय की हुई सीमा तक पहुंचते ही आपकी गाड़ी की हेड यूनिट मोबाइल डेटा को बंद कर देगी.\n\nडेटा इस्तेमाल का हिसाब हेड यूनिट लगाती है. ऐसा हो सकता है कि आपकी मोबाइल और इंटरनेट सेवा देने वाली कंपनी अलग तरह से डेटा खर्च का हिसाब लगाए. इसलिए, इस फ़र्क को ध्यान में रखते हुए सीमा तय करें."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"डेटा खर्च की चेतावनी सेट करें"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"डेटा खर्च की सीमा सेट करें"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"आपका डिवाइस, डेटा खर्च मापता है. आपकी मोबाइल और इंटरनेट सेवा देने वाली कंपनी के डेटा के हिसाब से, डेटा खर्च अलग-अलग हो सकता है."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"सेट करें"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"सेव करें"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM नेटवर्क"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"गाड़ी का इंटरनेट"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"गाड़ी का इंटरनेट बंद करने से, हो सकता है कि गाड़ी की कुछ सुविधाएं या ऐप्लिकेशन काम न कर पाएं.\n\nआपकी गाड़ी को ऑपरेट करने के लिए ज़रूरी डेटा, गाड़ी बनाने वाली कंपनी के साथ शेयर किया जाता रहेगा."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"फिर भी बंद करें"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"गाड़ी का इंटरनेट बंद कर दिया गया है. हो सकता है कि इस वजह से गाड़ी की कुछ सुविधाएं या ऐप्लिकेशन काम न कर पाएं. आपकी गाड़ी को ऑपरेट करने के लिए ज़रूरी डेटा, गाड़ी बनाने वाली कंपनी के साथ शेयर किया जाता रहेगा."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s से %3$s तक %1$s डेटा इस्तेमाल किया गया"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"अन्य नेटवर्क से जुड़ें"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"नेटवर्क की सेटिंग"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"नेटवर्क जोड़ें"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"जोड़ें"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"कनेक्ट हो रहा है…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"कनेक्ट नहीं है"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"नेटवर्क पहुंच से बाहर है"</string>
<string name="wifi_password" msgid="5565632142720292397">"पासवर्ड"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"पासवर्ड दिखाएं"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"वाई-फ़ाई हॉटस्पॉट से जुड़ने के लिए कम से कम एक बैंड चुनें:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"हॉटस्पॉट और टेदरिंग"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"हॉटस्पॉट"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"बंद है"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"हॉटस्पॉट अपने-आप बंद हो जाए"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"कोई डिवाइस कनेक्ट नहीं होने पर वाई-फ़ाई हॉटस्पॉट बंद हो जाएगा"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> को वाई-फ़ाई चालू करने की अनुमति चाहिए"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"ज़बरदस्ती रोकें"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"ज़बरदस्ती रोकें?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"अगर आप किसी ऐप्लिकेशन को ज़बरदस्ती रोकते हैं, तो हो सकता है वह ठीक से काम न करे."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"परफ़ॉर्मेंस सुरक्षा बंद करना चाहते हैं?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"अगर आप ऐसा करते हैं, तो हो सकता है कि सॉफ़्टवेयर और हार्डवेयर भी काम न करें."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"चालू रखें"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"बंद करें"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"क्या आप ऐप्लिकेशन की परफ़ॉर्मेंस को प्राथमिकता देने की सुविधा चालू करना चाहते हैं?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"इस सुविधा को चालू करने से संभावित सिस्टम में अस्थिरता या लंबे समय के लिए हार्डवेयर पर असर हो सकता है. क्या आप जारी रखना चाहते हैं?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"हां"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"रहने दें"</string>
<string name="disable_text" msgid="4358165448648990820">"बंद करें"</string>
<string name="enable_text" msgid="1794971777861881238">"चालू करें"</string>
<string name="uninstall_text" msgid="277907956072833012">"अनइंस्टॉल करें"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"अनुमतियां"</string>
<string name="notifications_label" msgid="6586089149665170731">"सूचनाएं"</string>
<string name="storage_application_label" msgid="5911779903670978586">"मेमोरी और कैश"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"पक्का करें कि परफ़ॉर्मेंस बेहतरीन हो"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ऐप्लिकेशन की परफ़ॉर्मेंस को प्राथमिकता दें"</string>
<string name="application_version_label" msgid="8556889839783311649">"वर्शन: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"कोई अनुमति नहीं दी गई"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"किसी अनुमति का अनुरोध नहीं किया गया"</string>
<string name="unused_apps" msgid="648471933781010395">"इस्तेमाल न किए जाने वाले ऐप्लिकेशन"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one">इस्तेमाल न किया जाने वाला <xliff:g id="COUNT_1">%d</xliff:g> ऐप्लिकेशन</item>
- <item quantity="other">इस्तेमाल न किए जाने वाले <xliff:g id="COUNT_1">%d</xliff:g> ऐप्लिकेशन</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{इस्तेमाल न किया जाने वाला # ऐप्लिकेशन}one{इस्तेमाल न किया जाने वाला # ऐप्लिकेशन}other{इस्तेमाल न किए जाने वाले # ऐप्लिकेशन}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"अनुमतियां हटाएं और स्टोरेज खाली करें"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"डिवाइस की मेमोरी में %s है"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"जब ज़रूरी हो, तो संसाधनों के बहुत ज़्यादा इस्तेमाल से बचने के लिए, ऐप्लिकेशन को बंद करें"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ऐप्लिकेशन की परफ़ॉर्मेंस को प्राथमिकता देने के लिए, सिस्टम के संसाधनों का इस्तेमाल करें"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"डेटा खर्च"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ऐप्लिकेशन का डेटा खर्च"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"डेटा के इस्तेमाल का इतिहास"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"सभी ऐप्लिकेशन"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"डेटा और वाई-फ़ाई के इस्तेमाल की जानकारी"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"डेटा के इस्तेमाल का इतिहास"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"कुल इस्तेमाल"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"फ़ोरग्राउंड"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"बैकग्राउंड"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"डेटा का इस्तेमाल करने दें"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"इस ऐप्लिकेशन को मोबाइल डेटा इस्तेमाल करने दें"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"डेटा प्रतिबंधित करें"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ऐप्लिकेशन फ़ोरग्राउंड में होने पर ही मोबाइल डेटा का इस्तेमाल करें"</string>
<string name="computing_size" msgid="5791407621793083965">"गिनती की जा रही है…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> अतिरिक्त अनुमतियां</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> अतिरिक्त अनुमतियां</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# अतिरिक्त अनुमति}one{# अतिरिक्त अनुमति}other{# अतिरिक्त अनुमतियां}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"ध्यान दें: डिवाइस को फिर से चालू करने के बाद, यह ऐप्लिकेशन तब तक शुरू नहीं होगा जब तक आप अपनी गाड़ी अनलॉक नहीं करते."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"असिस्ट और बोलकर फ़ोन को निर्देश"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"सहायक ऐप्लिकेशन"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"वाई-फ़ाई का नियंत्रण किसी ऐप्लिकेशन को वाई-फ़ाई चालू या बंद करने, वाई-फ़ाई नेटवर्क ढूंढने और उससे जुड़ने की अनुमति देता है. साथ ही, नेटवर्क जोड़ने या हटाने या सिर्फ़ सीमित दायरे में इस्तेमाल होने वाला हॉटस्पॉट चालू करने की अनुमति देता है."</string>
<string name="more_special_access_title" msgid="166115485446645971">"ज़्यादा सेटिंग"</string>
<string name="location_settings_title" msgid="901334356682423679">"जगह की जानकारी"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"जगह की जानकारी का इस्तेमाल करें"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"जिन ऐप्लिकेशन को आपने चुना है उन्हें अपनी जगह की जानकारी को ऐक्सेस करने की अनुमति दें"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"अगर आप इसे बंद करेंगे, तो कोई भी ऐप्लिकेशन जगह की जानकारी को ऐक्सेस नहीं कर पाएगा. ड्राइवर की सुरक्षा से जुड़ी मदद करने वाले ऐप्लिकेशन उसे अब भी ऐक्सेस कर पाएंगे."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ड्राइवर की सुरक्षा से जुड़ी मदद करने वाली सुविधाओं के लिए, जगह की जानकारी का इस्तेमाल करें"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"गाड़ी की जानकारी देने की सुविधा बंद है"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ड्राइवर असिस्टेंस ऐप, आपकी जगह की जानकारी को ऐक्सेस नहीं कर सकते"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"बदलें"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"ड्राइविंग में मदद करने वाले ऐप्लिकेशन को, जगह की जानकारी ऐक्सेस करने दें"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"अगर आप इसे बंद करेंगे, तो ड्राइवर की सुरक्षा से जुड़ी मदद करने वाले ऐसे ऐप्लिकेशन बंद हो जाएंगे जो जगह की जानकारी का इस्तेमाल करते हैं."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"फिर भी बंद करें"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"हाल ही में किए गए जगह के अनुरोध"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"हाल ही में जगह का कोई अनुरोध नहीं है"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ऐप्लिकेशन-लेवल की अनुमतियां"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"जगह की जानकारी से जुड़ी सेवाएं"</string>
<string name="location_use_location_title" msgid="117735895374606680">"जगह की जानकारी का इस्तेमाल करें"</string>
<string name="location_settings_footer" msgid="296892848338100051">"जगह की जानकारी देने वाली सेवा, आपके डिवाइस की मौजूदा जगह का पता लगाने के लिए, जीपीएस, वाई-फ़ाई, मोबाइल नेटवर्क, और सेंसर जैसे स्रोतों का इस्तेमाल कर सकती है."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ड्राइवर की सुरक्षा से जुड़ी मदद करने वाली सुविधाएं"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ड्राइवर की सुरक्षा से जुड़ी मदद करने वाली सुविधाओं के ऐप्लिकेशन को भेजी जाने वाली जगह की जानकारी में, आपके बारे में बताने वाली जानकारी शामिल नहीं होती है. इस जानकारी को ज़्यादा से ज़्यादा दो दिनों तक सेव रखा जाता है. इसके बाद, मिटा दिया जाता है."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"माइक्रोफ़ोन"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"माइक्रोफ़ोन इस्तेमाल करें"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"सभी ऐप्लिकेशन को अपना माइक्रोफ़ोन ऐक्सेस करने की अनुमति दें"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"माइक्रोफ़ोन की अनुमतियां मैनेज करें"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"हाल ही में, इन ऐप्लिकेशन ने माइक्रोफ़ोन का इस्तेमाल किया"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"हाल ही में, किसी भी ऐप्लिकेशन ने ऐक्सेस नहीं किया"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"किसी भी ऐप्लिकेशन के पास ऐक्सेस नहीं है"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count} ऐप्लिकेशन में से # के पास ऐक्सेस है}one{{total_count} ऐप्लिकेशन में से # के पास ऐक्सेस है}other{{total_count} ऐप्लिकेशन में से # के पास ऐक्सेस है}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"हाल ही में, इन ऐप्लिकेशन ने माइक्रोफ़ोन का इस्तेमाल किया"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"सभी देखें"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"लोड हो रहे हैं…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"सिस्टम"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"सिस्टम अपडेट"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"बेहतर सेटिंग"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"तीसरे पक्ष के लाइसेंस"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"लाइसेंस लोड करने में कोई समस्या है."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"लोड हो रहा है…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">अब आप डेवलपर बनने से <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> कदम दूर हैं.</item>
- <item quantity="other">अब आप डेवलपर बनने से <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> कदम दूर हैं.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{अब आप डेवलपर बनने से # कदम दूर हैं.}one{अब आप डेवलपर बनने से # कदम दूर हैं.}other{अब आप डेवलपर बनने से # कदम दूर हैं.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"अब आप डेवलपर बन गए हैं!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"ज़रूरत नहीं है, आप पहले से ही डेवलपर हैं."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"डेवलपर के लिए सेटिंग और टूल"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"नई प्रोफ़ाइल बन जाने के बाद, उपयोगकर्ता को चाहिए कि वह प्रोफ़ाइल को अपनी पसंद के हिसाब से बना ले."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"किसी भी प्रोफ़ाइल से ऐप्लिकेशन अपडेट किए जा सकते हैं, ताकि उनका इस्तेमाल अन्य सभी प्रोफाइलें कर सकें."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"और प्रोफ़ाइलें नहीं जोड़ी जा सकतीं"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">आप <xliff:g id="COUNT">%d</xliff:g> ही प्रोफ़ाइल बना सकते हैं.</item>
- <item quantity="other">आप ज़्यादा से ज़्यादा <xliff:g id="COUNT">%d</xliff:g> प्रोफ़ाइलें बना सकते हैं.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{सिर्फ़ 1 प्रोफ़ाइल बनाई जा सकती है.}one{आप ज़्यादा से ज़्यादा # प्रोफ़ाइल बना सकते हैं.}other{आप ज़्यादा से ज़्यादा # प्रोफ़ाइलें बना सकते हैं.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"नई प्रोफ़ाइल नहीं बनाई जा सकी"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"क्या आप यह प्रोफ़ाइल मिटाना चाहते हैं?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"इस प्रोफ़ाइल के सभी ऐप्लिकेशन और डेटा को मिटा दिया जाएगा"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"प्रोफ़ाइल नहीं मिटाई जा सकी."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"प्रोफ़ाइल मिटाई नहीं जा सकी. डिवाइस रीस्टार्ट करके फिर से कोशिश करें."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"इस प्रोफ़ाइल से दूसरी प्रोफ़ाइल पर जाने या गाड़ी को फिर से स्टार्ट करने पर, यह प्रोफ़ाइल मिट जाएगी."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"खारिज करें"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"फिर से कोशिश करें"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"लॉक खोलने का पैटर्न बनाने का तरीका"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"पैटर्न सेव करने में गड़बड़ी हुई"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"आपकी कोशिशें बहुत बार गलत हुई हैं. <xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"यह पैटर्न, रोटरी के साथ काम नहीं करता. कृपया टच का इस्तेमाल करें"</string>
<string name="okay" msgid="4589873324439764349">"ठीक है"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"क्या आप स्क्रीन लॉक हटाना चाहते हैं?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"स्क्रीन लॉक हटाने पर कोई भी आपका खाता इस्तेमाल कर सकता है"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"आपके आईटी एडमिन ने आम तौर पर इस्तेमाल होने वाले पिन पर रोक लगा दी है. कोई अन्य पिन बनाएं."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"इसमें अमान्य वर्ण नहीं डाला जा सकता."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"यह पासवर्ड अमान्य है, इसमें कम से कम 4 वर्ण होने चाहिए"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">पासवर्ड में कम से कम <xliff:g id="COUNT">%d</xliff:g> अक्षर होने चाहिए</item>
- <item quantity="other">पासवर्ड में कम से कम <xliff:g id="COUNT">%d</xliff:g> अक्षर होने चाहिए</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">पासवर्ड में अंग्रेज़ी के कम से कम <xliff:g id="COUNT">%d</xliff:g> छोटे अक्षर होने चाहिए</item>
- <item quantity="other">पासवर्ड में अंग्रेज़ी के कम से कम <xliff:g id="COUNT">%d</xliff:g> छोटे अक्षर होने चाहिए</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">पासवर्ड में अंग्रेज़ी के कम से कम <xliff:g id="COUNT">%d</xliff:g> बड़े अक्षर होने चाहिए</item>
- <item quantity="other">पासवर्ड में अंग्रेज़ी के कम से कम <xliff:g id="COUNT">%d</xliff:g> बड़े अक्षर होने चाहिए</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">पासवर्ड में कम से कम <xliff:g id="COUNT">%d</xliff:g> अंक होने चाहिए</item>
- <item quantity="other">पासवर्ड में कम से कम <xliff:g id="COUNT">%d</xliff:g> अंक होने चाहिए</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">पासवर्ड में कम से कम <xliff:g id="COUNT">%d</xliff:g> खास चिह्न होने चाहिए</item>
- <item quantity="other">पासवर्ड में कम से कम <xliff:g id="COUNT">%d</xliff:g> खास चिह्न होने चाहिए</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">पासवर्ड में कम से कम <xliff:g id="COUNT">%d</xliff:g> वर्ण ऐसे होने चाहिए जो अक्षर न हों</item>
- <item quantity="other">पासवर्ड में कम से कम <xliff:g id="COUNT">%d</xliff:g> वर्ण ऐसे होने चाहिए जो अक्षर न हों</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"डिवाइस एडमिन हाल ही के पासवर्ड का इस्तेमाल करने की मंज़ूरी नहीं देता"</string>
<string name="error_saving_password" msgid="8334882262622500658">"पासवर्ड सेव करने में गड़बड़ी हुई"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"आपके आईटी एडमिन ने आम तौर पर इस्तेमाल होने वाले पासवर्ड पर रोक लगा दी है. कोई अन्य पासवर्ड बनाएं."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"कोई प्रोफ़ाइल जोड़ें"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"यह प्रोफ़ाइल मिटाएं"</string>
<string name="add_profile_text" msgid="9118410102199116969">"प्रोफ़ाइल जोड़ें"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"डिसप्ले की चमक"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"अपने डिवाइसों को देखने के लिए, ब्लूटूथ चालू करें"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"किसी डिवाइस को दूसरे डिवाइस से जोड़ने के लिए, ब्लूटूथ सेटिंग खोलें"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"सूचना और मनोरंजन की सुविधा देने वाले डिवाइस का एडमिन"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"वे ऐप्लिकेशन जो चालू हैं"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"वे ऐप्लिकेशन जो चालू नहीं हैं"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"जिन ऐप्लिकेशन को यह अनुमति मिली है वे वाहन के डेटा को ऐक्सेस कर सकते हैं"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"वाहन का कोई एडमिन ऐप्लिकेशन नहीं है"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"सूचना और मनोरंजन की सुविधा देने वाले इस डिवाइस का एडमिन ऐप्लिकेशन चालू है और <xliff:g id="APP_NAME">%1$s</xliff:g> ऐप्लिकेशन को ये काम करने देता है:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"सूचना और मनोरंजन की सुविधा देने वाले इस डिवाइस के ऐप्लिकेशन को चालू करने से, <xliff:g id="APP_NAME">%1$s</xliff:g> ऐप्लिकेशन को ये काम करने की अनुमति मिल जाएगी:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"क्या आप सूचना और मनोरंजन की सुविधा देने वाले इस डिवाइस का ऐप्लिकेशन चालू करना चाहते हैं?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"सूचना और मनोरंजन की सुविधा देने वाले इस डिवाइस का ऐप्लिकेशन चालू करें"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"बंद करें और अनइंस्टॉल करें"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"सूचना और मनोरंजन की सुविधा देने वाले इस डिवाइस के ऐप्लिकेशन को बंद करें"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"ज़्यादा जानकारी"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"ऑर्गनाइज़ेशन मैनेजर, इस प्रोफ़ाइल से जुड़े ऐप्लिकेशन और डेटा को मॉनिटर और मैनेज कर सकता है. इसमें सेटिंग, अनुमतियां, कॉर्पोरेट ऐक्सेस, नेटवर्क गतिविधि, और गाड़ी की जगह की जानकारी शामिल है."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"ऑर्गनाइज़ेशन मैनेजर, इस प्रोफ़ाइल से जुड़े ऐप्लिकेशन और डेटा को मॉनिटर और मैनेज कर सकता है. इसमें सेटिंग, अनुमतियां, कॉर्पोरेट ऐक्सेस, नेटवर्क गतिविधि, और डिवाइस की जगह की जानकारी शामिल है."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"ऑर्गनाइज़ेशन मैनेजर, सूचना और मनोरंजन की सुविधा देने वाले इस डिवाइस के ऐप्लिकेशन और डेटा को मॉनिटर और मैनेज कर सकता है. इसमें सेटिंग, अनुमतियां, कॉर्पोरेट ऐक्सेस, नेटवर्क गतिविधि, और गाड़ी की जगह की जानकारी शामिल है."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"ऑर्गनाइज़ेशन मैनेजर, सूचना और मनोरंजन की सुविधा देने वाले इस डिवाइस के डेटा को ऐक्सेस कर सकता है, ऐप्लिकेशन मैनेज कर सकता है, और इस गाड़ी की सेटिंग में बदलाव कर सकता है."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"यह उपलब्ध नहीं है"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"मैनेज की गई इस गाड़ी में, वॉल्यूम को नहीं बदला जा सकता"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"मैनेज की गई इस गाड़ी में, कॉल नहीं किया जा सकता"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"मैनेज की गई इस गाड़ी में, एसएमएस की अनुमति नहीं है"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"मैनेज की गई इस गाड़ी में, कैमरा उपलब्ध नहीं है"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"मैनेज की गई इस गाड़ी में, स्क्रीनशॉट नहीं लिया जा सकता"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"मैनेज की गई इस गाड़ी में, इस ऐप्लिकेशन को नहीं खोला जा सकता"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"क्रेडिट सेवा देने वाली कंपनी ने ब्लॉक किया है"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"कुछ सुविधाओं के ऐक्सेस को संगठन ने सीमित कर दिया है.\n\nअगर इस बारे में कुछ पूछना है, तो संगठन के मैनेजर से संपर्क करें."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"वाहन के एडमिन ऐप्लिकेशन"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# ऐप्लिकेशन जो चालू है}one{# ऐप्लिकेशन जो चालू है}other{# ऐप्लिकेशन जो चालू हैं}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"कोई ऐप्लिकेशन चालू नहीं है"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> गाड़ी से जुड़ी नीति"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"वे सेटिंग जिन्हें ऑर्गनाइज़ेशन मैनेजर मैनेज करता है"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> के बारे में ज़्यादा जानें"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"क्या आपको गड़बड़ी की रिपोर्ट शेयर करना है?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"इस गाड़ी के ऑर्गनाइज़ेशन मैनेजर ने, इस डिवाइस की समस्या हल करने में मदद के लिए, गड़बड़ी की एक रिपोर्ट का अनुरोध किया है. ऐप्लिकेशन और डेटा को शेयर किया जा सकता है."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"इस गाड़ी के ऑर्गनाइज़ेशन मैनेजर ने, इस डिवाइस की समस्या हल करने में मदद के लिए, गड़बड़ी की एक रिपोर्ट का अनुरोध किया है. ऐप्लिकेशन और डेटा को शेयर किया जा सकता है और हो सकता है कि आपका डिवाइस कुछ देर के लिए धीमा हो जाए."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"इस गड़बड़ी की रिपोर्ट, आपकी गाड़ी के ऑर्गनाइज़ेशन मैनेजर से शेयर की जा रही है. ज़्यादा जानकारी के लिए, उनसे संपर्क करें."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"शेयर करें"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"अस्वीकार करें"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"इस सेटिंग को अभी बदला नहीं जा सकता"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"सुलभता"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"कैप्शन"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"कैप्शन की सेटिंग"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"बंद हैं"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"चालू हैं"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"स्क्रीन रीडर"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"कैप्शन दिखाएं"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"टेक्स्ट का साइज़"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"कैप्शन का साइज़ और स्टाइल"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"बहुत छोटा"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"छोटा"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"डिफ़ॉल्ट"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"बड़ा"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"बहुत बड़ा"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"कैप्शन का स्टाइल"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ऐप्लिकेशन के हिसाब से सेट करें"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"काले बैकग्राउंड पर सफ़ेद टेक्स्ट"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"सफ़ेद बैकग्राउंड पर काला टेक्स्ट"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"काले बैकग्राउंड पर पीला टेक्स्ट"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"नीले बैकग्राउंड पर पीला टेक्स्ट"</string>
</resources>
diff --git a/res/values-hr/arrays.xml b/res/values-hr/arrays.xml
index 2ecf44f..713fab4 100644
--- a/res/values-hr/arrays.xml
+++ b/res/values-hr/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ne dopuštaj nikada"</item>
<item msgid="1154273129608299386">"Dopusti uvijek"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 5f1bdca..78c6236 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -27,11 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Noćni način rada"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Mreža i internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilna mreža"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-a</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-ova</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}one{# SIM}few{# SIM-a}other{# SIM-ova}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktivno/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Neaktivno/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktivno/preuzeti SIM"</string>
@@ -39,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Dodajte više"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilni podaci"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Pristupi podacima pomoću mobilne mreže"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilna mreža"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Koristi mobilne podatke"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Isključiti mobilne podatke?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Odabir je obvezan"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Koristiti <xliff:g id="CARRIER">%1$s</xliff:g> za mobilne podatke?"</string>
@@ -54,11 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Upozorenje o podatkovnom prometu za <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Ograničenje podatkovnog prometa od <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Upozori na <xliff:g id="ID_1">^1</xliff:g>/Ograniči na <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Još %d dan</item>
- <item quantity="few">Još %d dana</item>
- <item quantity="other">Još %d dana</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Preostao # dan}one{Preostao # dan}few{Preostalo # dana}other{Preostalo # dana}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Nema preostalog vremena"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Preostalo je manje od jednog dana"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Ažurirao operater <xliff:g id="ID_1">^1</xliff:g> prije <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -73,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Postavi"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Upozorenje o potrošnji"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciklus potrošnje podatkovnog prometa"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Potrošnja podatkovnog prometa"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Postavi upozorenje o potrošnji"</string>
<string name="data_warning" msgid="116776633806885370">"Upozorenje o podatkov. prometu"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Postavi ograničenje prometa"</string>
@@ -81,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Glavna jedinica vozila isključit će mobilne podatke kad dosegne ograničenje koje ste postavili.\n\nBudući da potrošnju podatkovnog prometa mjeri glavna jedinica i da se obračun mobilnog operatera može razlikovati, možda biste trebali postaviti strože ograničenje."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Postavite upozorenje o potrošnji podataka"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Postavite ograničenje podatkovnog prometa"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Potrošnju podatkovnog prometa mjeri vaš uređaj. Može se razlikovati od mjerenja mobilnog operatera."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Postavi"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Spremi"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Mreža OEM-a"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet u vozilu"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Ako isključite internet u vozilu, neke značajke ili aplikacije vozila možda neće funkcionirati.\n\nKritični podaci potrebni za rad vozila i dalje će se dijeliti s proizvođačem."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Ipak isključi"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet u vozilu je isključen. To može onemogućiti rad nekih značajki ili aplikacija vozila. Kritični podaci potrebni za rad vozila i dalje će se dijeliti s proizvođačem."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s iskorišteno od %2$s do %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Pridruživanje drugoj mreži"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Postavke mreže"</string>
@@ -96,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj mrežu"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Poveži"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Povezivanje…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nije povezano"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Mreža nije u dometu"</string>
<string name="wifi_password" msgid="5565632142720292397">"Zaporka"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Prikaži zaporku"</string>
@@ -157,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Odaberite barem jedan pojas za žarišnu točku Wi‑Fija:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Žarišna točka i modemsko povezivanje"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Žarišna točka"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Isključeno"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Automatski isključi žarišnu točku"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Žarišna točka Wi‑Fija isključit će se ako nije povezan nijedan uređaj"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> želi uključiti Wi-Fi"</string>
@@ -299,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Prisilno zaustavi"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Prisilno zaustaviti?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ako prisilno zaustavite aplikaciju, možda će se ponašati nepredviđeno."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Želite li isključiti zaštitu izvedbe?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"U tom slučaju softver i hardver možda neće funkcionirati kako treba."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Ostavi uključeno"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Isključi"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Uključiti prioritet: izvedba aplikacije?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Uključivanje te opcije može uzrokovati nestabilnost sustava ili dugoročni učinak na hardver. Želite li nastaviti?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Da"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ne, hvala"</string>
<string name="disable_text" msgid="4358165448648990820">"Onemogući"</string>
<string name="enable_text" msgid="1794971777861881238">"Omogući"</string>
<string name="uninstall_text" msgid="277907956072833012">"Deinstaliraj"</string>
@@ -312,27 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Dopuštenja"</string>
<string name="notifications_label" msgid="6586089149665170731">"Obavijesti"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Pohrana i predmemorija"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Osiguraj vrhunsku izvedbu"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritet: izvedba aplikacije"</string>
<string name="application_version_label" msgid="8556889839783311649">"Verzija: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nije odobreno nijedno dopuštenje"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nije zatraženo nijedno dopuštenje"</string>
<string name="unused_apps" msgid="648471933781010395">"Nekorištene aplikacije"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> nekorištena aplikacija</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> nekorištene aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> nekorištenih aplikacija</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# nekorištena aplikacija}one{# nekorištena aplikacija}few{# nekorištene aplikacije}other{# nekorištenih aplikacija}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Ukloni dopuštenja i oslobodi prostor"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s u internoj pohrani"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Zatvaranje aplikacija prema potrebi radi štednje resursa"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Upotrijebite resurse sustava da biste izvedbu aplikacije postavili kao prioritet"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Potrošnja podataka"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Potrošnja podatkovnog prometa za aplikacije"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Povijest potrošnje"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Sve aplikacije"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Potrošnja: podaci i Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Povijest potrošnje"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Ukupna potrošnja"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Prednji plan"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Pozadina"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Dopusti podatke"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Dopušta aplikaciji upotrebu mobilnih podataka"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Ograniči podatke"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Upotreba mobilnih podataka samo u prednjem planu"</string>
<string name="computing_size" msgid="5791407621793083965">"Izračunavanje..."</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dodatno dopuštenje</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatna dopuštenja</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatnih dopuštenja</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# dodatno dopuštenje}one{# dodatno dopuštenje}few{# dodatna dopuštenja}other{# dodatnih dopuštenja}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Napomena: nakon ponovnog pokretanja ova se aplikacija ne može pokrenuti dok ne otključate vozilo."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomoćnik i glasovni unos"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplikacija pomoćnik"</string>
@@ -389,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Upravljanje Wi-Fijem omogućuje aplikaciji da uključuje ili isključuje Wi-Fi, traži Wi-Fi mreže i povezuje se s njima, dodaje ili uklanja mreže te pokreće lokalnu žarišnu točku."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Više"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lokacija"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Upotreba lokacije"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Dopusti navedenim aplikacijama pristup lokaciji"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Ako isključite tu postavku, uklonit će se pristup lokaciji za sve aplikacije. Aplikacije za pomoć u vožnji i dalje će imati pristup."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Koristi lokaciju za pomoć u vožnji"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Isključena je lokacija vozila"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Aplikacije za pomoć u vožnji ne mogu pristupiti lokaciji"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Promijeni"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Dopusti aplikacijama za pomoć u vožnji pristup lokaciji"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ako isključite tu postavku, onemogućit će se aplikacije za pomoć u vožnji koje se oslanjaju na podatke o lokaciji."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Ipak isključi"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedavni zahtjevi za lokaciju"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nema nedavnih zahtjeva za lokaciju"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Dopuštenja na razini aplikacije"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Usluge lokacije"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Upotreba lokacije"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Za procjenu lokacije vašeg uređaja mogu se upotrebljavati izvori kao što su GPS, Wi-Fi, mobilne mreže i senzori."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Pomoć u vožnji"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Podaci o lokaciji koji se šalju aplikacijama za pomoć u vožnji ne sadrže informacije koje otkrivaju vaš identitet. Čuvaju se najviše dva dana prije nego što se izbrišu."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Koristi mikrofon"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Svim aplikacijama dopustite pristup mikrofonu"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Upravljanje dopuštenjima za mikrofon"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Nedavno pristupano"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nema nedavnih aplikacija"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Nijedna aplikacija nema pristup"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# od {total_count} aplikacija ima pristup}one{# od {total_count} aplikacija ima pristup}few{# od {total_count} aplikacija imaju pristup}other{# od {total_count} aplikacija imaju pristup}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nedavno pristupano"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Prikaži sve"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Učitavanje…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sustav"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Ažuriranja sustava"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Napredno"</string>
@@ -433,11 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licence trećih strana"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Došlo je do problema s učitavanjem licenci."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Učitavanje..."</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak i postat ćete razvojni programer.</item>
- <item quantity="few">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka i postat ćete razvojni programer.</item>
- <item quantity="other">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka i postat ćete razvojni programer.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Još # korak i postat ćete razvojni programer.}one{Još # korak i postat ćete razvojni programer.}few{Još # koraka i postat ćete razvojni programer.}other{Još # koraka i postat ćete razvojni programer.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Sad ste razvojni programer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Nema potrebe, već ste razvojni programer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opcije za razvojne programere"</string>
@@ -506,15 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Nakon što izradite novi profil, ta osoba sama bi ga trebala prilagoditi."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Aplikacije je moguće ažurirati iz bilo kojeg profila za korištenje sa svim ostalim profilima."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Ograničenje broja profila dosegnuto"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Možete izraditi do <xliff:g id="COUNT">%d</xliff:g> profil.</item>
- <item quantity="few">Možete izraditi do <xliff:g id="COUNT">%d</xliff:g> profila.</item>
- <item quantity="other">Možete izraditi do <xliff:g id="COUNT">%d</xliff:g> profila.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Može se izraditi samo jedan profil.}one{Možete izraditi najviše # profil.}few{Možete izraditi najviše # profila.}other{Možete izraditi najviše # profila.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Nije uspjela izrada novog profila"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Želite li izbrisati profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Izbrisat će se sve aplikacije i podaci za taj profil"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Brisanje profila nije uspjelo."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil nije izbrisan. Možete ponovo pokrenuti uređaj i pokušati opet."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ovaj će se profil izbrisati kad prijeđete na drugi profil ili ponovo pokrenete vozilo."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Odbaci"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Pokušaj opet"</string>
@@ -627,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Kako iscrtati uzorak za otključavanje"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Pogreška pri spremanju uzorka"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Previše netočnih pokušaja. Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Uzorak se ne unosi rotacijski; dodirnite"</string>
<string name="okay" msgid="4589873324439764349">"U redu"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Ukloniti zaključavanje zaslona?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Druge osobe moći će pristupiti vašem računu"</string>
@@ -658,36 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Vaš je IT administrator blokirao uobičajene PIN-ove. Pokušajte s nekom drugim PIN-om."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Unos ne smije sadržavati nevažeće znakove."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Zaporka nije važeća, mora imati najmanje četiri znaka."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> slovo</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> slova</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> slova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> malo slovo</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> mala slova</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> malih slova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> veliko slovo</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> velika slova</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> velikih slova</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> znamenku</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> znamenke</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> znamenki</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> posebni simbol</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> posebna simbola</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> posebnih simbola</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> znak koji nije slovo</item>
- <item quantity="few">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> znaka koji nisu slova</item>
- <item quantity="other">Mora sadržavati najmanje <xliff:g id="COUNT">%d</xliff:g> znakova koji nisu slova</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Administrator uređaja ne dopušta upotrebu nedavne zaporke"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Pogreška pri spremanju zaporke"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Vaš je IT administrator blokirao uobičajene zaporke. Pokušajte s nekom drugom zaporkom."</string>
@@ -730,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Dodaj profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Izbriši profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Dodavanje profila"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Svjetlina zaslona"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Da biste vidjeli svoje uređaje, uključite Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Da biste uparili uređaj, otvorite postavke Bluetootha"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrator sustava za informiranje i zabavu"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivirane aplikacije"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktivirane aplikacije"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplikacije s tim dopuštenjem imaju pristup podacima vozila"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nema nijedne aplikacije administratora vozila"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Ova je aplikacija administratora sustava za informiranje i zabavu aktivna i omogućuje aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> izvođenje sljedećih radnji:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Aktiviranjem aplikacije sustava za informiranje i zabavu omogućit ćete aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> izvođenje sljedećih radnji:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktivirati apl. sustava za inf./zabavu?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktiviraj aplikaciju sustava za informiranje i zabavu"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktiviraj i deinstaliraj"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deaktiviraj aplikaciju sustava za informiranje i zabavu"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Više pojedinosti"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Upravitelj organizacije može nadzirati aplikacije i podatke povezane s tim profilom, uključujući postavke, dopuštenja, korporacijski pristup, aktivnost na mreži i podatke o lokaciji vozila, te njima upravljati."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Upravitelj organizacije može nadzirati aplikacije i podatke povezane s tim profilom, uključujući postavke, dopuštenja, korporacijski pristup, aktivnost na mreži i podatke o lokaciji uređaja, te njima upravljati."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Upravitelj organizacije može nadzirati aplikacije i podatke povezane s tim sustavom za informiranje i zabavu, uključujući postavke, dopuštenja, korporacijski pristup, aktivnost na mreži i podatke o lokaciji vozila, te njima upravljati."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Upravitelj organizacije možda može pristupiti podacima povezanim s tim sustavom za informiranje i zabavu, upravljati aplikacijama i promijeniti postavke vozila."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Nije dostupno"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Glasnoća se ne može promijeniti u ovom upravljanom vozilu"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Pozivi se ne mogu upućivati u ovom upravljanom vozilu"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Slanje SMS-ova nije dopušteno u ovom upravljanom vozilu"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera nije dostupna u ovom upravljanom vozilu"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Nije moguće izraditi snimke zaslona u ovom upravljanom vozilu"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Ta se aplikacija ne može otvoriti u ovom upravljanom vozilu"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blokirao operater"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Organizacija je ograničila pristup nekim značajkama.\n\nAko imate pitanja, obratite se upravitelju organizacije."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Aplikacije administratora za vozila"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivirana aplikacija}one{# aktivirana aplikacija}few{# aktivirane aplikacije}other{# aktiviranih aplikacija}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nema aktiviranih aplikacija"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Pravila o vozilima organizacije <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Postavke kojima upravlja upravitelj organizacije"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Saznajte više o usluzi <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Podijeliti izvješće o programskim pogreškama?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Upravitelj organizacije za ovo vozilo zatražio je izvješće o programskim pogreškama radi lakšeg rješavanja problema na uređaju. Moguće je da će se dijeliti aplikacije i podaci."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Upravitelj organizacije za ovo vozilo zatražio je izvješće o programskim pogreškama radi lakšeg rješavanja problema na uređaju. Moguće je da će se dijeliti aplikacije i podaci, što bi moglo privremeno usporiti uređaj."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Izvješće o programskim pogreškama dijeli se s upraviteljem organizacije ovog vozila. Obratite mu se za više pojedinosti."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Dijeli"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Odbij"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Ta se postavka trenutačno ne može promijeniti"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Pristupačnost"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Titlovi"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferencije za titlove"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Isključeno"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Uključeno"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Čitač zaslona"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Prikaži titlove"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Veličina teksta"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Veličina i stil titlova"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Vrlo mali"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Mali"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Zadano"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Veliki"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Vrlo veliki"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Stil titlova"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Postavi po aplikaciji"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Bijelo na crnom"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Crno na bijelom"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Žuto na crnom"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Žuto na plavom"</string>
</resources>
diff --git a/res/values-hu/arrays.xml b/res/values-hu/arrays.xml
index df2d309..13b3f6c 100644
--- a/res/values-hu/arrays.xml
+++ b/res/values-hu/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Soha ne engedélyezze"</item>
<item msgid="1154273129608299386">"Mindig engedélyezze"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index dcc5582..1cf45ed 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Éjszakai mód"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Hálózat és internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilhálózat"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktív / SIM-kártya"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inaktív / SIM-kártya"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktív / Letöltött SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Továbbiak hozzáadása"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiladat"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Adathozzáférés a mobilhálózaton keresztül"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilhálózat"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Mobiladatok használata"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Kikapcsolja a mobiladatokat?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Kiválasztás szükséges"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"A(z) <xliff:g id="CARRIER">%1$s</xliff:g> szolgáltatót használja?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g>-os adatforgalmi figyelmeztetés"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g>-os adatforgalmi korlátozás"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g>-os adatforgalmi figyelmeztetés / <xliff:g id="ID_2">^2</xliff:g>-os adatforgalmi korlátozás"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d nap van hátra</item>
- <item quantity="one">%d nap van hátra</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# nap van hátra}other{# nap van hátra}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Nincs hátralévő idő"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Kevesebb mint egy nap van hátra"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"A(z) <xliff:g id="ID_1">^1</xliff:g> frissítette ennyi ideje: <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Beállítás"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Adatfigyelmeztetés és -korlát"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Alkalmazások adatforgalmi ciklusa"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobiladat-forgalom"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Figyelmeztetés beállítása"</string>
<string name="data_warning" msgid="116776633806885370">"Adatforgalmi figyelmeztetés"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Adatkorlát megadása"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"A jármű fejegysége kikapcsolja a mobiladat-kapcsolatot, amint eléri a beállított korlátot.\n\nMivel az adatforgalmat a fejegység méri, és a szolgáltató mérései ettől eltérhetnek, érdemes lehet szigorúbb korlátot megadnia."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Adathasználati figyelmeztetés beállítása"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Adathasználati korlát beállítása"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Az adathasználatot az eszköz méri. Ez eltérhet a mobilszolgáltató adataitól."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Beállítás"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Mentés"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-hálózat"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"A jármű internetkapcsolata"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Ha kikapcsolja a jármű internetkapcsolatát, előfordulhat, hogy a jármű bizonyos funkciói vagy alkalmazásai nem működnek.\n\nA jármű üzemeltetéséhez szükséges létfontosságú adatokat továbbra is megosztja a rendszer a gyártóval."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Kikapcsolás mindenképp"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Ki van kapcsolva a jármű internetkapcsolata, ezért előfordulhat, hogy a jármű bizonyos funkciói és alkalmazásai nem működnek. A jármű üzemeltetéséhez szükséges létfontosságú adatokat továbbra is megosztja a rendszer a gyártóval."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s felhasználva (%2$s – %3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Csatlakozás másik hálózathoz"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Hálózati beállítások"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Hálózat hozzáadása"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Csatlakozás"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Csatlakozás…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nincs kapcsolat"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"A hálózat nincs hatókörön belül"</string>
<string name="wifi_password" msgid="5565632142720292397">"Jelszó"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Jelszó megjelenítése"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Válasszon sávot a Wi-Fi-hotspotnak:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot és internetmegosztás"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Kikapcsolva"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Wi-Fi-hotspot automatikus kikapcsolása"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"A Wi-Fi-hotspot kikapcsol, ha nincsenek csatlakoztatott eszközök"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"A(z) <xliff:g id="REQUESTER">%s</xliff:g> szeretné bekapcsolni a Wi-Fi-t"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Kényszerített leállítás"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Kényszeríti a leállítást?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ha leállásra kényszeríti az alkalmazást, lehetséges, hogy hibásan fog működni."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Kikapcsolja a teljesítményvédelmet?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ha kikapcsolja, előfordulhat, hogy a szoftver és a hardver nem működik majd olyan jól."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Maradjon bekapcsolva"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Kikapcsolás"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Bekapcsolja az appteljesítmény-rangsort?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Bekapcsolásával a rendszer instabilitását idézheti elő, vagy hosszú távon kihathat a hardver működésére. Biztosan folytatja?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Igen"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nem, köszönöm"</string>
<string name="disable_text" msgid="4358165448648990820">"Letiltás"</string>
<string name="enable_text" msgid="1794971777861881238">"Engedélyezés"</string>
<string name="uninstall_text" msgid="277907956072833012">"Eltávolítás"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Engedélyek"</string>
<string name="notifications_label" msgid="6586089149665170731">"Értesítések"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Tárhely és gyorsítótár"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Csúcsteljesítmény"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Appteljesítmény-rangsor"</string>
<string name="application_version_label" msgid="8556889839783311649">"Verzió: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nincsenek megadott engedélyek"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nincsenek kért engedélyek"</string>
<string name="unused_apps" msgid="648471933781010395">"Nem használt alkalmazások"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> nem használt alkalmazás</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> nem használt alkalmazás</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# nem használt alkalmazás}other{# nem használt alkalmazás}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Engedélytörlés és tárhely-felszabadítás"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s a belső tárhelyen"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Az app bezárásával elkerülhető a túlzott erőforrás-használat"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"A rendszer erőforrásait használja az appteljesítmény rangsorolásához"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Adathasználat"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Alkalmazás adathasználata"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Használati előzmények"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Összes alkalmazás"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Adat- és Wi‑Fi-használat"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Használati előzmények"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Használat összesen"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Előtér"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Háttér"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Adatok engedélyezése"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Mobiladat-használat engedélyezése az appnak"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Adatok korlátozása"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Mobiladat-használat csak előtérben lévő appnál"</string>
<string name="computing_size" msgid="5791407621793083965">"Számítás…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> további engedély</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> további engedély</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# további engedély}other{# további engedély}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Megjegyzés: Újraindítás után ez az alkalmazás csak a jármű feloldását követően indul el."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Segédalkalmazás és hangbevitel"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Segédalkalmazás"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"A Wi-Fi-vezérlés lehetővé teszi az alkalmazás számára a Wi-Fi be- és kikapcsolását, a Wi-Fi-hálózatok keresését és a hozzájuk való kapcsolódást, a hálózatok hozzáadását és eltávolítását, valamint a csak helyi hotspot indítását."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Több"</string>
<string name="location_settings_title" msgid="901334356682423679">"Hely"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Hely használata"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Megadott alkalmazásai hozzáférhetnek a helyadatokhoz"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"A beállítás kikapcsolásával megszünteti a helyadatokhoz való hozzáférést is az összes alkalmazás esetében. A sofőrtámogató alkalmazások hozzáférése viszont megmarad."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Sofőrtámogatás helyadatokkal"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"A jármű helyadatai ki vannak kapcsolva"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"A sofőrtámogatás nem látja a helyadatait"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Módosítás"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"A vezetést segítő alkalmazások hozzáférhetnek a helyadatokhoz"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ha kikapcsolja ezt a beállítást, letiltja a helyadatokra támaszkodó sofőrtámogató alkalmazásokat is."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Kikapcsolás mindenképp"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Legutóbbi helylekérdezések"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nincsenek friss helylekérdezések"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Alkalmazásszintű engedélyek"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Helyszolgáltatások"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Helyadatok használata"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Eszköze helyének meghatározásához a Hely szolgáltatás a GPS, a Wi-Fi- és mobilhálózatok, továbbá az érzékelők adatait használhatja fel."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Sofőrtámogatás"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"A sofőrtámogatási alkalmazásoknak küldött helyadatok nem tartalmaznak olyan információt, amely alapján Ön azonosítható lenne. Legfeljebb két napig tároljuk ezeket az adatokat, mielőtt törölnénk őket."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Mikrofon használata"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Mikrofonhoz való hozzáférés engedélyezése az összes alkalmazás számára"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Mikrofonhasználati engedélyek kezelése"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"A közelmúltban hozzáférő alkalmazások"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nincs újabb alkalmazás"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 alkalmazás rendelkezik hozzáféréssel"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count} alkalmazásból # rendelkezik hozzáféréssel}other{{total_count} alkalmazásból # rendelkezik hozzáféréssel}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"A közelmúltban hozzáférő alkalmazások"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Összes megtekintése"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Betöltés…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Rendszer"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Rendszerfrissítések"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Haladó"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Harmadik felek licencei"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Probléma adódott a licencek betöltésekor."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Betöltés…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> lépésre van attól, hogy fejlesztő legyen.</item>
- <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> lépésre van attól, hogy fejlesztő legyen.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{# lépésre van attól, hogy fejlesztő legyen.}other{# lépésre van attól, hogy fejlesztő legyen.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Ön mostantól már fejlesztő!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Nincs rá szükség, Ön már fejlesztő."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Fejlesztői beállítások"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Új profil létrehozása után a profilt a tulajdonosának kell személyre szabnia."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Az alkalmazások bármely profilból frissíthetők a többi profilban való használatra."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Elérte a profilok maximális számát"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Legfeljebb <xliff:g id="COUNT">%d</xliff:g> profilt lehet létrehozni.</item>
- <item quantity="one">Legfeljebb egy profilt lehet létrehozni.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Legfeljebb egy profilt lehet létrehozni.}other{Legfeljebb # profilt lehet létrehozni.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Nem sikerült az új profil létrehozása"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Törli ezt a profilt?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"A profilhoz tartozó összes alkalmazás és adat törlődik"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Nem sikerült a profil törlése"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"A profil nem lett törölve. Indítsa újra az eszközt, és próbálja újra."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ez a profil a következő profilváltáskor vagy a jármű újraindításakor lesz törölve."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Bezárás"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Újra"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Hogyan kell feloldási mintát rajzolni?"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Hiba történt a minta mentése során"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Túl sok helytelen próbálkozás. Próbálja újra <xliff:g id="NUMBER">%d</xliff:g> másodperc múlva."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"A tekerőgomb nem támogatott; érintsen"</string>
<string name="okay" msgid="4589873324439764349">"Rendben"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Eltávolítja a képernyőzárat?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Ezzel bárki hozzáférhet majd az Ön fiókjához"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Rendszergazdája letiltotta a gyakran használt PIN-kódokat. Próbálkozzon másik PIN-kóddal."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Nem tartalmazhat érvénytelen karaktert."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Érvénytelen jelszó, legalább 4 karakterből kell állnia."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Tartalmaznia kell legalább <xliff:g id="COUNT">%d</xliff:g> betűt</item>
- <item quantity="one">Tartalmaznia kell legalább 1 betűt</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Tartalmaznia kell legalább <xliff:g id="COUNT">%d</xliff:g> kisbetűt</item>
- <item quantity="one">Tartalmaznia kell legalább 1 kisbetűt</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Tartalmaznia kell legalább <xliff:g id="COUNT">%d</xliff:g> nagybetűt</item>
- <item quantity="one">Tartalmaznia kell legalább 1 nagybetűt</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Tartalmaznia kell legalább <xliff:g id="COUNT">%d</xliff:g> számjegyet</item>
- <item quantity="one">Tartalmaznia kell legalább 1 számjegyet</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Tartalmaznia kell legalább <xliff:g id="COUNT">%d</xliff:g> speciális karaktert</item>
- <item quantity="one">Tartalmaznia kell legalább 1 speciális karaktert</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Tartalmaznia kell legalább <xliff:g id="COUNT">%d</xliff:g> olyan karaktert, amely nem betű</item>
- <item quantity="one">Tartalmaznia kell legalább 1 olyan karaktert, amely nem betű</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Az eszközrendszergazda nem engedélyezi a legutóbbi jelszavak használatát"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Hiba történt a jelszó mentése során"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Rendszergazdája letiltotta a gyakran használt jelszavakat. Próbálkozzon másik jelszóval."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Profil hozzáadása"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"A profil törlése"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Profil hozzáadása"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"A kijelző fényereje"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Eszközei megtekintéséhez kapcsolja be a Bluetootht"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Eszköz párosításához nyissa meg a Bluetooth-beállításokat"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Infotainment-rendszergazda"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivált alkalmazások"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktivált alkalmazások"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Az ezzel az engedéllyel rendelkező alkalmazások hozzáférhetnek a jármű adataihoz"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nem található jármű-adminisztrátori alkalmazás"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Az infotainment-rendszergazdai alkalmazás aktív, és engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás számára a következő műveletek végrehajtását:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Az infotainment-rendszergazdai alkalmazás aktiválása engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás számára a következő műveletek végrehajtását:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktiválja az infotainmentrendszer-appot?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Az infotainmentrendszer-app aktiválása"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Kikapcsolás és eltávolítás"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Az infotainmentrendszer-alkalmazás deaktiválása"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"További részletek"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"A szervezetkezelő figyelheti és kezelheti az ezzel a profillal társított alkalmazásokat és adatokat, beleértve a beállításokat, az engedélyeket, a vállalati hozzáférést, a hálózati tevékenységeket és a jármű helyadatait is."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"A szervezetkezelő figyelheti és kezelheti az ezzel a profillal társított alkalmazásokat és adatokat, beleértve a beállításokat, az engedélyeket, a vállalati hozzáférést, a hálózati tevékenységeket és az eszköz helyadatait is."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"A szervezetkezelő figyelheti és kezelheti az ezzel az infotainmentrendszerrel társított alkalmazásokat és adatokat, beleértve a beállításokat, az engedélyeket, a vállalati hozzáférést, a hálózati tevékenységeket és a jármű helyadatait is."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"A szervezetkezelő hozzáférhet az ehhez az infotainmentrendszerhez tartozó adatokhoz, kezelheti az alkalmazásokat, és módosíthatja a jármű beállításait."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Nem áll rendelkezésre"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Nem lehet szabályozni a hangerőt ebben a kezelt járműben"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Nem lehet hívást indítani ebben a kezelt járműben"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Nem lehet SMS-t küldeni ebben a kezelt járműben"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Nem áll rendelkezésre a kamera ebben a kezelt járműben"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Ezen a felügyelt eszközön nem lehet képernyőképeket készíteni"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Nem lehet megnyitni ezt az alkalmazást ebben a kezelt járműben"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Ezt tiltja a hitelszolgáltatója"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"A szervezet bizonyos funkciókhoz korlátozza a hozzáférést.\n\nEsetleges kérdéseivel forduljon a szervezetkezelőhöz."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"A jármű rendszergazdai alkalmazásai"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivált alkalmazás}other{# aktivált alkalmazás}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nincsenek aktivált alkalmazások"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"A(z) <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> járművekre vonatkozó irányelvei"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"A szervezetkezelő által kezelt beállítások"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"További információ erről: <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Megosztja a hibajelentést?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"A jármű szervezetkezelője hibajelentést kért az eszközzel kapcsolatos probléma megoldása érdekében. Előfordulhat, hogy a rendszer megoszt alkalmazásokat és adatokat."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"A jármű szervezetkezelője hibajelentést kért az eszközzel kapcsolatos probléma megoldása érdekében. Előfordulhat, hogy a rendszer megoszt alkalmazásokat és adatokat, továbbá eszköze átmenetileg lelassulhat."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"A rendszer megosztja a hibajelentést a szervezetkezelővel, aki alá a jármű tartozik. További részletekért forduljon hozzá."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Megosztás"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Elutasítás"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Ez a beállítás jelenleg nem módosítható"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Kisegítő lehetőségek"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Feliratok"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Feliratbeállítások"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Ki"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Be"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Képernyőolvasó"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Felirat megjelenítése"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Szövegméret"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Feliratméret és -stílus"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Nagyon kicsi"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Kicsi"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Alapértelmezett"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Nagy"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Nagyon nagy"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Felirat stílusa"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Alkalmazás által beállítva"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Fekete alapon fehér"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Fehér alapon fekete"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Fekete alapon sárga"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Kék alapon sárga"</string>
</resources>
diff --git a/res/values-hy/arrays.xml b/res/values-hy/arrays.xml
index dfe8b73..4c297d8 100644
--- a/res/values-hy/arrays.xml
+++ b/res/values-hy/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Երբեք չթույլատրել"</item>
<item msgid="1154273129608299386">"Միշտ թույլատրել"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 9807620..ba3cd67 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Գիշերային ռեժիմ"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Ցանց և ինտերնետ"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Բջջային ցանց"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM քարտ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM քարտ</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM քարտ}one{# SIM քարտ}other{# SIM քարտ}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Ակտիվ է/SIM քարտ"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Ակտիվ չէ/SIM քարտ"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Ակտիվ է/ներբեռնված SIM քարտ"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Ավելացնել"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Բջջային ինտերնետ"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Օգտվել բջջային ինտերնետից"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Բջջային ցանց"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Օգտագործել բջջային ինտերնետ"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Անջատե՞լ բջջային ինտերնետը"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Ընտրեք SIM քարտը"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Անցնե՞լ <xliff:g id="CARRIER">%1$s</xliff:g>-ի բջջային ինտերնետին"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Թրաֆիկի օգտագործման զգուշացում` <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Թրաֆիկի օգտագործման սահմանաչափ՝ <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Թրաֆիկի օգտագործման զգուշացում` <xliff:g id="ID_1">^1</xliff:g> / Թրաֆիկի օգտագործման սահմանաչափ` <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Մնացել է %d օր</item>
- <item quantity="other">Մնացել է %d օր</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Մնացել է # օր}one{Մնացել է # օր}other{Մնացել է # օր}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Ժամանակ չի մնացել"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Մնացել է 1 օրից պակաս ժամանակ"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Թարմացվել է <xliff:g id="ID_1">^1</xliff:g>-ի կողմից <xliff:g id="ID_2">^2</xliff:g> առաջ"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Պահել"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Զգուշացումներ և սահմանաչափ"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Վիճակագրության ժամանակահատվածը"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Բջջային ինտերնետի օգտագործում"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Նախազգուշացում դնել"</string>
<string name="data_warning" msgid="116776633806885370">"Զգուշացում թրաֆիկի մասին"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Սահմանել թրաֆիկի սահմանաչափը"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Նշված սահմանաչափն անցնելու դեպքում մեքենայի գլխավոր վահանակը կանջատի բջջային ինտերնետը։\n\nՕպերատորի վիճակագրությունը կարող է տարբերվել գլխավոր վահանակի տվյալներից, ուստի խորհուրդ ենք տալիս նշել նախատեսվածից ցածր սահմանաչափ։"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Նախազգուշացման կարգավորում"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Թրաֆիկի օգտագործման սահմանաչափը"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Բջջային ինտերնետի օգտագործումը չափում է ձեր սարքը։ Ցուցանիշը կարող է տարբերվել՝ կախված ձեր բջջային օպերատորի տվյալներից։"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Պահել"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Պահել"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM ցանց"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Մեքենայի ինտերնետ"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Եթե անջատեք մեքենայի ինտերնետը, որոշ գործառույթներ և հավելվածներ կարող են չաշխատել։\n\nԿարևոր տվյալները, որոնք անհրաժեշտ են մեքենայի աշխատանքի համար, նախկինի պետ կփոխանցվեն արտադրողին։"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Միևնույն է անջատել"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Մեքենայի ինտերնետն անջատված է, ուստի որոշ գործառույթներ և հավելվածներ կարող են չաշխատել։ Կարևոր տվյալները, որոնք անհրաժեշտ են մեքենայի աշխատանքի համար, նախկինի պետ կփոխանցվեն արտադրողին։"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Օգտագործվել է %1$s (%2$s – %3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Միանալ այլ ցանցի"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Ցանցի կարգավորումներ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Ավելացնել ցանց"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Միանալ"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Միացում…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Կապ չկա"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Ցանցն անհասանելի է"</string>
<string name="wifi_password" msgid="5565632142720292397">"Գաղտնաբառ"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Ցուցադրել գաղտնաբառը"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Ընտրեք առնվազն մեկ դիապազոն թեժ կետի համար՝"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Թեժ կետ և մոդեմի ռեժիմ"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Թեժ կետ"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Անջատված է"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Ավտոմատ անջատել թեժ կետը"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi թեժ կետը կանջատվի, եթե որևէ սարք միացած չլինի դրան"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"Թույլտատրե՞լ <xliff:g id="REQUESTER">%s</xliff:g> հավելվածին միացնել Wi-Fi-ը"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Կանգնեցնել"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Կանգնեցնե՞լ"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Հավելվածի ստիպողաբար դադարեցումը կարող է ազդել դրա աշխատանքի վրա։"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Անջատե՞լ արդյունավետության պաշտպանությունը"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Անջատելու դեպքում ձեր ծրագրերն ու սարքակազմը ևս կարող են չաշխատել։"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Միացված թողնել"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Անջատել"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Կարևորե՞լ հավելվածի արտադրողականությունը"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Եթե միացնեք այս կարգավորումը, դա կարող է հանգեցնել համակարգի անկայուն աշխատանքի և ազդել սարքակազմի վրա։ Շարունակե՞լ։"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Այո"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ոչ, շնորհակալություն"</string>
<string name="disable_text" msgid="4358165448648990820">"Անջատել"</string>
<string name="enable_text" msgid="1794971777861881238">"Միացնել"</string>
<string name="uninstall_text" msgid="277907956072833012">"Ապատեղադրել"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Թույլտվություններ"</string>
<string name="notifications_label" msgid="6586089149665170731">"Ծանուցումներ"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Հիշողություն և քեշ"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Առավ․ արդյունավետություն"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Կարևորել հավելվածի արտադրողականությունը"</string>
<string name="application_version_label" msgid="8556889839783311649">"Տարբերակ՝ %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Թույլտվություններ չեն տրվել"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Թույլտվությունների հարցում չի արվել"</string>
<string name="unused_apps" msgid="648471933781010395">"Չօգտագործվող հավելվածներ"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> չօգտագործվող հավելված</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> չօգտագործվող հավելված</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# չօգտագործվող հավելված}one{# օգտագործվող հավելված}other{# օգտագործվող հավելված}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Հեռացնել թույլտվությունները և տարածք ազատել"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s տարածք ներքին հիշողությունում"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Փակել հավելվածները՝ ռեսուրսները խնայելու համար"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Օգտագործում է համակարգի ռեսուրսները՝ հավելվածի արտադրողականությունը կարևորելու համար"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Թրաֆիկի օգտագործում"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Հավելվածի թրաֆիկ"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Օգտագործման պատմություն"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Բոլոր հավելվածները"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Բջջային ինտերնետ և Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Օգտագործման պատմություն"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Ընդհամենը օգտագործվել է"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Ակտիվ ռեժիմ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Ֆոնային ռեժիմ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Թույլ տալ բջջ․ ինտերնետը"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Թույլատրել հավելվածին օգտագործել բջջային ինտերնետը"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Սահմանափակել բջջ․ ինտերնետը"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Օգտագործել բջջային ինտերնետը ակտիվ ռեժիմում"</string>
<string name="computing_size" msgid="5791407621793083965">"Հաշվարկում…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> լրացուցիչ թույլտվություն</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> լրացուցիչ թույլտվություն</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# լրացուցիչ թույլտվություն}one{# լրացուցիչ թույլտվություն}other{# լրացուցիչ թույլտվություն}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Ուշադրություն. վերաբեռնումից հետո այս հավելվածը չի գործարկվի, մինչև չապակողպեք մեքենան:"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Հուշումներ և ձայնային ներածում"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Օգնական հավելված"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi-ի կառավարը հնարավորություն է տալիս հավելվածներին միացնել և անջատել Wi-Fi-ը, գտնել Wi-Fi ցանցեր և միանալ դրանց, ավելացնել և հեռացնել ցանցեր, միացնել միայն տեղային թեժ կետ:"</string>
<string name="more_special_access_title" msgid="166115485446645971">"Լրացուցիչ կարգավորումներ"</string>
<string name="location_settings_title" msgid="901334356682423679">"Տեղորոշում"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Օգտագործել տեղորոշումը"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Թույլատրել նշված հավելվածներին օգտագործել տեղադրությունը"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Եթե անջատեք կարգավորումը, տեղադրության հասանելիությունը կչեղարկվի բոլոր հավելվածների համար։ «Օգնություն վարորդին» հավելվածներին այն հասանելի կլինի։"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Միացնել տեղադրությունը «Օգնություն վարորդին» գործառույթներում"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Սարքի տեղորոշումն անջատված է"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"«Օգնություն վարորդին» հավելվածներին հասանելի չէ ձեր տեղադրությունը"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Փոխել"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Վարորդին օգնող հավելվածներին հասանելի դարձրեք ձեր տեղադրությունը"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Եթե անջատեք կարգավորումը, «Օգնություն վարորդին» հավելվածները, որոնք օգտագործում են տեղադրության տվյալները, չեն աշխատի։"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Անջատել"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Տեղադրության տվյալների վերջին հարցումները"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Վերջերս տեղորոշման տվյալների հարցումներ չեն արվել"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Հավելվածների թույլտվություններ"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Տեղորոշման ծառայություններ"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Օգտագործել տեղորոշումը"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Ձեր սարքի տեղադրությունը որոշելու համար տեղորոշման ծառայությունն օգտվում է տարբեր աղբյուրներից (GPS, Wi‑Fi, բջջային ցանցեր և տվիչներ)։"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Օգնություն վարորդին"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Տեղադրության տվյալները, որոնք ուղարկվում են «Օգնություն վարորդին» հավելվածներին, չեն պարունակում ձեզ նույնականացնող տեղեկություններ։ Այդ տվյալները պահվում են առավելագույնը 2 օր։"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Խոսափող"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Օգտագործել խոսափողը"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Հասանելի դարձնել խոսափողը բոլոր հավելվածներին"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Խոսափողի թույլտվությունների կառավարում"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Վերջերս օգտագործված"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Ոչ մի հավելված վերջերս չի օգտագործել խոսափողը"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Հասանելի չէ որևէ հավելվածի"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Հասանելի է {total_count} հավելվածից #-ին}one{Հասանելի է {total_count} հավելվածից #-ին}other{Հասանելի է {total_count} հավելվածից #-ին}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Վերջերս օգտագործված"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Դիտել բոլորը"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Բեռնում…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Համակարգ"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Համակարգի թարմացումներ"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Լրացուցիչ կարգավորումներ"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Այլ լիցենզիաներ"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Չհաջողվեց բեռնել արտոնագրերը:"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Բեռնում…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Մշակող դառնալու համար ձեզ մնացել է <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> քայլ</item>
- <item quantity="other">Մշակող դառնալու համար ձեզ մնացել է <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> քայլ</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Մշակող դառնալու համար ձեզ մնացել է # քայլ։}one{Մշակող դառնալու համար ձեզ մնացել է # քայլ։}other{Մշակող դառնալու համար ձեզ մնացել է # քայլ։}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Դուք արդեն մշակող եք:"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Կարիք չկա, դուք արդեն իսկ մշակող եք:"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Մշակողների համար"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Երբ դուք նոր պրոֆիլ ստեղծեք, օգտատերը պետք է այն ինքնուրույն կարգավորի։"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Ցանկացած օգտատեր կարող է թարմացնել հավելվածները մյուս պրոֆիլների համար։"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Պրոֆիլների սահմանաչափը լրացել է"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Դուք կարող եք ստեղծել միայն <xliff:g id="COUNT">%d</xliff:g> պրոֆիլ։</item>
- <item quantity="other">Դուք կարող եք ստեղծել միայն <xliff:g id="COUNT">%d</xliff:g> պրոֆիլ։</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Դուք կարող եք ստեղծել միայն մեկ պրոֆիլ։}one{Դուք կարող եք ստեղծել միայն # պրոֆիլ։}other{Դուք կարող եք ստեղծել միայն # պրոֆիլ։}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Չհաջողվեց ստեղծել նոր պրոֆիլ"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Ջնջե՞լ այս պրոֆիլը"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Այս պրոֆիլի հետ կապված բոլոր հավելվածներն ու տվյալները կջնջվեն"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Չհաջողվեց ջնջել պրոֆիլը։"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Պրոֆիլը չջնջվեց։ Վերագործարկեք սարքը և նորից փորձեք։"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Այս պրոֆիլը կջնջվի, երբ դուք անցնեք այլ պրոֆիլ կամ վերագործարկեք ավտոմեքենան։"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Փակել"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Նորից փորձել"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Ինչպես ապակողպող նախշ գծել"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Չհաջողվեց պահել նախշը"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Չափից շատ սխալ փորձ է կատարվել։ Նորից փորձեք <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից։"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Նախշը չի աջակցում պտտաշարժում. օգտագործեք հպում"</string>
<string name="okay" msgid="4589873324439764349">"Հաստատել"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Անջատե՞լ էկրանի կողպումը"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Ցանկացած մարդ կկարողանա մտնել ձեր հաշիվ"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"ՏՏ ադմինիստրատորն արգելափակել է պարզ PIN կոդերը։ Փորձեք մեկ այլ PIN կոդ։"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Գաղտնաբառն անվավեր նիշ է պարունակում:"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Գաղտնաբառը պետք է պարունակի առնվազն 4 նիշ:"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> տառ</item>
- <item quantity="other">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> տառ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> փոքրատառ</item>
- <item quantity="other">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> փոքրատառ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> մեծատառ</item>
- <item quantity="other">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> մեծատառ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> թվանշան</item>
- <item quantity="other">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> թվանշան</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> հատուկ նշան</item>
- <item quantity="other">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> հատուկ նշան</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> ոչ տառային նիշ</item>
- <item quantity="other">Պետք է պարունակի առնվազն <xliff:g id="COUNT">%d</xliff:g> ոչ տառային նիշ</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Սարքի ադմինիստրատորը թույլ չի տալիս օգտագործել վերջին գաղտնաբառը"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Չհաջողվեց պահել գաղտնաբառը"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ՏՏ ադմինիստրատորն արգելափակել է պարզ գաղտնաբառերը։ Փորձեք մեկ այլ գաղտնաբառ։"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Ավելացնել պրոֆիլ"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Ջնջել պրոֆիլը"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Ավելացնել պրոֆիլ"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Էկրանի պայծառությունը"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Ձեր սարքերը տեսնելու համար միացրեք Bluetooth-ը"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Սարքը զուգակցելու համար բացեք Bluetooth-ի կարգավորումները"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Տեղեկատվաժամանցային համակարգի ադմինիստրատոր"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Ակտիվացված հավելվածներ"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Ապակտիվացված հավելվածներ"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Այս թույլտվությունը ստացած հավելվածներին հասանելի են մեքենայի տվյալները"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Մեքենայի ադմինիստրատորի հավելվածներ չկան"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Տեղեկատվաժամանցային համակարգի ադմինիստրատորի հավելվածն ակտիվ է և թույլ է տալիս <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին կատարել հետևյալ գործողությունները․"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Տեղեկատվաժամանցային համակարգի ադմինիստրատորի այս հավելվածն ակտիվացնելուց հետո <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը կկարողանա կատարել հետևյալ գործողությունները․"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Միացնե՞լ տեղեկատվաժամանցային համակարգի այս հավելվածը"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Միացնել տեղեկատվաժամանցային համակարգի այս հավելվածը"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Ապակտիվացնել և ապատեղադրել"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Անջատել տեղեկատվաժամանցային համակարգի այս հավելվածը"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Այլ մանրամասներ"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Կազմակերպության ադմինիստրատորը կարող է վերահսկել և կառավարել այս օգտատիրոջ հետ առնչվող հավելվածները և տվյալները, այդ թվում՝ կարգավորումները, թույլտվությունները, կորպորատիվ մուտքը, ցանցային գործունեությունը և մեքենայի տեղադրության տվյալները։"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Կազմակերպության ադմինիստրատորը կարող է վերահսկել և կառավարել այս օգտատիրոջ հետ առնչվող հավելվածները և տվյալները, այդ թվում՝ կարգավորումները, թույլտվությունները, կորպորատիվ մուտքը, ցանցային գործունեությունը և սարքի տեղադրության տվյալները։"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Կազմակերպության ադմինիստրատորը կարող է վերահսկել և կառավարել այս տեղեկատվաժամանցային համակարգի հետ կապված հավելվածները և տվյալները, այդ թվում՝ կարգավորումները, թույլտվությունները, կորպորատիվ մուտքը, ցանցային գործունեությունը և մեքենայի տեղադրության տվյալները։"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Կազմակերպության ադմինիստրատորը կարող է ստանալ այս տեղեկատվաժամանցային համակարգի հետ կապված տվյալների օգտագործման թույլտվություն, փոփոխել մեքենայի կարգավորումներն ու կառավարել հավելվածները։"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Հասանելի չէ"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Հնարավոր չէ փոխել ձայնի ուժգնությունն այս կառավարվող ավտոմեքենայում"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Հնարավոր չէ զանգեր կատարել այս կառավարվող ավտոմեքենայում"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Հնարավոր չէ SMS-ներ ուղարկել այս կառավարվող ավտոմեքենայում"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Տեսախցիկը հասանելի չէ այս կառավարվող ավտոմեքենայում"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Այս կառավարվող ավտոմեքենայում հնարավոր չէ սքրինշոթներ անել"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Հավելվածը հասանելի չէ այս կառավարվող ավտոմեքենայում"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Արգելափակվել է ձեր բանկի կողմից"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Կազմակերևպությունը սահմանափակել է որոշ գործառույթների հասանելիությունը։\n\nՀարցերի դեպքում դիմեք կազմակերպության ադմինիստրատորին։"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Մեքենայի ադմինիստրատորի հավելվածներ"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# ակտիվացված հավելված}one{# ակտիվացված հավելված}other{# ակտիվացված հավելված}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Ակտիվացված հավելվածներ չկան"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"«<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>» կազմակերպության տրանսպորտային միջոցների կանոններ"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Կազմակերպության ադմինիստրատորի կողմից կառավարվող կարգավորումներ"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Իմանալ ավելին «<xliff:g id="SERVICE">%1$s</xliff:g>» ծառայության մասին"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Ուղարկե՞լ վրիպակի զեկույցը"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Այս սարքի անսարքությունների վերացման նպատակով ձեր ավտոմեքենայի կազմակերպության ադմինիստրատորին անհրաժեշտ է վրիպակի զեկույց։ Կարող են տրամադրվել տեղեկություններ ձեր հավելվածների մասին և այլ տվյալներ։"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Այս սարքի անսարքությունների վերացման նպատակով ձեր ավտոմեքենայի կազմակերպության ադմինիստրատորին անհրաժեշտ է վրիպակի զեկույց։ Կարող են տրամադրվել տեղեկություններ ձեր հավելվածների մասին և այլ տվյալներ, իսկ սարքի աշխատանքը կարող է ժամանակավորապես դանդաղել։"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Այս վրիպակի զեկույցը տրամադրվում է ձեր ավտոմեքենայի կազմակերպության ադմինիստրատորին։ Դիմեք նրան՝ լրացուցիչ տեղեկություններ ստանալու համար։"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Ուղարկել"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Մերժել"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Ներկայումս հնարավոր չէ փոխել այս կարգավորումը"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Հատուկ գործառույթներ"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Ենթագրեր"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Ենթագրերի կարգավորումներ"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Անջատված են"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Միացված են"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Էկրանի ընթերցիչ"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Ցուցադրել ենթագրերը"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Տեքստի չափսը"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Ենթագրերի չափսը և ոճը"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Շատ փոքր"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Փոքր"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Կանխադրված"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Մեծ"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Շատ մեծ"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Ենթագրերի ոճը"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Կարգավորված է հավելվածով"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Սպիտակը սևի վրա"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Սևը սպիտակի վրա"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Դեղինը սևի վրա"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Դեղինը կապույտի վրա"</string>
</resources>
diff --git a/res/values-in/arrays.xml b/res/values-in/arrays.xml
index d40ab17d..e65e512 100644
--- a/res/values-in/arrays.xml
+++ b/res/values-in/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Jangan pernah izinkan"</item>
<item msgid="1154273129608299386">"Selalu izinkan"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 154f597..2c348c6 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Mode malam"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Jaringan & internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Jaringan seluler"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktif / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Tidak aktif / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktif / SIM yang didownload"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Tambahkan lainnya"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Kuota"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Akses data menggunakan jaringan seluler"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Jaringan seluler"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Gunakan kuota"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Nonaktifkan kuota?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Perlu memilih SIM"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Gunakan <xliff:g id="CARRIER">%1$s</xliff:g> untuk kuota?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Peringatan penggunaan kuota <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Batas data <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Peringatan penggunaan kuota <xliff:g id="ID_1">^1</xliff:g>/Batas kuota <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d hari lagi</item>
- <item quantity="one">%d hari lagi</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# hari lagi}other{# hari lagi}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Waktu habis"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Kurang dari 1 hari lagi"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Diupdate oleh <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> lalu"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Setel"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Peringatan & batas data"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Siklus penggunaan kuota aplikasi"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Penggunaan data seluler"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Setel peringatan kuota"</string>
<string name="data_warning" msgid="116776633806885370">"Peringatan kuota"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Setel batas data"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Head unit kendaraan akan menonaktifkan kuota jika mencapai batas yang disetel.\n\nKarena penggunaan data diukur oleh head unit, dan operator dapat menghitung penggunaan secara berbeda, pertimbangkan untuk menyetel batas yang konservatif."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Setel peringatan penggunaan data"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Setel batas penggunaan data"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Penggunaan data diukur oleh perangkat Anda. Hasilnya mungkin berbeda dengan data operator seluler Anda."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Setel"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Simpan"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Jaringan OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet kendaraan"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Menonaktifkan internet kendaraan dapat menyebabkan beberapa aplikasi atau fitur kendaraan berhenti bekerja.\n\nData penting yang diperlukan untuk mengoperasikan kendaraan Anda akan terus dibagikan kepada produsen kendaraan."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Tetap nonaktifkan"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet kendaraan dinonaktifkan. Ini dapat menyebabkan beberapa aplikasi atau fitur kendaraan berhenti bekerja. Data penting yang diperlukan untuk mengoperasikan kendaraan Anda akan terus dibagikan kepada produsen kendaraan."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s digunakan antara %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Gabung ke jaringan lain"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferensi jaringan"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Tambahkan jaringan"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Hubungkan"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Menghubungkan…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Tidak terhubung"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Jaringan di luar jangkauan"</string>
<string name="wifi_password" msgid="5565632142720292397">"Sandi"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Tampilkan sandi"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Pilih minimal satu band untuk hotspot Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot & tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Nonaktif"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Otomatis nonaktifkan hotspot"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Hotspot Wi-Fi akan dinonaktifkan jika tidak ada perangkat yang terhubung"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ingin mengaktifkan Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Paksa berhenti"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Paksa berhenti?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Jika aplikasi dihentikan paksa, fungsinya mungkin akan terganggu."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Nonaktifkan perlindungan performa?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Jika dinonaktifkan, software dan hardware Anda mungkin juga tidak berfungsi."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Biarkan aktif"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Nonaktifkan"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Aktifkan prioritaskan performa aplikasi?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Mengaktifkannya dapat menyebabkan potensi ketidakstabilan sistem atau dampak jangka panjang pada hardware. Ingin melanjutkan?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ya"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Tidak, terima kasih"</string>
<string name="disable_text" msgid="4358165448648990820">"Nonaktifkan"</string>
<string name="enable_text" msgid="1794971777861881238">"Aktifkan"</string>
<string name="uninstall_text" msgid="277907956072833012">"Uninstal"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Izin"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifikasi"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Penyimpanan & cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Performa optimal aktif"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritaskan performa aplikasi"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versi: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Tidak ada izin yang diberikan"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Tidak ada izin yang diminta"</string>
<string name="unused_apps" msgid="648471933781010395">"Aplikasi tidak digunakan"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikasi tidak digunakan</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikasi tidak digunakan</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# aplikasi tidak digunakan}other{# aplikasi tidak digunakan}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Hapus izin & kosongkan ruang penyimpanan"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s di penyimpanan internal"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Jika perlu, tutup aplikasi agar penggunaan resource tidak berlebihan"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Menggunakan resource sistem untuk memprioritaskan performa aplikasi"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Penggunaan data"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Penggunaan kuota aplikasi"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Histori penggunaan"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Semua aplikasi"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Penggunaan Data & Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Histori penggunaan"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Total penggunaan"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Latar depan"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Latar belakang"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Izinkan penggunaan data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Izinkan aplikasi ini menggunakan data seluler"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Batasi data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Hanya gunakan data seluler saat aplikasi berada di latar depan"</string>
<string name="computing_size" msgid="5791407621793083965">"Menghitung..."</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> izin tambahan</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> izin tambahan</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# izin tambahan}other{# izin tambahan}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Catatan: Setelah reboot, aplikasi ini tidak dapat dimulai hingga kunci kendaraan dibuka."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Bantuan & masukan suara"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplikasi bantuan"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Kontrol Wi-Fi memungkinkan aplikasi mengaktifkan atau menonaktifkan Wi-Fi, memindai dan menghubungkan ke jaringan Wi-Fi, menambahkan atau menghapus jaringan, atau memulai hotspot khusus lokal."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Lainnya"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lokasi"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Gunakan lokasi"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Mengizinkan aplikasi yang ditentukan untuk mengakses lokasi Anda"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Jika Anda menonaktifkannya, fitur ini akan menghapus akses lokasi untuk semua aplikasi. Aplikasi Bantuan bagi Pengemudi akan tetap memiliki akses."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Menggunakan lokasi untuk Bantuan bagi Pengemudi"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Lokasi kendaraan nonaktif"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Aplikasi Bantuan bagi Pengemudi tidak dapat mengakses lokasi Anda"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Ubah"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Mengizinkan aplikasi yang membantu mengemudi mengakses lokasi Anda"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Jika Anda menonaktifkannya, fitur Bantuan bagi Pengemudi yang mengandalkan informasi lokasi akan dinonaktifkan."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Tetap nonaktifkan"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Permintaan Lokasi Terbaru"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Tidak ada permintaan lokasi terbaru"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Izin tingkat aplikasi"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Layanan Lokasi"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Gunakan lokasi"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Lokasi dapat menggunakan sumber informasi seperti GPS, Wi-Fi, jaringan seluler, dan sensor untuk memperkirakan lokasi perangkat Anda."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Bantuan bagi pengemudi"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Informasi lokasi yang dikirimkan ke aplikasi Bantuan bagi Pengemudi tidak berisi informasi yang mengidentifikasi Anda. Informasi tersebut akan disimpan maksimal selama 2 hari sebelum dihapus."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Gunakan mikrofon"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Izinkan semua aplikasi mengakses mikrofon Anda"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Kelola izin mikrofon"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Diakses baru-baru ini"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Tidak ada aplikasi yang baru-baru ini mengakses mikrofon"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 aplikasi memiliki akses ke mikrofon"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# dari {total_count} aplikasi memiliki akses}other{# dari {total_count} aplikasi memiliki akses}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Diakses baru-baru ini"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Lihat semua"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Memuat…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Update sistem"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Lanjutan"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Lisensi pihak ketiga"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ada masalah saat memuat lisensi."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Memuat…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Tinggal <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> langkah untuk menjadi developer.</item>
- <item quantity="one">Tinggal <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> langkah untuk menjadi developer.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Anda perlu menyelesaikan # langkah lagi untuk menjadi developer.}other{Anda perlu menyelesaikan # langkah lagi untuk menjadi developer.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Sekarang Anda adalah seorang developer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Tidak perlu, Anda sudah menjadi developer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opsi developer"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Setelah Anda membuat profil baru, pengguna tersebut harus menyesuaikan profilnya sendiri."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Aplikasi dapat diupdate dari profil mana pun untuk digunakan oleh semua profil lain."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Batas profil telah tercapai"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Anda dapat membuat maksimal <xliff:g id="COUNT">%d</xliff:g> profil.</item>
- <item quantity="one">Hanya satu profil yang dapat dibuat.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Hanya satu profil yang dapat dibuat.}other{Anda dapat membuat maksimal # profil.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Tidak dapat membuat profil baru"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Hapus profil ini?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Semua aplikasi dan data untuk profil ini akan dihapus"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Tidak dapat menghapus profil."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil tidak dihapus. Anda dapat memulai ulang perangkat dan mencoba lagi."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Profil ini akan dihapus jika Anda menggantinya atau menghidupkan ulang mesin kendaraan."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Tutup"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Coba lagi"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Cara menggambar pola pembuka kunci"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Error saat menyimpan pola"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Terlalu banyak kesalahan pola. Coba kembali dalam <xliff:g id="NUMBER">%d</xliff:g> detik."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Pola tidak mendukung rotasi, gunakan sentuhan"</string>
<string name="okay" msgid="4589873324439764349">"Oke"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Hapus kunci layar?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Tindakan ini akan mengizinkan siapa pun mengakses akun Anda"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"PIN umum diblokir oleh admin IT. Coba PIN lain."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Tidak boleh berisi karakter yang tidak valid."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Sandi tidak valid, minimal 4 karakter."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Minimal berisi <xliff:g id="COUNT">%d</xliff:g> huruf</item>
- <item quantity="one">Minimal berisi 1 huruf</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Minimal berisi <xliff:g id="COUNT">%d</xliff:g> huruf kecil</item>
- <item quantity="one">Minimal berisi 1 huruf kecil</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Minimal berisi <xliff:g id="COUNT">%d</xliff:g> huruf besar</item>
- <item quantity="one">Minimal berisi 1 huruf besar</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Minimal berisi <xliff:g id="COUNT">%d</xliff:g> digit angka</item>
- <item quantity="one">Minimal berisi 1 digit angka</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Minimal berisi <xliff:g id="COUNT">%d</xliff:g> simbol khusus</item>
- <item quantity="one">Minimal berisi 1 simbol khusus</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Minimal berisi <xliff:g id="COUNT">%d</xliff:g> karakter bukan huruf</item>
- <item quantity="one">Minimal berisi 1 karakter bukan huruf</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Admin perangkat tidak mengizinkan penggunaan sandi yang baru-baru ini digunakan"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Error saat menyimpan sandi"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Sandi umum diblokir oleh admin IT. Coba sandi lain."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Tambahkan profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Hapus profil ini"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Tambahkan profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Kecerahan layar"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Untuk melihat perangkat Anda, aktifkan Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Untuk menyambungkan perangkat, buka setelan Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Admin sistem infotainmen"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aplikasi yang diaktifkan"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Aplikasi yang dinonaktifkan"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplikasi yang memiliki izin ini dapat mengakses data kendaraan ini"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Tidak ada aplikasi admin kendaraan"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Aplikasi admin sistem infotainmen ini aktif dan mengizinkan aplikasi <xliff:g id="APP_NAME">%1$s</xliff:g> untuk menjalankan operasi berikut:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Dengan mengaktifkan aplikasi sistem infotainmen ini, aplikasi <xliff:g id="APP_NAME">%1$s</xliff:g> akan dapat menjalankan operasi berikut:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktifkan apl sistem infotainmen ini?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktifkan aplikasi sistem infotainmen ini"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Nonaktifkan & uninstal"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Nonaktifkan aplikasi sistem infotainmen ini"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Detail selengkapnya"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Pengelola organisasi dapat memantau serta mengelola aplikasi dan data yang terkait dengan profil ini, termasuk setelan, izin, akses perusahaan, aktivitas jaringan, dan informasi lokasi kendaraan."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Pengelola organisasi Anda dapat memantau serta mengelola aplikasi dan data yang terkait dengan profil ini, termasuk setelan, izin, akses perusahaan, aktivitas jaringan, dan informasi lokasi perangkat."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Pengelola organisasi dapat memantau serta mengelola aplikasi dan data yang terkait dengan sistem infotainmen ini, termasuk setelan, izin, akses perusahaan, aktivitas jaringan, dan informasi lokasi kendaraan."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Pengelola organisasi mungkin dapat mengakses data yang terkait dengan sistem infotainmen ini, mengelola aplikasi, dan mengubah setelan kendaraan ini."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Pilihan ini tidak tersedia"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Tidak dapat mengubah volume di kendaraan terkelola ini"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Tidak dapat melakukan panggilan di kendaraan terkelola ini"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS tidak diizinkan di kendaraan terkelola ini"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera tidak tersedia di kendaraan terkelola ini"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Tidak dapat mengambil screenshot di kendaraan terkelola ini"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Tidak dapat membuka aplikasi ini di kendaraan terkelola ini"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Diblokir oleh penyedia kredit"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Akses ke beberapa fitur dibatasi oleh organisasi.\n\nJika ada pertanyaan, hubungi pengelola organisasi."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Aplikasi admin kendaraan"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aplikasi yang diaktifkan}other{# aplikasi yang diaktifkan}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Tidak ada aplikasi yang diaktifkan"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Kebijakan kendaraan <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Setelan dikelola oleh pengelola organisasi"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Pelajari lebih lanjut <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Bagikan laporan bug?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Pengelola organisasi untuk kendaraan ini meminta laporan bug guna membantu memecahkan masalah perangkat ini. Aplikasi dan data mungkin dibagikan."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Pengelola organisasi untuk kendaraan ini meminta laporan bug guna membantu memecahkan masalah perangkat ini. Aplikasi dan data mungkin dibagikan, serta perangkat Anda mungkin menjadi lambat untuk sementara."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Laporan bug ini akan dibagikan kepada pengelola organisasi untuk kendaraan ini. Hubungi pengelola tersebut untuk detail selengkapnya."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Bagikan"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Tolak"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Setelan ini tidak dapat diubah untuk saat ini"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Aksesibilitas"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Teks"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferensi teks"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Nonaktif"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Aktif"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Pembaca layar"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Tampilkan teks"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Ukuran teks"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Ukuran dan gaya teks"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Sangat kecil"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Kecil"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Default"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Besar"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Sangat besar"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Gaya teks"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Disetel oleh aplikasi"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Putih berlatar hitam"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Hitam berlatar putih"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Kuning berlatar hitam"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Kuning berlatar biru"</string>
</resources>
diff --git a/res/values-is/arrays.xml b/res/values-is/arrays.xml
index b283cc2..fd933f7 100644
--- a/res/values-is/arrays.xml
+++ b/res/values-is/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Leyfa aldrei"</item>
<item msgid="1154273129608299386">"Leyfa alltaf"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 96e282e..e3e93d3 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Næturstilling"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Netkerfi og internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Farsímakerfi"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-kort</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-kort</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}one{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Virk / SIM-kort"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Óvirk / SIM-kort"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Virk / sótt SIM-kort"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Bæta fleirum við"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Farsímagögn"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Aðgangur að gögnum um farsímakerfi"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Farsímakerfi"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Nota farsímagögn"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Slökkva á farsímagögnum?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Val er áskilið"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Nota <xliff:g id="CARRIER">%1$s</xliff:g> fyrir farsímagögn?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> gagnaviðvörun"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> gagnamörk"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> gagnaviðvörun / <xliff:g id="ID_2">^2</xliff:g> gagnamörk"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d dagur eftir</item>
- <item quantity="other">%d dagar eftir</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# dagur eftir}one{# dagur eftir}other{# dagar eftir}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Enginn tími eftir"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Innan við einn dagur eftir"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Uppfært af <xliff:g id="ID_1">^1</xliff:g> fyrir <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Stilla"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Gagnaviðvörun og hámark"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Notkunarferli forritagagna"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Notkun farsímagagna"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Stilla gagnaviðvörun"</string>
<string name="data_warning" msgid="116776633806885370">"Gagnaviðvörun"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Velja gagnamörk"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Mælaborð bílsins mun slökkva á farsímagögnum þegar markinu sem þú hefur stillt er náð.\n\nÞar sem mælaborðið mælir gagnanotkun og símafyrirtækið gæti reiknað notkun á annan hátt skaltu íhuga að stilla hófleg mörk."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Stilla viðvörun fyrir hámark gagnanotkunar"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Velja hámark gagnanotkunar"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Gagnanotkun er mæld af tækinu þínu. Slík notkun kann að vera frábrugðin gögnum símafyrirtækisins."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Stilla"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Vista"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-netkerfi"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Nettenging bíls"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Þegar slökkt er á nettengingu bílsins gætu sumir eiginleikar eða forrit hætt að virka.\n\nMikilvægum gögnum sem þarf til að stjórna bílnum verður áfram deilt með framleiðanda bílsins."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Slökkva samt"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Slökkt er á nettengingu bílsins. Slíkt kemur hugsanlega í veg fyrir að tilteknir eiginleikar eða forrit virki sem skyldi. Mikilvægum gögnum sem eru áskilin til að stjórna bílnum verður áfram deilt með framleiðanda bílsins."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s notuð %2$s–%3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Tengjast öðru neti"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Netstillingar"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Bæta við neti"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Tengja"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Tengist…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Ekki tengt"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Ekkert samband við netkerfi"</string>
<string name="wifi_password" msgid="5565632142720292397">"Aðgangsorð"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Sýna aðgangsorð"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Veldu a.m.k. eitt svið fyrir heitan Wi‑Fi reit:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Heitur reitur og tjóðrun"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Heitur reitur"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Slökkt"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Slökkva á heitum reit sjálfkrafa"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Slökkt verður á heitum Wi‑Fi reit ef engin tæki eru tengd"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> vill kveikja á Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Þvinga lokun"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Þvinga fram lokun?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ef þú þvingar fram lokun forrits gæti það látið illa."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Slökkva á afkastavernd?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Hugbúnaður og vélbúnaður starfar hugsanlega ekki eins vel ef þetta er gert."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Hafa kveikt"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Slökkva"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Virkja forgangsröðun afkasta forritsins?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Þegar kveikt er á þessu getur kerfið orðið óstöðugt eða vélbúnaður getur orðið fyrir langtímaáhrifum. Viltu halda áfram?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Já"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nei, takk"</string>
<string name="disable_text" msgid="4358165448648990820">"Slökkva"</string>
<string name="enable_text" msgid="1794971777861881238">"Kveikja"</string>
<string name="uninstall_text" msgid="277907956072833012">"Fjarlægja"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Heimildir"</string>
<string name="notifications_label" msgid="6586089149665170731">"Tilkynningar"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Geymslurými og skyndiminni"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Tryggja hámarksafköst"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Forgangsraða afköstum forrits"</string>
<string name="application_version_label" msgid="8556889839783311649">"Útgáfa: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Engar heimildir veittar"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Engar heimildarbeiðnir"</string>
<string name="unused_apps" msgid="648471933781010395">"Ónotuð forrit"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ónotað forrit</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ónotuð forrit</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ónotað forrit}one{# ónotað forrit}other{# ónotuð forrit}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Fjarlægja heimildir og losa um pláss"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s í innbyggðri geymslu"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Loka forriti til að koma í veg fyrir ofnotkun tilfanga þegar þörf krefur"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Notar kerfistilföng til að forgangsraða afköstum forrits"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Gagnanotkun"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Gagnanotkun forrits"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Notkunarferill"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Öll forrit"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Notkun gagna og Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Notkunarferill"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Heildarnotkun"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Í forgrunni"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Í bakgrunni"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Leyfa gagnanotkun"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Leyfa þessu forriti að nota farsímagögn"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Takmarka gagnanotkun"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Nota aðeins farsímagögn ef forritið er í forgrunni"</string>
<string name="computing_size" msgid="5791407621793083965">"Reiknar…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> viðbótarheimild</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> viðbótarheimildir</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# viðbótarheimild}one{# viðbótarheimild}other{# viðbótarheimildir}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Athugaðu: Eftir endurræsingu er ekki hægt að ræsa þetta forrit fyrr en þú tekur ökutækið úr lás."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Aðstoð og raddinntak"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aðstoðarforrit"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi stjórnun leyfir forriti að kveikja og slökkva á Wi-Fi, leita að og tengjast við Wi-Fi net, bæta við og fjarlægja net og búa til staðbundinn heitan reit."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Meira"</string>
<string name="location_settings_title" msgid="901334356682423679">"Staðsetning"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Nota staðsetningu"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Veita tilgreindum forritum aðgang að staðsetningu"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Lokað verður fyrir aðgang allra forrita að staðsetningu ef þú slekkur á þessu. Forrit akstursaðstoðar fá áfram aðgang."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Nota staðsetningu við akstursaðstoð"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Slökkt á staðsetningu ökutækis"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Akstursaðstoð fær ekki aðgang að staðsetningu"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Breyta"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Veita akstursaðstoðarforritum aðgang að staðsetningu"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ef þú slekkur á þessu verða þau forrit akstursaðstoðar sem reiða sig á staðsetningarupplýsingar óvirk."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Slökkva samt"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nýlegar staðsetningarbeiðnir"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Engar nýlegar staðsetningarbeiðnir"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Heimildir á forritsstigi"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Staðsetningarþjónusta"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Nota staðsetningu"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Staðsetning kann að notast við tækni á borð við GPS, Wi-Fi, farsímakerfi og skynjara til að áætla staðsetningu tækisins."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Akstursaðstoð"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Staðsetningarupplýsingar sem sendar eru í forrit akstursaðstoðar innihalda engar upplýsingar sem auðkenna þig. Upplýsingarnar eru geymdar að hámarki í 2 daga áður en þeim er eytt."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Hljóðnemi"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Nota hljóðnema"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Veita öllum forritum aðgang að hljóðnemanum"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Stjórna heimildum hljóðnema"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Nýleg notkun"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Engin nýleg forrit"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 forrit eru með aðgang"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# af {total_count} forriti/forritum er með aðgang}one{# af {total_count} forriti/forritum er með aðgang}other{# af {total_count} forritum eru með aðgang}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nýlega opnað"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Skoða allt"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Hleður…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Kerfi"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Kerfisuppfærslur"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Ítarlegt"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Leyfi þriðju aðila"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Vandamál kom upp við að hlaða leyfin."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Hleður…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Nú ertu <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skrefi frá því að vera þróunaraðili.</item>
- <item quantity="other">Nú ertu <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skrefum frá því að vera þróunaraðili.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Nú ertu # skrefi frá því að vera þróunaraðili.}one{Nú ertu # skrefi frá því að vera þróunaraðili.}other{Nú ertu # skrefum frá því að verða þróunaraðili.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Nú ertu þróunaraðili!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Þetta er óþarfi; þú ert nú þegar þróunaraðili."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Forritunarkostir"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Þegar þú hefur búið til nýtt snið ætti sá einstaklingur að stilla það fyrir sjálfan sig."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Hægt er að uppfæra forrit úr hvaða prófíl sem er fyrir notkun allra annarra prófíla."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Hámarki prófíla náð"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Þú getur búið til allt að <xliff:g id="COUNT">%d</xliff:g> prófíl.</item>
- <item quantity="other">Þú getur búið til allt að <xliff:g id="COUNT">%d</xliff:g> prófíla.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Aðeins er hægt að búa til einn prófíl.}one{Þú getur búið til allt að # prófíl.}other{Þú getur búið til allt að # prófíla.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Ekki var hægt að búa til nýjan prófíl"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Á að eyða þessum prófíl?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Öllum forritum og gögnum fyrir þennan prófíl verður eytt"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Ekki var hægt að eyða prófíl."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Prófíl ekki eytt. Endurræstu tækið og reyndu aftur."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Þessum prófíl verður eytt þegar þú skiptir um prófíl eða endurræsir ökutækið."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Hunsa"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Reyna aftur"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Hvernig opnunarmynstur er teiknað"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Villa við að vista mynstur"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Of margar misheppnaðar tilraunir. Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndur."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Mynstur styður ekki snúning, notaðu snertingu"</string>
<string name="okay" msgid="4589873324439764349">"Í lagi"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Viltu fjarlægja skjálás?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Þetta gefur hverjum sem er aðgang að reikningnum þínum"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Kerfisstjórinn þinn hefur lokað á algeng PIN-númer. Prófaðu annað PIN-númer."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Þetta má ekki innihalda ógildan staf."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Aðgangsorðið er ógilt, það verður að vera minnst fjórir stafir að lengd."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> staf</item>
- <item quantity="other">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> stafi</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> lágstaf</item>
- <item quantity="other">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> lágstafi</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> hástaf</item>
- <item quantity="other">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> hástafi</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> tölustaf</item>
- <item quantity="other">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> tölustafi</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> sérstaf</item>
- <item quantity="other">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> sérstafi</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Verður að innihalda að minnsta kosti <xliff:g id="COUNT">%d</xliff:g> staftákn sem ekki er bókstafur</item>
- <item quantity="other">Verður að innihalda að minsta kosti <xliff:g id="COUNT">%d</xliff:g> staftákn sem ekki eru bókstafir</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Tækjastjóri leyfir ekki notkun nýlegs aðgangsorðs"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Villa við að vista aðgangsorð"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Kerfisstjórinn þinn hefur lokað á algeng aðgangsorð. Prófaðu annað aðgangsorð."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Bæta við prófíl"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Eyða þessum prófíl"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Bæta við prófíl"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Birtustig skjás"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Kveiktu á Bluetooth til að sjá tækin þín"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Opnaðu stillingar Bluetooth til að para tæki"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Stjórnandi upplýsinga- og afþreyingarkerfis"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Virk forrit"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Óvirk forrit"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Forrit með þessa heimild hafa aðgang að gögnum þessa ökutækis"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Engin stjórnendaforrit fyrir ökutæki"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Þetta stjórnandaforrit upplýsinga- og afþreyingarkerfis er virkt og gerir forritinu <xliff:g id="APP_NAME">%1$s</xliff:g> kleift að framkvæma eftirfarandi aðgerðir:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Þegar kveikt er á þessu upplýsinga- og afþreyingarkerfisforriti getur forritið <xliff:g id="APP_NAME">%1$s</xliff:g> framkvæmt eftirfarandi aðgerðir:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Virkja þetta upplýsinga- og afþreyingarkerfisforrit?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Virkja þetta upplýsinga- og afþreyingarkerfisforrit"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Gera óvirkt og fjarlægja"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Slökkva á þessu upplýsinga- og afþreyingarkerfisforriti"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Nánar"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Stjórnandi fyrirtækisins getur fylgst með og stjórnað forritum og gögnum sem tengjast þessum prófíl, þ.m.t. stillingum, heimildum, fyrirtækjaaðgangi, netnotkun og staðsetningarupplýsingum ökutækisins."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Stjórnandi fyrirtækisins getur fylgst með og stjórnað forritum og gögnum sem tengjast þessum prófíl, þ.m.t. stillingum, heimildum, fyrirtækjaaðgangi, netnotkun og staðsetningarupplýsingum tækisins."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Stjórnandi fyrirtækisins getur fylgst með og stjórnað forritum og gögnum sem tengjast þessu upplýsinga- og afþreyingarkerfi, þ.m.t. stillingum, heimildum, fyrirtækjaaðgangi, netnotkun og staðsetningarupplýsingum ökutækisins."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Stjórnandi fyrirtækisins getur hugsanlega opnað gögn sem tengjast þessu upplýsinga- og afþreyingarkerfi, stjórnað forritum og breytt stillingum þessa ökutækis."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Þetta er ekki tiltækt"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Ekki er hægt að breyta hljóðstyrk í þessu stýrða ökutæki"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Ekki er hægt að hringja símtöl í þessu stýrða ökutæki"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS eru ekki leyfð þessu stýrða ökutæki"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Myndavél er ekki tiltæk í þessu stýrða ökutæki"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Ekki er hægt að taka skjámyndir í þessu stýrða ökutæki"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Ekki er hægt að opna þetta forrit í þessu stýrða ökutæki"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Útilokað af lánveitanda þínum"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Fyrirtækið hefur takmarkað aðgang að tilteknum eiginleikum.\n\nHafðu samband við stjórnanda fyrirtækisins ef spurningar vakna."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Stjórnendaforrit ökutækis"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# virkt forrit}one{# virkt forrit}other{# virk forrit}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Engin virk forrit"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Ökutækjaregla <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Stjórnandi fyrirtækis stjórnar stillingum"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Nánar um <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Deila villutilkynningu?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Stjórnandi fyrirtækisins sem stjórnar þessu ökutæki bað um villutilkynningu til að aðstoða við úrræðaleit í þessu tæki. Forritum og gögnum verður hugsanlega deilt."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Stjórnandi fyrirtækisins sem stjórnar þessu ökutæki bað um villutilkynningu til að aðstoða við úrræðaleit í þessu tæki. Forritum og gögnum verður hugsanlega deilt og mögulegt er að þetta hægi tímabundið á tækinu."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Þessari villutilkynningu er deilt með stjórnanda fyrirtækisins sem stjórnar þessu ökutæki. Hafðu samband við viðkomandi til að fá frekari upplýsingar."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Deila"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Hafna"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Ekki er hægt að breyta þessari stillingu eins og er"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Aðgengi"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Skjátextar"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Kjörstillingar skjátexta"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Slökkt"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Kveikt"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Skjálesari"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Birta skjátexta"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Textastærð"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Stærð og stíll skjátexta"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Mjög lítil"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Lítil"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Sjálfgefið"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Stór"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Mjög stór"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Stíll skjátexta"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Stillt af forriti"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Hvítt á svörtu"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Svart á hvítu"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Gult á svörtu"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Gult á bláu"</string>
</resources>
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
index a7c8a9a..0d7024f 100644
--- a/res/values-it/arrays.xml
+++ b/res/values-it/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Non consentire mai"</item>
<item msgid="1154273129608299386">"Consenti sempre"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 86cd911..d73b8b9 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Modalità notturna"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Rete e Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Rete mobile"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}one{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Attivo/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Non attivo/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Attivo/SIM scaricata"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Aggiungi altri"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dati mobili"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accedi ai dati tramite la rete mobile"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Rete mobile"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Usa dati mobili"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Disattivare i dati mobili?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Fai una scelta"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Utilizzare <xliff:g id="CARRIER">%1$s</xliff:g> per i dati mobili?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Avviso relativo ai dati: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Limite dati: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Avviso relativo ai dati: <xliff:g id="ID_1">^1</xliff:g>/Limite dati: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Restano %d giorni</item>
- <item quantity="other">Restano %d giorni</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Manca # giorno}one{Manca # giorno}other{Mancano # giorni}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Tempo scaduto"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Resta meno di 1 giorno"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Aggiornamento eseguito da <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> fa"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Imposta"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Limite dati e avviso"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo di utilizzo dei dati delle app"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Utilizzo dati mobili"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Imposta avviso sui dati"</string>
<string name="data_warning" msgid="116776633806885370">"Avviso sui dati"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Imposta limite dati"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"L\'unità principale del tuo veicolo disattiverà i dati mobili una volta raggiunto il limite impostato.\n\nPoiché l\'utilizzo dei dati viene misurato dall\'unità principale e il tuo operatore potrebbe tener conto dell\'utilizzo in modo diverso, è consigliabile impostare un limite conservativo."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Imposta avviso sull\'utilizzo dei dati"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Imposta limite di utilizzo dei dati"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"L\'utilizzo dei dati è misurato dal tuo dispositivo. Potrebbe variare rispetto ai dati del tuo operatore di telefonia mobile."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Imposta"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Salva"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Rete OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet del veicolo"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Se disattivi Internet del veicolo, alcune app o funzionalità del veicolo potrebbero non funzionare.\n\nI dati critici necessari per far funzionare il tuo veicolo continueranno a essere condivisi con il relativo produttore."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Disattiva comunque"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet del veicolo disattivato: alcune app o funzionalità del veicolo potrebbero non funzionare. I dati critici necessari per far funzionare il tuo veicolo continueranno a essere condivisi con il relativo produttore."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Dati usati: %1$s, %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Connettiti a un\'altra rete"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferenze di rete"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Aggiungi rete"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Connetti"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Connessione…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nessuna connessione"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Rete fuori portata"</string>
<string name="wifi_password" msgid="5565632142720292397">"Password"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Mostra password"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Scegli almeno una banda per l\'hotspot Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot e tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Off"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Disattiva hotspot automaticamente"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"L\'hotspot Wi‑Fi viene disattivato se non ci sono dispositivi collegati"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> chiede di attivare il Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Forza interruzione"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Vuoi forzare l\'interruzione?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Se forzi l\'interruzione di un\'app, questa potrebbe funzionare in modo anomalo."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Disattivare protezione prestazioni?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Se procedi, anche il tuo software e il tuo hardware potrebbero non funzionare."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Lascia attiva"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Disattiva"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Attivare Priorità a prestazioni dell\'app?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"L\'attivazione dell\'impostazione può causare una potenziale instabilità del sistema o può avere un impatto a lungo termine sull\'hardware. Vuoi continuare?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Sì"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"No, grazie"</string>
<string name="disable_text" msgid="4358165448648990820">"Disattiva"</string>
<string name="enable_text" msgid="1794971777861881238">"Attiva"</string>
<string name="uninstall_text" msgid="277907956072833012">"Disinstalla"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Autorizzazioni"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notifiche"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Spazio di archiviazione e cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Prestazioni ottimali"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Priorità a prestazioni dell\'app"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versione: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nessuna autorizzazione concessa"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nessuna autorizzazione richiesta"</string>
<string name="unused_apps" msgid="648471933781010395">"App inutilizzate"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> app inutilizzata</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> app inutilizzate</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# app inutilizzata}one{# app inutilizzata}other{# app inutilizzate}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Rimuovi autorizzazioni e libera spazio"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s nella memoria interna"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Se serve, chiudi l\'app per evitare l\'uso eccessivo delle risorse"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Utilizza le risorse del sistema per dare la priorità alle prestazioni dell\'app"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Utilizzo dei dati"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Utilizzo dati delle app"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Cronologia di utilizzo"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Tutte le app"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Utilizzo dati e Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Cronologia di utilizzo"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Utilizzo totale"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Primo piano"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Background"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Consenti dati"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Consenti a questa app di usare i dati mobili"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Limita dati"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Usa dati mobili solo quando l\'app è in primo piano"</string>
<string name="computing_size" msgid="5791407621793083965">"Elaborazione…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorizzazioni aggiuntive</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# autorizzazione aggiuntiva}one{# autorizzazione aggiuntiva}other{# autorizzazioni aggiuntive}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Nota: dopo il riavvio, devi sbloccare il veicolo per poter avviare l\'app."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistenza e input vocale"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"App di assistenza"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Controllo del Wi-Fi consente a un\'app di attivare o disattivare il Wi-Fi, cercare e connettersi a reti Wi-Fi, aggiungere e rimuovere reti oppure avviare un hotspot solo locale."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Altro"</string>
<string name="location_settings_title" msgid="901334356682423679">"Posizione"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Usa posizione"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Consenti alle app specificate di accedere alla tua posizione"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Se disattivi questa impostazione, verrà rimosso l\'accesso alla posizione per tutte le app. Le app di assistenza alla guida continueranno ad avere accesso."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Usa posizione per assistenza alla guida"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Posizione del veicolo disattivata"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Le app di assistenza alla guida non possono accedere alla tua posizione"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Modifica"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Consenti alle app di assistenza alla guida di accedere alla tua posizione"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Se disattivi questa impostazione, verranno disattivate le app di assistenza alla guida che si basano sulle informazioni relative alla posizione."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Disattiva comunque"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Richieste di posizione recenti"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nessuna richiesta di posizione recente"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Autorizzazioni a livello di app"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Servizi di geolocalizzazione"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Usa posizione"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Il servizio di geolocalizzazione potrebbe usare fonti quali GPS, reti mobili, Wi-Fi e sensori per stabilire la posizione approssimativa del dispositivo."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Assistenza alla guida"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Le informazioni sulla posizione inviate alle app di assistenza alla guida non includono dati che ti identificano. Vengono memorizzate per massimo 2 giorni prima di essere eliminate."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microfono"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Usa il microfono"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Consenti a tutte le app di accedere al microfono"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Gestisci le autorizzazioni di accesso al microfono"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Usi recenti"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nessuna app recente"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Nessuna app ha accesso"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Ha accesso # su {total_count} app}one{Ha accesso # su {total_count} app}other{Hanno accesso # su {total_count} app}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Usi recenti"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Mostra tutto"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Caricamento in corso…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Aggiornamenti di sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Avanzate"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licenze di terze parti"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Errore di caricamento delle licenze."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Caricamento…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Ti mancano <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> passaggi per diventare sviluppatore.</item>
- <item quantity="other">Ti mancano <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> passaggi per diventare sviluppatore.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Ti manca # passaggio per diventare sviluppatore.}one{Ti manca # passaggio per diventare sviluppatore.}other{Ti mancano # passaggi per diventare sviluppatore.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Ora sei sviluppatore."</string>
<string name="show_dev_already" msgid="1678087328973865736">"Non è necessario, sei già sviluppatore."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opzioni sviluppatore"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"I nuovi profili dovrebbero essere personalizzati dalle persone per cui sono stati creati."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Qualsiasi profilo può aggiornare le app che verranno usate da tutti gli altri profili."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Limite di profili raggiunto"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">È possibile creare massimo <xliff:g id="COUNT">%d</xliff:g> profilo.</item>
- <item quantity="other">È possibile creare massimo <xliff:g id="COUNT">%d</xliff:g> profili.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{È possibile creare un solo profilo.}one{È possibile creare al massimo # profilo.}other{È possibile creare al massimo # profili.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Impossibile creare un nuovo profilo"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Vuoi eliminare questo profilo?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Verranno eliminati tutti i dati e le app di questo profilo"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Impossibile eliminare il profilo."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profilo non eliminato. Puoi riavviare il dispositivo e riprovare."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Questo profilo verrà eliminato quando cambierai profilo o riaccenderai il motore."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignora"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Riprova"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Come creare una sequenza di sblocco"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Errore di salvataggio della sequenza"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Troppi tentativi errati. Riprova tra <xliff:g id="NUMBER">%d</xliff:g> secondi."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Sequenza non supporta input rotatorio, usa tocco"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Rimuovere il blocco schermo?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"In questo modo chiunque potrà accedere al tuo dispositivo"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"I PIN comuni sono stati bloccati dall\'amministratore IT. Prova a usare un altro PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Non può contenere un carattere non valido."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Password non valida: deve avere almeno 4 caratteri."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
- <item quantity="other">Deve contenere almeno <xliff:g id="COUNT">%d</xliff:g> lettere</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
- <item quantity="other">Deve contenere almeno <xliff:g id="COUNT">%d</xliff:g> lettere minuscole</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
- <item quantity="other">Deve contenere almeno <xliff:g id="COUNT">%d</xliff:g> lettere maiuscole</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
- <item quantity="other">Deve contenere almeno <xliff:g id="COUNT">%d</xliff:g> numeri</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
- <item quantity="other">Deve contenere almeno <xliff:g id="COUNT">%d</xliff:g> simboli speciali</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
- <item quantity="other">Deve contenere almeno <xliff:g id="COUNT">%d</xliff:g> caratteri non costituiti da una lettera</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"L\'amministratore del dispositivo non consente l\'utilizzo di una password recente"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Errore di salvataggio della password"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Le password comuni sono state bloccate dall\'amministratore IT. Prova a usare un\'altra password."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Aggiungi un profilo"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Elimina questo profilo"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Aggiungi profilo"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Luminosità dello schermo"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Per vedere i tuoi dispositivi, attiva il Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Per accoppiare un dispositivo, apri le impostazioni Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Amministratore di sistema di infotainment"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"App attivate"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"App disattivate"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Le app con questa autorizzazione hanno accesso ai dati di questo veicolo"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nessuna app di amministrazione del veicolo"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Questa app per amministratori di sistema di infotainment è attiva e consente all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di eseguire le seguenti operazioni:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Attivando questa app di sistema di infotainment, l\'app <xliff:g id="APP_NAME">%1$s</xliff:g> potrà eseguire le seguenti operazioni:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Attivare app di sistema di infotainment?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Attiva questa app di sistema di infotainment"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Disattiva e disinstalla"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Disattiva quest\'app di sistema di infotainment"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Altri dettagli"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Il gestore dell\'organizzazione può monitorare e gestire le app e i dati associati a questo profilo, inclusi accesso aziendale, impostazioni, autorizzazioni, attività di rete e informazioni sulla posizione del veicolo."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Il gestore dell\'organizzazione può monitorare e gestire le app e i dati associati a questo profilo, inclusi accesso aziendale, impostazioni, autorizzazioni, attività di rete e informazioni sulla posizione del dispositivo."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Il gestore dell\'organizzazione può monitorare e gestire le app e i dati associati a questo sistema di infotainment, inclusi accesso aziendale, impostazioni, autorizzazioni, attività di rete e informazioni sulla posizione del veicolo."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Il gestore dell\'organizzazione potrebbe essere in grado di accedere ai dati associati a questo sistema di infotainment, gestire app e modificare le impostazioni di questo veicolo."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Non disponibile"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Impossibile regolare il volume in questo veicolo gestito"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Impossibile effettuare chiamate in questo veicolo gestito"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Gli SMS non sono consentiti in questo veicolo gestito"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"La videocamera non è disponibile in questo veicolo gestito"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Impossibile acquisire screenshot in questo veicolo gestito"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Impossibile aprire l\'app in questo veicolo gestito"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Impostazione bloccata dal fornitore di credito"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"L\'accesso ad alcune funzionalità è stato limitato dall\'organizzazione.\n\nPer eventuali domande, contatta il responsabile dell\'organizzazione."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"App per amministratori veicolo"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# app attivata}one{# app attivate}other{# app attivate}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nessuna app attivata"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Norme relative ai veicoli <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Impostazioni gestite dal gestore dell\'organizzazione"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Scopri di più su <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Condividere la segnalazione di bug?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Il gestore dell\'organizzazione del veicolo ha richiesto una segnalazione di bug per contribuire a risolvere i problemi di questo dispositivo. Potrebbero essere condivisi dati e app."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Il gestore dell\'organizzazione del veicolo ha richiesto una segnalazione di bug per contribuire a risolvere i problemi di questo dispositivo. Potrebbero essere condivisi dati e app e il dispositivo potrebbe rallentare temporaneamente."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"La segnalazione di bug sta per essere condivisa con il gestore dell\'organizzazione del veicolo. Contatta il gestore per maggiori dettagli."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Condividi"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Rifiuta"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Al momento non è possibile modificare questa impostazione"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibilità"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Sottotitoli"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferenze sottotitoli"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Off"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"On"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Screen reader"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Mostra sottotitoli"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Dimensioni testo"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Stile e dimensioni sottotitoli"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Molto piccolo"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Piccolo"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Predefinito"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Grande"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Molto grande"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Stile sottotitoli"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Impostato dall\'app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Bianco su nero"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Nero su bianco"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Giallo su nero"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Giallo su blu"</string>
</resources>
diff --git a/res/values-iw/arrays.xml b/res/values-iw/arrays.xml
index 76f620c..a08f139 100644
--- a/res/values-iw/arrays.xml
+++ b/res/values-iw/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"אף פעם לא לאפשר"</item>
<item msgid="1154273129608299386">"לאפשר תמיד"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index eeeddda..80c825f 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -27,12 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"מצב לילה"</string>
<string name="network_and_internet" msgid="4229023630498537530">"רשת ואינטרנט"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"רשת סלולרית"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> כרטיסי SIM</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> כרטיסי SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> כרטיסי SIM</item>
- <item quantity="one">כרטיס SIM אחד (<xliff:g id="COUNT_0">%1$d</xliff:g>)</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{כרטיס SIM אחד}two{# כרטיסי SIM}many{# כרטיסי SIM}other{# כרטיסי SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"פעיל / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"לא פעיל / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"פעיל / SIM שהורדת"</string>
@@ -40,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"הוספה"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"חבילת גלישה"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"שימוש בחבילת הגלישה דרך הרשת הסלולרית"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"רשת סלולרית"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"שימוש בחבילת גלישה"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"לכבות את חבילת הגלישה?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"עליך לבחור אפשרות כלשהי"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"להשתמש ב-<xliff:g id="CARRIER">%1$s</xliff:g> בשביל חבילת גלישה?"</string>
@@ -55,12 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"אזהרה לגבי שימוש בנתונים: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"מגבלת נתונים: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"אזהרה לגבי שימוש בנתונים:<xliff:g id="ID_1">^1</xliff:g>/מגבלת נתונים:<xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="two">נותרו יומיים (%d)</item>
- <item quantity="many">נותרו %d ימים</item>
- <item quantity="other">נותרו %d ימים</item>
- <item quantity="one">נותר יום אחד (%d)</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{נותר יום אחד}two{נותרו יומיים}many{נותרו # ימים}other{נותרו # ימים}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"לא נשאר זמן"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"נותר פחות מיום אחד"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"עדכון בוצע על ידי <xliff:g id="ID_1">^1</xliff:g> לפני <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -75,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"הגדרה"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"אזהרות והגבלות של נתונים"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"מחזור שימוש בחבילת הגלישה באפליקציות"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"שימוש בחבילת הגלישה"</string>
<string name="set_data_warning" msgid="6628236612886588097">"מתי תופיע אזהרת שימוש בנתונים"</string>
<string name="data_warning" msgid="116776633806885370">"אזהרה לגבי שימוש בנתונים"</string>
<string name="set_data_limit" msgid="7136539812414500084">"הגדרת מגבלת נתונים"</string>
@@ -83,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"כשהיחידה הראשית ברכב תגיע למגבלה שהגדרת, היא תשבית את חבילת הגלישה.\n\nמכיוון שעשויים להיות הבדלים בין השימוש בחבילת הגלישה שנמדד על ידי היחידה הראשית לבין השימוש שנמדד על ידי הספק, מומלץ להגדיר מגבלה סבירה."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"הגדרת אזהרה לגבי שימוש בחבילת הגלישה"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"מגבלה לשימוש בחבילת הגלישה"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"כמות השימוש בחבילת הגלישה נמדדת על ידי המכשיר שלך. ייתכן שהערך הזה יהיה שונה מהערך שנמדד על ידי ספק הסלולר שלך."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"הגדרה"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"שמירה"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"רשת OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"חיבור הרכב לאינטרנט"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"לאחר השבתה של חיבור הרכב לאינטרנט, ייתכן שתכונות או אפליקציות מסוימות של הרכב לא יפעלו.\n\nהמערכת תמשיך לשתף נתונים קריטיים הדרושים להפעלת הרכב עם יצרן הרכב."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"השבתה בכל זאת"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"חיבור הרכב לאינטרנט מושבת. בעקבות זאת, ייתכן שתכונות או אפליקציות מסוימות של הרכב לא יפעלו. המערכת תמשיך לשתף נתונים קריטיים הדרושים להפעלת הרכב עם יצרן הרכב."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"השתמשת ב-%1$s בין %2$s ל-%3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"הצטרפות לרשת אחרת"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"העדפות רשת"</string>
@@ -98,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"הוספת רשת"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"התחברות"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"ההתחברות מתבצעת…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"לא מחובר"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"הרשת לא בטווח"</string>
<string name="wifi_password" msgid="5565632142720292397">"סיסמה"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"הצגת סיסמה"</string>
@@ -159,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"יש לבחור תדר אחד לפחות לנקודת Wi‑Fi לשיתוף אינטרנט:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"נקודה לשיתוף אינטרנט ושיתוף אינטרנט בין מכשירים"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"נקודת אינטרנט"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"כבויה"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"כיבוי אוטומטי של הנקודה לשיתוף אינטרנט"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"נקודת ה-Wi‑Fi לשיתוף אינטרנט תיכבה כשאין אף מכשיר מחובר"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> רוצה להפעיל את ה-Wi-Fi"</string>
@@ -301,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"סגירה ידנית"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"לסגור ידנית?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"אם סוגרים אפליקציה ידנית, ייתכן שהיא לא תפעל כהלכה."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"לכבות את ההגנה על הביצועים?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"בחירה באפשרות הזו עלולה לגרום לפעילות לא תקינה של התוכנה והחומרה."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"לא לכבות"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"כיבוי"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"להפעיל את העדיפות לביצועי האפליקציות?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"הפעלת ההגדרה הזו עלולה לגרום לאי יציבות במערכת או להשפיע על החומרה לטווח ארוך. רוצה להמשיך?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"כן"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"לא תודה"</string>
<string name="disable_text" msgid="4358165448648990820">"השבת"</string>
<string name="enable_text" msgid="1794971777861881238">"הפעלה"</string>
<string name="uninstall_text" msgid="277907956072833012">"הסרת התקנה"</string>
@@ -314,29 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"הרשאות"</string>
<string name="notifications_label" msgid="6586089149665170731">"התראות"</string>
<string name="storage_application_label" msgid="5911779903670978586">"אחסון ומטמון"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"הבטחת ביצועים מרביים"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"עדיפות לביצועי אפליקציות"</string>
<string name="application_version_label" msgid="8556889839783311649">"גרסה: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"לא הוענקו הרשאות"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"לא התבקשו הרשאות"</string>
<string name="unused_apps" msgid="648471933781010395">"אפליקציות שמזמן לא השתמשת בהן"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> אפליקציות שמזמן לא השתמשת בהן</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> אפליקציות שמזמן לא השתמשת בהן</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> אפליקציות שמזמן לא השתמשת בהן</item>
- <item quantity="one">אפליקציה אחת (<xliff:g id="COUNT_0">%d</xliff:g>) שמזמן לא השתמשת בה</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{אפליקציה אחת שמזמן לא השתמשת בה}two{# אפליקציות שמזמן לא השתמשת בהן}many{# אפליקציות שמזמן לא השתמשת בהן}other{# אפליקציות שמזמן לא השתמשת בהן}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"הסרת הרשאות ופינוי נפח אחסון"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s בשטח אחסון פנימי"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"סגירת האפליקציה מאפשרת לחסוך במשאבים כשצריך"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"שימוש במשאבי המערכת תוך מתן עדיפות לביצועי אפליקציות"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"שימוש בחבילת הגלישה"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"שימוש בחבילת הגלישה באפל\'"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"היסטוריית השימוש"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"כל האפליקציות"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"חבילת גלישה ו-Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"היסטוריית השימוש"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"השימוש הכולל"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"בחזית"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ברקע"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"השימוש בחבילת גלישה מותר"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"מתן הרשאה לאפליקציה הזאת לשימוש בחבילת גלישה"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"הגבלת השימוש בחבילת גלישה"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"השימוש בחבילת גלישה מותר רק כשהאפליקציה פועלת ברקע"</string>
<string name="computing_size" msgid="5791407621793083965">"מתבצע חישוב…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> הרשאות נוספות</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> הרשאות נוספות</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> הרשאות נוספות</item>
- <item quantity="one">הרשאה אחת (<xliff:g id="COUNT_0">%d</xliff:g>) נוספת</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{הרשאה אחת נוספת}two{# הרשאות נוספות}many{# הרשאות נוספות}other{# הרשאות נוספות}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"הערה: לאחר הפעלה מחדש, ניתן להפעיל את האפליקציה רק לאחר ביטול של נעילת הרכב."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"קלט אסיסטנט וקלט קולי"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"אפליקציית עזרה"</string>
@@ -393,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"שליטה ב-Wi-Fi מאפשרת לאפליקציות להפעיל ולכבות חיבור Wi-Fi, לסרוק רשתות Wi-Fi ולהתחבר אליהן, להוסיף ולהסיר רשתות או להפעיל נקודה לשיתוף אינטרנט באופן מקומי בלבד."</string>
<string name="more_special_access_title" msgid="166115485446645971">"עוד"</string>
<string name="location_settings_title" msgid="901334356682423679">"מיקום"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"שימוש במיקום"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"אישור לאפליקציות נבחרות לגשת למיקום"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"אם משביתים את האפשרות הזו, מסירים את הגישה למיקום עבור כל האפליקציות. לאפליקציות העזרה לנהג עדיין תהיה גישה."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"שימוש במיקום עבור עזרה לנהג"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"מיקום הרכב כבוי"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"לאפליקציות העזרה לנהג אין גישה למיקום"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"שינוי"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"אישור לאפליקציות העזרה לנהג לגשת למיקום"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"אם משביתים את האפשרות הזו, משביתים את אפליקציות העזרה לנהג שמתבססות על פרטי המיקום."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"השבתה בכל זאת"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"בקשות של מיקומים אחרונים"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"אין בקשות של מיקומים אחרונים"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"הרשאות ברמת אפליקציה"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"שירותי מיקום"</string>
<string name="location_use_location_title" msgid="117735895374606680">"שימוש במיקום"</string>
<string name="location_settings_footer" msgid="296892848338100051">"תכונת המיקום משתמשת במקורות כמו GPS, Wi‑Fi, רשתות סלולריות וחיישנים כדי לעזור בהערכה של מיקום המכשיר שלך."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"עזרה לנהג"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"פרטי המיקום שנשלחים לאפליקציות העזרה לנהג לא מכילים פרטים מזהים עליך. הפרטים מאוחסנים ליומיים לכל היותר עד למחיקתם."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"מיקרופון"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"שימוש במיקרופון"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"מתן הרשאת גישה למיקרופון לכל האפליקציות"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"ניהול של הרשאות המיקרופון"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"האפליקציות האחרונות שניגשו למיקרופון"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"אין אפליקציות אחרונות"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"אין אפליקציות עם הרשאת גישה"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{לאפליקציה אחת מתוך {total_count} יש גישה}two{ל-# אפליקציות מתוך {total_count} יש גישה}many{ל-# אפליקציות מתוך {total_count} יש גישה}other{ל-# אפליקציות מתוך {total_count} יש גישה}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"בקשות הגישה האחרונות למיקרופון"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"הצגת כל הבקשות"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"בטעינה…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"מערכת"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"עדכוני מערכת"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"מתקדם"</string>
@@ -437,12 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"רישיונות צד שלישי"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"יש בעיה בטעינת הרישיון."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"בטעינה…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="two">בעוד <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> צעדים התואר שלך יהיה מפתח/ת.</item>
- <item quantity="many">בעוד <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> צעדים התואר שלך יהיה מפתח/ת.</item>
- <item quantity="other">בעוד <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> צעדים התואר שלך יהיה מפתח/ת.</item>
- <item quantity="one">בעוד צעד אחד (<xliff:g id="STEP_COUNT_0">%1$d</xliff:g>) התואר שלך יהיה מפתח/ת.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{נותר עוד שלב אחד להגדרתך כמפתח.}two{נותרו עוד # שלבים אחד להגדרתך כמפתח.}many{נותרו עוד # שלבים אחד להגדרתך כמפתח.}other{נותרו עוד # שלבים אחד להגדרתך כמפתח.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"את/ה מפתח/ת עכשיו!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"אין צורך, את/ה כבר מפתח/ת."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"אפשרויות למפתחים"</string>
@@ -511,16 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"לאחר יצירה של פרופיל חדש, המשתמש של הפרופיל הזה צריך להתאים אותו אישית בעצמו."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"עדכון אפליקציות מפרופיל כלשהו יחיל את העדכונים בכל יתר הפרופילים."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"הגעת למספר הפרופילים המרבי"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="two">ניתן ליצור רק <xliff:g id="COUNT">%d</xliff:g> פרופילים.</item>
- <item quantity="many">ניתן ליצור רק <xliff:g id="COUNT">%d</xliff:g> פרופילים.</item>
- <item quantity="other">ניתן ליצור רק <xliff:g id="COUNT">%d</xliff:g> פרופילים.</item>
- <item quantity="one">ניתן ליצור רק פרופיל אחד.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{ניתן ליצור רק פרופיל אחד.}two{ניתן ליצור רק # פרופילים.}many{ניתן ליצור רק # פרופילים.}other{ניתן ליצור רק # פרופילים.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"לא ניתן היה ליצור את הפרופיל החדש"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"למחוק את הפרופיל הזה?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"כל האפליקציות והנתונים של הפרופיל הזה יימחקו"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"לא ניתן היה למחוק את הפרופיל"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"הפרופיל לא נמחק. צריך להפעיל מחדש ולנסות שוב."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"הפרופיל הזה יימחק במהלך החלפת פרופילים או הפעלה מחדש של הרכב."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ביטול"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ניסיון חוזר"</string>
@@ -633,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"כיצד לשרטט קו ביטול נעילה"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"שגיאה בשמירה של קו ביטול הנעילה"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"יותר מדי ניסיונות שגויים. ניתן לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"אין תמיכה בקו ביטול נעילה בחוגה, רק במגע"</string>
<string name="okay" msgid="4589873324439764349">"אישור"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"להסיר את נעילת המסך?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"פעולה זו תאפשר לכל אחד לגשת לחשבון שלך"</string>
@@ -664,42 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"קודי אימות נפוצים חסומים בידי מנהל ה-IT. יש לנסות קוד אימות אחר."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"לא ניתן לכלול תו לא חוקי."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"הסיסמה לא חוקית, היא חייבת להיות באורך של ארבעה תווים לפחות."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="two">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> אותיות</item>
- <item quantity="many">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> אותיות</item>
- <item quantity="other">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> אותיות</item>
- <item quantity="one">צריכה להכיל לפחות אות אחת</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="two">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> אותיות קטנות</item>
- <item quantity="many">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> אותיות קטנות</item>
- <item quantity="other">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> אותיות קטנות</item>
- <item quantity="one"> צריכה להכיל לפחות אות קטנה אחת</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="two">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> אותיות גדולות</item>
- <item quantity="many">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> אותיות גדולות</item>
- <item quantity="other">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> אותיות גדולות</item>
- <item quantity="one">צריכה להכיל לפחות אות גדולה אחת</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="two">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> ספרות</item>
- <item quantity="many">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> ספרות</item>
- <item quantity="other">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> ספרות</item>
- <item quantity="one">צריכה להכיל לפחות ספרה אחת</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="two">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> סמלים מיוחדים</item>
- <item quantity="many">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> סמלים מיוחדים</item>
- <item quantity="other">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> סמלים מיוחדים</item>
- <item quantity="one">צריכה להכיל לפחות סמל מיוחד אחד</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="two">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> תווים שאינם אותיות</item>
- <item quantity="many">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> תווים שאינם אותיות</item>
- <item quantity="other">צריכה להכיל לפחות <xliff:g id="COUNT">%d</xliff:g> תווים שאינם אותיות</item>
- <item quantity="one">צריכה להכיל לפחות תו אחד שאינו אות</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"מנהל המכשיר לא מאפשר להשתמש בסיסמה שנעשה בה שימוש לאחרונה"</string>
<string name="error_saving_password" msgid="8334882262622500658">"שגיאה בשמירת הסיסמה"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"סיסמאות נפוצות חסומות בידי מנהל ה-IT. יש לנסות סיסמה אחרת."</string>
@@ -742,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"להוספת פרופיל"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"מחיקת הפרופיל"</string>
<string name="add_profile_text" msgid="9118410102199116969">"הוספת פרופיל"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"בהירות התצוגה"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"כדי להציג את המכשירים שלך, צריך להפעיל את Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"כדי להתאים מכשיר, צריך לפתוח את הגדרות Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"המנהל של מערכת המידע והבידור"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"אפליקציות מופעלות"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"אפליקציות מושבתות"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"לאפליקציות עם ההרשאה הזאת יש גישה לנתוני הרכב הזה"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"אין אפליקציות למנהלים ברכב"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"אפליקציית המנהל של מערכת המידע והבידור פעילה ומאפשרת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לבצע את הפעולות הבאות:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"הפעלת האפליקציה הזאת של מערכת המידע והבידור תאפשר לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לבצע את הפעולות הבאות:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"להפעיל את אפליקציית המידע והבידור?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"הפעלת האפליקציה הזאת של מערכת המידע והבידור"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"השבתה והסרה"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"השבתת האפליקציה הזאת של מערכת המידע והבידור"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"פרטים נוספים"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"מנהל הארגון יכול לפקח על אפליקציות ונתונים המשויכים לפרופיל הזה ולנהל אותם, כולל הגדרות, הרשאות, גישה ארגונית, פעילות הרשת ומידע על מיקום הרכב."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"מנהל הארגון יכול לפקח על אפליקציות ונתונים המשויכים לפרופיל הזה ולנהל אותם, כולל הגדרות, הרשאות, גישה ארגונית, פעילות הרשת ומידע על מיקום המכשיר."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"מנהל הארגון יכול לפקח על אפליקציות ונתונים המשויכים למערכת הזו של המידע והבידור ולנהל אותם, כולל הגדרות, הרשאות, גישה ארגונית, פעילות הרשת ומידע על מיקום הרכב."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"יכול להיות שמנהל הארגון יוכל לקבל גישה לנתונים שמשויכים למערכת הזו של המידע והבידור, לנהל אפליקציות ולשנות את הגדרות הרכב הזה."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ההגדרה הזו לא זמינה"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"לא ניתן לשנות את עוצמת הקול ברכב המנוהל הזה"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"לא ניתן לבצע שיחות ברכב המנוהל הזה"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"לא ניתן לשלוח ולקבל הודעות SMS ברכב המנוהל הזה"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"המצלמה לא זמינה ברכב המנוהל הזה"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"לא ניתן לבצע צילומי מסך ברכב המנוהל הזה"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"לא ניתן לפתוח את האפליקציה הזו ברכב המנוהל הזה"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"נחסמה על ידי החברה שמוכרת מכשירים באשראי"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"הגישה לחלק מהתכונות מוגבלת על ידי הארגון.\n\nיש לך שאלות? כדאי ליצור קשר עם מנהל הארגון."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"אפליקציות למנהלי מערכות של הרכב"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{אפליקציה אחת מופעלת}two{# אפליקציות מופעלות}many{# אפליקציות מופעלות}other{# אפליקציות מופעלות}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"אין אפליקציות פעילות"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"מדיניות הרכב של <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"ההגדרות מנוהלות על ידי המנהל של הארגון"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"מידע נוסף על <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"לשתף את דוח איתור הבאגים?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"מנהל הארגון האחראי לרכב הזה ביקש דוח איתור באגים כדי לסייע בפתרון בעיות במכשיר הזה. יכול להיות שהאפליקציות והנתונים שלך ישותפו."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"מנהל הארגון האחראי לרכב הזה ביקש דוח איתור באגים כדי לסייע בפתרון בעיות במכשיר הזה. יכול להיות שהאפליקציות והנתונים ישותפו, ופעילות המכשיר שלך תהיה איטית יותר באופן זמני."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"דוח איתור הבאגים משותף עכשיו עם מנהל הארגון האחראי לרכב הזה. צריך ליצור איתו קשר כדי לקבל פרטים נוספים."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"שיתוף"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"דחייה"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"לא ניתן לשנות את ההגדרה הזו כרגע."</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"נגישות"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"כתוביות"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"העדפות לכתוביות"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"מושבתות"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"פועלות"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"קורא מסך"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"הצגת הכתוביות"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"גודל הטקסט"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"גודל וסגנון הכתוביות"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"קטנות מאוד"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"קטנות"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ברירת מחדל"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"גדולות"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"גדולות מאוד"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"סגנון הכתוביות"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"בהגדרת האפליקציה"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"לבן על גבי שחור"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"שחור על גבי לבן"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"צהוב על גבי שחור"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"צהוב על גבי כחול"</string>
</resources>
diff --git a/res/values-ja/arrays.xml b/res/values-ja/arrays.xml
index cec41ae..df58cf4 100644
--- a/res/values-ja/arrays.xml
+++ b/res/values-ja/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"許可しない"</item>
<item msgid="1154273129608299386">"常に許可する"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index b647ff4..88cfb7d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"夜間モード"</string>
<string name="network_and_internet" msgid="4229023630498537530">"ネットワークとインターネット"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"モバイル ネットワーク"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other">SIM: <xliff:g id="COUNT_1">%1$d</xliff:g> つ</item>
- <item quantity="one">SIM: <xliff:g id="COUNT_0">%1$d</xliff:g> つ</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# 件の SIM}other{# 件の SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"有効 / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"無効 / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"有効 / ダウンロード型 SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"追加"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"モバイルデータ"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"モバイル ネットワーク経由でデータにアクセス"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"モバイル ネットワーク"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"モバイルデータの使用"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"モバイルデータを OFF にしますか?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"選択してください"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"モバイルデータに <xliff:g id="CARRIER">%1$s</xliff:g> を使用?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"警告するデータ使用量: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"データ上限: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"データ警告: <xliff:g id="ID_1">^1</xliff:g> / データ上限: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">残り %d 日</item>
- <item quantity="one">残り %d 日</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{残り # 日}other{残り # 日}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"残り時間なし"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"残り 1 日未満"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"更新: <xliff:g id="ID_1">^1</xliff:g>、<xliff:g id="ID_2">^2</xliff:g>前"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"設定"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"データ使用量の警告と上限"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"アプリのデータ使用量のサイクル"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"モバイルデータ使用量"</string>
<string name="set_data_warning" msgid="6628236612886588097">"データ使用量を警告"</string>
<string name="data_warning" msgid="116776633806885370">"警告するデータ使用量"</string>
<string name="set_data_limit" msgid="7136539812414500084">"データ使用量を制限"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"車載ヘッドユニットで設定した上限に達するとモバイルデータが OFF になります。\n\nデータ使用量はヘッドユニットで測定された値ですが、携帯通信会社での使用量の計算はこれと異なることがあるため、余裕をもって上限を設定することをおすすめします。"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"データ使用の警告の設定"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"データ使用の上限の設定"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"データ使用量はお使いのデバイスで測定されます。携帯通信会社のデータによって数値が異なる場合があります。"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"設定"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"保存"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM ネットワーク"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"車両のインターネット"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"車両のインターネットを OFF にすると、車両の機能やアプリの一部が動作しなくなるおそれがあります。\n\n車両を動かすのに必要な重要データは、車両メーカーと引き続き共有されます。"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"OFF にする"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"車両のインターネットが OFF になりました。車両の機能やアプリの一部が動作しなくなるおそれがあります。車両を動かすのに必要な重要データは、車両メーカーと引き続き共有されます。"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s 使用(%2$s~%3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"他のネットワークに接続"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"ネットワーク設定"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"ネットワークを追加"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"接続"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"接続しています…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"接続されていません"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"ネットワーク圏外です"</string>
<string name="wifi_password" msgid="5565632142720292397">"パスワード"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"パスワードを表示する"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi-Fi アクセス ポイントの帯域幅を 1 つ以上選択:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"アクセス ポイントとテザリング"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"アクセス ポイント"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"OFF"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"アクセス ポイントを自動的にオフにする"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"デバイスが接続されていないと、Wi-Fi アクセス ポイントはオフになります"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"「<xliff:g id="REQUESTER">%s</xliff:g>」が Wi-Fi を ON にしようとしています"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"強制停止"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"強制停止しますか?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"アプリを強制停止すると、アプリが正常に機能しなくなる恐れがあります。"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"パフォーマンス保護を OFF にしますか?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"OFF にすると、ソフトウェアとハードウェアは想定どおりに動作しない恐れがあります。"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ON のままにする"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"OFF にする"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"アプリのパフォーマンスを優先しますか?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"オンにすると、システムを不安定にしたり、ハードウェアに長期的な影響を及ぼしたりする可能性があります。続行しますか?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"はい"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"いいえ"</string>
<string name="disable_text" msgid="4358165448648990820">"無効にする"</string>
<string name="enable_text" msgid="1794971777861881238">"有効にする"</string>
<string name="uninstall_text" msgid="277907956072833012">"アンインストール"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"権限"</string>
<string name="notifications_label" msgid="6586089149665170731">"通知"</string>
<string name="storage_application_label" msgid="5911779903670978586">"ストレージとキャッシュ"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"ピーク パフォーマンス"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"アプリのパフォーマンスを優先する"</string>
<string name="application_version_label" msgid="8556889839783311649">"バージョン: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"権限が付与されていません"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"リクエストされた権限はありません"</string>
<string name="unused_apps" msgid="648471933781010395">"使用されていないアプリ"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">使用されていないアプリ: <xliff:g id="COUNT_1">%d</xliff:g> 個</item>
- <item quantity="one">使用されていないアプリ: <xliff:g id="COUNT_0">%d</xliff:g> 個</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# 個の使用していないアプリ}other{# 個の使用していないアプリ}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"権限を削除して空き容量を増やす"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s(内部ストレージ)"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"必要に応じてアプリを終了し、リソースの過度の使用を回避します"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"アプリのパフォーマンスに優先的にシステム リソースを使用します"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"データ使用量"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"アプリのデータ使用量"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"使用履歴"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"すべてのアプリ"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"データと Wi-Fi の使用量"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"使用履歴"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"総使用量"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"フォアグラウンド"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"バックグラウンド"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"データを許可"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"このアプリにモバイルデータの使用を許可"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"データを制限する"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"アプリがフォアグラウンドの場合のみモバイルデータを使用"</string>
<string name="computing_size" msgid="5791407621793083965">"計算しています…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 個の追加権限</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 個の追加権限</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# 個のその他の権限}other{# 個のその他の権限}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"注: 再起動後、車のロックを解除するまでこのアプリは起動できません。"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"アシストと音声入力"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"アシストアプリ"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"「Wi-Fi の管理」により、アプリは Wi-Fi のオン / オフ切り替え、Wi-Fi ネットワークのスキャンと接続、ネットワークの追加と削除、ローカル専用アクセス ポイントの起動を行えるようになります。"</string>
<string name="more_special_access_title" msgid="166115485446645971">"その他"</string>
<string name="location_settings_title" msgid="901334356682423679">"位置情報"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"位置情報の使用"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"指定したアプリに位置情報へのアクセスを許可します"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"この設定を OFF にすると、すべてのアプリで位置情報へのアクセス権限が削除されます。ドライバー サポート アプリのアクセス権限は保持されます。"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"位置情報をドライバー サポートで使用する"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"車の位置情報はオフです"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ドライバー サポート アプリが位置情報にアクセスできません"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"変更"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"運転をサポートするアプリに位置情報へのアクセスを許可します"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"この設定を OFF にすると、位置情報を使用するドライバー サポート アプリは無効になります。"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"OFF にする"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"最近の位置情報リクエスト"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"最近の位置情報リクエストはありません"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"アプリレベルの権限"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"位置情報サービス"</string>
<string name="location_use_location_title" msgid="117735895374606680">"位置情報を使用"</string>
<string name="location_settings_footer" msgid="296892848338100051">"位置情報の特定には、GPS、Wi-Fi、モバイル ネットワーク、センサーなどを使用する場合があります。"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ドライバー サポート"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ドライバー サポート アプリに送信された位置情報に、ユーザーを識別する情報は含まれていません。この情報は最大 2 日間保存されてから削除されます。"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"マイク"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"マイクの使用"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"すべてのアプリにマイクへのアクセスを許可します"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"マイクの権限を管理"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"最近アクセスしたもの"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"最近使ったアプリはありません"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"権限が付与されているアプリはありません"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{#/{total_count} 個のアプリに権限が付与されています}other{#/{total_count} 個のアプリに権限が付与されています}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"最近アクセスしたもの"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"すべて表示"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"読み込んでいます…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"システム"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"システム アップデート"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"詳細設定"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"サードパーティ ライセンス"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ライセンスの読み込み中に問題が発生しました。"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"読み込んでいます…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">開発者向けオプションが有効になるまであと <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> 回です。</item>
- <item quantity="one">開発者向けオプションが有効になるまであと <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> 回です</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{あと # ステップでデベロッパー設定が有効になります。}other{あと # ステップでデベロッパー設定が有効になります。}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"開発者向けオプションが有効になりました"</string>
<string name="show_dev_already" msgid="1678087328973865736">"開発者向けオプションはすでに有効です"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"開発者向けオプション"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"新しいプロファイルを作成したら、そのプロファイルのユーザーは自分でカスタマイズする必要があります。"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"どのプロファイルでも、他のすべてのプロファイルで使用するアプリを更新できます。"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"プロファイル数の上限に達しました"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">作成できるプロファイルは最大 <xliff:g id="COUNT">%d</xliff:g> 件です。</item>
- <item quantity="one">作成できるプロファイルは 1 件のみです。</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{作成できるプロファイルは 1 件のみです。}other{作成できるプロファイルは # 件までです。}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"新しいプロファイルを作成できませんでした"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"このプロファイルを削除しますか?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"このプロファイルのアプリとデータはすべて削除されます"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"プロファイルを削除できませんでした"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"プロフィールを削除できませんでした。デバイスを再起動してもう一度お試しください。"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"プロファイルを切り替えたり、車を再始動したりすると、このプロファイルは削除されます。"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"閉じる"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"再試行"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"ロック解除パターンの描き方"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"パターンの保存中にエラーが発生しました"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"間違えた回数が上限を超えました。<xliff:g id="NUMBER">%d</xliff:g> 秒後にもう一度お試しください。"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"パターンは回転に対応してません。タップしてください"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"画面ロックを解除しますか?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"解除すると、誰でもアカウントにアクセスできるようになります"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"一般的な PIN は IT 管理者によってブロックされています。別の PIN をお試しください。"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"無効な文字があります。"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"パスワードが無効です。4 文字以上で入力してください。"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">英字が <xliff:g id="COUNT">%d</xliff:g> 文字以上必要です</item>
- <item quantity="one">英字が 1 文字以上必要です</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">小文字の英字が <xliff:g id="COUNT">%d</xliff:g> 文字以上必要です</item>
- <item quantity="one">小文字の英字が 1 文字以上必要です</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">大文字の英字が <xliff:g id="COUNT">%d</xliff:g> 文字以上必要です</item>
- <item quantity="one">大文字の英字が 1 文字以上必要です</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">数字が <xliff:g id="COUNT">%d</xliff:g> つ以上必要です</item>
- <item quantity="one">数字が 1 つ以上必要です</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">記号が <xliff:g id="COUNT">%d</xliff:g> つ以上必要です</item>
- <item quantity="one">記号が 1 つ以上必要です</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">記号または数字が <xliff:g id="COUNT">%d</xliff:g> つ以上必要です</item>
- <item quantity="one">記号または数字が 1 つ以上必要です</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"デバイス管理により、最近使用したパスワードは使用できません"</string>
<string name="error_saving_password" msgid="8334882262622500658">"パスワードの保存中にエラーが発生しました"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"一般的なパスワードは IT 管理者によってブロックされています。別のパスワードをお試しください。"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"プロファイルを追加"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"このプロファイルを削除"</string>
<string name="add_profile_text" msgid="9118410102199116969">"プロファイルを追加"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ディスプレイの明るさ"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"デバイスを表示するには、Bluetooth を ON にしてください"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"デバイスをペア設定するには、Bluetooth の設定を開いてください"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"インフォテインメント システム管理"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"有効なアプリ"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"無効なアプリ"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"この権限を付与されたアプリは、この車のデータにアクセスできます"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"車両管理アプリはありません"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"このインフォテインメント システム管理アプリは有効で、アプリ(<xliff:g id="APP_NAME">%1$s</xliff:g>)に次の操作を許可します:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"このインフォテインメント システム管理アプリを有効にすると、アプリ(<xliff:g id="APP_NAME">%1$s</xliff:g>)に次の操作を許可することになります:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"インフォテインメント システム アプリを有効にしますか?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"このインフォテインメント システム アプリを有効にする"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"無効にしてアンインストール"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"このインフォテインメント システム アプリを無効にする"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"詳細"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"組織の管理者は、設定、権限、コーポレート アクセス、ネットワーク アクティビティ、車両の位置情報など、このプロファイルに関連付けられたアプリやデータの監視、管理を行えます。"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"組織の管理者は、設定、権限、コーポレート アクセス、ネットワーク アクティビティ、デバイスの位置情報など、このプロファイルに関連付けられたアプリやデータの監視、管理を行えます。"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"組織の管理者は、設定、権限、コーポレート アクセス、ネットワーク アクティビティ、車両の位置情報など、このインフォテインメント システムに関連付けられたアプリやデータの監視、管理を行えます。"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"組織の管理者がこのインフォテインメント システムに関連するデータにアクセスし、アプリを管理し、車両の設定を変更できる可能性があります。"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"利用できません"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"この管理対象車両では音量を変更できません"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"この管理対象車両では通話を行えません"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"この管理対象車両では SMS は許可されていません"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"この管理対象車両ではカメラを利用できません"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"この管理対象車両ではスクリーンショットを撮ることはできません"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"この管理対象車両ではこのアプリを開くことはできません"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"クレジット プロバイダによりブロックされています"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"一部の機能へのアクセスは組織によって制限されています。\n\nご不明な点がありましたら、組織の管理者にお問い合わせください。"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"車両管理アプリ"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# 個の有効なアプリ}other{# 個の有効なアプリ}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"有効なアプリはありません"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> の車両に関するポリシー"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"設定は組織の管理者によって管理されています"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"「<xliff:g id="SERVICE">%1$s</xliff:g>」の詳細"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"バグレポートを共有しますか?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"この車両の組織の管理者から、このデバイスのトラブルシューティングに役立てるためのバグレポートを共有するようリクエストがありました。アプリやデータが共有される場合があります。"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"この車両の組織の管理者から、このデバイスのトラブルシューティングに役立てるためのバグレポートを共有するようリクエストがありました。アプリやデータが共有され、デバイスの動作が一時的に遅くなる場合があります。"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"このバグレポートは、この車両の組織の管理者と共有しています。詳しくは、該当する管理者にお問い合わせください。"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"共有"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"同意しない"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"現在、この設定は変更できません"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ユーザー補助"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"字幕"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"字幕の設定"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"OFF"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ON"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"スクリーン リーダー"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"字幕の表示"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"文字のサイズ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"字幕のサイズとスタイル"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"極小"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"小"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"デフォルト"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"大"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"極大"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"字幕スタイル"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"アプリによる設定"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"黒地に白"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"白地に黒"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"黒地に黄色"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"青地に黄色"</string>
</resources>
diff --git a/res/values-ka/arrays.xml b/res/values-ka/arrays.xml
index 8031d70..277bb21 100644
--- a/res/values-ka/arrays.xml
+++ b/res/values-ka/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"არასოდეს დაშვება"</item>
<item msgid="1154273129608299386">"ყოველთვის დაშვება"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index fea3f04..24973b8 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"ღამის რეჟიმი"</string>
<string name="network_and_internet" msgid="4229023630498537530">"ქსელი და ინტერნეტი"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"მობილური ქსელი"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-ბარათი</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM-ბარათი</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-ბარათი}other{# SIM-ბარათი}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"აქტიური / SIM ბარათი"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"არააქტიური / SIM ბარათი"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"აქტიური / ჩამოტვირთული SIM ბარათი"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"დამატება"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"მობილური ინტერნეტი"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"მონაცემებზე წვდომა მობილური ქსელით"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"მობილური ქსელი"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"მობილური ინტერნეტის გამოყენება"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"გსურთ მობილური ინტერნეტის გამორთვა?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"არჩევა სავალდებულოა"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"გამოიყენებთ <xliff:g id="CARRIER">%1$s</xliff:g>-ს მობ. ინტ.-თვის?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> გაფრთხილება მობილურ ინტერნეტზე"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"ტრაფიკის ლიმიტი <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> გაფრთხილება მობილურ ინტერნეტზე / <xliff:g id="ID_2">^2</xliff:g> ტრაფიკის ლიმიტი"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">დარჩა %d დღე</item>
- <item quantity="one">დარჩა %d დღე</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{დარჩა # დღე}other{დარჩა # დღე}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"დრო აღარ დარჩა"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"დარჩენილია 1 დღეზე ნაკლები"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g>-ის წინ განაახლა <xliff:g id="ID_1">^1</xliff:g>-მ(ა)"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"დაყენება"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"მოხმარების შესახებ გაფრთხილება და ლიმიტი"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"აპების მიერ ტრაფიკის მოხმარების ციკლი"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"მობილური ინტერნეტის მოხმარება"</string>
<string name="set_data_warning" msgid="6628236612886588097">"გაფრთხილების დაყენება"</string>
<string name="data_warning" msgid="116776633806885370">"მოხმარების შესახებ გაფრთხილება"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ტრაფიკის ლიმიტის დაყენება"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"მითითებული ლიმიტის მიღწევის შემდეგ თქვენი ავტომობილის საინფორმაციო-გასართობი სისტემა გამორთავს მობილურ ინტერნეტს.\n\nლიმიტის არჩევისას გაითვალისწინეთ, რომ ავტომობილის საინფორმაციო-გასართობი სისტემა და თქვენი ოპერატორი შეიძლება განსხვავებულად აღრიცხავდეს ინტერნეტის მოხმარებას."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"მონაცემთა მოხმარების გაფრთხილების დაყენება"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"მონაცემთა მოხმარების ლიმიტის დაყენება"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"თქვენი მოწყობილობა ზომავს მობილური ინტერნეტის გამოყენების ინტენსივობას. ეს მონაცემები შეიძლება განსხვავდებოდეს მათგან, რომელსაც მობილური ოპერატორები გაწვდიან."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"დაყენება"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"შენახვა"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM ქსელი"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"ავტომობილის ინტერნეტი"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"ავტომობილისთვის ინტერნეტის გამორთვამ შეიძლება ხელი შეუშალოს ზოგიერთი ფუნქციის ან აპის მუშაობას.\n\nმნიშვნელოვანი მონაცემები, რომლებიც საჭიროა ავტომობილის მუშაობისთვის, ისევ გაზიარდება მწარმოებელთან."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"მაინც გამორთვა"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"ავტომობილისთვის ინტერნეტი გამორთულია. ამან შეიძლება ხელი შეუშალოს ავტომობილის ზოგიერთი ფუნქციის ან აპის მუშაობას. მნიშვნელოვანი მონაცემები, რომლებიც საჭიროა ავტომობილის მუშაობისთვის, ისევ გაზიარდება მწარმოებელთან."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"გამოყენებულია %1$s (%2$s - %3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"სხვა ქსელთან დაკავშირება"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"ქსელის პარამეტრები"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"ქსელის დამატება"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"დაკავშირება"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"უკავშირდება…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"არ არის დაკავშირებული"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"ქსელი მისაწვდომ რადიუსში არ არის"</string>
<string name="wifi_password" msgid="5565632142720292397">"პაროლი"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"პაროლის გამოჩენა"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"აირჩიეთ 1 დიაპ. Wi‑Fi ქსელისთვის:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"უსადენო ქსელი და ტეტერინგი"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"უსადენო ქსელი"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"გამორთვა"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"უსადენო ქსელის ავტომატურად გამორთვა"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi უსადენო ქსელი გამოირთვება, თუ მასთან არცერთი მოწყობილობა არ არის დაკავშირებული"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g>-ს სურს, ჩართოს Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"ძალით შეჩერება"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"გსურთ ძალით შეჩერება?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"აპისთვის მუშაობის ძალით შეჩერების შემთხვევაში, მან შეიძლება არასათანადოდ იმუშაოს."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"გამორთავთ ეფექტურობის დაცვას?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"თუ ამას გააკეთებთ, თქვენმა პროგრამულმა უზრუნველყოფამ და აპარატურამ შეიძლება არ იმუშაოს."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ჩართულად დატოვება"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"გამორთვა"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"გსურთ აპის ეფექტურობის პრიორიტ. ჩართვა?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"ამ პარამეტრის ჩართვას შეუძლია გამოიწვიოს სისტემის არასტაბილურობა ან დიდი ხნით იმოქმედოს აპარატურაზე. გსურთ გაგრძელება?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"დიახ"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"არა, გმადლობთ"</string>
<string name="disable_text" msgid="4358165448648990820">"გათიშვა"</string>
<string name="enable_text" msgid="1794971777861881238">"ჩართვა"</string>
<string name="uninstall_text" msgid="277907956072833012">"დეინსტალაცია"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"ნებართვები"</string>
<string name="notifications_label" msgid="6586089149665170731">"შეტყობინებები"</string>
<string name="storage_application_label" msgid="5911779903670978586">"მეხსიერება და ქეში"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"პიკური ეფექტურობა"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"აპის ეფექტურობის პრიორიტეტი"</string>
<string name="application_version_label" msgid="8556889839783311649">"ვერსია: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ნებართვები არ არის გაცემული"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ნებართვებზე მოთხოვნები არ არის"</string>
<string name="unused_apps" msgid="648471933781010395">"გამოუყენებელი აპები"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> გამოუყენებელი აპი</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> გამოუყენებელი აპი</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# გამოუყენებელი აპი}other{# გამოუყენებელი აპი}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"ნებართვების ამოშლა და ადგილის გათავისუფ."</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s შიდა მეხსიერებაში"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"თუ საჭიროა, დახურეთ აპი რესურსების გადაჭარბების თავიდან ასაცილებლად"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"იყენებს სისტემურ რესურსებს აპის ეფექტურობის პრიორიტეტების განსასაზღვრად"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"მონაცემთა მოხმარება"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"აპის მონაცემთა გამოყენება"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"გამოყენების ისტორია"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"ყველა აპი"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"მობილ. ინტერნეტი და Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"გამოყენების ისტორია"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"ჯამური მოხმარება"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"წინა პლანი"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ფონური"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"მობ. ინტ. გამ. უფლ. მიც."</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"ამ აპისთვის მობ. ინტერნ. გამოყ. საშუალების მიცემა"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"მონაცემთა შეზღუდვა"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"მობ. ინტერნ. გამოიყ. მაშინ, როცა აპი წინა პლანზეა"</string>
<string name="computing_size" msgid="5791407621793083965">"გამოთვლა…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> დამატებითი ნებართვა</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> დამატებითი ნებართვა</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# დამატებითი ნებართვა}other{# დამატებითი ნებართვა}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"შენიშვნა: გადატვირთვის შემდეგ, ეს აპი ვერ გაეშვება, სანამ ავტომობილს არ განბლოკავთ."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ასისტენტი და ხმოვანი შეყვანა"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"დამხმარე აპი"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi-ს მართვა საშუალებას აძლევს აპს, ჩართოს ან გამორთოს Wi-Fi, მოახდინოს სკანირება Wi-Fi ქსელების აღმოსაჩენად და მათთან დასაკავშირებლად, დაამატოს ან ამოშალოს ქსელები, ან გაუშვას მხოლოდ ადგილობრივი მოხმარების უსადენო ქსელი."</string>
<string name="more_special_access_title" msgid="166115485446645971">"მეტი"</string>
<string name="location_settings_title" msgid="901334356682423679">"მდებარეობა"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"მდებარეობის გამოყენება"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"დაუშვით აპები მდებარეობაზე წვდომისთვის"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"თუ ამას გამორთავთ, მდებარეობის წვდომა ყველა აპისთვის ამოიშლება. მძღოლის დახმარების აპები კვლავ შეძლებს წვდომას."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"მდებ. გამოიყენება მძღოლის დახმარებისთვის"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"მანქანის მდებარეობა გამორთულია"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"მძღოლის დახმარების აპებს არ აქვს წვდომა თქვენს მდებარეობაზე"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"შეცვლა"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"დაუშვით მდებ. წვდომაში დამხმარე აპები"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"თუ ამას გამორთავთ, მძღოლის დახმარების აპები, რომლებიც მდებარეობის ინფორმაციას ეყრდნობა, გაითიშება."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"მაინც გამორთვა"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"მდებარეობის ბოლოდროინდელი მოთხოვნები"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"მდებარეობის ბოლოდროინდელი მოთხოვნები არ არის"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ნებართვები აპის დონეზე"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"მდებარეობის სერვისები"</string>
<string name="location_use_location_title" msgid="117735895374606680">"მდებარეობის გამოყენება"</string>
<string name="location_settings_footer" msgid="296892848338100051">"მდებარეობის სერვისმა შესაძლოა გამოიყენოს ისეთი წყაროები, როგორიცაა GPS, Wi-Fi, მობილური ქსელები და სენსორები, რათა ხელი შეუწყოს თქვენი მოწყობილობის მდებარეობის დადგენას."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"მძღოლის დახმარება"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ინფორმაცია მდებარეობის შესახებ, რომელიც მძღოლის დახმარების აპებთან ზიარდება, არ შეიცავს ინფორმაციას, რომლითაც შესაძლებელი იქნება თქვენი ამოცნობა. ის წაშლამდე მაქსიმუმ 2 დღე ინახება."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"მიკროფონი"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"მიკროფონის გამოყენება"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"თქვენს მიკროფონზე წვდომის დაშვება ყველა აპისთვის"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"მიკროფონის ნებართვების მართვა"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"ბოლოდროინდელი წვდომა"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"ბოლოს გამოყენებული აპების სია ცარიელია"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"წვდომა აქვს 0 აპს"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{წვდომა აქვს # აპს {total_count}-დან}other{წვდომა აქვს # აპს {total_count}-დან}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"ბოლოდროინდელი წვდომა"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"ყველას ნახვა"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"მიმდინარეობს ჩატვირთვა…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"სისტემა"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"სისტემის განახლებები"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"გაფართოებული"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"მესამე მხარის ლიცენზიები"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ლიცენზიის ჩამოტვირთვასთან პრობლემაა."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"მიმდინარეობს ჩატვირთვა…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">დეველოპერობამდე <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ნაბიჯი დაგრჩათ.</item>
- <item quantity="one">დეველოპერობამდე <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ნაბიჯი დაგრჩათ.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ახლა უკვე # ნაბიჯი გაშორებთ დეველოპერობამდე.}other{ახლა უკვე # ნაბიჯი გაშორებთ დეველოპერობამდე.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"ახლა დეველოპერი ხართ!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"არ არის საჭირო, უკვე დეველოპერი ხართ."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"დეველოპერთა პარამეტრები"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"მას შემდეგ, რაც ახალ პროფილს შექმნით, ამ პიროვნებამ თვითონ უნდა დააყენოს მისი პარამეტრები."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"აპების განახლება შესაძლებელია ნებისმიერი პროფილიდან ყველა სხვა პროფილით გამოსაყენებლად."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"პროფილების ლიმიტი მიღწეულია"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">შესაძლებელია <xliff:g id="COUNT">%d</xliff:g>-მდე პროფილის შექმნა.</item>
- <item quantity="one">შესაძლებელია მხოლოდ ერთი პროფილის შექმნა.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{შესაძლებელია მხოლოდ ერთი პროფილის შექმნა.}other{შესაძლებელია # პროფილის შექმნა.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"ახალი პროფილის შექმნა ვერ მოხერხდა"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"წაიშალოს ეს პროფილი?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ამ პროფილის ყველა აპი და მონაცემი წაიშლება"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"პროფილის წაშლა ვერ მოხერხდა."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"პროფილი არ წაიშალა. შეგიძლიათ, გადატვირთოთ მოწყობილობა და ცადოთ ხელახლა."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"ეს პროფილი წაიშლება, როცა სხვა პროფილზე გადართავთ ან ავტომობილს ხელახლა დაქოქავთ."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"დახურვა"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ხელახლა ცდა"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"როგორ დახაზოთ განბლოკვის გრაფიკული გასაღები"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"ნიმუშის შენახვისას მოხდა შეცდომა"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"დაფიქსირდა მეტისმეტად ბევრი არასწორი მცდელობა. ცადეთ ხელახლა <xliff:g id="NUMBER">%d</xliff:g> წამში."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"ნიმუშს არ აქვს როტაციულის მხარდაჭერა, ისარგებლეთ შეხებით"</string>
<string name="okay" msgid="4589873324439764349">"კარგი"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"გაუქმდეს ეკრანის დაბლოკვა?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"ეს ქმედება ხელმისაწვდომს გახდის თქვენს ანგარიშს ყველასთვის"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"ხშირად გამოყენებული PIN-კოდები თქვენი IT ადმინისტრატორის მიერ დაბლოკილია. ცადეთ სხვა PIN-კოდი."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"არ უნდა შეიცავდეს არასწორ სიმბოლოს."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"პაროლი არასწორია, უნდა შეიცავდეს მინიმუმ 4 სიმბოლოს."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">უნდა შეიცავდეს მინიმუმ <xliff:g id="COUNT">%d</xliff:g> ასოს</item>
- <item quantity="one">უნდა შეიცავდეს მინიმუმ 1 ასოს</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">უნდა შეიცავდეს მინიმუმ <xliff:g id="COUNT">%d</xliff:g> არამთავარულ ასოს</item>
- <item quantity="one">უნდა შეიცავდეს მინიმუმ 1 არამთავარულ ასოს</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">უნდა შეიცავდეს მინიმუმ <xliff:g id="COUNT">%d</xliff:g> მთავრულ ასოს</item>
- <item quantity="one">უნდა შეიცავდეს მინიმუმ 1 მთავრულ ასოს</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">უნდა შეიცავდეს მინიმუმ <xliff:g id="COUNT">%d</xliff:g> ციფრს</item>
- <item quantity="one">უნდა შეიცავდეს მინიმუმ 1 ციფრს</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">უნდა შეიცავდეს მინიმუმ <xliff:g id="COUNT">%d</xliff:g> სპეციალურ სიმბოლოს</item>
- <item quantity="one">უნდა შეიცავდეს მინიმუმ 1 სპეციალურ სიმბოლოს</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">უნდა შეიცავდეს მინიმუმ <xliff:g id="COUNT">%d</xliff:g> არაანბანურ სიმბოლოს</item>
- <item quantity="one">უნდა შეიცავდეს მინიმუმ 1 არაანბანურ სიმბოლოს</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ბოლოდროინდელი პაროლის ხელახლა გამოყენება მოწყობილობის ადმინისტრატორის მიერ ნებადართული არ არის"</string>
<string name="error_saving_password" msgid="8334882262622500658">"პაროლის შენახვისას მოხდა შეცდომა"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ხშირად გამოყენებული პაროლები თქვენი IT ადმინისტრატორის მიერ დაბლოკილია. ცადეთ სხვა პაროლი."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"პროფილის დამატება"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ამ პროფილის წაშლა"</string>
<string name="add_profile_text" msgid="9118410102199116969">"პროფილის დამატება"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ეკრანის სიკაშკაშე"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"თქვენი მოწყობილობების სანახავად ჩართეთ Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"მოწყობილობის დასაწყვილებლად გახსენით Bluetooth პარამეტრები"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"გართობის/საინფორმაციო სისტემის ადმინისტრატორი"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"აქტიური აპები"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"დეაქტივირებული აპები"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ამ ნებართვის მქონე აპებს წვდომა აქვთ ამ ავტომობილის მონაცემებზე"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"ავტომობილის ადმინისტრატორის აპები არ არის"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"გართობის/საინფორმაციო სისტემის ადმინისტრირების ეს აპი აქტიურია და საშუალებას აძლევს აპს <xliff:g id="APP_NAME">%1$s</xliff:g>, განახორციელოს შემდეგი ოპერაციები:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"გართობის/საინფორმაციო სისტემის ამ აპის გააქტიურება საშუალებას მისცემს აპს <xliff:g id="APP_NAME">%1$s</xliff:g>, განახორციელოს შემდეგი ოპერაციები:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"გსურთ გარ./საინ. სის. ამ აპის გააქტიურ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"გაააქტიურეთ გართობის/საინფორმაციო სისტემის ეს აპი"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"დეაქტივაცია და დეინსტალაცია"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"გართობის/საინფორმაციო სისტემის ამ აპის დეაქტივაცია"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"დაწვრილებით"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"ორგანიზაციის მენეჯერს შეუძლია ამ პროფილთან დაკავშირებული აპების და მონაცემების, მათ შორის, პარამეტრების, ნებართვების, კორპორაციული წვდომის, ქსელის აქტივობისა და სატრანსპორტო საშუალების მდებარეობის შესახებ ინფორმაციის, მონიტორინგი და მართვა."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"ორგანიზაციის მენეჯერს შეუძლია ამ პროფილთან დაკავშირებული აპების და მონაცემების, მათ შორის, პარამეტრების, ნებართვების, კორპორაციული წვდომის, ქსელის აქტივობისა და თქვენი მოწყობილობის მდებარეობის ინფორმაციის, მონიტორინგი და მართვა."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"ორგანიზაციის მენეჯერს შეუძლია ამ გართობის/საინფორმაციო სისტემასთან დაკავშირებული აპების და მონაცემების, მათ შორის, პარამეტრების, ნებართვების, კორპორაციული წვდომის, ქსელის აქტოვობის და სატრანსპორტო საშუალების მდებარეობის შესახებ ინფორმაციის, მონიტორინგი და მართვა."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"ორგანიზაციის მენეჯერმა შეიძლება მოახერხოს ამ გასართობ/საინფორმაციო სისტემასთან დაკავშირებულ მონაცემებზე წვდომა, მართოს აპები და შეცვალოს სატრანსპორტო საშუალების ეს პარამეტრები."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ეს მიუწვდომელია"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"ამ მართულ სატრანსპორტო საშუალებაში შეუძლებელია ხმის შეცვლა"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"ამ მართულ სატრანსპორტო საშუალებაში დარეკვა შეუძლებელია"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"ამ მართულ სატრანსპორტო საშუალებაში შეუძლებელია SMS-ის გაგზავნა"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"ამ მართულ სატრანსპორტო საშუალებაში კამერა მიუწვდომელია"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"ამ მართულ სატრანსპორტო საშუალებაში ეკრანის ანაბეჭდების გადაღება შეუძლებელია"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"ამ მართულ სატრანსპორტო საშუალებაში შეუძლებელია ამ აპის გახსნა"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"დაბლოკილია თქვენი კრედიტის გამცემის მიერ"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"ზოგიერთ ფუნქციაზე წვდომა ორგანიზაციის მიერ არის შეზღუდული.\n\nთუ შეკითხვები გაქვთ, დაუკავშირდით ორგანიზაციის მმართველს."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"სატრანსპორტო საშუალების მართვის აპები"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# აქტიური აპი}other{# აქტიური აპი}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"აქტიური აპები არ არის"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>-ის სატრანსპორტო საშუალებების წესები"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"ორგანიზაციის მენეჯერის მიერ მართული პარამეტრები"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"შეიტყვეთ მეტი <xliff:g id="SERVICE">%1$s</xliff:g>-ის შესახებ"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"გსურთ ხარვეზის შესახებ ანგარიშის გაზიარება?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"ამ მოწყობილობის პრობლემების აღმოფხვრაში დასახმარებლად, სატრანსპორტო საშუალების ორგანიზაციის მენეჯერმა ხარვეზის ანგარიში მოითხოვა. აპები და მონაცემები შეიძლება გაზიარდეს."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"ამ მოწყობილობის პრობლემების აღმოფხვრაში დასახმარებლად, სატრანსპორტო საშუალების ორგანიზაციის მენეჯერმა ხარვეზის ანგარიში მოითხოვა. ამ დროს შეიძლება გაზიარდეს აპები და მონაცემები, ხოლო თქვენი მოწყობილობა დროებით შენელდეს."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"ხარვეზის შესახებ ეს ანგარიში ამ სატრანსპორტო საშუალების ორგანიზაციის მენეჯერთან ზიარდება. დეტალური ინფორმაციისთვის დაუკავშირდით მას."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"გაზიარება"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"უარყოფა"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"ამ პარამეტრის შეცვლა ახლა შეუძლებელია"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"მარტივი წვდომა"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"სუბტიტრები"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"სუბტიტრების პარამეტრები"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"გამორთულია"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ჩართულია"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"ეკრანის წამკითხველი"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"სუბტიტრების ჩვენება"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ტექსტის ზომა"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"სუბტიტრების ზომა და სტილი"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"ძალიან პატარა"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"პატარა"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ნაგულისხმევი"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"დიდი"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ძალიან დიდი"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"სუბტიტრების სტილი"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"დაყენება აპით"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"თეთრით შავზე"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"შავით თეთრზე"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"ყვითლით შავზე"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"ყვითლით ლურჯზე"</string>
</resources>
diff --git a/res/values-kk/arrays.xml b/res/values-kk/arrays.xml
index 27c0187..feacd2a 100644
--- a/res/values-kk/arrays.xml
+++ b/res/values-kk/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ешқашан рұқсат бермеу"</item>
<item msgid="1154273129608299386">"Әрдайым рұқсат беру"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index a84291f..09e0265 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Түнгі режим"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Желі және интернет"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Мобильдік желі"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM картасы</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM картасы</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM картасы}other{# SIM картасы}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Іске қосулы/SIM картасы"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Іске қосылмаған/SIM картасы"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Іске қосулы/Жүктеп алынған SIM картасы"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Тағы қосу"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобильдік интернет"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Деректерге мобильдік желі арқылы кіру"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Мобильдік желі"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Мобильдік интернетті пайдалану"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Мобильдік интернет өшірілсін бе?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Таңдаңыз"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Мобильдік интернет үшін <xliff:g id="CARRIER">%1$s</xliff:g> қолданылсын ба?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Дерек шығыны туралы ескерту: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Дерек шегі: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Дерек шығыны туралы ескерту: <xliff:g id="ID_1">^1</xliff:g>/Дерек шегі: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d күн қалды.</item>
- <item quantity="one">%d күн қалды.</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# күн қалды.}other{# күн қалды.}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Уақыт бітті."</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 күннен аз уақыт қалды."</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> бұрын <xliff:g id="ID_1">^1</xliff:g> жаңартты."</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Орнату"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Дерек ескертуі және шегі"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Қолданбаның дерек шығыны циклі"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Мобильдік интернет трафигі"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Дерек шығыны туралы ескерту"</string>
<string name="data_warning" msgid="116776633806885370">"Дерек шығыны туралы ескерту"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Дерек шығынын шектеу"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Орнатқан шекке жеткеннен кейін, көліктегі құрылғы мобильдік деректерді өшіреді.\n\nҚұрылғы деректерді пайдалану шегін белгілейтіндіктен және оператор трафикті басқаша есептеуі мүмкін болғандықтан, қатаңырақ шек қойған жөн."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Дерек шығыны туралы ескерту"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Дерек трафигі шегін орнату"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Дерек трафигін құрылғы өлшейді. Бұл мобильдік оператордың дерегінен басқаша болуы мүмкін."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Орнату"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Сақтау"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Өндіруші желісі"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Көліктегі интернет"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Көліктегі интернетті өшірсеңіз, кейбір функциялар немесе қолданбалар дұрыс жұмыс істемеуі мүмкін.\n\nОның жұмыс істеуіне қажетті маңызды дерек көлік өндірушісіне жіберіледі."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Бәрібір өшіру"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Көліктегі интернет өшірілген. Көліктегі кейбір функциялар немесе қолданбалар дұрыс жұмыс істемеуі мүмкін. Оның жұмыс істеуіне қажетті маңызды дерек көлік өндірушісіне жіберіледі."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s аралығында %1$s пайдаланылды."</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Басқа желіге қосылу"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Желі параметрлері"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Желі қосу"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Қосылу"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Қосылуда…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Қосылмаған"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Желі байланыс аясында емес."</string>
<string name="wifi_password" msgid="5565632142720292397">"Құпия сөз"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Құпия сөзді көрсету"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi‑Fi хотспоты үшін кемінде бір диапазон таңдаңыз."</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Хотспот және тетеринг"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Хотспот"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Өшіру"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Хотспотты автоматты өшіру"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Ешқандай құрылғы жалғанбаса, Wi‑Fi хотспоты өшеді"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> Wi-Fi байланысын қосқысы келеді."</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Қолмен тоқтату"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Қолмен тоқтатылсын ба?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Қолданбаны қолмен тоқтату оның жұмысына кері әсерін тигізуі мүмкін."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Өнімділікті қорғауды қосу керек пе?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Қосулы қалдырсаңыз, бағдарламалық құрал мен жабдық та жұмыс істемей қалуы мүмкін."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Қосулы қалдыру"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Өшіру"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Қолданба өнімділігін басымды ету қосылсын ба?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Функция қосылса, жүйенің жұмысы тұрақсыз болуы немесе жабдыққа әсер етуі мүмкін. Жалғастырғыңыз келе ме?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Иә"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Жоқ, рақмет"</string>
<string name="disable_text" msgid="4358165448648990820">"Өшіру"</string>
<string name="enable_text" msgid="1794971777861881238">"Қосу"</string>
<string name="uninstall_text" msgid="277907956072833012">"Жою"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Рұқсаттар"</string>
<string name="notifications_label" msgid="6586089149665170731">"Хабарландырулар"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Жад және кэш"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Барынша өнімді жұмыс істеуді қосу"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Қолданба өнімділігін басымды ету"</string>
<string name="application_version_label" msgid="8556889839783311649">"Нұсқа: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ешқандай рұқсат берілмеген"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ешқандай рұқсат сұралмаған"</string>
<string name="unused_apps" msgid="648471933781010395">"Пайдаланылмайтын қолданбалар"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> пайдаланылмайтын қолданба</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> пайдаланылмайтын қолданба</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# пайдаланылмайтын қолданба}other{# пайдаланылмайтын қолданба}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Рұқсаттарды өшіру және орын босату"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"Ішкі жад: %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Ресурстар шығынын азайту үшін қолданбаны керек кезде жауып қояды."</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Қолданба өнімділігін басымды ету үшін жүйенің ресурстарын пайдаланады."</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Деректер трафигі"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Қолданбаның дерек шығыны"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Пайдалану тарихы"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Барлық қолданба"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Мобильдік интернет пен Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Пайдалану тарихы"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Жалпы пайдалану"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Экрандық режим"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Фондық режим"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Рұқсат беру"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Осы қолданбаға мобильдік интернетті пайдалануға рұқсат беру"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Мобильдік интернетті шектеу"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Мобильдік интернетті қолданбаның экрандық режимінде ғана пайдалану"</string>
<string name="computing_size" msgid="5791407621793083965">"Есептелуде…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> қосымша рұқсат</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> қосымша рұқсат</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# қосымша рұқсат}other{# қосымша рұқсат}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Ескертпе: қайта жүктегеннен кейін, көліктің құлпын ашпайынша, бұл қолданба іске қосылмайды."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Көмекші және дауыспен енгізу"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Көмекші қолданба"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi желісін басқару функциясы қолданбаға Wi-Fi желісін қосуға немесе өшіруге, Wi-Fi желілерін іздеуге және оларға жалғануға, желілерді енгізуге не өшіруге немесе тек жергілікті хотспотты іске қосуға рұқсат етеді."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Тағы"</string>
<string name="location_settings_title" msgid="901334356682423679">"Локация"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Локацияны пайдалану"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Көрсетілген қолданбалардың локацияны қолдануына рұқсат ету"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Мұны өшірсеңіз, барлық қолданбаның локацияны қолдану рұқсаты жойылады. Жүргізушіге көмек қолданбалары локацияны одан әрі қолдана алады."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Жүргізушіге көмек функциясы үшін локацияны қолдану"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Көліктің локациясы өшірулі"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Жүргізушіге көмек қолданбалары локацияны қолдана алмайды."</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Өзгерту"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Жүргізуге көмектесетін қолданбалардың локацияңызды қолдануына рұқсат ету"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Мұны өшірсеңіз, локация мәліметіне сүйенетін жүргізушіге көмек қолданбалары өшіріледі."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Бәрібір өшіру"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Соңғы орынды анықтау сұраулары"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Орналасқан жерді анықтау сұраулары жақында жасалмаған"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Қолданба деңгейіндегі рұқсаттар"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Локация қызметтері"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Локацияны пайдалану"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Құрылғының орналасқан жерін анықтау үшін GPS, Wi-Fi, мобильдік желілер және датчиктер пайдаланылуы мүмкін."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Жүргізушіге көмек функциялары"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Жүргізушіге көмек қолданбаларына жіберілген локация туралы ақпаратта жеке басыңызды анықтайтын мәлімет жоқ. Ақпарат ең көбі 2 күн сақталып, кейін жойылады."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Микрофон"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Микрофонды пайдалану"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Барлық қолданбаның микрофонды пайдалануына рұқсат беру"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Микрофонды пайдалану рұқсаттарын басқару"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Жақында пайдаланылған"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Жақында пайдаланған қолданбалар жоқ."</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Ешбір қолданбаға рұқсат берілмеген."</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{#/{total_count} қолданбаға рұқсат берілген.}other{#/{total_count} қолданбаға рұқсат берілген.}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Жақында пайдаланылған"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Барлығын көру"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Жүктелуде…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Жүйе"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Жүйенің жаңа нұсқалары"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Қосымша"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Үшінші тарап лицензиялары"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Лицензияларды жүктеу барысында ақау орын алды."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Жүктелуде…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> қадамнан кейін әзірлеуші атанасыз.</item>
- <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> қадамнан кейін әзірлеуші атанасыз.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{# қадамнан кейін әзірлеуші боласыз.}other{# қадамнан кейін әзірлеуші боласыз.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Енді сіз әзірлеушісіз!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Қажет емес, сіз енді әзірлеушісіз."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Әзірлеуші опциялары"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Сіз жаңа профиль құрған кезде, пайдаланушы оны өзіне ыңғайлы етіп реттеуі тиіс."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Қолданбаларды кез келген профильден жаңартып, барлық өзге профильде пайдалануға болады."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Профильдер саны шегіне жетті"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> профильге дейін жасауға болады.</item>
- <item quantity="one">Тек бір профиль жасауға болады.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Тек бір профиль жасауға болады.}other{# профильге дейін жасауға болады.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Жаңа профиль құру мүмкін болмады"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Бұл профильді жою керек пе?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Осы профильдегі барлық қолданбалар мен деректер жойылады."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Профильді жою мүмкін болмады"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Профиль жойылмады. Құрылғыны өшіріп қосып, қайталап көріңіз."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Бұл профиль құрылғыны өшіріп қосқан кезде немесе профильдерді ауыстырғанда жойылады."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Қабылдамау"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Қайталау"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Құлыпты ашу өрнегін сызу"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Өрнекті сақтау кезінде қате кетті"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Тым көп қате әрекет жасалды. <xliff:g id="NUMBER">%d</xliff:g> секундтан кейін қайталап көріңіз."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Өрнекті айналма түймемен емес, түрту арқылы салу керек."</string>
<string name="okay" msgid="4589873324439764349">"Жарайды"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Экран құлпы өшірілсін бе?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Кез келген адам аккаунтыңызға кіре алатын болады"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Әкімшіңіз оңай PIN кодтарына тыйым салды. Басқа PIN кодын енгізіп көріңіз."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Жарамсыз таңба болмауы керек"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Құпия сөз жарамсыз, ең кемі 4 таңбадан тұруы керек"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Кемінде <xliff:g id="COUNT">%d</xliff:g> әріп болуы керек</item>
- <item quantity="one">Кемінде 1 әріп болуы керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Кемінде <xliff:g id="COUNT">%d</xliff:g> кіші әріп болуы керек</item>
- <item quantity="one">Кемінде 1 кіші әріп болуы керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Кемінде <xliff:g id="COUNT">%d</xliff:g> бас әріп болуы керек</item>
- <item quantity="one">Кемінде 1 бас әріп болуы керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Кемінде <xliff:g id="COUNT">%d</xliff:g> сан болуы керек</item>
- <item quantity="one">Кемінде 1 сан болуы керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Кемінде <xliff:g id="COUNT">%d</xliff:g> арнайы таңба болуы керек</item>
- <item quantity="one">Кемінде 1 арнайы таңба болуы керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Кемінде <xliff:g id="COUNT">%d</xliff:g> әріптік емес таңба болуы керек</item>
- <item quantity="one">Кемінде 1 әріптік емес таңба болуы керек</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Құрылғы әкімшісі соңғы құпия сөзді қолдануға рұқсат бермейді"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Құпия сөзді сақтау кезінде қате кетті"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Әкімшіңіз оңай құпия сөздерге тыйым салды. Басқа құпия сөз енгізіп көріңіз."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Профиль қосу"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Бұл профильді жою"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Профиль қосу"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Дисплей жарықтығы"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Құрылғыларыңызды көру үшін Bluetooth-ты қосыңыз."</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Құрылғыны жұптау үшін Bluetooth параметрлерін ашыңыз."</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Ақпараттық-сауықтық жүйе әкімшісі"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Қосылған қолданбалар"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Өшірілген қолданбалар"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Мұндай рұқсаты бар қолданбалар осы көліктің деректерін пайдалана алады."</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Көлік әкімшісіне арналған қолданбалар жоқ."</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Бұл ақпараттық-сауықтық жүйе әкімшісінің қолданбасы жұмыс істеп тұр және <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының мына әрекеттерді орындауына мүмкіндік береді:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Осы ақпараттық-сауықтық жүйе қолданбасын белсендірсеңіз, <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы мына әрекеттерді орындай алады:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Осы ақпараттық-сауықтық жүйе қолданбасын белсендіру керек пе?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Осы ақпараттық-сауықтық жүйе қолданбасын белсендіру"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Өшіру және жою"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Ақпараттық-сауықтық жүйе қолданбасын өшіру"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Қосымша мәліметтер"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Ұйым басқарушысы осы профильмен байланысты қолданбалар мен деректі, соның ішінде параметрлерді, рұқсаттарды, корпоративтік рұқсатты, желідегі әрекеттерді және көлік локациясы туралы ақпаратты бақылап, басқара алады."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Ұйым басқарушысы осы профильмен байланысты қолданбалар мен деректі, соның ішінде параметрлерді, рұқсаттарды, корпоративтік рұқсатты, желідегі әрекеттерді және құрылғы локациясы туралы ақпаратты бақылап, басқара алады."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Ұйым басқарушысы осы ақпараттық-сауықтық жүйемен байланысты қолданбалар мен деректі, соның ішінде параметрлерді, рұқсаттарды, корпоративтік рұқсатты, желідегі әрекеттерді және көлік локациясы туралы ақпаратты бақылап, басқара алады."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Ұйым басқарушысы осы ақпараттық-сауықтық жүйемен байланысты деректі пайдалана, қолданбаларды басқара және осы көлік параметрлерін өзгерте алады."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Параметр қолжетімсіз"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Бұл басқарылатын көлікте дыбыс деңгейін өзгерту мүмкін емес"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Бұл басқарылатын көлікте қоңырау шалу мүмкін емес"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Бұл басқарылатын көлікте SMS жазу мүмкін емес"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Бұл басқарылатын көлікте камера қолжетімді емес"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Бұл басқарылатын көлікте скриншот түсіру мүмкін емес"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Бұл басқарылатын көлікте осы қолданбаны ашу мүмкін емес"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Кредитор тарапынан бөгелді"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Ұйым кейбір функцияларды пайдалануға шектеу қойған.\n\nСұрақтарыңыз болса, ұйым басқарушысына хабарласыңыз."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Көлік әкімшісінің қолданбалары"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# қосылған қолданба}other{# қосылған қолданба}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Қосылған қолданба жоқ"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> көлік саясаты"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Параметрлерді ұйым басқарушысы басқарады."</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> туралы толығырақ ақпарат"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Қате туралы есеп бөлісілсін бе?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Бұл көлік ұйымының басқарушысы осы құрылғының ақауларын жоюға көмектесу үшін қате туралы есепті сұрады. Қолданбалар мен дерек бөлісілуі мүмкін."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Бұл көлік ұйымының басқарушысы осы құрылғының ақауларын жоюға көмектесу үшін қате туралы есепті сұрады. Қолданбалар мен дерек бөлісілуі, құрылғыңыз уақытша баяулауы мүмкін."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Бұл қате туралы есеп осы көлік ұйымының басқарушысымен бөлісілуде. Толығырақ мәлімет алу үшін оған хабарласыңыз."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Бөлісу"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Қабылдамау"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Бұл параметр қазір өзгертілмейді."</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Арнайы мүмкіндіктер"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Субтитр"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Субтитр параметрлері"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Өшірулі"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Қосулы"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Экранды оқу құралы"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Субтитрді көрсету"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Мәтін өлшемі"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Субтитр өлшемі мен стилі"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Өте кіші"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Кішi"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Әдепкі"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Үлкен"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Өте үлкен"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Субтитр стилі"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Орнатушы қолданба"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Қарадағы ақ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Ақтағы қара"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Қарадағы сары"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Көктегі сары"</string>
</resources>
diff --git a/res/values-km/arrays.xml b/res/values-km/arrays.xml
index e68f971..d82ea3a 100644
--- a/res/values-km/arrays.xml
+++ b/res/values-km/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"កុំអនុញ្ញាតឱ្យសោះ"</item>
<item msgid="1154273129608299386">"អនុញ្ញាតជានិច្ច"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 40dd44e..1e3c661 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"មុខងារយប់"</string>
<string name="network_and_internet" msgid="4229023630498537530">"បណ្តាញ និងអ៊ីនធឺណិត"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"បណ្ដាញទូរសព្ទចល័ត"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other">ស៊ីម <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">ស៊ីម <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{ស៊ីម #}other{ស៊ីម #}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"សកម្ម / ស៊ីម"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"អសកម្ម / ស៊ីម"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"សកម្ម / ស៊ីមដែលបានទាញយក"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"បញ្ចូលបន្ថែមទៀត"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"ទិន្នន័យទូរសព្ទចល័ត"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ចូលប្រើទិន្នន័យដោយប្រើបណ្ដាញទូរសព្ទចល័ត"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"បណ្ដាញទូរសព្ទចល័ត"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"ប្រើទិន្នន័យទូរសព្ទចល័ត"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"បិទទិន្នន័យទូរសព្ទចល័ត?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"តម្រូវឱ្យមានការជ្រើសរើស"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"ប្រើ <xliff:g id="CARRIER">%1$s</xliff:g> សម្រាប់ទិន្នន័យទូរសព្ទចល័ត?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"ការព្រមានពីការប្រើទិន្នន័យ <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"កម្រិតកំណត់ទិន្នន័យ <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"ការព្រមានពីការប្រើទិន្នន័យ <xliff:g id="ID_1">^1</xliff:g>/កម្រិតកំណត់ទិន្នន័យ <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">នៅសល់ %d ថ្ងៃទៀត</item>
- <item quantity="one">នៅសល់ %d ថ្ងៃទៀត</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{នៅសល់ # ថ្ងៃទៀត}other{នៅសល់ # ថ្ងៃទៀត}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"អស់ពេលនៅសល់ហើយ"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"នៅសល់តិចជាង 1 ថ្ងៃ"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"បានធ្វើបច្ចុប្បន្នភាពដោយ <xliff:g id="ID_1">^1</xliff:g> កាលពី <xliff:g id="ID_2">^2</xliff:g> មុន"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"កំណត់"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"កំហិត និងការព្រមានអំពីការប្រើទិន្នន័យ"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"វដ្តនៃការប្រើទិន្នន័យកម្មវិធី"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"ការប្រើទិន្នន័យទូរសព្ទចល័ត"</string>
<string name="set_data_warning" msgid="6628236612886588097">"កំណត់ការព្រមានពីការប្រើទិន្នន័យ"</string>
<string name="data_warning" msgid="116776633806885370">"ការព្រមានពីការប្រើទិន្នន័យ"</string>
<string name="set_data_limit" msgid="7136539812414500084">"កំណត់កម្រិតទិន្នន័យ"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ឧបករណ៍ចាក់សំឡេងរបស់យានជំនិះអ្នកនឹងបិទទិន្នន័យទូរសព្ទចល័ត នៅពេលដែលវាប្រើប្រាស់ទិន្នន័យដល់កម្រិតដែលអ្នកបានកំណត់។\n\nដោយសារការប្រើប្រាស់ទិន្នន័យត្រូវបានវាស់ស្ទង់ដោយឧបករណ៍ចាក់សំឡេងរបស់យានជំនិះ ហើយក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នកអាចគណនាលើការប្រើប្រាស់ខុសពីនោះ សូមពិចារណាកំណត់កម្រិតប្រើប្រាស់ទិន្នន័យទាប។"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"កំណត់ការព្រមានពីការប្រើទិន្នន័យ"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"កំណត់ដែនកំណត់ប្រើទិន្នន័យ"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"ការប្រើទិន្នន័យត្រូវបានវាស់ដោយឧបករណ៍របស់អ្នក។ វាអាចខុសគ្នាពីទិន្នន័យរបស់ក្រុមហ៊ុនសេវាទូរសព្ទចល័តអ្នក។"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"កំណត់"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"រក្សាទុក"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"បណ្ដាញ OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"អ៊ីនធឺណិតរបស់យានជំនិះ"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"ការបិទអ៊ីនធឺណិតរបស់យានជំនិះអាចរារាំងមុខងារ ឬកម្មវិធីរបស់យានជំនិះមួយចំនួនមិនឱ្យដំណើរការ។\n\nទិន្នន័យចាំបាច់ដែលតម្រូវឱ្យដំណើការយានជំនិះរបស់អ្នកនឹងបន្តចែករំលែកជាមួយក្រុមហ៊ុនផលិតយានជំនិះ។"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"មិនអីទេ បិទចុះ"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"អ៊ីនធឺណិតរបស់យានជំនិះត្រូវបានបិទ។ ការធ្វើបែបនេះអាចរារាំងមុខងារ ឬកម្មវិធីរបស់យានជំនិះមួយចំនួនមិនឱ្យដំណើរការ។ ទិន្នន័យចាំបាច់ដែលតម្រូវឱ្យដំណើការយានជំនិះរបស់អ្នកនឹងបន្តចែករំលែកជាមួយក្រុមហ៊ុនផលិតយានជំនិះ។"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"បានប្រើ %1$s នៅថ្ងៃទី %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"ចូលរួមបណ្តាញផ្សេងទៀត"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"ចំណូលចិត្តបណ្តាញ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"បញ្ចូលបណ្ដាញ"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"ភ្ជាប់"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"កំពុងភ្ជាប់…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"មិនបានភ្ជាប់"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"បណ្ដាញមិនមានសេវាទេ"</string>
<string name="wifi_password" msgid="5565632142720292397">"ពាក្យសម្ងាត់"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"បង្ហាញពាក្យសម្ងាត់"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"សូមជ្រើសរើសកម្រិតបញ្ជូនយ៉ាងហោចណាស់មួយសម្រាប់ហតស្ប៉ត Wi‑Fi៖"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ហតស្ប៉ត និងការភ្ជាប់"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ហតស្ប៉ត"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"បិទ"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"បិទហតស្ប៉តដោយស្វ័យប្រវត្តិ"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"ហតស៉្បត Wi-Fi នឹងបិទ ប្រសិនបើឧបករណ៍មិនត្រូវបានភ្ជាប់"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ចង់បើក Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"បង្ខំឱ្យបញ្ឈប់"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"បង្ខំឱ្យបញ្ឈប់?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"ប្រសិនបើអ្នកបង្ខំឱ្យបញ្ឈប់កម្មវិធី នោះកម្មវិធីអាចនឹងដំណើរការមិនត្រឹមត្រូវ។"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"បិទការការពារប្រតិបត្តិការឬ?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"ប្រសិនបើអ្នកបិទមុខងារនេះ កម្មវិធី និងហាតវែររបស់អ្នកក៏ប្រហែលជាមិនដំណើរការផងដែរ។"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ទុកឱ្យបើក"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"បិទ"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"បើកការកំណត់អាទិភាពប្រតិបត្តិការកម្មវិធី?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"ការបើកការកំណត់អាទិភាពប្រតិបត្តិការកម្មវិធីអាចបង្កឱ្យមានអស្ថិរភាពប្រព័ន្ធ ឬផលប៉ះពាល់ហាតវែររយៈពេលយូរអង្វែង។ តើអ្នកចង់បន្តដែរទេ?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"បាទ/ចាស"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"ទេ អរគុណ"</string>
<string name="disable_text" msgid="4358165448648990820">"បិទ"</string>
<string name="enable_text" msgid="1794971777861881238">"បើក"</string>
<string name="uninstall_text" msgid="277907956072833012">"លុប"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"ការអនុញ្ញាត"</string>
<string name="notifications_label" msgid="6586089149665170731">"ការជូនដំណឹង"</string>
<string name="storage_application_label" msgid="5911779903670978586">"ទំហំផ្ទុក និងឃ្លាំងបម្រុង"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"ធានាប្រតិបត្តិការខ្ពស់បំផុត"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"កំណត់អាទិភាពប្រតិបត្តិការកម្មវិធី"</string>
<string name="application_version_label" msgid="8556889839783311649">"កំណែ៖ %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"មិនបានផ្តល់សិទ្ធិអនុញ្ញាតទេ"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"គ្មានការអនុញ្ញាតដែលបានស្នើសុំទេ"</string>
<string name="unused_apps" msgid="648471933781010395">"កម្មវិធីដែលមិនប្រើ"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">កម្មវិធីដែលមិនប្រើចំនួន <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">កម្មវិធីដែលមិនប្រើចំនួន <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{កម្មវិធីដែលមិនប្រើ #}other{កម្មវិធីដែលមិនប្រើ #}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"ដកការអនុញ្ញាតចេញ និងបង្កើនទំហំផ្ទុក"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s នៅក្នុងទំហំផ្ទុកខាងក្នុង"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"នៅពេលចាំបាច់ សូមបិទកម្មវិធី ដើម្បីចៀសវាងប្រើធនធានច្រើនពេក"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ប្រើធនធានប្រព័ន្ធ ដើម្បីកំណត់អាទិភាពប្រតិបត្តិការកម្មវិធី"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ការប្រើទិន្នន័យ"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ការប្រើទិន្នន័យកម្មវិធី"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"ប្រវត្តិប្រើ"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"កម្មវិធីទាំងអស់"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ការប្រើទិន្នន័យ និង Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"ប្រវត្តិប្រើ"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"ការប្រើសរុប"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ផ្ទៃខាងមុខ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ផ្ទៃខាងក្រោយ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"អនុញ្ញាតឱ្យប្រើទិន្នន័យ"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"អនុញ្ញាតឱ្យកម្មវិធីនេះប្រើទិន្នន័យទូរសព្ទចល័ត"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ដាក់កំហិតទិន្នន័យ"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ប្រើទិន្នន័យទូរសព្ទចល័ត តែនៅពេលកម្មវិធីស្ថិតនៅផ្ទៃខាងមុខប៉ុណ្ណោះ"</string>
<string name="computing_size" msgid="5791407621793083965">"កំពុងគណនា…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other">ការអនុញ្ញាតបន្ថែម <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">ការអនុញ្ញាតបន្ថែម <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{ការអនុញ្ញាតបន្ថែម #}other{ការអនុញ្ញាតបន្ថែម #}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"ចំណាំ៖ បន្ទាប់ពីចាប់ផ្ដើមឡើងវិញហើយ កម្មវិធីនេះមិនអាចចាប់ផ្ដើមបានទេ រហូតទាល់តែអ្នកដោះសោយានជំនិះរបស់អ្នក។"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ជំនួយ និងការបញ្ចូលសំឡេង"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"កម្មវិធីជំនួយ"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"ការគ្រប់គ្រង Wi-Fi អនុញ្ញាតឱ្យកម្មវិធីបើក ឬបិទ Wi-Fi ស្កេន និងភ្ជាប់បណ្តាញ Wi-Fi បញ្ចូល ឬលុបបណ្តាញ ឬចាប់ផ្តើមតែហតស្ប៉តមូលដ្ឋានប៉ុណ្ណោះ។"</string>
<string name="more_special_access_title" msgid="166115485446645971">"ច្រើនទៀត"</string>
<string name="location_settings_title" msgid="901334356682423679">"ទីតាំង"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"ប្រើទីតាំង"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"អនុញ្ញាតឱ្យកម្មវិធីដែលអ្នកបញ្ជាក់ចូលប្រើទីតាំងរបស់អ្នក"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"ប្រសិនបើបិទទីតាំងនេះ វានឹងដកសិទ្ធិចូលប្រើទីតាំងសម្រាប់កម្មវិធីទាំងអស់ កម្មវិធីជំនួយអ្នកបើកបរនឹងនៅតែមានសិទ្ធិចូលប្រើដដែល។"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ប្រើទីតាំងសម្រាប់មុខងារជំនួយអ្នកបើកបរ"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"ទីតាំងយានជំនិះត្រូវបានបិទ"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"កម្មវិធីជំនួយអ្នកបើកបរមិនអាចចូលប្រើទីតាំងរបស់អ្នកបានទេ"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"ផ្លាស់ប្ដូរ"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"អនុញ្ញាតឱ្យកម្មវិធីដែលផ្ដល់ជំនួយពាក់ព័ន្ធនឹងការបើកបរចូលប្រើទីតាំងរបស់អ្នក"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"ប្រសិនបើអ្នកបិទមុខងារនេះ កម្មវិធីជំនួយអ្នកបើកបរដែលផ្អែកលើព័ត៌មានទីតាំងនឹងត្រូវបានបិទ។"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"មិនអីទេ បិទចុះ"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"សំណើទីតាំងថ្មីៗ"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"គ្មានសំណើទីតាំងថ្មីៗទេ"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ការអនុញ្ញាតកម្រិតកម្មវិធី"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"សេវាកម្មទីតាំង"</string>
<string name="location_use_location_title" msgid="117735895374606680">"ប្រើទីតាំង"</string>
<string name="location_settings_footer" msgid="296892848338100051">"ទីតាំងអាចប្រើប្រាស់ប្រភពផ្សេងៗដូចជា GPS, Wi‑Fi, បណ្ដាញទូរសព្ទចល័ត និងឧបករណ៍ចាប់សញ្ញា ដើម្បីជួយប៉ាន់ស្មានទីតាំងឧបករណ៍របស់អ្នក។"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ជំនួយអ្នកបើកបរ"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ព័ត៌មានទីតាំងដែលបានបញ្ជូនទៅកម្មវិធីជំនួយអ្នកបើកបរមិនមានព័ត៌មានដែលសម្គាល់អ្នកទេ។ ព័ត៌មាននោះត្រូវបានរក្សាទុកយ៉ាងយូរបំផុត 2 ថ្ងៃ មុនពេលត្រូវបានលុប។"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"មីក្រូហ្វូន"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"ប្រើមីក្រូហ្វូន"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"អនុញ្ញាតឱ្យកម្មវិធីទាំងអស់ចូលប្រើមីក្រូហ្វូនរបស់អ្នក"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"គ្រប់គ្រងការអនុញ្ញាតឱ្យប្រើមីក្រូហ្វូន"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"បានចូលប្រើកាលពីថ្មីៗនេះ"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"គ្មានកម្មវិធីថ្មីៗ"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"កម្មវិធី 0 មានសិទ្ធិចូលប្រើ"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{កម្មវិធី # នៃ {total_count} មានសិទ្ធិចូលប្រើ}other{កម្មវិធី # នៃ {total_count} មានសិទ្ធិចូលប្រើ}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"បានចូលប្រើកាលពីថ្មីៗនេះ"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"មើលទាំងអស់"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"កំពុងផ្ទុក…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"ប្រព័ន្ធ"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"បច្ចុប្បន្នភាពប្រព័ន្ធ"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"កម្រិតខ្ពស់"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"អាជ្ញាបណ្ណភាគីទីបី"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"មានបញ្ហាក្នុងការផ្ទុកអាជ្ញាបណ្ណ។"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"កំពុងផ្ទុក…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">ឥឡូវនេះ នៅសល់ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ជំហានទៀត អ្នកនឹងក្លាយជាអ្នកអភិវឌ្ឍន៍។</item>
- <item quantity="one">ឥឡូវនេះ នៅសល់ <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ជំហានទៀត អ្នកនឹងក្លាយជាអ្នកអភិវឌ្ឍន៍។</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ឥឡូវនេះ នៅសល់ # ជំហានទៀត អ្នកនឹងក្លាយជាអ្នកអភិវឌ្ឍន៍។}other{ឥឡូវនេះ នៅសល់ # ជំហានទៀត អ្នកនឹងក្លាយជាអ្នកអភិវឌ្ឍន៍។}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"ឥឡូវនេះ អ្នកក្លាយជាអ្នកអភិវឌ្ឍន៍ហើយ!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"មិនចាំបាច់ទេ អ្នកក្លាយជាអ្នកអភិវឌ្ឍន៍ហើយ។"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ជម្រើសសម្រាប់អ្នកអភិវឌ្ឍន៍"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"បន្ទាប់ពីអ្នកបង្កើតកម្រងព័ត៌មានថ្មី បុគ្គលនោះគួរតែប្ដូរកម្រងព័ត៌មាននោះតាមបំណងសម្រាប់ខ្លួនគាត់ផ្ទាល់។"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"កម្មវិធីអាចត្រូវដំឡើងកំណែពីកម្រងព័ត៌មានទាំងឡាយសម្រាប់ប្រើប្រាស់ដោយកម្រងព័ត៌មានផ្សេងទៀតទាំងអស់។"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"បានឈានដល់ដែនកំណត់នៃកម្រងព័ត៌មានហើយ"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">អ្នកអាចបង្កើតកម្រងព័ត៌មានបានរហូតដល់ <xliff:g id="COUNT">%d</xliff:g>។</item>
- <item quantity="one">អាចបង្កើតបានតែកម្រងព័ត៌មានមួយប៉ុណ្ណោះ។</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{អាចបង្កើតកម្រងព័ត៌មានបានតែមួយប៉ុណ្ណោះ។}other{អ្នកអាចបង្កើតកម្រងព័ត៌មានបានរហូតដល់ #។}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"មិនអាចបង្កើតកម្រងព័ត៌មានថ្មីបានទេ"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"លុបកម្រងព័ត៌មាននេះឬ?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"កម្មវិធី និងទិន្នន័យទាំងអស់សម្រាប់កម្រងព័ត៌មាននេះនឹងត្រូវបានលុប"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"មិនអាចលុបកម្រងព័ត៌មានបានទេ។"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"កម្រងព័ត៌មានមិនត្រូវបានលុបទេ។ អ្នកអាចចាប់ផ្ដើមឧបករណ៍ឡើងវិញ រួចព្យាយាមម្ដងទៀត។"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"កម្រងព័ត៌មាននេះនឹងត្រូវបានលុប នៅពេលអ្នកប្ដូរកម្រងព័ត៌មាន ឬបញ្ឆេះយានជំនិះឡើងវិញ។"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ច្រានចោល"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ព្យាយាមម្ដងទៀត"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"របៀបគូរលំនាំដោះសោ"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"មានបញ្ហាក្នុងការរក្សាទុកលំនាំ"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"ការព្យាយាមចូលខុសច្រើនដងពេក។ សូមព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER">%d</xliff:g> វិនាទី។"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"លំនាំមិនអាចប្រើការបង្វិលបានទេ សូមប្រើការចុច"</string>
<string name="okay" msgid="4589873324439764349">"យល់ព្រម"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"លុបការចាក់សោអេក្រង់?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"ការធ្វើបែបនេះនឹងអនុញ្ញាតឱ្យនរណាក៏អាចចូលប្រើគណនីរបស់អ្នក"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"កូដ PIN លក្ខណៈសាមញ្ញត្រូវបានទប់ស្កាត់ដោយអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នក។ សូមសាកល្បងប្រើកូដ PIN ផ្សេងពីនេះ។"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"វាមិនអាចប្រើតួអក្សរដែលមិនត្រឹមត្រូវបានទេ។"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"ពាក្យសម្ងាត់មិនត្រឹមត្រូវទេ ត្រូវមានយ៉ាងហោចណាស់ 4 តួ។"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">ត្រូវមានអក្សរយ៉ាងហោចណាស់ <xliff:g id="COUNT">%d</xliff:g> តួ</item>
- <item quantity="one">ត្រូវមានអក្សរយ៉ាងហោចណាស់ 1 តួ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">ត្រូវមានអក្សរតូចយ៉ាងហោចណាស់ <xliff:g id="COUNT">%d</xliff:g> តួ</item>
- <item quantity="one">ត្រូវមានអក្សរតូចយ៉ាងហោចណាស់ 1 តួ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">ត្រូវមានអក្សរធំយ៉ាងហោចណាស់ <xliff:g id="COUNT">%d</xliff:g> តួ</item>
- <item quantity="one">ត្រូវមានអក្សរធំយ៉ាងហោចណាស់ 1 តួ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">ត្រូវមានលេខយ៉ាងហោចណាស់ <xliff:g id="COUNT">%d</xliff:g> ខ្ទង់</item>
- <item quantity="one">ត្រូវមានលេខយ៉ាងហោចណាស់ 1 ខ្ទង់</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">ត្រូវមានសញ្ញាពិសេសយ៉ាងហោចណាស់ <xliff:g id="COUNT">%d</xliff:g></item>
- <item quantity="one">ត្រូវមានសញ្ញាពិសេសយ៉ាងហោចណាស់ 1</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">ត្រូវមានតួដែលមិនមែនជាអក្សរយ៉ាងហោចណាស់ <xliff:g id="COUNT">%d</xliff:g></item>
- <item quantity="one">ត្រូវមានតួដែលមិនមែនជាអក្សរយ៉ាងហោចណាស់ 1</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"អ្នកគ្រប់គ្រងឧបករណ៍មិនអនុញ្ញាតឱ្យប្រើពាក្យសម្ងាត់ដែលទើបប្រើហើយទេ"</string>
<string name="error_saving_password" msgid="8334882262622500658">"មានបញ្ហាក្នុងការរក្សាទុកពាក្យសម្ងាត់"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ពាក្យសម្ងាត់លក្ខណៈសាមញ្ញត្រូវបានទប់ស្កាត់ដោយអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នក។ សូមសាកល្បងប្រើពាក្យសម្ងាត់ផ្សេងពីនេះ។"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"បញ្ចូលកម្រងព័ត៌មាន"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"លុបកម្រងព័ត៌មាននេះ"</string>
<string name="add_profile_text" msgid="9118410102199116969">"បញ្ចូលកម្រងព័ត៌មាន"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ពន្លឺផ្ទាំងអេក្រង់"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"ដើម្បីឃើញឧបករណ៍របស់អ្នក សូមបើកប៊្លូធូស"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"ដើម្បីផ្គូផ្គងឧបករណ៍ សូមបើកការកំណត់ប៊្លូធូស"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"អ្នកគ្រប់គ្រងប្រព័ន្ធព័ត៌មាន និងកម្សាន្ត"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"កម្មវិធីដែលបានបើកដំណើរការ"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"កម្មវិធីដែលបានបិទដំណើរការ"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"កម្មវិធីដែលមានការអនុញ្ញាតនេះមានសិទ្ធិចូលប្រើទិន្នន័យរបស់យានជំនិះនេះ"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"គ្មានកម្មវិធីអ្នកគ្រប់គ្រងយានជំនិះទេ"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"កម្មវិធីអ្នកគ្រប់គ្រងប្រព័ន្ធព័ត៌មាន និងកម្សាន្តនេះគឺសកម្ម និងអនុញ្ញាតឱ្យកម្មវិធី <xliff:g id="APP_NAME">%1$s</xliff:g> ធ្វើប្រតិបត្តិការខាងក្រោម៖"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"ការបើកដំណើរការកម្មវិធីប្រព័ន្ធព័ត៌មាន និងកម្សាន្តនេះនឹងអនុញ្ញាតឱ្យកម្មវិធី <xliff:g id="APP_NAME">%1$s</xliff:g> ធ្វើប្រតិបត្តិការខាងក្រោម៖"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"បើកដំណើរការកម្មវិធីប្រព័ន្ធព័ត៌មាន និងកម្សាន្តនេះឬ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"បើកដំណើរការកម្មវិធីប្រព័ន្ធព័ត៌មាន និងកម្សាន្តនេះ"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"បិទដំណើរការ ហើយលុប"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"បិទដំណើរការកម្មវិធីប្រព័ន្ធព័ត៌មាន និងកម្សាន្តនេះ"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"ព័ត៌មានលម្អិតបន្ថែម"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"អ្នកគ្រប់គ្រងស្ថាប័នរបស់អ្នកអាចតាមដាន និងគ្រប់គ្រងកម្មវិធី និងទិន្នន័យដែលពាក់ព័ន្ធនឹងកម្រងព័ត៌មាននេះ រួមទាំងការកំណត់ ការអនុញ្ញាត ការចូលប្រើលក្ខណៈក្រុមហ៊ុន សកម្មភាពបណ្តាញ និងព័ត៌មានទីតាំងរបស់យានជំនិះផងដែរ។"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"អ្នកគ្រប់គ្រងស្ថាប័នរបស់អ្នកអាចតាមដាន និងគ្រប់គ្រងកម្មវិធី និងទិន្នន័យដែលពាក់ព័ន្ធនឹងកម្រងព័ត៌មាននេះ រួមទាំងការកំណត់ ការអនុញ្ញាត ការចូលប្រើលក្ខណៈក្រុមហ៊ុន សកម្មភាពបណ្តាញ និងព័ត៌មានទីតាំងរបស់ឧបករណ៍ផងដែរ។"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"អ្នកគ្រប់គ្រងស្ថាប័នអាចតាមដាន និងគ្រប់គ្រងកម្មវិធី និងទិន្នន័យដែលពាក់ព័ន្ធនឹងប្រព័ន្ធព័ត៌មាន និងកម្សាន្តនេះ រួមទាំងការកំណត់ ការអនុញ្ញាត ការចូលប្រើលក្ខណៈក្រុមហ៊ុន សកម្មភាពបណ្ដាញ និងព័ត៌មានទីតាំងរបស់យានជំនិះផងដែរ។"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"អ្នកគ្រប់គ្រងស្ថាប័នប្រហែលជាអាចចូលប្រើទិន្នន័យដែលពាក់ព័ន្ធនឹងប្រព័ន្ធព័ត៌មាន និងកម្សាន្តនេះ គ្រប់គ្រងកម្មវិធី និងប្ដូរការកំណត់យានជំនិះនេះ។"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"មិនអាចប្រើបានទេ"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"មិនអាចប្ដូរកម្រិតសំឡេងនៅក្នុងយានជំនិះដែលស្ថិតក្រោមការគ្រប់គ្រងនេះបានទេ"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"មិនអាចធ្វើការហៅទូរសព្ទនៅក្នុងយានជំនិះដែលស្ថិតក្រោមការគ្រប់គ្រងនេះបានទេ"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"មិនអនុញ្ញាត SMS នៅក្នុងយានជំនិះដែលស្ថិតក្រោមការគ្រប់គ្រងនេះទេ"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"មិនអាចប្រើកាមេរ៉ានៅក្នុងយានជំនិះដែលស្ថិតក្រោមការគ្រប់គ្រងនេះបានទេ"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"មិនអាចថតរូបអេក្រង់នៅក្នុងយានជំនិះដែលស្ថិតក្រោមការគ្រប់គ្រងនេះបានទេ"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"មិនអាចបើកកម្មវិធីនេះនៅក្នុងយានជំនិះដែលស្ថិតក្រោមការគ្រប់គ្រងនេះបានទេ"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"បានទប់ស្កាត់ដោយក្រុមហ៊ុនផ្ដល់សេវាឥណទានរបស់អ្នក"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"ស្ថាប័នរបស់អ្នកដាក់កំហិតលើការចូលប្រើមុខងារមួយចំនួន។\n\nប្រសិនបើអ្នកមានសំណួរ សូមទាក់ទងអ្នកគ្រប់គ្រងស្ថាប័ន។"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"កម្មវិធីអ្នកគ្រប់គ្រងក្រុមយានជំនិះ"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{កម្មវិធីដែលបានបើកដំណើរការ #}other{កម្មវិធីដែលបានបើកដំណើរការ #}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"គ្មានកម្មវិធីដែលបានបើកដំណើរការទេ"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"គោលការណ៍យានជំនិះ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"ការកំណត់ដែលស្ថិតក្រោមការគ្រប់គ្រងរបស់អ្នកគ្រប់គ្រងស្ថាប័ន"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"ស្វែងយល់បន្ថែមអំពី <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"ចែករំលែករបាយការណ៍អំពីបញ្ហាឬ?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"អ្នកគ្រប់គ្រងស្ថាប័នរបស់យានជំនិះនេះបានស្នើសុំរបាយការណ៍អំពីបញ្ហា ដើម្បីជួយដោះស្រាយបញ្ហាឧបករណ៍នេះ។ កម្មវិធី និងទិន្នន័យអាចនឹងត្រូវបានចែករំលែក។"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"អ្នកគ្រប់គ្រងស្ថាប័នរបស់យានជំនិះនេះបានស្នើសុំរបាយការណ៍អំពីបញ្ហា ដើម្បីជួយដោះស្រាយបញ្ហាឧបករណ៍នេះ។ កម្មវិធី និងទិន្នន័យអាចនឹងត្រូវបានចែករំលែក ហើយឧបករណ៍របស់អ្នកអាចនឹងដំណើរការយឺតជាបណ្តោះអាសន្ន។"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"របាយការណ៍អំពីបញ្ហានេះកំពុងត្រូវបានចែករំលែកជាមួយអ្នកគ្រប់គ្រងស្ថាប័នរបស់យានជំនិះនេះ។ សូមទាក់ទងគាត់ ដើម្បីទទួលបានព័ត៌មានលម្អិតបន្ថែម។"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"ចែករំលែក"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"បដិសេធ"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"មិនអាចផ្លាស់ប្ដូរការកំណត់នេះនៅពេលនេះបានទេ"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ភាពងាយស្រួល"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"អក្សររត់"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"ចំណូលចិត្តអក្សររត់"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"បិទ"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"បើក"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"កម្មវិធីអានអេក្រង់"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"បង្ហាញអក្សររត់"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ទំហំអក្សរ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"រចនាប័ទ្ម និងទំហំអក្សររត់"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"តូចខ្លាំង"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"តូច"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"លំនាំដើម"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ធំ"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ធំខ្លាំង"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"រចនាប័ទ្មអក្សររត់"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"កំណត់ដោយកម្មវិធី"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"ពណ៌សលើពណ៌ខ្មៅ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"ពណ៌ខ្មៅលើពណ៌ស"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"ពណ៌លឿងលើពណ៌ខ្មៅ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"ពណ៌លឿងលើពណ៌ខៀវ"</string>
</resources>
diff --git a/res/values-kn/arrays.xml b/res/values-kn/arrays.xml
index e4fc3ea..44958d1 100644
--- a/res/values-kn/arrays.xml
+++ b/res/values-kn/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"ಎಂದಿಗೂ ಅನುಮತಿಸಬೇಡಿ"</item>
<item msgid="1154273129608299386">"ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 24d90a0..475314d 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"ರಾತ್ರಿ ಮೋಡ್"</string>
<string name="network_and_internet" msgid="4229023630498537530">"ನೆಟ್ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಸಿಮ್ಗಳು</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಸಿಮ್ಗಳು</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}one{# SIM ಗಳು}other{# SIM ಗಳು}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"ಸಕ್ರಿಯ / ಸಿಮ್"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"ಸಕ್ರಿಯವಾಗಿರದ / ಸಿಮ್"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"ಸಕ್ರಿಯ / ಡೌನ್ಲೋಡ್ ಮಾಡಿದ SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"ಇನ್ನಷ್ಟು ಸೇರಿಸಿ"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"ಮೊಬೈಲ್ ಡೇಟಾ"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ಬಳಸಿ ಡೇಟಾ ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಬಳಸಿ"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್ ಮಾಡಬೇಕೆ?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"ಆಯ್ಕೆ ಅಗತ್ಯವಿದೆ"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"ಮೊಬೈಲ್ ಡೇಟಾಗಾಗಿ <xliff:g id="CARRIER">%1$s</xliff:g> ಬಳಸುವುದೇ?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> ಡೇಟಾ ಎಚ್ಚರಿಕೆ"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> ಡೇಟಾ ಮಿತಿ"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> ಡೇಟಾ ಎಚ್ಚರಿಕೆ / <xliff:g id="ID_2">^2</xliff:g> ಡೇಟಾ ಮಿತಿ"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d ದಿನಗಳು ಉಳಿದಿವೆ</item>
- <item quantity="other">%d ದಿನಗಳು ಉಳಿದಿವೆ</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# ದಿನ ಉಳಿದಿದೆ}one{# ದಿನಗಳು ಉಳಿದಿವೆ}other{# ದಿನಗಳು ಉಳಿದಿವೆ}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"ಯಾವುದೇ ಸಮಯ ಉಳಿದಿಲ್ಲ"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 ದಿನಕ್ಕಿಂತಲೂ ಕಡಿಮೆ ಉಳಿದಿದೆ"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ಸಮಯದ ಹಿಂದೆ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"ಹೊಂದಿಸಿ"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ಡೇಟಾ ಎಚ್ಚರಿಕೆ ಮತ್ತು ಮಿತಿ"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"ಆ್ಯಪ್ ಡೇಟಾ ಬಳಕೆ ಆವರ್ತನೆ"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಕೆ"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ಡೇಟಾ ಎಚ್ಚರಿಕೆಯನ್ನು ಸೆಟ್ ಮಾಡಿ"</string>
<string name="data_warning" msgid="116776633806885370">"ಡೇಟಾ ಎಚ್ಚರಿಕೆ"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ಡೇಟಾ ಮಿತಿ ಹೊಂದಿಸಿ"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ನೀವು ಹೊಂದಿಸಿರುವ ಮಿತಿಯನ್ನು ತಲುಪಿದಾಗ ನಿಮ್ಮ ವಾಹನದ ಹೆಡ್ ಯೂನಿಟ್ ಒಮ್ಮೆ ನಿಮ್ಮ ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ.\n\n ಡೇಟಾ ಬಳಕೆಯನ್ನು ಹೆಡ್ ಯೂನಿಟ್ ಮೂಲಕ ಅಳೆಯಲಾಗುವ ಕಾರಣ ಮತ್ತು ನಿಮ್ಮ ವಾಹಕವು ಬಳಕೆಯನ್ನು ಬೇರೆ ರೀತಿಯಲ್ಲಿ ಪರಿಗಣಿಸಬಹುದಾದ ಕಾರಣ, ಸುರಕ್ಷಿತ ಮಿತಿಯನ್ನು ಹೊಂದಿಸುವುದು ಸೂಕ್ತ."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ಡೇಟಾ ಬಳಕೆ ಎಚ್ಚರಿಕೆಯನ್ನು ಸೆಟ್ ಮಾಡಿ"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ಡೇಟಾ ಬಳಕೆ ಮಿತಿಯನ್ನು ಹೊಂದಿಸಿ"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"ಡೇಟಾ ಬಳಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದ ಮೂಲಕ ಅಳೆಯಲಾಗುತ್ತದೆ. ಇದು ನಿಮ್ಮ ಮೊಬೈಲ್ ಕ್ಯಾರಿಯರ್ನ ಡೇಟಾದಿಂದ ಬದಲಾಗಿರಬಹುದು."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"ಹೊಂದಿಸಿ"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"ಉಳಿಸಿ"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM ನೆಟ್ವರ್ಕ್"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"ವಾಹನದ ಇಂಟರ್ನೆಟ್"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"ವಾಹನದ ಇಂಟರ್ನೆಟ್ ಆಫ್ ಮಾಡುವುದರಿಂದ ಇದು ಕೆಲವು ವಾಹನದ ಫೀಚರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ತಡೆಯಬಹುದು.\n\nನಿಮ್ಮ ವಾಹನವನ್ನು ನಿರ್ವಹಿಸಲು ಅಗತ್ಯವಿರುವ ನಿರ್ಣಾಯಕ ಡೇಟಾವನ್ನು ವಾಹನ ತಯಾರಕರ ಜೊತೆ ಹಂಚಿಕೊಳ್ಳುವುದನ್ನು ಮುಂದುವರಿಸಲಾಗುತ್ತದೆ."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"ಹೇಗಿದ್ದರೂ ಆಫ್ ಮಾಡಿ"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"ವಾಹನದ ಇಂಟರ್ನೆಟ್ ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ. ಇದು ಕೆಲವು ವಾಹನದ ಫೀಚರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ತಡೆಯಬಹುದು. ನಿಮ್ಮ ವಾಹನವನ್ನು ನಿರ್ವಹಿಸಲು ಅಗತ್ಯವಿರುವ ನಿರ್ಣಾಯಕ ಡೇಟಾವನ್ನು ವಾಹನ ತಯಾರಕರ ಜೊತೆ ಹಂಚಿಕೊಳ್ಳುವುದನ್ನು ಮುಂದುವರಿಸಲಾಗುತ್ತದೆ."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s ಅವಧಿಯಲ್ಲಿ %1$s ಬಳಸಲಾಗಿದೆ"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"ಇತರ ನೆಟ್ವರ್ಕ್ಗೆ ಸೇರಿಕೊಳ್ಳಿ"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"ನೆಟ್ವರ್ಕ್ ಆದ್ಯತೆಗಳು"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"ನೆಟ್ವರ್ಕ್ ಸೇರಿಸಿ"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"ಸಂಪರ್ಕಿಸಿ"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"ಕನೆಕ್ಟ್ ಆಗುತ್ತಿದೆ…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"ಕನೆಕ್ಟ್ ಆಗಿಲ್ಲ"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"ನೆಟ್ವರ್ಕ್ ವ್ಯಾಪ್ತಿಯಲ್ಲಿಲ್ಲ"</string>
<string name="wifi_password" msgid="5565632142720292397">"ಪಾಸ್ವರ್ಡ್"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"ಪಾಸ್ವರ್ಡ್ ತೋರಿಸಿ"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"ವೈ-ಫೈ ಹಾಟ್ಸ್ಪಾಟ್ಗೆ ಬ್ಯಾಂಡ್ ಆರಿಸಿ:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ಹಾಟ್ಸ್ಪಾಟ್ & ಟೆಥರಿಂಗ್"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ಹಾಟ್ಸ್ಪಾಟ್"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ಆಫ್ ಮಾಡಿ"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಹಾಟ್ಸ್ಪಾಟ್ ಅನ್ನು ಆಫ್ ಮಾಡಿ"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"ಯಾವುದೇ ಸಾಧನಗಳು ಸಂಪರ್ಕಗೊಳ್ಳದೇ ಇರುವಾಗ ವೈ-ಫೈ ಹಾಟ್ಸ್ಪಾಟ್ ಆಫ್ ಆಗುತ್ತದೆ"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ಗಾಗಿ ವೈ-ಫೈ ಆನ್ ಮಾಡಬೇಕು"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"ಬಲವಂತವಾಗಿ ನಿಲ್ಲಿಸಿ"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"ಬಲವಂತವಾಗಿ ಸ್ಥಗಿತಗೊಳಿಸುವುದೇ?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"ಆ್ಯಪ್ ಅನ್ನು ಬಲವಂತವಾಗಿ ಸ್ಥಗಿತಗೊಳಿಸಿದರೆ, ಅದು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"ಕಾರ್ಯಕ್ಷಮತೆ ರಕ್ಷಣೆಯನ್ನು ಆಫ್ ಮಾಡಬೇಕೇ?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"ಹಾಗೆ ಮಾಡಿದರೆ, ನಿಮ್ಮ ಸಾಫ್ಟ್ವೇರ್ ಮತ್ತು ಹಾರ್ಡ್ವೇರ್ ಸಹ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ಆನ್ ಆಗಿರಿಸಿ"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"ಆಫ್ ಮಾಡಿ"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"ಆ್ಯಪ್ನ ಕಾರ್ಯಕ್ಷಮತೆ ಆದ್ಯತೆ ಆನ್ ಮಾಡುವುದೇ?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"ಅದನ್ನು ಆನ್ ಮಾಡುವುದರಿಂದ ಸಂಭಾವ್ಯ ಸಿಸ್ಟಂ ಅಸ್ಥಿರತೆ ಅಥವಾ ದೀರ್ಘಾವಧಿಯ ಹಾರ್ಡ್ವೇರ್ ಪರಿಣಾಮ ಉಂಟಾಗಬಹುದು. ನೀವು ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"ಹೌದು"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"ಬೇಡ"</string>
<string name="disable_text" msgid="4358165448648990820">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="enable_text" msgid="1794971777861881238">"ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="uninstall_text" msgid="277907956072833012">"ಅನ್ಇನ್ಸ್ಟಾಲ್"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"ಅನುಮತಿಗಳು"</string>
<string name="notifications_label" msgid="6586089149665170731">"ಅಧಿಸೂಚನೆಗಳು"</string>
<string name="storage_application_label" msgid="5911779903670978586">"ಸಂಗ್ರಹಣೆ ಮತ್ತು ಕ್ಯಾಷ್"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"ಗರಿಷ್ಠ ಕಾರ್ಯಕ್ಷಮತೆ ಖಚಿತಪಡಿಸಿ"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ಆ್ಯಪ್ನ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಆದ್ಯತೆಗೊಳಿಸಿ"</string>
<string name="application_version_label" msgid="8556889839783311649">"ಆವೃತ್ತಿ: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ಯಾವುದೇ ಅನುಮತಿಗಳನ್ನು ನೀಡಲಾಗಿಲ್ಲ"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ಯಾವುದೇ ಅನುಮತಿಗಳನ್ನು ವಿನಂತಿಸಿಲ್ಲ"</string>
<string name="unused_apps" msgid="648471933781010395">"ಬಳಕೆಯಾಗದ ಆ್ಯಪ್ಗಳು"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one">ಬಳಕೆಯಾಗದ <xliff:g id="COUNT_1">%d</xliff:g> ಆ್ಯಪ್ಗಳು</item>
- <item quantity="other">ಬಳಕೆಯಾಗದ <xliff:g id="COUNT_1">%d</xliff:g> ಆ್ಯಪ್ಗಳು</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ಬಳಕೆಯಾಗದ ಆ್ಯಪ್}one{# ಬಳಕೆಯಾಗದ ಆ್ಯಪ್ಗಳು}other{# ಬಳಕೆಯಾಗದ ಆ್ಯಪ್ಗಳು}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"ಅನುಮತಿಗಳನ್ನು ತೆಗೆಯಿರಿ, ಸ್ಥಳ ಮುಕ್ತಗೊಳಿಸಿ"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"ಆಂತರಿಕ ಸಂಗ್ರಹಣೆಯಲ್ಲಿ %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"ಅಗತ್ಯವಿದ್ದಾಗ, ಸಂಪನ್ಮೂಲಗಳ ಅತಿಯಾದ ಬಳಕೆ ತಪ್ಪಿಸಲು ಆ್ಯಪ್ ಮುಚ್ಚಿ"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ಆ್ಯಪ್ನ ಕಾರ್ಯಕ್ಷಮತೆಗೆ ಆದ್ಯತೆ ನೀಡಲು ಸಿಸ್ಟಂ ಮಾಹಿತಿಯ ಮೂಲಗಳನ್ನು ಬಳಸುತ್ತದೆ"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ಡೇಟಾ ಬಳಕೆ"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ಆ್ಯಪ್ ಡೇಟಾ ಬಳಕೆ"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"ಬಳಕೆಯ ಇತಿಹಾಸ"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ಡೇಟಾ ಮತ್ತು ವೈ-ಫೈ ಬಳಕೆ"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"ಬಳಕೆಯ ಇತಿಹಾಸ"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"ಒಟ್ಟು ಬಳಕೆ"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ಮುನ್ನೆಲೆ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ಹಿನ್ನೆಲೆ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ಡೇಟಾವನ್ನು ಬಳಸಲು ಅನುಮತಿಸಿ"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"ಈ ಆ್ಯಪ್ ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಬಳಸಲು ಅನುಮತಿಸಿ"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ಡೇಟಾವನ್ನು ನಿರ್ಬಂಧಿಸಿ"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ಆ್ಯಪ್ ಮುನ್ನೆಲೆಯಲ್ಲಿದ್ದಾಗ ಮಾತ್ರ ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸಿ"</string>
<string name="computing_size" msgid="5791407621793083965">"ಗಣನೆ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳು</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳು</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# ಹೆಚ್ಚುವರಿ ಅನುಮತಿ}one{# ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳು}other{# ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳು}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"ಗಮನಿಸಿ: ರೀಬೂಟ್ ಮಾಡಿದ ನಂತರ, ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೀವು ಅನ್ಲಾಕ್ ಮಾಡುವ ತನಕ ಈ ಆ್ಯಪ್ ಪ್ರಾರಂಭಗೊಳ್ಳುವುದಿಲ್ಲ"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ಅಸಿಸ್ಟೆಂಟ್ ಮತ್ತು ಧ್ವನಿ ಇನ್ಪುಟ್"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"ಅಸಿಸ್ಟೆಂಟ್ ಆ್ಯಪ್"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"ವೈ-ಫೈ ನಿಯಂತ್ರಣವು, ವೈ-ಫೈ ಅನ್ನು ಆನ್ ಅಥವಾ ಆಫ್ ಮಾಡಲು, ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು ಮತ್ತು ಸಂಪರ್ಕಿಸಲು, ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ಸೇರಿಸಲು ಅಥವಾ ತೆಗೆದುಹಾಕಲು ಹಾಗೂ ಸ್ಥಳೀಯವಾದ ಹಾಟ್ಸ್ಪಾಟ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು ಈ ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="more_special_access_title" msgid="166115485446645971">"ಇನ್ನಷ್ಟು"</string>
<string name="location_settings_title" msgid="901334356682423679">"ಸ್ಥಳ"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"ಸ್ಥಳ ಬಳಸಿ"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಆ್ಯಪ್ಗಳಿಗೆ ಅನುಮತಿಸಿ"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"ನೀವು ಇದನ್ನು ಆಫ್ ಮಾಡಿದರೆ, ಇದು ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳಿಗೆ ಸ್ಥಳ ಪ್ರವೇಶವನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ. ಡ್ರೈವರ್ಗೆ ಸಹಾಯಮಾಡುವ ಫೀಚರ್ಗಳು ಈಗಲೂ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತವೆ."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ಡ್ರೈವರ್ಗೆ ಸಹಾಯ ಫೀಚರ್ಗಾಗಿ ಡ್ರೈವರ್ ಅವರ ಸ್ಥಳವನ್ನು ಬಳಸಿ"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"ವಾಹನದ ಸ್ಥಳ ಆಫ್ ಆಗಿದೆ"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ಡ್ರೈವರ್ಗೆ ಸಹಾಯ ಮಾಡುವ ಆ್ಯಪ್ಗಳು ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"ಬದಲಾಯಿಸಿ"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸುವಲ್ಲಿ ಡ್ರೈವಿಂಗ್ಗೆ ಸಹಾಯ ಮಾಡುವ ಆ್ಯಪ್ಗಳಿಗೆ ಅನುಮತಿಸಿ"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"ನೀವು ಇದನ್ನು ಆಫ್ ಮಾಡಿದರೆ, ಸ್ಥಳ ಮಾಹಿತಿಯ ಮೇಲೆ ಅವಲಂಬಿತವಾದ ಡ್ರೈವರ್ಗೆ ಸಹಾಯ ಮಾಡುವ ಫೀಚರ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"ಹೇಗಿದ್ದರೂ ಆಫ್ ಮಾಡಿ"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ಇತ್ತೀಚಿನ ಸ್ಥಳ ವಿನಂತಿಗಳು"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಸ್ಥಳ ವಿನಂತಿಗಳು ಇಲ್ಲ"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ಆ್ಯಪ್ ಹಂತದ ಅನುಮತಿಗಳು"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"ಸ್ಥಳ ಸೇವೆಗಳು"</string>
<string name="location_use_location_title" msgid="117735895374606680">"ಸ್ಥಳವನ್ನು ಬಳಸಿ"</string>
<string name="location_settings_footer" msgid="296892848338100051">"ಸ್ಥಳವು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಅಂದಾಜು ಮಾಡಲು ಸಹಾಯ ಮಾಡುವುದಕ್ಕಾಗಿ GPS, ವೈಫೈ, ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳು ಮತ್ತು ಸೆನ್ಸರ್ಗಳಂತಹ ಮೂಲಗಳನ್ನು ಬಳಸಬಹುದು."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ಡ್ರೈವರ್ಗೆ ಸಹಾಯ"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ಡ್ರೈವರ್ಗೆ ಸಹಾಯ ಮಾಡುವ ಆ್ಯಪ್ಗಳಿಗೆ ಕಳುಹಿಸಲಾಗುವ ಸ್ಥಳದ ಮಾಹಿತಿಯು ನಿಮ್ಮನ್ನು ಗುರುತಿಸುವಂತಹ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿರುವುದಿಲ್ಲ. ಅಳಿಸುವ ಮೊದಲು ಅದನ್ನು ಗರಿಷ್ಠ 2 ದಿನಗಳವರೆಗೆ ಸಂಗ್ರಹಿಸಿಡಲಾಗುತ್ತದೆ."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"ಮೈಕ್ರೋಫೋನ್"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಬಳಸಿ"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳಿಗೆ ಅನುಮತಿಸಿ"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"ಇತ್ತೀಚಿಗೆ ಪ್ರವೇಶಿಸಿರುವುದು"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"ಇತ್ತೀಚಿನ ಯಾವುದೇ ಆ್ಯಪ್ಗಳಿಲ್ಲ"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 ಆ್ಯಪ್ಗಳಿಗೆ ಪ್ರವೇಶವಿದೆ"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count} ಆ್ಯಪ್ಗಳಲ್ಲಿನ # ಗೆ ಪ್ರವೇಶವಿದೆ}one{{total_count} ಆ್ಯಪ್ಗಳಲ್ಲಿನ # ಗಳಿಗೆ ಪ್ರವೇಶವಿದೆ}other{{total_count} ಆ್ಯಪ್ಗಳಲ್ಲಿನ # ಗಳಿಗೆ ಪ್ರವೇಶವಿದೆ}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"ಇತ್ತೀಚಿಗೆ ಪ್ರವೇಶಿಸಿರುವುದು"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"ಎಲ್ಲವನ್ನೂ ವೀಕ್ಷಿಸಿ"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"ಲೋಡ್ ಆಗುತ್ತಿದೆ…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"ಸಿಸ್ಟಂ"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"ಸಿಸ್ಟಂ ಅಪ್ಡೇಟ್ಗಳು"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"ಸುಧಾರಿತ"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"ಮೂರನೇ-ವ್ಯಕ್ತಿ ಪರವಾನಗಿಗಳು"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ಪರವಾನಗಿಗಳನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"ಲೋಡ್ ಆಗುತ್ತಿದೆ..."</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">ನೀವು ಇದೀಗ ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ಹಂತಗಳ ದೂರದಲ್ಲಿರುವಿರಿ.</item>
- <item quantity="other">ನೀವು ಇದೀಗ ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ಹಂತಗಳ ದೂರದಲ್ಲಿರುವಿರಿ.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ನೀವು ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ ಈಗ # ಹಂತದಷ್ಟು ದೂರದಲ್ಲಿದ್ದೀರಿ.}one{ನೀವು ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ ಈಗ # ಹಂತಗಳಷ್ಟು ದೂರದಲ್ಲಿದ್ದೀರಿ.}other{ನೀವು ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ ಈಗ # ಹಂತಗಳಷ್ಟು ದೂರದಲ್ಲಿದ್ದೀರಿ.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"ಇದೀಗ ನೀವು ಡೆವಲಪರ್!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"ಅಗತ್ಯವಿಲ್ಲ, ನೀವು ಈಗಾಗಲೇ ಡೆವಲಪರ್ ಆಗಿರುವಿರಿ."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ಡೆವಲಪರ್ ಆಯ್ಕೆಗಳು"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"ನೀವು ಹೊಸ ಪ್ರೊಫೈಲ್ ಅನ್ನು ರಚಿಸಿದ ನಂತರ, ಆ ವ್ಯಕ್ತಿಯು ಅದನ್ನು ತಮಗಾಗಿ ಕಸ್ಟಮೈಸ್ ಮಾಡಬೇಕು."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"ಇತರ ಎಲ್ಲಾ ಪ್ರೊಫೈಲ್ಗಳ ಬಳಕೆಗಾಗಿ ಯಾವುದೇ ಪ್ರೊಫೈಲ್ನಿಂದ ಆ್ಯಪ್ಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"ಪ್ರೊಫೈಲ್ನ ಮಿತಿಯನ್ನು ತಲುಪಿದ್ದೀರಿ"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">ನೀವು ಗರಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಪ್ರೊಫೈಲ್ಗಳನ್ನು ರಚಿಸಬಹುದು.</item>
- <item quantity="other">ನೀವು ಗರಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಪ್ರೊಫೈಲ್ಗಳನ್ನು ರಚಿಸಬಹುದು.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{ಒಂದು ಪ್ರೊಫೈಲ್ ಅನ್ನು ಮಾತ್ರ ರಚಿಸಬಹುದು.}one{ನೀವು ಗರಿಷ್ಠ # ಪ್ರೊಫೈಲ್ಗಳನ್ನು ರಚಿಸಬಹುದು.}other{ನೀವು ಗರಿಷ್ಠ # ಪ್ರೊಫೈಲ್ಗಳನ್ನು ರಚಿಸಬಹುದು.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"ಹೊಸ ಪ್ರೊಫೈಲ್ ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ಈ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಬೇಕೇ?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ಈ ಪ್ರೊಫೈಲ್ಗೆ ಸಂಬಂಧಿಸಿದ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"ಪ್ರೊಫೈಲ್ ಅಳಿಸಿಲ್ಲ. ಸಾಧನ ಆರಂಭಿಸಿ, ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"ನೀವು ಪ್ರೊಫೈಲ್ಗಳನ್ನು ಬದಲಾಯಿಸಿದಾಗ ಅಥವಾ ವಾಹನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿದಾಗ ಈ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ವಜಾಗೊಳಿಸಿ"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ಮರುಪ್ರಯತ್ನ"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"ಅನ್ಲಾಕ್ ನಮೂನೆಯನ್ನು ರಚಿಸುವುದು ಹೇಗೆ"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"ಪ್ಯಾಟರ್ನ್ ಉಳಿಸುವಲ್ಲಿ ದೋಷ"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"ಹಲವಾರು ತಪ್ಪು ಪ್ರಯತ್ನಗಳು. ಪುನಃ <xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡ್ಗಳ ನಂತರ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"ಪ್ಯಾಟರ್ನ್ ರೋಟರಿಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ, ಸ್ಪರ್ಶಿಸಿ"</string>
<string name="okay" msgid="4589873324439764349">"ಸರಿ"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ತೆಗೆದುಹಾಕಿ"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"ಇದು ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಯಾರು ಬೇಕಾದರೂ ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸುತ್ತದೆ"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು ಒಂದೇ ರೀತಿಯ ಪಿನ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿದ್ದಾರೆ. ಬೇರೆಯ ಪಿನ್ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"ಇದು ಅಮಾನ್ಯ ಅಕ್ಷರವನ್ನು ಒಳಗೊಂಡಿರಬಾರದು."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"ಪಾಸ್ವರ್ಡ್ ಅಮಾನ್ಯವಾಗಿದೆ, ಕನಿಷ್ಠ 4 ಅಕ್ಷರಗಳು ಇರಬೇಕು."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- <item quantity="other">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಲೋವರ್ ಕೇಸ್ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- <item quantity="other">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಲೋವರ್ ಕೇಸ್ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಅಪ್ಪರ್ ಕೇಸ್ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- <item quantity="other">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಅಪ್ಪರ್ ಕೇಸ್ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಅಂಕಿಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- <item quantity="other">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಅಂಕಿಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ವಿಶೇಷ ಸಂಕೇತಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- <item quantity="other">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ವಿಶೇಷ ಸಂಕೇತಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಅಕ್ಷರೇತರ ಕ್ಯಾರೆಕ್ಟರ್ಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- <item quantity="other">ಕನಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಅಕ್ಷರೇತರ ಕ್ಯಾರೆಕ್ಟರ್ಗಳನ್ನು ಹೊಂದಿರಬೇಕು</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ಇತ್ತೀಚಿನ ಪಾಸ್ವರ್ಡ್ ಬಳಸಲು ಸಾಧನದ ನಿರ್ವಾಹಕರು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="error_saving_password" msgid="8334882262622500658">"ಪಾಸ್ವರ್ಡ್ ಉಳಿಸುವಲ್ಲಿ ದೋಷ"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು ಒಂದೇ ರೀತಿಯ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿದ್ದಾರೆ. ಬೇರೆಯ ಪಾಸ್ವರ್ಡ್ ಪ್ರಯತ್ನಿಸಿ."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"ಒಂದು ಪ್ರೊಫೈಲ್ ಅನ್ನು ಸೇರಿಸಿ"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ಈ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಿ"</string>
<string name="add_profile_text" msgid="9118410102199116969">"ಪ್ರೊಫೈಲ್ ಅನ್ನು ಸೇರಿಸಿ"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ಡಿಸ್ಪ್ಲೇ ಪ್ರಖರತೆ"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"ನಿಮ್ಮ ಸಾಧನಗಳನ್ನು ನೋಡಲು, ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"ಸಾಧನವನ್ನು ಜೋಡಿಸಲು, ಬ್ಲೂಟೂತ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"ಇನ್ಫೋಟೈನ್ಮೆಂಟ್ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರು"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"ಸಕ್ರಿಯಗೊಂಡ ಆ್ಯಪ್ಗಳು"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"ನಿಷ್ಕ್ರಿಯಗೊಂಡ ಆ್ಯಪ್ಗಳು"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ಈ ಅನುಮತಿಯನ್ನು ಹೊಂದಿರುವ ಆ್ಯಪ್ಗಳು ಈ ವಾಹನದ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"ಯಾವುದೇ ವಾಹನ ನಿರ್ವಾಹಕ ಆ್ಯಪ್ಗಳಿಲ್ಲ"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"ಈ ಇನ್ಫೋಟೈನ್ಮೆಂಟ್ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕ ಆ್ಯಪ್ ಸಕ್ರಿಯವಾಗಿದೆ ಮತ್ತು ಈ ಕೆಳಗಿನ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"ಈ ಇನ್ಫೋಟೈನ್ಮೆಂಟ್ ಸಿಸ್ಟಂ ಆ್ಯಪ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಈ ಕೆಳಗಿನ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಲಾಗುತ್ತದೆ:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"ಈ ಇನ್ಫೋಟೈನ್ಮೆಂಟ್ ಸಿಸ್ಟಂ ಆ್ಯಪ್ ಸಕ್ರಿಯಗೊಳಿಸುವುದೇ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"ಈ ಇನ್ಫೋಟೈನ್ಮೆಂಟ್ ಸಿಸ್ಟಂ ಆ್ಯಪ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಮತ್ತು ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"ಈ ಇನ್ಫೋಟೈನ್ಮೆಂಟ್ ಸಿಸ್ಟಂ ಆ್ಯಪ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"ಇನ್ನಷ್ಟು ವಿವರಗಳು"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅನುಮತಿಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ಮತ್ತು ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಈ ಬಳಕೆದಾರರಿಗೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅನುಮತಿಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ಮತ್ತು ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಈ ಪ್ರೊಫೈಲ್ಗೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅನುಮತಿಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ಮತ್ತು ವಾಹನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಈ ಇನ್ಫೋಟೈನ್ಮೆಂಟ್ ಸಿಸ್ಟಂಗೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರು ಈ ಇನ್ಫೋಟೈನ್ಮೆಂಟ್ ಸಿಸ್ಟಂಗೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಲು, ಆ್ಯಪ್ಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಈ ವಾಹನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗಬಹುದು."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ಅದು ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"ಈ ನಿರ್ವಹಿಸಿದ ವಾಹನದಲ್ಲಿ ವಾಲ್ಯೂಮ್ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"ಈ ನಿರ್ವಹಿಸಿದ ವಾಹನದಲ್ಲಿ ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"ಈ ನಿರ್ವಹಿಸಿದ ವಾಹನದಲ್ಲಿ SMS ಅನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"ಈ ನಿರ್ವಹಿಸಿದ ವಾಹನದಲ್ಲಿ ಕ್ಯಾಮರಾ ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"ನಿರ್ವಹಿಸಿದ ಈ ವಾಹನದಲ್ಲಿ ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ತೆಗೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"ಈ ನಿರ್ವಹಿಸಿದ ವಾಹನದಲ್ಲಿ ಈ ಆ್ಯಪ್ ಅನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"ನಿಮ್ಮ ಕ್ರೆಡಿಟ್ ಒದಗಿಸುವವರಿಂದ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"ಕೆಲವು ವೈಶಿಷ್ಟ್ಯಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಸಂಸ್ಥೆಯು ನಿರ್ಬಂಧಿಸಿದೆ.\n\nನೀವು ಪ್ರಶ್ನೆಗಳನ್ನು ಹೊಂದಿದ್ದರೆ, ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"ವಾಹನ ನಿರ್ವಹಣಾ ಆ್ಯಪ್ಗಳು"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# ಸಕ್ರಿಯಗೊಂಡ ಆ್ಯಪ್}one{# ಸಕ್ರಿಯಗೊಂಡ ಆ್ಯಪ್ಗಳು}other{# ಸಕ್ರಿಯಗೊಂಡ ಆ್ಯಪ್ಗಳು}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"ಯಾವುದೇ ಸಕ್ರಿಯಗೊಂಡ ಆ್ಯಪ್ಗಳಿಲ್ಲ"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ವಾಹನ ನೀತಿ"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರಿಂದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿರ್ವಹಿಸಲಾಗಿದೆ"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"ಬಗ್ ವರದಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳುವುದೇ?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"ಈ ವಾಹನದ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರು ಈ ಸಾಧನದ ಸಮಸ್ಯೆ ನಿವಾರಿಸಲು ಸಹಾಯ ಮಾಡಲು ಬಗ್ ವರದಿಯನ್ನು ವಿನಂತಿಸಿದ್ದಾರೆ. ಆ್ಯಪ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"ಈ ವಾಹನದ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರು ಈ ಸಾಧನದ ಸಮಸ್ಯೆ ನಿವಾರಿಸಲು ಸಹಾಯ ಮಾಡಲು ಬಗ್ ವರದಿಯನ್ನು ವಿನಂತಿಸಿದ್ದಾರೆ. ಆ್ಯಪ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಸಾಧನವು ತಾತ್ಕಾಲಿಕವಾಗಿ ನಿಧಾನಗೊಳ್ಳಬಹುದು."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"ಈ ಬಗ್ ವರದಿಯನ್ನು ಈ ವಾಹನದ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ. ಹೆಚ್ಚಿನ ವಿವರಗಳಿಗಾಗಿ ಅವರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"ನಿರಾಕರಿಸಿ"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸದ್ಯಕ್ಕೆ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ಪ್ರವೇಶಿಸುವಿಕೆ"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"ಶೀರ್ಷಿಕೆಗಳು"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"ಶೀರ್ಷಿಕೆ ಆದ್ಯತೆಗಳು"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ಆಫ್ ಆಗಿದೆ"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ಆನ್ ಆಗಿದೆ"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"ಸ್ಕ್ರೀನ್ ರೀಡರ್"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"ಶೀರ್ಷಿಕೆಗಳನ್ನು ತೋರಿಸಿ"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ಪಠ್ಯ ಗಾತ್ರ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"ಶೀರ್ಷಿಕೆಯ ಗಾತ್ರ ಮತ್ತು ಶೈಲಿ"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"ತುಂಬಾ ಸಣ್ಣದು"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"ಚಿಕ್ಕದು"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ಡೀಫಾಲ್ಟ್"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ದೊಡ್ಡದು"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ತುಂಬಾ ದೊಡ್ಡದು"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"ಶೀರ್ಷಿಕೆಯ ಶೈಲಿ"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ಆ್ಯಪ್ ಮೂಲಕ ಹೊಂದಿಸಿ"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"ಕಪ್ಪಿನ ಮೇಲೆ ಬಿಳಿ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"ಬಿಳಿಯ ಮೇಲೆ ಕಪ್ಪು"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"ಕಪ್ಪಿನ ಮೇಲೆ ಹಳದಿ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"ನೀಲಿಯ ಮೇಲೆ ಹಳದಿ"</string>
</resources>
diff --git a/res/values-ko/arrays.xml b/res/values-ko/arrays.xml
index 96bba98..30421e2 100644
--- a/res/values-ko/arrays.xml
+++ b/res/values-ko/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"허용 안함"</item>
<item msgid="1154273129608299386">"항상 허용"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 98086a6..e209226 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"야간 모드"</string>
<string name="network_and_internet" msgid="4229023630498537530">"네트워크 및 인터넷"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"모바일 네트워크"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other">SIM <xliff:g id="COUNT_1">%1$d</xliff:g>개</item>
- <item quantity="one">SIM <xliff:g id="COUNT_0">%1$d</xliff:g>개</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{SIM #개}other{SIM #개}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"활성/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"비활성/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"활성/다운로드한 SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"추가"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"모바일 데이터"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"모바일 네트워크를 사용하여 데이터 액세스"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"모바일 네트워크"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"모바일 데이터 사용"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"모바일 데이터를 사용 중지하시겠습니까?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"선택 필요"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"<xliff:g id="CARRIER">%1$s</xliff:g>의 모바일 데이터를 사용하시겠습니까?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> 데이터 경고"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"데이터 한도 <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> 데이터 경고/데이터 한도 <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d일 남음</item>
- <item quantity="one">%d일 남음</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{#일 남음}other{#일 남음}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"남은 시간 없음"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1일 미만 남음"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> 전에 <xliff:g id="ID_1">^1</xliff:g>에서 업데이트함"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"설정"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"데이터 경고 및 한도"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"앱 데이터 사용량 주기"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"모바일 데이터 사용량"</string>
<string name="set_data_warning" msgid="6628236612886588097">"데이터 경고 설정"</string>
<string name="data_warning" msgid="116776633806885370">"데이터 경고"</string>
<string name="set_data_limit" msgid="7136539812414500084">"데이터 한도 설정"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"설정한 모바일 데이터 한도에 도달하면 차량에서 모바일 데이터를 사용 중지합니다.\n\n데이터 사용량은 헤드 유닛에서 측정되며 이동통신사에서 사용량을 다르게 계산할 수 있으므로 한도를 낮게 설정해 보세요."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"데이터 사용 경고 설정"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"데이터 사용 한도"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"데이터 사용량은 기기에서 측정됩니다. 이동통신사의 데이터와 다를 수 있습니다."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"설정"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"저장"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM 네트워크"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"차량 인터넷"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"차량 인터넷을 사용 중지하면 일부 차량 기능이나 앱이 작동하지 않을 수 있습니다.\n\n차량 작동에 필요한 주요 데이터는 차량 제조업체와 계속 공유됩니다."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"무시하고 사용 중지"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"차량 인터넷이 사용 중지되었습니다. 일부 차량 기능이나 앱이 작동하지 않을 수 있습니다. 차량 작동에 필요한 주요 데이터는 차량 제조업체와 계속 공유됩니다."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s 사용됨, %2$s~%3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"다른 네트워크에 연결"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"네트워크 환경설정"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"네트워크 추가"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"연결"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"연결 중…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"연결되지 않음"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"범위 안에 네트워크가 없음"</string>
<string name="wifi_password" msgid="5565632142720292397">"비밀번호"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"비밀번호 표시"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi‑Fi 핫스팟 대역 한 개 이상 선택"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"핫스팟 및 테더링"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"핫스팟"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"사용 안함"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"자동으로 핫스팟 사용 중지"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"연결된 기기가 없으면 Wi‑Fi 핫스팟이 사용 중지됩니다."</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g>에서 Wi-Fi를 사용 설정하려고 합니다."</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"강제 종료"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"강제 종료하시겠습니까?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"앱을 강제 종료하면 예기치 않은 오류가 발생할 수 있습니다."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"성능 보호 기능을 사용 중지하시겠습니까?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"사용 중지하면 소프트웨어와 하드웨어가 제대로 작동하지 않을 수 있습니다."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"계속 사용"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"사용 중지"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"앱 성능 우선순위 지정을 사용 설정하시겠습니까?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"사용 설정하면 잠재적으로 시스템이 불안정해지거나 장기적인 하드웨어 문제가 발생할 수 있습니다. 계속하시겠어요?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"예"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"아니요"</string>
<string name="disable_text" msgid="4358165448648990820">"사용 중지"</string>
<string name="enable_text" msgid="1794971777861881238">"사용"</string>
<string name="uninstall_text" msgid="277907956072833012">"제거"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"권한"</string>
<string name="notifications_label" msgid="6586089149665170731">"알림"</string>
<string name="storage_application_label" msgid="5911779903670978586">"저장용량 및 캐시"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"최대 성능 보장"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"앱 성능 우선순위 지정"</string>
<string name="application_version_label" msgid="8556889839783311649">"버전: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"부여된 권한이 없습니다."</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"요청한 권한이 없습니다."</string>
<string name="unused_apps" msgid="648471933781010395">"사용하지 않는 앱"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">사용하지 않는 앱 <xliff:g id="COUNT_1">%d</xliff:g>개</item>
- <item quantity="one">사용하지 않는 앱 <xliff:g id="COUNT_0">%d</xliff:g>개</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{사용하지 않는 앱 #개}other{사용하지 않는 앱 #개}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"권한을 삭제하고 여유 공간 확보"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"내부 저장소의 %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"필요한 경우 과도한 리소스 사용을 방지하기 위해 앱을 닫습니다."</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"시스템 리소스를 사용하여 앱 성능 우선순위를 지정합니다."</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"데이터 사용량"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"앱 데이터 사용량"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"사용량 내역"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"모든 앱"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"데이터 및 Wi‑Fi 사용량"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"사용량 내역"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"총 사용량"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"포그라운드"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"백그라운드"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"데이터 허용"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"앱에서 모바일 데이터를 사용하도록 허용"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"데이터 제한"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"앱이 포그라운드에 있을 때만 모바일 데이터 사용"</string>
<string name="computing_size" msgid="5791407621793083965">"계산 중..."</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other">추가 권한 <xliff:g id="COUNT_1">%d</xliff:g>개</item>
- <item quantity="one">추가 권한 <xliff:g id="COUNT_0">%d</xliff:g>개</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{추가 권한 #개}other{추가 권한 #개}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"참고: 재부팅한 후 이 앱은 차량을 잠금 해제할 때까지 시작할 수 없습니다."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"어시스트 및 음성 입력"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"지원 앱"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi 제어를 사용하면 앱에서 Wi-Fi를 사용 또는 사용 중지하고, Wi-Fi 네트워크를 검색 및 연결하고, 네트워크를 추가 또는 제거하며, 로컬 전용 핫스팟을 시작하도록 허용합니다."</string>
<string name="more_special_access_title" msgid="166115485446645971">"더보기"</string>
<string name="location_settings_title" msgid="901334356682423679">"위치"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"위치 사용"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"지정한 앱이 내 위치에 액세스하도록 허용합니다."</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"이 기능을 끄면 모든 앱의 위치 액세스 권한이 삭제됩니다. 운전자 지원 앱은 계속 내 위치에 액세스할 수 있습니다."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"운전자 지원에서 위치 사용"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"자동차 위치 사용 중지됨"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"운전자 지원 앱이 내 위치 정보에 액세스할 수 없음"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"변경"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"운전 지원 앱이 내 위치에 액세스하도록 허용합니다."</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"기능을 끄면 위치 정보를 사용하는 운전자 지원 앱이 사용 중지됩니다."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"무시하고 사용 중지"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"최근 위치 요청"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"최근 위치 요청 없음"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"앱 수준 권한"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"위치 서비스"</string>
<string name="location_use_location_title" msgid="117735895374606680">"위치 사용"</string>
<string name="location_settings_footer" msgid="296892848338100051">"기기의 위치를 추정하는 데 GPS, Wi-Fi, 모바일 네트워크, 센서 등의 데이터가 사용될 수 있습니다."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"운전자 지원"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"운전자 지원 앱에 전송되는 위치 정보에는 개인 식별 정보가 포함되지 않습니다. 정보는 최대 2일 동안 보관된 후 삭제됩니다."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"마이크"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"마이크 사용"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"모든 앱이 마이크에 액세스하도록 허용"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"마이크 권한 관리"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"최근 액세스함"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"최근에 사용한 앱 없음"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"앱 0개에 액세스 권한이 있음"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{앱 #/{total_count}개에 액세스 권한이 있음}other{앱 #/{total_count}개에 액세스 권한이 있음}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"최근 액세스함"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"모두 보기"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"로드 중…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"시스템"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"시스템 업데이트"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"고급"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"타사 라이선스"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"라이선스를 로드하는 동안 문제가 발생했습니다."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"로드 중…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">개발자가 되려면 <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>단계가 남았습니다.</item>
- <item quantity="one">개발자가 되려면 <xliff:g id="STEP_COUNT_0">%1$d</xliff:g>단계가 남았습니다.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{개발자가 되려면 #단계가 남았습니다.}other{개발자가 되려면 #단계가 남았습니다.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"개발자가 되셨습니다."</string>
<string name="show_dev_already" msgid="1678087328973865736">"이미 개발자입니다."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"개발자 옵션"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"새 프로필을 만들고 나면 사용자가 직접 프로필을 맞춤설정해야 합니다."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"어떤 프로필에서든 앱을 업데이트하여 다른 모든 프로필에 적용할 수 있습니다."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"최대 프로필 개수에 도달"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">최대 <xliff:g id="COUNT">%d</xliff:g>개의 프로필을 만들 수 있습니다.</item>
- <item quantity="one">프로필은 1개만 만들 수 있습니다.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{프로필은 1개만 만들 수 있습니다.}other{최대 #개의 프로필을 만들 수 있습니다.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"새 프로필을 만들 수 없음"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"프로필을 삭제하시겠습니까?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"이 프로필의 모든 앱과 데이터가 삭제됩니다."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"프로필을 삭제할 수 없음"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"프로필을 삭제할 수 없음: 기기를 다시 시작한 후 시도해 보세요"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"이 프로필은 프로필을 전환하거나 차량을 다시 시작할 때 삭제됩니다"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"닫기"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"재시도"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"잠금해제 패턴을 그리는 방법"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"패턴 저장 중 오류 발생"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"잘못 시도한 횟수가 너무 많습니다. <xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도해 주세요."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"패턴에는 로터리 입력이 지원되지 않습니다. 터치를 사용하세요."</string>
<string name="okay" msgid="4589873324439764349">"확인"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"화면 잠금을 삭제하시겠습니까?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"화면 잠금을 삭제하면 누구나 계정에 액세스할 수 있습니다."</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"IT 관리자가 일반적으로 사용되는 PIN을 차단했습니다. 다른 PIN을 시도해 보세요."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"잘못된 문자를 포함할 수 없습니다."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"비밀번호는 4자 이상이어야 합니다."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">문자를 <xliff:g id="COUNT">%d</xliff:g>개 이상 포함해야 합니다.</item>
- <item quantity="one">문자를 1개 이상 포함해야 합니다.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">소문자를 <xliff:g id="COUNT">%d</xliff:g>개 이상 포함해야 합니다.</item>
- <item quantity="one">소문자를 1개 이상 포함해야 합니다.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">대문자를 <xliff:g id="COUNT">%d</xliff:g>개 이상 포함해야 합니다.</item>
- <item quantity="one">대문자를 1개 이상 포함해야 합니다.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">숫자를 <xliff:g id="COUNT">%d</xliff:g>개 이상 포함해야 합니다.</item>
- <item quantity="one">숫자를 1개 이상 포함해야 합니다.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">특수 기호를 <xliff:g id="COUNT">%d</xliff:g>개 이상 포함해야 합니다.</item>
- <item quantity="one">특수 기호를 1개 이상 포함해야 합니다.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">글자가 아닌 문자를 <xliff:g id="COUNT">%d</xliff:g>개 이상 포함해야 합니다.</item>
- <item quantity="one">글자가 아닌 문자를 1개 이상 포함해야 합니다.</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"기기 관리자가 최근 비밀번호 사용을 허용하지 않습니다."</string>
<string name="error_saving_password" msgid="8334882262622500658">"비밀번호 저장 중 오류 발생"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"IT 관리자가 일반적으로 사용되는 비밀번호를 차단했습니다. 다른 비밀번호로 시도해 보세요."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"프로필 추가"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"이 프로필 삭제"</string>
<string name="add_profile_text" msgid="9118410102199116969">"프로필 추가"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"디스플레이 밝기"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"기기를 표시하려면 블루투스를 사용 설정하세요."</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"기기를 페어링하려면 블루투스 설정을 여세요."</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"인포테인먼트 시스템 관리자"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"활성화된 앱"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"비활성화된 앱"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"이 권한을 가진 앱은 차량 데이터에 액세스할 수 있습니다."</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"차량 관리자 앱 없음"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"인포테인먼트 시스템 관리자 앱이 활성화되어 있으며, <xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 다음 작업을 처리하도록 허용합니다."</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"인포테인먼트 시스템 앱을 활성화하면 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 다음 작업을 처리할 수 있습니다."</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"인포테인먼트 시스템 앱을 활성화하시겠습니까?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"인포테인먼트 시스템 앱 활성화"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"비활성화 및 제거"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"인포테인먼트 시스템 앱 비활성화"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"세부정보 더보기"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"조직 관리자는 이 프로필과 연결된 앱 및 데이터를 모니터링하고 관리할 수 있습니다. 여기에는 설정, 권한, 기업 액세스, 네트워크 활동, 차량의 위치 정보가 포함됩니다."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"조직 관리자는 이 프로필과 연결된 앱 및 데이터를 모니터링하고 관리할 수 있습니다. 여기에는 설정, 권한, 기업 액세스, 네트워크 활동, 기기의 위치 정보가 포함됩니다."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"조직 관리자는 이 인포테인먼트 시스템과 연결된 앱 및 데이터를 모니터링하고 관리할 수 있습니다. 여기에는 설정, 권한, 기업 액세스, 네트워크 활동, 차량의 위치 정보가 포함됩니다."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"조직 관리자는 이 인포테인먼트 시스템과 연결된 데이터에 액세스하고 앱을 관리하며 차량 설정을 변경할 수 있습니다."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"사용할 수 없음"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"관리되는 차량의 볼륨을 변경할 수 없음"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"관리되는 차량에서 전화를 걸 수 없음"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"관리되는 차량에서 SMS를 사용할 수 없음"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"관리되는 차량의 카메라를 사용할 수 없음"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"관리되는 차량에서 스크린샷을 찍을 수 없음"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"관리되는 차량에서 앱을 열 수 없음"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"신용 상품 제공업체에서 차단했습니다"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"조직에서 일부 기능에 대한 액세스를 제한했습니다.\n\n궁금한 점이 있으면 조직 관리자에게 문의하세요."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"차량 관리자 앱"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{활성화된 앱 #개}other{활성화된 앱 #개}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"활성화된 앱 없음"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> 차량 정책"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"조직 관리자가 관리하는 설정"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> 자세히 알아보기"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"버그 신고를 공유하시겠습니까?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"차량의 조직 관리자가 이 기기의 문제를 해결하기 위해 버그 신고를 요청했습니다. 앱과 데이터가 공유될 수 있습니다."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"차량의 조직 관리자가 이 기기의 문제를 해결하기 위해 버그 신고를 요청했습니다. 앱과 데이터가 공유될 수 있으며 기기 속도가 일시적으로 느려질 수 있습니다."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"버그 신고는 차량의 조직 관리자와 공유됩니다. 자세한 내용은 관리자에게 문의하세요."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"공유"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"거부"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"지금은 이 설정을 변경할 수 없습니다."</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"접근성"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"자막"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"자막 환경설정"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"꺼짐"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"켜짐"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"스크린 리더"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"자막 보기"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"텍스트 크기"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"자막 크기 및 스타일"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"아주 작게"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"작게"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"기본"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"크게"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"아주 크게"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"자막 스타일"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"앱에 의해 설정됨"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"검은색 바탕에 흰색"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"흰색 바탕에 검은색"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"검은색 바탕에 노란색"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"파란색 바탕에 노란색"</string>
</resources>
diff --git a/res/values-ky/arrays.xml b/res/values-ky/arrays.xml
index ce983c4..1876ad2 100644
--- a/res/values-ky/arrays.xml
+++ b/res/values-ky/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Эч качан уруксат жок"</item>
<item msgid="1154273129608299386">"Дайым уруксат"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 81ffb76..21ec4cc 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Түнкү режим"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Тармак жана Интернет"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Мобилдик тармак"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM карта</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM карта</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM карта}other{# SIM карта}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Активдүү / SIM-карта"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Активдүү эмес / SIM-карта"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Активдүү / Жүктөлүп алынган SIM-карта"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Дагы кошуу"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобилдик Интернет"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Интернетке мобилдик тармак аркылуу чыгуу"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Мобилдик тармак"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Мобилдик трафикти колдонуу"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Мобилдик Интернетти өчүрөсүзбү?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Тандоо керек"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"<xliff:g id="CARRIER">%1$s</xliff:g> Интернети колдонулсунбу?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Качан эскертүү берилет: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Трафик чектелген: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Качан эскертүү берилет: <xliff:g id="ID_1">^1</xliff:g> / Трафик чектелген: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d күн калды</item>
- <item quantity="one">%d күн калды</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# күн калды}other{# күн калды}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Убакыт калган жок"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 күнгө жетпеген убакыт калды"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> тарабынан <xliff:g id="ID_2">^2</xliff:g> мурда жаңырды"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Коюу"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Трафик жана чектөөлөр"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Статистика цикли"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Мобилдик трафик"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Трафик тууралуу эскертүү"</string>
<string name="data_warning" msgid="116776633806885370">"Трафик тууралуу эскертүү"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Трафикти чектөө"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Белгиленген чекке жеткенде, унааңыздын негизги тутуму мобилдик Интернетти өчүрөт.\n\nТелефонуңуздун статистикасы менен байланыш операторунун статистикасы аздыр-көптүр айырмалангандыктан, чекти кабелтең коюңуз."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Интернеттин сарпталышы жөнүндө эскертүү"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Трафикти чектөө"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Дайын-даректердин өткөрүлүшүн түзмөгүңүз эсептеп турат. Ал мобилдик байланыш операторунун трафигинен айырмаланышы мүмкүн."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Коюу"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Сактоо"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM тармагы"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Унаанын Интернети"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Унаанын Интернетин өчүрсөңүз, андагы айрым функциялар же колдонмолор иштебеши мүмкүн.\n\nУнааңызды иштетүү үчүн керектелген маалымат унаанын өндүрүүчүсү менен бөлүшүлө берет."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Баары бир өчүрүү"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Унаанын Интернети өчүк. Андагы айрым функциялар же колдонмолор иштебеши мүмкүн. Унааңызды иштетүү үчүн керектелген маалымат унаанын өндүрүүчүсү менен бөлүшүлө берет."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s баштап %3$s чейин %1$s колдонулду"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Башка тармакка кошулуу"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Тармак жөндөөлөрү"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Тармак кошуу"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Туташуу"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Туташууда…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Туташкан жок"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Тармак тейлөө аймагында эмес"</string>
<string name="wifi_password" msgid="5565632142720292397">"Сырсөз"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Сырсөздү көрсөтүү"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi‑Fi байланыш түйүнүн иштетүү үчүн кеминде бир жыштыкты тандаңыз:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Байланыш түйүнү жана модем режими"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Байланыш түйүнү"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Өчүк"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Байланыш түйүнү автоматтык түрдө өчөт"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Бир дагы түзмөк туташпаса, Wi‑Fi байланыш түйүнү автоматтык түрдө өчүп калат"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> WiFi\'ды күйгүзгөнү жатат"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Мажбурлап токтотуу"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Токтотулсунбу?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Колдонмону мажбурлап токтотсоңуз, ал туура эмес иштеп калышы мүмкүн."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Майнаптуулукту коргоо күйгүзүлсүнбү?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Эгер өчүрсөңүз, программа менен аппараттык камсыздоо да иштебей калышы мүмкүн."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Күйгөн боюнча калтыруу"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Өчүрүү"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Колдонмонун иштешине артыкчылык берилсинби?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Муну күйгүзсөңүз, тутум туруктуу иштебей же аппараттык камсыздоого кедергиси тийиши мүмкүн. Улантасызбы?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ооба"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Жок, рахмат"</string>
<string name="disable_text" msgid="4358165448648990820">"Өчүрүү"</string>
<string name="enable_text" msgid="1794971777861881238">"Иштетүү"</string>
<string name="uninstall_text" msgid="277907956072833012">"Чыгарып салуу"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Уруксаттар"</string>
<string name="notifications_label" msgid="6586089149665170731">"Билдирмелер"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Сактагыч жана кеш"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Майнаптуулукту камсыздоо"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Колдонмонун иштешине артыкчылык берилсин"</string>
<string name="application_version_label" msgid="8556889839783311649">"Версиясы: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Бир да уруксат берилген жок"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Бир да уруксат суралган жок"</string>
<string name="unused_apps" msgid="648471933781010395">"Колдонулбаган колдонмолор"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> колдонулбаган колдонмо</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> колдонулбаган колдонмо</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# иштетилбеген колдонмо}other{# иштетилбеген колдонмо}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Уруксаттарды өчүрүп, орун бошотуу"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"Ички сактагычтын %s ээлеп турат"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Керек болгондо колдонмону жаап, булактардын ашыкча колдонулушуна тоскоол болуңуз"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Колдонмонун иштешине артыкчылык берүү үчүн тутумдун ресурстарын колдонот"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Маалымат алмашуу"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Колдонмолордун трафиги"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Колдонуу таржымалы"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Бардык колдонмолор"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Мобилдик трафик ж-а Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Колдонуу таржымалы"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Жалпы колдонулушу"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Активдүү режим"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Фон"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Трафикке уруксат берүү"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Бул колдонмо мобилдик трафикти пайдалана берсин"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Трафикти чектөө"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Колдонмо активдүү режимде болгондо гана мобилдик трафикти колдонуу"</string>
<string name="computing_size" msgid="5791407621793083965">"Эсептелүүдө…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> кошумча уруксат берилди</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> кошумча уруксат берилди</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# кошумча уруксат берилди}other{# кошумча уруксат берилди}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Эскертүү: Өчүрүп-күйгүзгөндөн кийин, бул колдонмо унааңыздын кулпусу ачылмайынча иштебейт."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Жардамчы жана айтып киргизүү"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Көмөкчү колдонмо"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi\'ды көзөмөлдөө колдонмого Wi-Fi\'ды өчүрүп же күйгүзүүгө, Wi-Fi тармактарын издеп, аларга туташууга, тармактарды кошуп же алып салууга же жергиликтүү байланыш түйүнүн иштетүүгө уруксат берет."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Дагы"</string>
<string name="location_settings_title" msgid="901334356682423679">"Жайгашкан жер"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Жайгашкан жерди колдонуу"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Көрсөтүлгөн колдонмолорго кайда жүргөнүңүздү көрүүгө уруксат бериңиз"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Муну өчүрсөңүз, бардык колдонмолор кайда жүргөнүңүздү көрө албай калат, бирок Айдоочуга көмөктөш колдонмолорго көрүнө берет."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Айдоочуга көмөктөш функцияларга кайда жүргөнүмдү көрсөтүү"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Унаанын жайгашкан жерин аныктоо өчүк"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Айдоочуга көмөктөш колдонмолор кайда жүргөнүңүздү көрө албайт"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Өзгөртүү"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Унаада жардам берген колдонмолорго кайда жүргөнүңүздү көрүүгө уруксат бериңиз"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Эгер муну өчүрсөңүз, кайда жүргөнүңүз тууралуу маалыматты колдонгон Айдоочуга көмөктөш колдонмолор өчүрүлөт."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Баары бир өчүрүү"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Жакында изделген жерлер"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Жакында изделген жерлер жок"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Колдонмонун уруксаттары"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Жайгашкан жерди аныктоо кызматтары"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Жайгашкан жерди аныктоо"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Түзмөктүн жайгашкан жери GPS, Wi‑Fi, мобилдик тармактар жана сенсорлор аркылуу аныкталат."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Айдоочуга көмөктөш функциялар"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Айдоочуга көмөктөш колдонмолорго жөнөтүлгөн кайда жүргөнүңүз тууралуу маалыматта өздүгүңүздү аныктаган маалымат камтылбайт. Ал 2 күнгө чейин сакталып, андан кийин өчүрүлөт."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Микрофон"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Микрофонду колдонуу"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Бардык колдонмолорго микрофонуңузду пайдаланууга уруксат бериңиз"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Микрофонду колдонуу уруксаттарын башкаруу"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Жакында пайдалангандар"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Жакында бир да колдонмо пайдаланган жок"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Бир да колдонмо пайдалана албайт"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count} ичинен # колдонмо пайдалана алат}other{{total_count} ичинен # колдонмо пайдалана алат}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Жакында колдонулган"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Баарын көрүү"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Жүктөлүүдө…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Тутум"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Системанын жаңыртуулары"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Өркүндөтүлгөн"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Үчүнчү тараптын уруксаттамалары"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Уруксаттамалар жүктөлүп жатканда көйгөй келип чыкты."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Жүктөлүүдө…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Сиздин иштеп чыгуучу болушуңузга <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кадам калды.</item>
- <item quantity="one">Сиздин иштеп чыгуучу болушуңузга <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> кадам калды.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Сиздин иштеп чыгуучу болушуңузга # кадам калды.}other{Сиздин иштеп чыгуучу болушуңузга # кадам калды.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Сиз иштеп чыгуучу болдуңуз!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Кереги жок, сиз иштеп чыгуучуболгонсуз."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Иштеп чыгуучунун параметрлери"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Жаңы профиль түзүлгөндөн кийин, ал аны өзүнө ыңгайлаштырып алышы керек."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Колдонуучулардын баары колдонмолорду бардык профилдер үчүн жаңырта алат."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Профилдердин саны чекке жетти"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> профилге чейин гана түзүүгө болот.</item>
- <item quantity="one">Бир профилди гана түзүүгө болот.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Бир профилди гана түзүүгө болот.}other{# профилге чейин гана түзүүгө болот.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Жаңы профиль түзүлбөй койду"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Бул профиль жок кылынсынбы?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Бул профилдеги бардык колдонмолор жана маалыматтар өчүрүлөт"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Профиль өчпөй койду."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Профиль өчүрүлдү. Түзмөктү өчүрүп-күйгүзүп, кайталап көрүңүз."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Профилдерди которуштуруп же унааны өчүрүп күйгүзгөнүңүздө, бул профиль өчүрүлөт."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Четке кагуу"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Кайталоо"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Графикалык ачкычты кантип тартуу керек"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Графикалык ачкычты сактоо катасы"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Туура эмес аракеттер өтө көп болду. <xliff:g id="NUMBER">%d</xliff:g> секунддан кийин кайталап көрүңүз."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Графикалык ачкычта буруу колдоого алынбайт, тийүүнү колдонуңуз"</string>
<string name="okay" msgid="4589873324439764349">"Жарайт"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Экранды кулпулабайсызбы?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Аккаунтуңузга каалаган киши кире берет"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Жөнөкөй PIN-коддорду коюу IT администраторуңуз тарабынан бөгөттөлгөн. Татаалыраак PIN-кодду коюп көрүңүз."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Бул жерде жараксыз белги камтылбашы керек."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Сырсөз жараксыз, кеминде 4 белгиден турушу керек."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Кеминде <xliff:g id="COUNT">%d</xliff:g> тамга болушу керек</item>
- <item quantity="one">Кеминде 1 тамга болушу керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Кеминде <xliff:g id="COUNT">%d</xliff:g> кичине тамга болушу керек</item>
- <item quantity="one">Кеминде 1 кичине тамга болушу керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Кеминде <xliff:g id="COUNT">%d</xliff:g> баш тамга болушу керек</item>
- <item quantity="one">Кеминде 1 баш тамга болушу керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Кеминде <xliff:g id="COUNT">%d</xliff:g> сан болушу керек</item>
- <item quantity="one">Кеминде 1 сан болушу керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Кеминде <xliff:g id="COUNT">%d</xliff:g> өзгөчө белги болушу керек</item>
- <item quantity="one">Кеминде 1 өзгөчө белги болушу керек</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Тамгадан башка кеминде <xliff:g id="COUNT">%d</xliff:g> белги болушу керек</item>
- <item quantity="one">Тамгадан башка кеминде 1 белги болушу керек</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Түзмөктүн администратору акыркы сырсөздү колдонууга тыюу салган"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Сырсөздү сактоо катасы"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Жөнөкөй сырсөздөрү коюу IT администраторуңуз тарабынан бөгөттөлгөн. Татаалыраак сырсөздү коюп көрүңүз."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Профиль кошуу"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Бул профилди өчүрүү"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Профиль кошуу"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Экрандын жарыктыгы"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Түзмөктөрдү көрүү үчүн Bluetooth\'ду күйгүзүңүз"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Түзмөктү жупташтыруу үчүн Bluetooth\'дун жөндөөлөрүн ачыңыз"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Инфозоок тутумунун администратору"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Иштетилген колдонмолор"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Өчүрүлгөн колдонмолор"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Мындай уруксат берилген колдонмолор ушул унаанын дайын-даректерин колдоно алышат"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Унааны башкарган колдонмолор жок"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Инфозоок тутуму башкарган колдонмо иштетилип, <xliff:g id="APP_NAME">%1$s</xliff:g> төмөнкү аракеттерди аткара алат:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Инфозоок тутуму колдонмосу иштетилгенде, <xliff:g id="APP_NAME">%1$s</xliff:g> төмөнкү аракеттерди аткара алат:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Бул инфозоок тутуму иштетилсинби?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Бул инфозоок тутуму колдонмосун иштетүү"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Өчүрүп, түзмөктөн чыгарып салуу"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Бул инфозоок тутуму колдонмосун өчүрүү"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Толук маалымат"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Уюмдун башкаруучусу бул профилге байланыштуу колдонмолор менен дайындарды, анын ичинде жөндөөлөр, уруксаттар, корпоративдик кирүү мүмкүнчүлүгү, Интернеттеги аракеттери жана унаанын жайгашкан жери тууралуу маалыматты көзөмөлдөй алат."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Уюмдун башкаруучусу бул профилге байланыштуу колдонмолор менен дайындарды, анын ичинде жөндөөлөр, уруксаттар, корпоративдик кирүү мүмкүнчүлүгү, Интернеттеги аракеттери жана түзмөктүн жайгашкан жери тууралуу маалыматты көзөмөлдөй алат."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Уюмдун башкаруучусу бул инфозоок тутуму менен байланыштуу колдонмолор менен дайындарды, анын ичинде жөндөөлөр, уруксаттар, корпоративдик кирүү мүмкүнчүлүгү, Интернеттеги аракеттери жана унаанын жайгашкан жери тууралуу маалыматты көзөмөлдөй алат."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Уюмдун башкаруучусу бул инфозоок тутуму менен байланышкан маалыматты көрүп, колдонмолорду башкарып, унаанын жөндөөлөрүн өзгөртө алат."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Ал жеткиликсиз"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Бул башкарылган унаанын үнүн өзгөртүүгө болбойт"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Бул башкарылган унаадан телефон чалууга болбойт"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Бул башкарылган унаадан SMS жөнөтүүгө болбойт"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Бул башкарылган унаанын камерасы жеткиликсиз"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Бул башкарылган унаада скриншотторду тартып алууга болбойт"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Бул башкарылган унаада бул колдонмону ачууга болбойт"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Насыя берүүчү тарабынан бөгөттөлдү"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Айрым функцияларды колдонуу мүмкүнчүлүгү уюм тарабынан чектелген.\n\nЭгер суроолоруңуз болсо, уюмдун башкаруучусуна кайрылыңыз."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Унааны башкаруучу колдонмолор"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# иштетилген колдонмо}other{# иштетилген колдонмо}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Иштетилген колдонмолор жок"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> уюмунун унаалар боюнча саясаты"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Жөндөөлөр уюмдун башкаруучусу тарабынан башкарылат"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> жөнүндө кеңири маалымат"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Мүчүлүштүк тууралуу кабарды бөлүшөсүзбү?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Бул унаанын уюмунун башкаруучусу түзмөктөгү бузулууларды аныктап оңдоо үчүн мүчүлүштүк тууралуу кабар берүүнү суранды. Колдонмолор менен дайындар бөлүшүлүшү мүмкүн."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Бул унаанын уюмунун башкаруучусу түзмөктөгү бузулууларды аныктап оңдоо үчүн мүчүлүштүк тууралуу кабар берүүнү суранды. Колдонмолор менен дайындар бөлүшүлүп, түзмөгүңүз жайыраак иштеп калышы мүмкүн."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Бул мүчүлүштүк тууралуу кабар унаанын уюмунун башкаруучусу менен бөлүшүлүүдө. Толук маалымат алуу үчүн ага кайрылыңыз."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Бөлүшүү"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Четке кагуу"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Бул жөндөөнү азыр өзгөртүүгө болбойт"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Атайын мүмкүнчүлүктөр"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Коштомо жазуулар"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Коштомо жазуулардын жөндөөлөрү"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Өчүк"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Күйүк"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Экрандагыны окугуч"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Коштомо жазууларды көрсөтүү"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Текст өлчөмү"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Коштомо жазуунун өлчөмү жана стили"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Өтө кичине"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Кичине"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Демейки"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Чоң"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Өтө чоң"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Коштомо жазуунун стили"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Колдонмо боюнча коюу"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Ак карада"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Кара акта"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Сары карада"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Сары көктө"</string>
</resources>
diff --git a/res/values-lo/arrays.xml b/res/values-lo/arrays.xml
index 5b5a2ae..70c5326 100644
--- a/res/values-lo/arrays.xml
+++ b/res/values-lo/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"ບໍ່ອະນຸຍາດ"</item>
<item msgid="1154273129608299386">"ອະນຸຍາດທຸກເທື່ອ"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 148fbd9..f955f93 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"ໂໝດກາງຄືນ"</string>
<string name="network_and_internet" msgid="4229023630498537530">"ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"ເຄືອຂ່າຍມືຖື"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# ຊິມ}other{# ຊິມ}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"ນຳໃຊ້ຢູ່ / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"ບໍ່ໄດ້ນຳໃຊ້ / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"ນຳໃຊ້ຢູ່ / SIM ທີ່ດາວໂຫລດແລ້ວ"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"ເພີ່ມອີກ"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"ອິນເຕີເນັດມືຖື"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ເຂົ້າເຖິງອິນເຕີເນັດໂດຍໃຊ້ເຄືອຂ່າຍມືຖື"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"ເຄືອຂ່າຍມືຖື"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"ໃຊ້ອິນເຕີເນັດມືຖື"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"ປິດອິນເຕີເນັດມືຖືບໍ?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"ຈໍາເປັນຕ້ອງເລືອກ"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"ໃຊ້ <xliff:g id="CARRIER">%1$s</xliff:g> ສຳລັບອິນເຕີເນັດມືຖືບໍ?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"ຄຳເຕືອນຂໍ້ມູນ <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"ຂີດຈຳກັດຂໍ້ມູນ <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"ຄຳເຕືອນຂໍ້ມູນ <xliff:g id="ID_1">^1</xliff:g> / ຂີດຈຳກັດຂໍ້ມູນ <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">ຍັງເຫຼືອ %d ມື້</item>
- <item quantity="one">ຍັງເຫຼືອ %d ມື້</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{ຍັງເຫຼືອອີກ # ມື້}other{ຍັງເຫຼືອອີກ # ມື້}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"ບໍ່ມີເວລາເຫຼືອ"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"ເຫຼືອໜ້ອຍກວ່າ 1 ມື້"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"ອັບເດດໂດຍ <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ນາທີກ່ອນ"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"ຕົກລົງ"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ຄຳເຕືອນ ແລະ ຂີດຈຳກັດອິນເຕີເນັດ"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"ຮອບການນຳໃຊ້ຂໍ້ມູນແອັບ"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"ການໃຊ້ອິນເຕີເນັດມືຖື"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ຕັ້ງຄ່າການເຕືອນອິນເຕີເນັດ"</string>
<string name="data_warning" msgid="116776633806885370">"ຄຳເຕືອນອິນເຕີເນັດ"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ຕັ້ງຄ່າຂີດຈຳກັດອິນເຕີເນັດ"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ລະບົບເຄື່ອງສຽງຂອງລົດທ່ານຈະປິດອິນເຕີເນັດມືຖື ເມື່ອມັນຮອດຂີດຈຳກັດທີ່ທ່ານຕັ້ງໄວ້.\n\nເພາະວ່າການໃຊ້ອິນເຕີເນັດຖືກວັດແທກໂດຍລະບົບເຄື່ອງສຽງ ແລະ ຜູ້ໃຫ້ບໍລິການອາດວັດແທກການໃຊ້ອິນເຕີເນັດແຕກຕ່າງກັນ, ສະນັ້ນ ກະລຸນາພິຈາລະນາກຳນົດຂີດຈຳກັດໂດຍເຜື່ອຈຳນວນໄວ້ນຳ."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ຕັ້ງຄ່າຄຳເຕືອນການນຳໃຊ້ຂໍ້ມູນ"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ຕັ້ງຄ່າຂີດຈຳກັດການນຳໃຊ້ຂໍ້ມູນ"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"ປະລິມານການໃຊ້ອິນເຕີເນັດຈະວັດແທກໂດຍອຸປະກອນຂອງທ່ານ. ມັນອາດຈະແຕກຕ່າງຈາກປະລິມານອິນເຕີເນັດຂອງຜູ້ໃຫ້ບໍລິການມືຖືຂອງທ່ານ."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"ຕົກລົງ"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"ບັນທຶກ"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"ເຄືອຂ່າຍ OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"ອິນເຕີເນັດຂອງພາຫະນະ"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"ການປິດອິນເຕີເນັດຂອງພາຫະນະອາດຈະເຮັດໃຫ້ບາງຄຸນສົມບັດ ຫຼື ແອັບຂອງພາຫະນະຢຸດເຮັດວຽກ.\n\nລະບົບຈະສືບຕໍ່ແບ່ງປັນອິນເຕີເນັດສຳຄັນທີ່ຈຳເປັນຕ້ອງໃຊ້ເພື່ອໃຫ້ພາຫະນະຂອງທ່ານເຮັດວຽກກັບຜູ້ຜະລິດພາຫະນະ."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"ຢືນຢັນການປິດ"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"ອິນເຕີເນັດຂອງພາຫະນະປິດຢູ່. ນີ້ອາດຈະເຮັດໃຫ້ບາງຄຸນສົມບັດ ຫຼື ແອັບຂອງພາຫະນະຢຸດເຮັດວຽກ. ລະບົບຈະສືບຕໍ່ແບ່ງປັນອິນເຕີເນັດສຳຄັນທີ່ຈຳເປັນຕ້ອງໃຊ້ເພື່ອໃຫ້ພາຫະນະຂອງທ່ານເຮັດວຽກກັບຜູ້ຜະລິດພາຫະນະ."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"ໃຊ້ແລ້ວ %1$s ແຕ່ %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"ເຂົ້າຮ່ວມເຄືອຂ່າຍອື່ນ"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"ການຕັ້ງຄ່າເຄືອຂ່າຍ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"ເພີ່ມເຄືອຂ່າຍ"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"ເຊື່ອມຕໍ່"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"ກຳລັງເຊື່ອມຕໍ່…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"ບໍ່ໄດ້ເຊື່ອມຕໍ່"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"ເຄືອຂ່າຍບໍ່ຢູ່ໃນໄລຍະ"</string>
<string name="wifi_password" msgid="5565632142720292397">"ລະຫັດຜ່ານ"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"ສະແດງລະຫັດຜ່ານ"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"ເລືອກຢ່າງໜ້ອຍໜຶ່ງຄື້ນສຳລັບ Wi‑Fi ຮັອດສະປອດ:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ຮັອດສະປອດ ແລະ ການປ່ອຍສັນຍານ"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ຮັອດສະປອດ"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ປິດ"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"ປິດຮັອດສະປອດອັດຕະໂນມັດ"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"ຮັອດສະປອດ Wi‑Fi ຈະປິດຖ້າບໍ່ມີອຸປະກອນເຊື່ອມຕໍ່"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ຕ້ອງການເປີດໃຊ້ Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"ບັງຄັບຢຸດ"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"ບັງຄັບປິດບໍ?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"ຖ້າທ່ານບັງຄັບປິດແອັບໃດໜຶ່ງ, ມັນອາດເຮັດວຽກຜິດປົກກະຕິໄດ້."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"ປິດການປົກປ້ອງປະສິດທິພາບບໍ?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"ຖ້າທ່ານປິດການນຳໃຊ້, ຊອບແວ ແລະ ຮາດແວຂອງທ່ານອາດຈະບໍ່ເຮັດວຽກເຊັ່ນກັນ."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ເປີດໄວ້"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"ປິດໄວ້"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"ເປີດໃຫ້ຄວາມສຳຄັນແກ່ປະສິດທິພາບແອັບບໍ?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"ການເປີດມັນສາມາດອາດຈະເຮັດໃຫ້ລະບົບບໍ່ສະຖຽນກໍເປັນໄດ້ ຫຼື ຜົນກະທົບໄລຍະຍາວຕໍ່ກັບຮາດແວ. ທ່ານຕ້ອງການດຳເນີນການຕໍ່ບໍ່?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"ແມ່ນ"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"ບໍ່, ຂອບໃຈ"</string>
<string name="disable_text" msgid="4358165448648990820">"ປິດນຳໃຊ້"</string>
<string name="enable_text" msgid="1794971777861881238">"ເປິດນຳໃຊ້"</string>
<string name="uninstall_text" msgid="277907956072833012">"ຖອນການຕິດຕັ້ງ"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"ການອະນຸຍາດ"</string>
<string name="notifications_label" msgid="6586089149665170731">"ການແຈ້ງເຕືອນ"</string>
<string name="storage_application_label" msgid="5911779903670978586">"ບ່ອນຈັດເກັບຂໍ້ມູນ ແລະ ແຄສ"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"ຮັບປະກັນປະສິດທິພາບສູງສຸດ"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ໃຫ້ຄວາມສຳຄັນແກ່ປະສິດທິພາບແອັບ"</string>
<string name="application_version_label" msgid="8556889839783311649">"ເວີຊັນ: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ບໍ່ໄດ້ໃຫ້ການອະນຸຍາດໃດ"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ບໍ່ມີການຮ້ອງຂໍການອະນຸຍາດໃດ"</string>
<string name="unused_apps" msgid="648471933781010395">"ແອັບທີ່ບໍ່ໄດ້ໃຊ້"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ແອັບທີ່ບໍ່ໄດ້ໃຊ້</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ແອັບທີ່ບໍ່ໄດ້ໃຊ້</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ແອັບທີ່ບໍ່ໄດ້ໃຊ້}other{# ແອັບທີ່ບໍ່ໄດ້ໃຊ້}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"ລຶບການອະນຸຍາດອອກ ແລະ ຂະຫຍາຍພື້ນທີ່ຫວ່າງ"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s ໃນພື້ນທີ່ຈັດເກັບພາຍໃນ"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"ເມື່ອຈຳເປັນ, ກະລຸນາປິດແອັບເພື່ອຫຼີກເວັ້ນການນຳໃຊ້ຊັບພະຍາກອນຫຼາຍເກີນໄປ"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ໃຊ້ຊັບພະຍາກອນລະບົບເພື່ອໃຫ້ຄວາມສຳຄັນແກ່ປະສິດທິພາບແອັບ"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ການໃຊ້ຂໍ້ມູນ"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ການໃຊ້ຂໍ້ມູນແອັບ"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"ປະຫວັດການໃຊ້"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"ແອັບທັງໝົດ"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ການໃຊ້ອິນເຕີເນັດ ແລະ Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"ປະຫວັດການໃຊ້"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"ການໃຊ້ທັງໝົດ"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ພື້ນໜ້າ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ພື້ນຫຼັງ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ອະນຸຍາດອິນເຕີເນັດ"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"ອະນຸຍາດໃຫ້ແອັບນີ້ໃຊ້ອິນເຕີເນັດມືຖື"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ຈຳກັດອິນເຕີເນັດ"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ໃຊ້ອິນເຕີເນັດມືຖືເມື່ອແອັບຢູ່ໃນພື້ນໜ້າເທົ່ານັ້ນ"</string>
<string name="computing_size" msgid="5791407621793083965">"ກຳລັງຄຳນວນ..."</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ການອະນຸຍາດເພີ່ມເຕີມ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ການອະນຸຍາດເພີ່ມເຕີມ</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# ການອະນຸຍາດເພີ່ມເຕີມ}other{# ການອະນຸຍາດເພີ່ມເຕີມ}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"ໝາຍເຫດ: ຫຼັງຈາກເປີດຂຶ້ນມາໃໝ່ແລ້ວ, ແອັບນີ້ຈະບໍ່ສາມາດເລີ່ມໄດ້ຈົນກວ່າທ່ານຈະປົດລັອກອຸປະກອນຂອງທ່ານ."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ການຊ່ວຍເຫຼືອ ແລະ ການປ້ອນຂໍ້ມູນດ້ວຍສຽງ"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"ແອັບຜູ້ຊ່ວຍ"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"ການຄວບຄຸມ Wi-Fi ອະນຸຍາດໃຫ້ແອັບເປີດ ຫຼື ປິດ Wi-Fi, ສະແກນ ແລະ ເຊື່ອມຕໍ່ກັບເຄືອຂ່າຍ Wi-Fi, ເພີ່ມ ຫຼື ລຶບເຄືອຂ່າຍອອກ ຫຼື ເລີ່ມຮັອດສະປອດສະເພາະພື້ນທີ່ໄດ້."</string>
<string name="more_special_access_title" msgid="166115485446645971">"ເພີ່ມເຕີມ"</string>
<string name="location_settings_title" msgid="901334356682423679">"ສະຖານທີ່"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"ໃຊ້ສະຖານທີ່"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"ອະນຸຍາດໃຫ້ແອັບທີ່ທ່ານລະບຸໄວ້ເຂົ້າເຖິງສະຖານທີ່ຂອງທ່ານ"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"ຖ້າທ່ານປິດການຕັ້ງຄ່ານີ້, ມັນຈະລຶບສິດເຂົ້າເຖິງສະຖານທີ່ສຳລັບແອັບທັງໝົດອອກ. ແອັບຕົວຊ່ວຍຜູ້ຂັບຈະຍັງມີສິດເຂົ້າເຖິງຢູ່."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ໃຊ້ສະຖານທີ່ຂອງທ່ານສຳລັບຕົວຊ່ວຍຜູ້ຂັບ"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"ສະຖານທີ່ພາຫະນະປິດຢູ່"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ແອັບຕົວຊ່ວຍຜູ້ຂັບຂີ່ບໍ່ສາມາດເຂົ້າເຖິງສະຖານທີ່ຂອງທ່ານໄດ້"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"ປ່ຽນ"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"ອະນຸຍາດແອັບທີ່ຊ່ວຍໃນການຂັບຂີ່ເຂົ້າເຖິງສະຖານທີ່ຂອງທ່ານ"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"ຖ້າທ່ານປິດສິ່ງນີ້, ຄຸນສົມບັດຕົວຊ່ວຍຜູ້ຂັບທີ່ອາໄສໃສ່ຂໍ້ມູນສະຖານທີ່ຈະຖືກປິດການນຳໃຊ້."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"ຢືນຢັນການປິດ"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ຄຳຂໍຂໍ້ມູນສະຖານທີ່ຫຼ້າສຸດ"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ບໍ່ມີຄຳຂໍຂໍ້ມູນສະຖານທີ່ຫຼ້າສຸດ"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ການອະນຸຍາດລະດັບແອັບ"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"ການບໍລິການສະຖານທີ່"</string>
<string name="location_use_location_title" msgid="117735895374606680">"ໃຊ້ສະຖານທີ່"</string>
<string name="location_settings_footer" msgid="296892848338100051">"ສະຖານທີ່ອາດຈະໃຊ້ແຫລ່ງຂໍ້ມູນຕ່າງໆ ເຊັ່ນ: GPS, Wi‑Fi ແລະ ເຄືອຂ່າຍມືຖື ແລະ ເຊັນເຊີເພື່ອຊ່ວຍຄາດຄະເນສະຖານທີ່ຂອງອຸປະກອນຂອງທ່ານ."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ຕົວຊ່ວຍຜູ້ຂັບ"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ຂໍ້ມູນສະຖານທີ່ທີ່ສົ່ງໃຫ້ແອັບຕົວຊ່ວຍຜູ້ຂັບບໍ່ມີຂໍ້ມູນທີ່ລະບຸຕົວຕົນຂອງທ່ານ. ລະບົບຈະເກັບຂໍ້ມູນໄວ້ສູງສຸດ 2 ມື້ກ່ອນທີ່ຈະລຶບມັນ."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"ໄມໂຄຣໂຟນ"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"ໃຊ້ໄມໂຄຣໂຟນ"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"ອະນຸຍາດໃຫ້ແອັບທັງໝົດເຂົ້າເຖິງໄມໂຄຣໂຟນຂອງທ່ານ"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"ຈັດການການອະນຸຍາດໄມໂຄຣໂຟນ"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"ເຂົ້າໃຊ້ຫຼ້າສຸດ"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"ບໍ່ມີແອັບທີ່ໃຊ້ຫຼ້າສຸດ"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"ບໍ່ມີແອັບໃດມີສິດເຂົ້າເຖິງ"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# ແອັບຈາກທັງໝົດ {total_count} ແອັບມີສິດເຂົ້າເຖິງ}other{# ແອັບຈາກທັງໝົດ {total_count} ແອັບມີສິດເຂົ້າເຖິງ}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"ເຂົ້າໃຊ້ຫຼ້າສຸດ"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"ເບິ່ງທັງໝົດ"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"ກຳລັງໂຫລດ…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"ລະບົບ"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"ການອັບເດດລະບົບ"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"ຂັ້ນສູງ"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"ໃບອະນຸຍາດພາກສ່ວນທີສາມ"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ເກີດບັນຫາໃນການໂຫລດໃບອະນຸຍາດ."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"ກຳລັງໂຫລດ..."</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">ຕອນນີ້ທ່ານຍັງອີກ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ຂັ້ນຕອນກໍຈະເປັນຜູ້ພັດທະນາແລ້ວ.</item>
- <item quantity="one">ຕອນນີ້ທ່ານຍັງອີກ <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ຂັ້ນຕອນກໍຈະເປັນຜູ້ພັດທະນາແລ້ວ.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ຕອນນີ້ທ່ານຍັງອີກ # ຂັ້ນຕອນກໍຈະເປັນນັກພັດທະນາແລ້ວ.}other{ຕອນນີ້ທ່ານຍັງອີກ # ຂັ້ນຕອນກໍຈະເປັນນັກພັດທະນາແລ້ວ.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"ຕອນນີ້ທ່ານເປັນຜູ້ພັດທະນາແລ້ວ!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"ບໍ່ຈຳເປັນ, ທ່ານເປັນຜູ້ພັດທະນາຢູ່ແລ້ວ."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ຕົວເລືອກຜູ້ພັດທະນາ"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"ຫຼັງຈາກທີ່ທ່ານສ້າງໂປຣໄຟລ໌ໃໝ່ແລ້ວ, ບຸກຄົນນັ້ນຄວນປັບແຕ່ງມັນສຳລັບຕົວເຂົາເຈົ້າເອງ."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"ສາມາດອັບເດດແອັບຈາກໂປຣໄຟລ໌ໃດໆກໍໄດ້ສຳລັບການໃຊ້ໂດຍໂປຣໄຟລ໌ອື່ນທັງໝົດ."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"ຮອດຂີດຈຳກັດໂປຣໄຟລ໌ແລ້ວ"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">ທ່ານສາມາດສ້າງໄດ້ບໍ່ເກີນ <xliff:g id="COUNT">%d</xliff:g> ໂປຣໄຟລ໌.</item>
- <item quantity="one">ສາມາດສ້າງໄດ້ພຽງໂປຣໄຟລ໌ດຽວເທົ່ານັ້ນ.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{ສາມາດສ້າງໄດ້ພຽງໂປຣໄຟລ໌ດຽວເທົ່ານັ້ນ.}other{ທ່ານສາມາດສ້າງໄດ້ບໍ່ເກີນ # ໂປຣໄຟລ໌.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"ບໍ່ສາມາດສ້າງໂປຣໄຟລ໌ໃໝ່ໄດ້"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ລຶບໂປຣໄຟລ໌ນີ້ບໍ?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ແອັບ ແລະ ຂໍ້ມູນທັງໝົດສຳລັບໂປຣໄຟລ໌ນີ້ຈະຖືກລຶບ."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"ບໍ່ສາມາດລຶບໂປຣໄຟລ໌ໄດ້."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"ລຶບໂປຣໄຟລ໌ບໍ່ໄດ້. ທ່ານສາມາດຣີສະຕາດອຸປະກອນ ແລ້ວລອງໃໝ່ໄດ້."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"ໂປຣໄຟລ໌ນີ້ຈະຖືກລຶບເມື່ອທ່ານປ່ຽນໂປຣໄຟລ໌ ຫຼື ຣິສະຕາດພາຫານະ."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ປິດໄວ້"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ລອງໃໝ່"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"ວິທີແຕ້ມຮູບແບບປົດລັອກ"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"ເກີດຄວາມຜິດພາດໃນການບັນທຶກຮູບແບບ"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"ພະຍາຍາມຢ່າງບໍ່ຖືກຕ້ອງຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນ <xliff:g id="NUMBER">%d</xliff:g> ວິນາທີ."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"ຮູບແບບບໍ່ຮອງຮັບປຸ່ມໝຸນ, ກະລຸນາໃຊ້ໜ້າຈໍສຳຜັດ"</string>
<string name="okay" msgid="4589873324439764349">"ຕົກລົງ"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"ລຶບການລັອກໜ້າຈໍອອກບໍ?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"ນີ້ຈະອະນຸຍາດໃຫ້ທຸກຄົນເຂົ້າເຖິງບັນຊີຂອງທ່ານໄດ້"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"PIN ທີ່ມັກໃຊ້ທົ່ວໄປຖືກບລັອກໄວ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບໄອທີຂອງທ່ານ. ກະລຸນາລອງໃຊ້ PIN ອື່ນ."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"ນີ້ບໍ່ສາມາດຮວມມີອັກຂະລະທີ່ບໍ່ຖືກຕ້ອງໄດ້."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"ລະຫັດຜ່ານໃຊ້ບໍ່ໄດ້, ຕ້ອງມີຢ່າງໜ້ອຍ 4 ຕົວອັກສອນ."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">ຕ້ອງມີຕົວອັກສອນຢ່າງໜ້ອຍ <xliff:g id="COUNT">%d</xliff:g> ຕົວ</item>
- <item quantity="one">ຕ້ອງມີຕົວອັກສອນຢ່າງໜ້ອຍ 1 ຕົວ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">ຕ້ອງມີຕົວອັກສອນຕົວພິມນ້ອຍຢ່າງໜ້ອຍ <xliff:g id="COUNT">%d</xliff:g> ຕົວ</item>
- <item quantity="one">ຕ້ອງມີຕົວອັກສອນຕົວພິມນ້ອຍຢ່າງໜ້ອຍ 1 ຕົວ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">ຕ້ອງມີຕົວອັກສອນຕົວພິມໃຫຍ່ຢ່າງໜ້ອຍ <xliff:g id="COUNT">%d</xliff:g> ຕົວ</item>
- <item quantity="one">ຕ້ອງມີຕົວອັກສອນຕົວພິມໃຫຍ່ຢ່າງໜ້ອຍ 1 ຕົວ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">ຕ້ອງມີຕົວເລກຢ່າງໜ້ອຍ <xliff:g id="COUNT">%d</xliff:g> ຕົວ</item>
- <item quantity="one">ຕ້ອງມີຕົວເລກຢ່າງໜ້ອຍ 1 ຕົວ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">ຕ້ອງມີສັນຍາລັກພິເສດຢ່າງໜ້ອຍ <xliff:g id="COUNT">%d</xliff:g> ຕົວ</item>
- <item quantity="one">ຕ້ອງມີສັນຍາລັກພິເສດຢ່າງໜ້ອຍ 1 ຕົວ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">ຕ້ອງມີອັກຂະລະທີ່ບໍ່ແມ່ນຕົວອັກສອນຢ່າງໜ້ອຍ <xliff:g id="COUNT">%d</xliff:g> ຕົວ</item>
- <item quantity="one">ຕ້ອງມີອັກຂະລະທີ່ບໍ່ແມ່ນຕົວອັກສອນຢ່າງໜ້ອຍ 1 ຕົວ</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ຜູ້ເບິ່ງແຍງລະບົບອຸປະກອນບໍ່ອະນຸຍາດໃຫ້ໃຊ້ລະຫັດຜ່ານເມື່ອບໍ່ດົນມານີ້"</string>
<string name="error_saving_password" msgid="8334882262622500658">"ເກີດຄວາມຜິດພາດໃນການບັນທຶກລະຫັດຜ່ານ"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ລະຫັດຜ່ານທົ່ວໄປແມ່ນຖືກບລັອກໂດຍຜູ້ເບິ່ງແຍງລະບົບໄອທີຂອງທ່ານ. ໃຫ້ລອງໃຊ້ລະຫັດອື່ນແທນ."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"ເພີ່ມໂປຣໄຟລ໌"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ລຶບໂປຣໄຟລ໌ນີ້"</string>
<string name="add_profile_text" msgid="9118410102199116969">"ເພີ່ມໂປຣໄຟລ໌"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ຄວາມແຈ້ງຂອງຈໍ"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"ເພື່ອເຫັນອຸປະກອນຂອງທ່ານ, ກະລຸນາເປີດ Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"ເພື່ອຈັບຄູ່ອຸປະກອນ, ກະລຸນາເປີດການຕັ້ງຄ່າ Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"ຜູ້ເບິ່ງແຍງລະບົບສາລະບັນເທີງ"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"ແອັບທີ່ເປີດນຳໃຊ້"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"ແອັບທີ່ປິດນຳໃຊ້"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ແອັບທີ່ມີການອະນຸຍາດນີ້ມີສິດເຂົ້າເຖິງຂໍ້ມູນຂອງອຸປະກອນນີ້"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"ບໍ່ມີແອັບຜູ້ເບິ່ງແຍງລະບົບຂອງພາຫະນະ"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"ແອັບຜູ້ເບິ່ງແຍງລະບົບສາລະບັນເທີງນີ້ຍັງເຄື່ອນໄຫວຢູ່ ແລະ ອະນຸຍາດໃຫ້ແອັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຮັດສິ່ງຕໍ່ໄປນີ້ໄດ້:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"ການເປີດນຳໃຊ້ແອັບລະບົບສາລະບັນເທີງນີ້ຈະເຮັດໃຫ້ແອັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ສາມາດດຳເນີນການດັ່ງຕໍ່ໄປນີ້ໄດ້:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"ເປີດນຳໃຊ້ແອັບລະບົບສາລະບັນເທີງນີ້ບໍ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"ເປີດນຳໃຊ້ແອັບລະບົບສາລະບັນເທີງນີ້"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"ປິດການນຳໃຊ້ ແລະ ຖອນການຕິດຕັ້ງ"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"ປິດນຳໃຊ້ແອັບລະບົບສາລະບັນເທີງນີ້"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"ລາຍລະອຽດເພີ່ມເຕີມ"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"ຜູ້ຈັດການອົງການສາມາດຕິດຕາມ ແລະ ຈັດການແອັບ ແລະ ຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບໂປຣໄຟລ໌ນີ້ໄດ້ ເຊິ່ງຮວມເຖິງການຕັ້ງຄ່າ, ການອະນຸຍາດ, ການເຂົ້າເຖິງອົງກອນ, ການເຄື່ອນໄຫວເຄືອຂ່າຍ ແລະ ຂໍ້ມູນສະຖານທີ່ຂອງພາຫະນະ."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"ຜູ້ຈັດການອົງການສາມາດຕິດຕາມ ແລະ ຈັດການແອັບ ແລະ ຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບໂປຣໄຟລ໌ນີ້ໄດ້ ເຊິ່ງຮວມເຖິງການຕັ້ງຄ່າ, ການອະນຸຍາດ, ການເຂົ້າເຖິງອົງກອນ, ການເຄື່ອນໄຫວເຄືອຂ່າຍ ແລະ ຂໍ້ມູນສະຖານທີ່ຂອງອຸປະກອນ."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"ຜູ້ຈັດການອົງການສາມາດກວດສອບ ແລະ ຈັດການແອັບ ແລະ ຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບລະບົບສາລະບັນເທີງນີ້, ຮວມທັງການຕັ້ງຄ່າ, ການອະນຸຍາດ, ສິດເຂົ້າເຖິງຂອງບໍລິສັດ, ການເຄື່ອນໄຫວເຄືອຂ່າຍ ແລະ ຂໍ້ມູນສະຖານທີ່ຂອງພາຫະນະ."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"ຜູ້ຈັດການອົງການອາດຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບລະບົບສາລະບັນເທີງນີ້, ຈັດການແອັບ ແລະ ປ່ຽນການຕັ້ງຄ່າຂອງພາຫະນະນີ້ໄດ້."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ບໍ່ພ້ອມນຳໃຊ້"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"ບໍ່ສາມາດປ່ຽນລະດັບສຽງໃນພາຫະນະທີ່ມີການຈັດການນີ້ໄດ້"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"ບໍ່ສາມາດໂທອອກໄດ້ໃນພາຫະນະທີ່ມີການຈັດການນີ້"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"ບໍ່ອະນຸຍາດ SMS ໃນພາຫະນະທີ່ມີການຈັດການນີ້"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"ກ້ອງບໍ່ສາມາດໃຊ້ໄດ້ໃນພາຫະນະທີ່ມີການຈັດການນີ້"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"ບໍ່ສາມາດຖ່າຍຮູບໜ້າຈໍໃນພາຫະນະທີ່ມີການຈັດການນີ້ໄດ້"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"ບໍ່ສາມາດເປີດແອັບນີ້ໄດ້ໃນພາຫະນະທີ່ມີການຈັດການນີ້"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"ຖືກບລັອກໂດຍຜູ້ໃຫ້ບໍລິການເຄຣດິດຂອງທ່ານ"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"ສິດເຂົ້າເຖິງບາງຄຸນສົມບັດຖືກຈຳກັດໄວ້ໂດຍອົງການ.\n\nຖ້າທ່ານມີຄຳຖາມ, ກະລຸນາຕິດຕໍ່ຜູ້ຈັດການອົງການ."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"ແອັບຜູ້ເບິ່ງແຍງພາຫະນະ"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# ແອັບທີ່ເປີດນຳໃຊ້}other{# ແອັບທີ່ເປີດນຳໃຊ້}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"ບໍ່ມີແອັບທີ່ເປີດນຳໃຊ້"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"ນະໂຍບາຍພາຫະນະຂອງ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"ການຕັ້ງຄ່າທີ່ຈັດການໂດຍຜູ້ຈັດການອົງການ"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"ສຶກສາເພີ່ມເຕີມກ່ຽວກັບ <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"ແບ່ງປັນລາຍງານຂໍ້ຜິດພາດບໍ?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"ຜູ້ຈັດການອົງການຂອງພາຫະນະນີ້ໄດ້ຂໍເອົາລາຍງານຂໍ້ຜິດພາດເພື່ອຊ່ວຍແກ້ໄຂບັນຫາຂອງອຸປະກອນນີ້. ອາດຈະມີການແບ່ງປັນແອັບ ແລະ ຂໍ້ມູນ"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"ຜູ້ຈັດການອົງການຂອງພາຫະນະນີ້ໄດ້ຂໍເອົາລາຍງານຂໍ້ຜິດພາດເພື່ອຊ່ວຍແກ້ໄຂບັນຫາຂອງອຸປະກອນນີ້. ອາດຈະມີການແບ່ງປັນແອັບ ແລະ ຂໍ້ມູນ ແລະ ອຸປະກອນຂອງທ່ານອາດຈະຢຸດເຮັດວຽກຊົ່ວຄາວ."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"ກຳລັງມີການແບ່ງປັນລາຍງານຂໍ້ຜິດພາດນີ້ກັບຜູ້ຈັດການອົງການຂອງພາຫະນະນີ້. ຕິດຕໍ່ເຂົາເຈົ້າສຳລັບລາຍລະອຽດເພີ່ມເຕີມ."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"ແບ່ງປັນ"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"ປະຕິເສດ"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"ບໍ່ສາມາດປ່ຽນການຕັ້ງຄ່ານີ້ໄດ້ໃນຂະນະນີ້"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ການຊ່ວຍເຂົ້າເຖິງ"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"ຄຳບັນຍາຍ"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"ການຕັ້ງຄ່າຄຳບັນຍາຍ"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ປິດ"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ເປີດ"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"ໂປຣແກຣມອ່ານໜ້າຈໍ"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"ສະແດງຄຳບັນຍາຍ"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ຂະໜາດຂໍ້ຄວາມ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"ຂະໜາດ ແລະ ຮູບແບບຄຳບັນຍາຍ"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"ນ້ອຍຫຼາຍ"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"ນ້ອຍ"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ຄ່າເລີ່ມຕົ້ນ"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ໃຫຍ່"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ໃຫຍ່ຫຼາຍ"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"ຮູບແບບຄຳບັນຍາຍ"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ຕັ້ງໂດຍແອັບ"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"ສີຂາວພື້ນດຳ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"ສີດຳພື້ນຂາວ"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"ສີເຫຼືອງພື້ນດຳ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"ສີເຫຼືອງພື້ນຟ້າ"</string>
</resources>
diff --git a/res/values-lt/arrays.xml b/res/values-lt/arrays.xml
index 3da7fa8..0a5e657 100644
--- a/res/values-lt/arrays.xml
+++ b/res/values-lt/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Niekada neleisti"</item>
<item msgid="1154273129608299386">"Visada leisti"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 3ae0b0f..6f34c9e 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -27,12 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Naktinis režimas"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Tinklas ir internetas"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobiliojo ryšio tinklas"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM kortelė</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM kortelės</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM kortelės</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM kortelių</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM kortelė}one{# SIM kortelė}few{# SIM kortelės}many{# SIM kortelės}other{# SIM kortelių}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktyvi / SIM kortelė"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Neaktyvi / SIM kortelė"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktyvi / atsisiųsta SIM kortelė"</string>
@@ -40,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Pridėti daugiau"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiliojo ryšio duomenys"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Prieiga prie duomenų naud. mobiliojo ryšio tinklą"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobiliojo ryšio tinklas"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Naudoti mobiliojo ryšio duomenis"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Išjungti mobiliojo ryšio duomenis?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Būtina pasirinkti"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Naudoti „<xliff:g id="CARRIER">%1$s</xliff:g>“ mob. ryšio duomen.?"</string>
@@ -55,12 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> duomenų įspėjimas"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> duomenų apribojimas"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> duomenų įspėjimas / <xliff:g id="ID_2">^2</xliff:g> duomenų apribojimas"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Liko %d diena</item>
- <item quantity="few">Liko %d dienos</item>
- <item quantity="many">Liko %d dienos</item>
- <item quantity="other">Liko %d dienų</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Liko # diena}one{Liko # diena}few{Liko # dienos}many{Liko # dienos}other{Liko # dienų}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Laiko neliko"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Liko mažiau nei 1 diena"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Prieš <xliff:g id="ID_2">^2</xliff:g> atnaujino „<xliff:g id="ID_1">^1</xliff:g>“"</string>
@@ -75,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Nustatyti"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Įspėjimas dėl duomenų ir apribojimas"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Programų duomenų naudojimo ciklas"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobiliojo ryšio duomenų naudojimas"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Nustatyti įspėjimą dėl duomenų"</string>
<string name="data_warning" msgid="116776633806885370">"Įspėjimas dėl duomenų"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Nust. duomenų apribojimą"</string>
@@ -83,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Pasiekus nustatytą apribojimą pagrindiniame transporto priemonės įtaise bus išjungti mobiliojo ryšio duomenys.\n\nKadangi sunaudoti duomenys skaičiuojami pagal pagrindinį transporto priemonės įtaisą ir operatorius gali apskaičiuoti kitaip, apsvarstykite galimybę nustatyti mažesnį apribojimą."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Nustatyti duomenų naudojimo įspėjimą"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Nustatyti duomenų naudojimo apribojimą"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Duomenų naudojimas matuojamas pagal įrenginį. Jis gali skirtis nuo mobiliojo ryšio operatoriaus duomenų."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Nustatyti"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Išsaugoti"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OĮG tinklas"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Transporto priemonės internetas"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Išjungus transporto priemonės internetą kai kurios jos funkcijos ar programos gali neveikti.\n\nPagrindiniai duomenys, reikalingi, kad transporto priemonė veiktų, toliau bus bendrinami su jos gamintoju."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Vis tiek išjungti"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Transporto priemonės internetas išjungtas. Dėl to kai kurios transporto priemonės funkcijos ar programos gali neveikti. Pagrindiniai duomenys, reikalingi, kad transporto priemonė veiktų, toliau bus bendrinami su jos gamintoju."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Naudojama: %1$s (%2$s–%3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Prisijungti prie kito tinklo"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Tinklo nuostatos"</string>
@@ -98,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Pridėti tinklą"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Prisijungti"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Prisijungiama…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Neprisijungta"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Tinklas ne diapazone"</string>
<string name="wifi_password" msgid="5565632142720292397">"Slaptažodis"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Rodyti slaptažodį"</string>
@@ -159,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Pasir. bent 1 „Wi‑Fi“ vieš. int. prieig. tšk. dažn. juostą:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Vieš. intern. prieig. tašk. ir įreng. kaip modemo naud."</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Viešosios interneto prieigos taškas"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Išjungta"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Išjungti viešosios interneto prieigos tašką autom."</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"„Wi‑Fi“ viešosios interneto prieigos taškas bus išjungtas, jei nebus prijungta jokių įrenginių"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> nori įjungti „Wi-Fi“"</string>
@@ -301,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Priverstinai sustabdyti"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Priverstinai sustabdyti?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Jei priverstinai sustabdysite programą, ji gali neveikti tinkamai."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Išjungti našumo apsaugą?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Jei taip padarysite, programinė ir aparatinė įranga gali taip gerai neveikti."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Palikti įjungtą"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Išjungti"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Suteikti prioritetą programos našumui?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Įjungus šį nustatymą sistema gali veikti nestabiliai arba aparatinė įranga ilgą laiką gali būti neigiamai veikiama. Ar norite tęsti?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Taip"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ne, ačiū"</string>
<string name="disable_text" msgid="4358165448648990820">"Išjungti"</string>
<string name="enable_text" msgid="1794971777861881238">"Įgalinti"</string>
<string name="uninstall_text" msgid="277907956072833012">"Pašalinti"</string>
@@ -314,29 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Leidimai"</string>
<string name="notifications_label" msgid="6586089149665170731">"Pranešimai"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Saugykla ir talpykla"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Užtikr. didž. našumą"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Suteikti prioritetą programos našumui"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versija: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nėra suteiktų leidimų"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nėra užklausų dėl leidimų"</string>
<string name="unused_apps" msgid="648471933781010395">"Nenaudojamos programos"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> nenaudojama programa</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> nenaudojamos programos</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> nenaudojamos programos</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> nenaudojamų programų</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# nenaudojama programa}one{# nenaudojama programa}few{# nenaudojamos programos}many{# nenaudojamos programos}other{# nenaudojamų programų}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Pašalinti leidimus ir atlaisvinti vietos"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s vidinėje atmintyje"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Užd. progr., kad sumaž. šalt. naudojimą"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Naudojami sistemos ištekliai, kad būtų galima suteikti prioritetą programos našumui"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Duomenų naudojimas"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Progr. duomenų naudojimas"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Naudojimo istorija"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Visos programos"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Duomenų ir „Wi-Fi“ naud."</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Naudojimo istorija"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Bendras naudojimas"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Priekinis planas"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Fonas"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Duomenų leidimas"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Leisti programai naudoti mobiliojo ryšio duomenis"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Duomenų apribojimas"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Mob. ryš. duom. naudoti tik pr. esant priek. plane"</string>
<string name="computing_size" msgid="5791407621793083965">"Skaičiuojama…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> papildomas leidimas</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> papildomi leidimai</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> papildomo leidimo</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> papildomų leidimų</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# papildomas leidimas}one{# papildomas leidimas}few{# papildomi leidimai}many{# papildomo leidimo}other{# papildomų leidimų}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Pastaba: paleidus iš naujo nebus galima paleisti programos, kol neatrakinsite transporto priemonės."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pagalb. progr. ir įvest. balsu"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Pagalbinė programa"</string>
@@ -393,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"„Wi-Fi“ valdymo funkcija leidžia šiai programai įjungti arba išjungti „Wi-Fi“, nuskaityti „Wi-Fi“ tinklus ir prisijungti prie jų, pridėti ar pašalinti tinklus arba paleisti tik vietinį viešosios interneto prieigos tašką."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Daugiau"</string>
<string name="location_settings_title" msgid="901334356682423679">"Vietovė"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Naudoti vietovę"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Leiskite nurodytoms programoms pasiekti vietovę"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Išjungus šį nustatymą, bus išjungta visų programų prieiga prie vietovės duomenų. Pagalbos vairuotojui programos vis tiek turės prieigą."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Naudoti vietovę pagalbos vairuot. funkc."</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Transporto vietovė išjungta"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Pag. vairuotojui progr. nep. jūsų viet."</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Keisti"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Leiskite vairuoti padedančioms programoms pasiekti vietovę"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Jei šį nustatymą išjungsite, pagalbos vairuotojui programos, kurioms reikalinga vietovės informacija, bus išjungtos."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Vis tiek išjungti"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Pastarosios vietovės užklausos"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nėra jokių pastarųjų vietovių užklausų"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Programos lygio leidimai"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Vietovės paslaugos"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Naudoti vietovę"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Vietovės paslauga gali naudoti įvairius šaltinius, pvz., GPS, „Wi-Fi“, mobiliojo ryšio tinklus ir jutiklius, kad nustatytų jūsų įrenginio vietovę."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Pagalba vairuotojui"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Vietovės informacijoje, išsiųstoje pagalbos vairuotojui programoms, nebus jus identifikuojančios informacijos. Prieš ištrinant ji saugoma daugiausia dvi dienas."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofonas"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Naudoti mikrofoną"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Leisti programoms pasiekti mikrofoną"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Tvarkyti mikrofono leidimus"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Neseniai pasiekta"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nėra naujausių programų"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 programų suteikta prieiga"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# programai iš {total_count} suteikta prieiga}one{# programai iš {total_count} suteikta prieiga}few{# programoms iš {total_count} suteikta prieiga}many{# programos iš {total_count} suteikta prieiga}other{# programų iš {total_count} suteikta prieiga}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Neseniai pasiekta"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Žr. viską"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Įkeliama…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Sistemos naujiniai"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Išplėstiniai"</string>
@@ -437,12 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Trečiųjų šalių licencijos"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Įkeliant licencijas iškilo problema."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Įkeliama..."</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Liko atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmą ir būsite kūrėjas.</item>
- <item quantity="few">Liko atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmus ir būsite kūrėjas.</item>
- <item quantity="many">Liko atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmo ir būsite kūrėjas.</item>
- <item quantity="other">Liko atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmų ir būsite kūrėjas.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Liko atlikti # veiksmą ir būsite kūrėjas.}one{Liko atlikti # veiksmą ir būsite kūrėjas.}few{Liko atlikti # veiksmus ir būsite kūrėjas.}many{Liko atlikti # veiksmo ir būsite kūrėjas.}other{Liko atlikti # veiksmų ir būsite kūrėjas.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Dabar esate kūrėjas!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Nereikia, jūs jau esate kūrėjas."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Kūrėjo parinktys"</string>
@@ -511,16 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Kai sukursite naują profilį, šis asmuo turėtų jį tinkinti pagal save."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Programas galima atnaujinti iš bet kurio profilio, kad galėtų naudoti visi kiti profiliai."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Pasiektas profilių limitas"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Galite sukurti ne daugiau nei <xliff:g id="COUNT">%d</xliff:g> profilį.</item>
- <item quantity="few">Galite sukurti ne daugiau nei <xliff:g id="COUNT">%d</xliff:g> profilius.</item>
- <item quantity="many">Galite sukurti ne daugiau nei <xliff:g id="COUNT">%d</xliff:g> profilio.</item>
- <item quantity="other">Galite sukurti ne daugiau nei <xliff:g id="COUNT">%d</xliff:g> profilių.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Galima sukurti tik vieną profilį.}one{Galite sukurti ne daugiau nei # profilį.}few{Galite sukurti ne daugiau nei # profilius.}many{Galite sukurti ne daugiau nei # profilio.}other{Galite sukurti ne daugiau nei # profilių.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Nepavyko sukurti naujo profilio"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Ištrinti šį profilį?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Bus ištrintos visos šio profilio programos ir duomenys"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Nepavyko ištrinti profilio."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profilis neištrintas. Galite pal. įr. iš naujo ir band. dar k."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Šis profilis bus ištrintas, kai perjungsite profilius ar paleiskite transporto priemonę iš naujo."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Atsisakyti"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Bandyti dar kartą"</string>
@@ -633,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Kaip nustatyti atrakinimo piešinį"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Klaida išsaugant atrakinimo piešinį"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Per daug klaidingų bandymų. Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sek."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Atr. pieš. negalima nubr. sukam. įvest. vald."</string>
<string name="okay" msgid="4589873324439764349">"Gerai"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Pašalinti ekrano užraktą?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Tai atlikus visi žmonės galės pasiekti jūsų paskyrą"</string>
@@ -664,42 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Dažnai naudojamus PIN kodus užblokavo IT administratorius. Bandykite naudoti kitą PIN kodą."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Čia negali būti netinkamų simbolių."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Slaptažodis netinkamas, jį turi sudaryti bent 4 simboliai."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> raidė</item>
- <item quantity="few">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> raidės</item>
- <item quantity="many">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> raidės</item>
- <item quantity="other">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> raidžių</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> mažoji raidė</item>
- <item quantity="few">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> mažosios raidės</item>
- <item quantity="many">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> mažosios raidės</item>
- <item quantity="other">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> mažųjų raidžių</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> didžioji raidė</item>
- <item quantity="few">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> didžiosios raidės</item>
- <item quantity="many">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> didžiosios raidės</item>
- <item quantity="other">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> didžiųjų raidžių</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> skaitmuo</item>
- <item quantity="few">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> skaitmenys</item>
- <item quantity="many">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> skaitmens</item>
- <item quantity="other">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> skaitmenų</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> specialusis simbolis</item>
- <item quantity="few">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> specialieji simboliai</item>
- <item quantity="many">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> specialiojo simbolio</item>
- <item quantity="other">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> specialiųjų simbolių</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> neraidinis simbolis</item>
- <item quantity="few">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> neraidiniai simboliai</item>
- <item quantity="many">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> neraidinio simbolio</item>
- <item quantity="other">Turi būti bent <xliff:g id="COUNT">%d</xliff:g> neraidinių simbolių</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Įrenginio administratorius neleidžia naudoti pastarojo slaptažodžio"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Klaida išsaugant slaptažodį"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Dažnai naudojamus slaptažodžius užblokavo IT administratorius. Bandykite naudoti kitą slaptažodį."</string>
@@ -742,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Pridėti profilį"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Ištrinti šį profilį"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Pridėti profilį"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Ekrano šviesumas"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Norėdami matyti savo įrenginius, įjunkite „Bluetooth“"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Norėdami susieti įrenginį, atidarykite „Bluetooth“ nustatymus"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Informacinės pramoginės sistemos administratorius"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Suaktyvintos programos"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Išaktyvintos programos"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Programos, kurioms suteiktas šis leidimas, turi prieigą prie šios transporto priemonės duomenų"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nėra jokių transporto priemonės administravimo programų"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Ši informacinės pramoginės sistemos administravimo programa yra aktyvi ir programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ leidžiama vykdyti toliau nurodytas operacijas."</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Suaktyvinus šią informacinės pramoginės sistemos programą programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ bus leidžiama vykdyti toliau nurodytas operacijas."</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Suaktyvinti šią informacinės pramoginės sistemos programą?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Suaktyvinti šią informacinės pramoginės sistemos programą"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Išaktyvinti ir pašalinti"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Išaktyvinti šią informacinės pramoginės sistemos programą"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Daugiau išsamios informacijos"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Organizacijos valdytojas gali stebėti ir tvarkyti su šiuo profiliu susietas programas bei duomenis, įskaitant nustatymus, leidimus, prieigą prie įmonės duomenų, tinklo veiklą ir transporto priemonės vietovės informaciją."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Organizacijos valdytojas gali stebėti ir tvarkyti su šiuo profiliu susietas programas bei duomenis, įskaitant nustatymus, leidimus, prieigą prie įmonės duomenų, tinklo veiklą ir įrenginio vietovės informaciją."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Organizacijos valdytojas gali stebėti ir tvarkyti su šia informacine pramogine sistema susietas programas ir duomenis, įskaitant nustatymus, leidimus, prieigą prie įmonės duomenų, tinklo veiklą ir transporto priemonės vietovės informaciją."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Organizacijos valdytojas gali pasiekti duomenis, susietus su šia informacine pramogine sistema, tvarkyti programas ir keisti šios transporto priemonės nustatymus."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Tai nepasiekiama"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Šioje valdomoje transporto priemonėje garsumo pakeisti negalima"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Šioje valdomoje transporto priemonėje skambinti negalima"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Šioje valdomoje transporto priemonėje SMS pranešimai neleidžiami"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Šioje valdomoje transporto priemonėje kamera nepasiekiama"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Šioje valdomoje transporto priemonėje daryti ekrano kopijų negalima"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Šioje valdomoje transporto priemonėje šios programos atidaryti negalima"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Užblokavo kredito teikėjas"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Prieigą prie kai kurių funkcijų apribojo organizacija.\n\nJei kyla klausimų, susisiekite organizacijos valdytoju."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Transporto priemonių administravimo programos"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# suaktyvinta programa}one{# suaktyvinta programa}few{# suaktyvintos programos}many{# suaktyvintos programos}other{# suaktyvintų programų}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nėra jokių suaktyvintų programų"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"„<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>“ transporto priemonių politika"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Organizacijos valdytojo tvarkomi nustatymai"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Sužinokite daugiau apie paslaugą „<xliff:g id="SERVICE">%1$s</xliff:g>“"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Bendrinti pranešimą apie riktą?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Transporto priemonės organizacijos valdytojas pateikė pranešimo apie riktą užklausą, kad galėtų padėti pašalinti triktis šiame įrenginyje. Programos ir duomenys gali būti bendrinami."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Transporto priemonės organizacijos valdytojas pateikė pranešimo apie riktą užklausą, kad galėtų padėti pašalinti triktis šiame įrenginyje. Programos bei duomenys gali būti bendrinami ir įrenginys gali laikinai veikti lėčiau."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Šis pranešimas apie riktą bendrinamas su transporto priemonės organizacijos valdytoju. Jei reikia išsamesnės informacijos, susisiekite su juo."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Bendrinti"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Atmesti"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Šiuo metu šio nustatymo pakeisti negalima"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Pritaikomumas"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Subtitrai"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Subtitrų nuostatos"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Išjungta"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Įjungta"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Ekrano skaitytuvas"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Rodyti subtitrus"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Teksto dydis"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Subtitrų dydis ir stilius"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Labai mažas"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Mažas"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Numatytasis"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Didelis"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Labai didelis"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Subtitrų stilius"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Nustatyta pagal programą"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Baltas ant juodo"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Juodas ant balto"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Geltonas ant juodo"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Geltonas ant mėlyno"</string>
</resources>
diff --git a/res/values-lv/arrays.xml b/res/values-lv/arrays.xml
index 44a9f8b..955d2c7 100644
--- a/res/values-lv/arrays.xml
+++ b/res/values-lv/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nekad neatļaut"</item>
<item msgid="1154273129608299386">"Vienmēr atļaut"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 513c924..83ef07e 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -27,11 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Nakts režīms"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Tīkls un internets"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilais tīkls"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM karšu</item>
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM karte</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM kartes</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM karte}zero{# SIM karšu}one{# SIM karte}other{# SIM kartes}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktīvs/SIM karte"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Neaktīvs/SIM karte"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktīvs/lejupielādēta SIM karte"</string>
@@ -39,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Pievienot vēl"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilie dati"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Piekļuve datiem, izmantojot mobilo tīklu"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilais tīkls"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Izmantot mobilos datus"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vai izslēgt mobilos datus?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Jāveic atlase"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Vai mobilajiem datiem lietot <xliff:g id="CARRIER">%1$s</xliff:g>?"</string>
@@ -54,11 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Datu brīdinājums: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Datu ierobežojums: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Datu brīdinājums: <xliff:g id="ID_1">^1</xliff:g>/ datu ierobežojums: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="zero">Atlikušas vēl %d dienas</item>
- <item quantity="one">Atlikusi vēl %d diena</item>
- <item quantity="other">Atlikušas vēl %d dienas</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Atlikusi vēl # diena}zero{Atlikušas vēl # dienas}one{Atlikusi vēl # diena}other{Atlikušas vēl # dienas}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Laiks beidzies"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Atlikusi mazāk nekā 1 diena"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Atjaunināja <xliff:g id="ID_1">^1</xliff:g> pirms <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -73,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Iestatīt"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Datu brīdinājums un ierobežojums"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Lietotnes datu lietojuma cikls"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobilo datu lietojums"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Iestatīt datu brīdinājumu"</string>
<string name="data_warning" msgid="116776633806885370">"Datu brīdinājums"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Iestatīt datu ierobežojumu"</string>
@@ -81,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Kad transportlīdzekļa sistēmas panelī būs sasniegts jūsu iestatītais ierobežojums, mobilie dati tiks izslēgti.\n\nTā kā datu lietojums tiek noteikts sistēmas panelī un jūsu mobilo sakaru operators var citādi uzskaitīt datu lietojumu, ieteicams iestatīt pārdomātu ierobežojumu."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Datu lietojuma brīdinājuma iestatīšana"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Datu lietojuma ierobežojuma iestatīšana"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Datu lietojums tiek noteikts ierīcē. Tas var atšķirties no jūsu mobilo sakaru operatora datiem."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Iestatīt"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Saglabāt"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM tīkls"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Transportlīdzekļa internets"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Izslēdzot transportlīdzekļa internetu, dažas tā funkcijas vai lietotnes var nedarboties.\n\nKritiskie dati, kas nepieciešami transportlīdzekļa vadībai, joprojām tiks kopīgoti ar tā ražotāju."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Tomēr izslēgt"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Transportlīdzekļa internets ir izslēgts. Dažas tā funkcijas vai lietotnes var nedarboties. Kritiskie dati, kas nepieciešami transportlīdzekļa vadībai, joprojām tiks kopīgoti ar tā ražotāju."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Izmantotais apjoms: %1$s (%2$s–%3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Izveidot savienojumu ar citu tīklu"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Tīkla preferences"</string>
@@ -96,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Pievienot tīklu"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Savienot"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Notiek savienošana…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Savienojums nav izveidots"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Tīkls nav sasniedzamības zonā."</string>
<string name="wifi_password" msgid="5565632142720292397">"Parole"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Rādīt paroli"</string>
@@ -157,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Izvēlieties vismaz 1 joslu Wi‑Fi tīklājam:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Tīklājs un piesaiste"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Tīklājs"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Izslēgts"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Automātiski izslēgt tīklāju"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi tīklājs tiks izslēgts, ja netiks pievienota neviena ierīce."</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"Lietotnē <xliff:g id="REQUESTER">%s</xliff:g> tiek mēģināts ieslēgt Wi-Fi savienojumu"</string>
@@ -299,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Veikt piespiedu apturēšanu"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Vai veikt piespiedu apturēšanu?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Piespiedu kārtā apturot lietotnes darbību, var rasties šīs lietotnes darbības traucējumi."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Vai izslēgt veiktspējas aizsardzību?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ja izslēgsiet, programmatūra un aparatūra var darboties mazāk efektīvi."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Atstāt ieslēgtu"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Izslēgt"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Piešķirt lietotnes veiktspējas prioritāti?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Šī iestatījuma ieslēgšana var izraisīt sistēmas nestabilitāti vai ietekmēt aparatūras veiktspēju ilgtermiņā. Vai vēlaties turpināt?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Jā"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nē, paldies"</string>
<string name="disable_text" msgid="4358165448648990820">"Atspējot"</string>
<string name="enable_text" msgid="1794971777861881238">"Iespējot"</string>
<string name="uninstall_text" msgid="277907956072833012">"Atinstalēt"</string>
@@ -312,27 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Atļaujas"</string>
<string name="notifications_label" msgid="6586089149665170731">"Paziņojumi"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Krātuve un kešatmiņa"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Optimizēt veiktspēju"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Lietotnes veiktspējas prioritātes piešķiršana"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versija: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nav piešķirta neviena atļauja."</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nav pieprasīta neviena atļauja."</string>
<string name="unused_apps" msgid="648471933781010395">"Neizmantotās lietotnes"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> neizmantotu lietotņu</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> neizmantota lietotne</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> neizmantotas lietotnes</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# neizmantota lietotne}zero{# neizmantotu lietotņu}one{# neizmantota lietotne}other{# neizmantotas lietotnes}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Noņemt atļaujas un atbrīvot vietu"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s: iekšējā atmiņa"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Pēc vajadzības aizvērt lietotni, lai nepārtērētu resursus"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Tiek izmantoti sistēmas resursi, lai piešķirtu lietotnes veiktspējas prioritāti."</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Datu lietojums"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Lietotnes datu lietojums"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Lietojuma vēsture"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Visas lietotnes"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Datu un Wi‑Fi lietojums"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Lietojuma vēsture"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Kopējais lietojums"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Priekšplānā"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Fonā"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Atļaut datus"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Ļaut šai lietotnei izmantot mobilos datus"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Ierobežot datus"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Izmantot mobilos datus, ja lietotne ir priekšplānā"</string>
<string name="computing_size" msgid="5791407621793083965">"Notiek aprēķināšana…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> papildu atļauju</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> papildu atļauja</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> papildu atļaujas</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# papildu atļauja}zero{# papildu atļauju}one{# papildu atļauja}other{# papildu atļaujas}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Piezīme. Šo lietotni pēc atkārtotas palaišanas varēs startēt tikai tad, kad būs atbloķēts transportlīdzeklis."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistents un balss ievade"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Palīga lietotne"</string>
@@ -389,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi pārvaldība ļauj lietotnei ieslēgt vai izslēgt Wi-Fi savienojumu, meklēt Wi-Fi tīklus un izveidot savienojumus ar tiem, pievienot vai noņemt tīklus, vai izveidot vietējo tīklāju."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Vairāk"</string>
<string name="location_settings_title" msgid="901334356682423679">"Atrašanās vieta"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Izmantot atrašanās vietu"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Ļaut dažām lietotnēm piekļūt atrašanās vietai"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Ja izslēgsiet šo iestatījumu, piekļuve atrašanās vietai tiks noņemta visām lietotnēm. Autovadītāja palīdzības lietotnēm joprojām būs piekļuve."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Atrašanās vieta autovadītāja palīdzībai"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Automašīnas atrašanās vieta ir izslēgta"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Palīdzības lietotnes nevar piekļūt atrašanās vietai."</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Mainīt"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Ļaut palīdzības lietotnēm piekļūt atrašanās vietai"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ja izslēgsiet šo iestatījumu, tiks atspējotas autovadītāja palīdzības lietotnes, kuru pamatā ir atrašanās vietas informācija."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Tomēr izslēgt"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Neseni atrašanās vietu pieprasījumi"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nav nesenu atrašanās vietu pieprasījumu"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Lietotnes līmeņa atļaujas"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Atrašanās vietu pakalpojumi"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Izmantot atrašanās vietu"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Lai noteiktu jūsu ierīces atrašanās vietu, var tikt izmantoti tādi avoti kā GPS, Wi-Fi, mobilie tīkli un sensori."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Autovadītāja palīdzība"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Autovadītāja palīdzības lietotnēm nosūtītā atrašanās vietas informācija neietver jūs identificējošu informāciju. Tā tiek glabāta ne vairāk kā 2 dienas un pēc tam tiek dzēsta."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofons"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Izmantot mikrofonu"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Atļaut visām lietotnēm piekļūt jūsu mikrofonam"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Pārvaldīt mikrofona atļaujas"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Nesen piekļuva"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nav nesen izmantotu lietotņu"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 lietotnēm ir piekļuve"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# lietotnei no {total_count} ir piekļuve}zero{# lietotnēm no {total_count} ir piekļuve}one{# lietotnei no {total_count} ir piekļuve}other{# lietotnēm no {total_count} ir piekļuve}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nesen piekļuva"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Skatīt visus"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Notiek ielāde…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistēma"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Sistēmas atjauninājumi"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Papildu"</string>
@@ -433,11 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Trešo pušu licences"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ielādējot licences, radās problēma."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Notiek ielāde…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="zero">Lai jūs kļūtu par izstrādātāju, atlikušas <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> darbības.</item>
- <item quantity="one">Lai jūs kļūtu par izstrādātāju, atlikusi <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> darbība.</item>
- <item quantity="other">Lai jūs kļūtu par izstrādātāju, atlikušas <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> darbības.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Pēc # darbības būsiet izstrādātājs.}zero{Pēc # darbībām būsiet izstrādātājs.}one{Pēc # darbības būsiet izstrādātājs.}other{Pēc # darbībām būsiet izstrādātājs.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Tagad jūs esat izstrādātājs!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Nav nepieciešams, ja jau esat izstrādātājs."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opcijas izstrādātājiem"</string>
@@ -506,15 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Kad jūs esat izveidojis jaunu profilu, profila īpašniekam tas patstāvīgi jāpielāgo."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"No jebkura profila var atjaunināt lietotnes, lai izmantotu tās visos pārējos profilos."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Sasniegts profilu ierobežojums"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="zero">Var izveidot <xliff:g id="COUNT">%d</xliff:g> profilus.</item>
- <item quantity="one">Var izveidot <xliff:g id="COUNT">%d</xliff:g> profilu.</item>
- <item quantity="other">Var izveidot <xliff:g id="COUNT">%d</xliff:g> profilus.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Var izveidot tikai vienu profilu.}zero{Var izveidot ne vairāk kā # profilus.}one{Var izveidot ne vairāk kā # profilu.}other{Var izveidot ne vairāk kā # profilus.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Nevarēja izveidot jaunu profilu"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Vai dzēst šo profilu?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Tiks dzēstas visas šī profila lietotnes un dati."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Nevarēja izdzēst profilu"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profils netika dzēsts. Varat restartēt ierīci un mēģināt vēlreiz."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Šis profils tiks izdzēsts, kad pārslēgsiet profilus vai atkārtoti iedarbināsiet transportlīdzekli"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Noraidīt"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Mēģināt vēlreiz"</string>
@@ -627,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Kā zīmēt atbloķēšanas kombināciju"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Saglabājot kombināciju, radās kļūda."</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Pārāk daudz neveiksmīgu mēģinājumu. Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundēm."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Tiek atbalstīta skārienievade, bet ne rotācija."</string>
<string name="okay" msgid="4589873324439764349">"Labi"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Vai noņemt ekrāna bloķēšanu?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Tādējādi ikviens varēs piekļūt jūsu kontam."</string>
@@ -658,36 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Jūsu IT administrators ir bloķējis bieži lietotus PIN. Izmēģiniet citu PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Nedrīkst ietvert nederīgu rakstzīmi."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Parole nav derīga; tajā jābūt vismaz 4 rakstzīmēm."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="zero">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> burti.</item>
- <item quantity="one">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> burts.</item>
- <item quantity="other">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> burti.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="zero">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> mazie burti.</item>
- <item quantity="one">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> mazais burts.</item>
- <item quantity="other">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> mazie burti.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="zero">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> lielie burti.</item>
- <item quantity="one">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> lielais burts.</item>
- <item quantity="other">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> lielie burti.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="zero">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> cipari.</item>
- <item quantity="one">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> cipars.</item>
- <item quantity="other">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> cipari.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="zero">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> īpašie simboli.</item>
- <item quantity="one">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> īpašais simbols.</item>
- <item quantity="other">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> īpašie simboli.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="zero">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> rakstzīmes, kas nav burti.</item>
- <item quantity="one">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> rakstzīme, kas nav burts.</item>
- <item quantity="other">Ir jāietver vismaz <xliff:g id="COUNT">%d</xliff:g> rakstzīmes, kas nav burti.</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Ierīces administrators neļauj izmantot nesen izveidotu paroli."</string>
<string name="error_saving_password" msgid="8334882262622500658">"Saglabājot paroli, radās kļūda."</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Jūsu IT administrators ir bloķējis bieži lietotas paroles. Izmēģiniet citu paroli."</string>
@@ -730,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Pievienot profilu"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Dzēst šo profilu"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Pievienot profilu"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Displeja spilgtums"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Lai skatītu savas ierīces, ieslēdziet Bluetooth."</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Lai savienotu pārī kādu ierīci, atveriet Bluetooth iestatījumus."</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Informatīvi izklaidējošās sistēmas administrators"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivizētās lietotnes"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktivizētās lietotnes"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Lietotnes, kurām ir šī atļauja, var piekļūt šī transportlīdzekļa datiem."</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nav transportlīdzekļa administratora lietotņu"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Šī informatīvi izklaidējošās sistēmas administratora lietotne ir aktīva un ļauj lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> veikt tālāk norādītās darbības."</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Aktivizējot šo informatīvi izklaidējošās sistēmas lietotni, lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> tiks atļauts veikt tālāk norādītās darbības."</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Vai aktivizēt šo sistēmas lietotni?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktivizēt šo informatīvi izklaidējošās sistēmas lietotni"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktivizēt un atinstalēt"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deaktivizēt šo informatīvi izklaidējošās sistēmas lietotni"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Plašāka informācija"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Organizācijas pārvaldnieks var pārraudzīt un pārvaldīt ar šo profilu saistītās lietotnes un datus, tostarp iestatījumus, atļaujas, korporatīvo piekļuvi, darbības tīklā un informāciju par transportlīdzekļa atrašanās vietu."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Organizācijas pārvaldnieks var pārraudzīt un pārvaldīt ar šo profilu saistītās lietotnes un datus, tostarp iestatījumus, atļaujas, korporatīvo piekļuvi, darbības tīklā un informāciju par ierīces atrašanās vietu."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Organizācijas pārvaldnieks var pārraudzīt un pārvaldīt ar šo informatīvi izklaidējošo sistēmu saistītās lietotnes un datus, tostarp iestatījumus, atļaujas, korporatīvo piekļuvi, darbības tīklā un informāciju par transportlīdzekļa atrašanās vietu."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Iespējams, organizācijas pārvaldnieks var piekļūt ar šo informatīvi izklaidējošo sistēmu saistītajiem datiem, pārvaldīt lietotnes un mainīt šī transportlīdzekļa iestatījumus."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Nav pieejams"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Nevar mainīt skaļumu šajā pārvaldītajā transportlīdzeklī"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Nevar veikt zvanus šajā pārvaldītajā transportlīdzeklī"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Nav atļauts sūtīt īsziņas šajā pārvaldītajā transportlīdzeklī"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera nav pieejama šajā pārvaldītajā transportlīdzeklī"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Nevar izveidot ekrānuzņēmumus šajā pārvaldītajā transportlīdzeklī"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Nevar atvērt šo lietotni šajā pārvaldītajā transportlīdzeklī"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Bloķēja jūsu kredīta nodrošinātājs"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Organizācija ir ierobežojusi piekļuvi noteiktām funkcijām.\n\nJa jums ir kādi jautājumi, sazinieties ar organizācijas pārvaldnieku."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Transportlīdzekļa administratora lietotnes"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivizēta lietotne}zero{# aktivizētu lietotņu}one{# aktivizēta lietotne}other{# aktivizētas lietotnes}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nav aktivizētu lietotņu"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>: transportlīdzekļa politika"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Iestatījumi, ko pārvalda organizācijas pārvaldnieks"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Plašāka informācija par: <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Vai kopīgot kļūdas pārskatu?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Šī transportlīdzekļa organizācijas pārvaldnieks pieprasīja kļūdas pārskatu, lai varētu palīdzēt novērst problēmu šajā ierīcē. Var tikt kopīgotas lietotnes un dati."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Šī transportlīdzekļa organizācijas pārvaldnieks pieprasīja kļūdas pārskatu, lai varētu palīdzēt novērst problēmu šajā ierīcē. Var tikt kopīgotas lietotnes un dati, un jūsu ierīces darbība var īslaicīgi palēnināties."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Šis kļūdas pārskats tiek kopīgots ar šī transportlīdzekļa organizācijas pārvaldnieku. Lai iegūtu plašāku informāciju, sazinieties ar pārvaldnieku."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Kopīgot"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Noraidīt"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Šo iestatījumu pašlaik nevar mainīt."</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Pieejamība"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Subtitri"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Subtitru preferences"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Izslēgti"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Ieslēgti"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Ekrāna lasītājs"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Rādīt subtitrus"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Teksta lielums"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Subtitru lielums un stils"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Ļoti mazs"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Mazs"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Noklusējums"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Liels"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Ļoti liels"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Subtitru stils"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Lietotnes iestatījums"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Balts uz melna"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Melns uz balta"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Dzeltens uz melna"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Dzeltens uz zila"</string>
</resources>
diff --git a/res/values-mk/arrays.xml b/res/values-mk/arrays.xml
index eed55c5..49c1788 100644
--- a/res/values-mk/arrays.xml
+++ b/res/values-mk/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Никогаш не дозволувај"</item>
<item msgid="1154273129608299386">"Секогаш дозволувај"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 62f4b5f..499744c 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Ноќен режим"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Мрежа и интернет"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Мобилна мрежа"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-картичка</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-картички</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-картичка}one{# SIM-картичка}other{# SIM-картички}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Активна/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Неактивна/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Активна/Преземена SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Додајте повеќе"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобилен интернет"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Пристап на интернет преку мобилната мрежа"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Мобилна мрежа"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Користи мобилен интернет"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Да се исклучи мобилниот интернет?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Треба да се избере"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Да се користи <xliff:g id="CARRIER">%1$s</xliff:g> за интернет?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Предупредување за потрошен интернет: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Ограничување за интернет: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Предупредување за потрошен интернет: <xliff:g id="ID_1">^1</xliff:g>/Ограничување за интернет: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Уште %d ден</item>
- <item quantity="other">Уште %d дена</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Преостанува # ден}one{Преостануваат # ден}other{Преостануваат # дена}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Нема повеќе време"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Уште помалку од 1 ден"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Ажурирано од <xliff:g id="ID_1">^1</xliff:g> пред <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Постави"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Предупредување/ограничување на интернет"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Циклус на потрошен интернет од апликации"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Потрошен мобилен интернет"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Поставете предупр. за интернет"</string>
<string name="data_warning" msgid="116776633806885370">"Предупредување за интернетот"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Поставете огранич. на интернет"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Главната единица на возилото ќе го исклучи мобилниот интернет откако ќе се достигне ограничувањето што сте го поставиле.\n\nСо оглед на тоа дека главната единица го мери потрошениот интернет, а операторот може да го мери поинаку, размислете за поставување пониско ограничување."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Поставете предупредување за потрошен интернет"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Поставете ограничување за потрошен интернет"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Потрошениот сообраќај се мери од вашиот уред. Може да варира зависно од интернетот на мобилниот оператор."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Постави"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Зачувај"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-мрежа"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Интернет на возилото"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Ако го исклучите интернетот на возилото, може да се попречат некои функции или апликации на возилото.\n\nКритичните податоци за користењето на возилото сепак ќе се споделуваат со производителот на возилото."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Сепак исклучи"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Интернетот на возилото е исклучен. Така може да се попречат некои функции или апликации на возилото. Критичните податоци за користењето на возилото сепак ќе се споделуваат со производителот на возилото."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Искористено: %1$s %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Придружи се на друга мрежа"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Мрежни поставки"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Додајте мрежа"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Поврзи"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Се поврзува…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Не е поврзано"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Мрежата не е во опсег"</string>
<string name="wifi_password" msgid="5565632142720292397">"Лозинка"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Прикажи ја лозинката"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Избери барем еден појас:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Точка на пристап и врзување"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Точка на пристап"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Исклучен"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Автоматско исклучување на точката на пристап"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Точката на пристап преку Wi‑Fi ќе се исклучи ако нема поврзани уреди"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> сака да вклучи Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Исклучи присилно"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Исклучи присилно?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ако присилно запрете апликација, таа може да не се однесува правилно."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Да се исклучи заштитата на изведбата?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ако ја исклучите, софверот и хардверот може да не функционираат толку добро."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Остави ја вклучена"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Исклучи"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Да се стави приоритет на изведба на апл?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Вклучувањето може да предизвика потенцијална нестабилност на системот или долгорочно влијание врз хардверот. Дали сакате да продолжите?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Да"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Не, фала"</string>
<string name="disable_text" msgid="4358165448648990820">"Оневозможи"</string>
<string name="enable_text" msgid="1794971777861881238">"Овозможи"</string>
<string name="uninstall_text" msgid="277907956072833012">"Деинсталирај"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Дозволи"</string>
<string name="notifications_label" msgid="6586089149665170731">"Известувања"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Капацитет и кеш"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Обезбеди врвна изведба"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Приоритет на изведбата на апликацијата"</string>
<string name="application_version_label" msgid="8556889839783311649">"Верзија %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Не се доделени дозволи"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Не се побарани дозволи"</string>
<string name="unused_apps" msgid="648471933781010395">"Некористени апликации"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> некористена апликација</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> некористени апликации</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# некористена апликација}one{# некористена апликација}other{# некористени апликации}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Отстранувај дозволи за повеќе простор"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s во внатрешен капацитет"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Кога е неопходно, затвори ја апликацијата за да се избегне прекумерно користење ресурси"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Се користат ресурси на системот за да се стави приоритет на изведбата на апликацијата"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Потрошен интернет"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Потрошен интернет од апл."</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Историја на сообраќај"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Сите апликации"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Мобилен интернет и Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Историја на сообраќај"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Вкупно потрошен интернет"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Преден план"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Заднина"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Дозволете моб. интернет"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Дозволете апликацијава да користи мобилен интернет"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Ограничен моб. интернет"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Аплик. користи моб. интернет само во преден план"</string>
<string name="computing_size" msgid="5791407621793083965">"Пресметување…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дополнителна дозвола</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дополнителни дозволи</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# дополнителна дозвола}one{# дополнителна дозвола}other{# дополнителни дозволи}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Забелешка: по рестартирање, апликацијава не може да се стартува додека не го отклучите возилото."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Помош и гласовен запис"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Апликација за помош"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Контролата на Wi-Fi дозволува апликацијава да вклучува или исклучува Wi-Fi, да скенира и да се поврзува на Wi-Fi мрежи, да додава или отстранува мрежи или да започне локална точка на пристап."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Повеќе"</string>
<string name="location_settings_title" msgid="901334356682423679">"Локација"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Користете ја локацијата"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Дозволете апликациите што ќе ги нагласите да пристапуваат до локацијата"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Ако го исклучите ова, ќе се отстрани пристапот до локацијата за сите апликации. Апликациите за помош за возачи и понатаму ќе имаат пристап."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Користете локација за помош за возачи"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Локацијата на возилото е исклучена"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Апликациите за помош за возачи немаат пристап до локацијата"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Измени"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Дозволи апликациите што помагаат со возењето да пристапуваат до локацијата"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ако го исклучите ова, функциите за помош за возачи што зависат од податоците за локација ќе бидат оневозможени."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Сепак исклучи"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Последни барања за локација"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Нема неодамнешни барања за локација"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Дозволи на ниво на апликација"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Услуги според локација"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Користи ја локацијата"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Услугата „Локација“ може да користи извори како GPS, Wi‑Fi, мобилни мрежи и сензори за да помогне да се процени локацијата на уредот."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Помош за возачи"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Податоците за локацијата што се испраќаат до апликациите за помош за возачи не содржат податоци што ве идентификуваат. Се чуваат најмногу 2 дена пред да се избришат."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Микрофон"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Користи го микрофонот"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Дозволете пристап до микрофонот за сите апликации"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Управувајте со дозволите за микрофон"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Неодамна пристапени"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Нема неодамнешни апликации"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 апликации имаат пристап"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# од {total_count} апликации има пристап}one{# од {total_count} апликации имаат пристап}other{# од {total_count} апликации имаат пристап}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Неодамнешни пристапувања"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Прикажи ги сите"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Се вчитува…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Систем"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Ажурирања на системот"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Напредни"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Лиценци на трети лица"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Постои проблем при вчитување на лиценците."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Се вчитува…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Сега сте на <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> чекор поблиску да станете програмер.</item>
- <item quantity="other">Сега сте на <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> чекори поблиску да станете програмер.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Сега сте на # чекор поблиску да станете програмер.}one{Сега сте на # чекор поблиску да станете програмер.}other{Сега сте на # чекори поблиску да станете програмер.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Сега сте програмер!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Нема потреба, веќе сте програмер."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Програмерски опции"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Откако ќе создадете нов профил за некое лице, тоа ќе треба да си го приспособи за себе."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Апликациите може да се ажурират од кој било профил, а може да ги користат сите други профили."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Достигнат е максимален број профили"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Може да создадете најмногу <xliff:g id="COUNT">%d</xliff:g> профил.</item>
- <item quantity="other">Може да создадете најмногу <xliff:g id="COUNT">%d</xliff:g> профили.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Може да се создаде само еден профил.}one{Може да создадете најмногу # профил.}other{Може да создадете најмногу # профили.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Не можеше да се создаде нов профил"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Да се избрише профилов?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Ќе се избришат сите апликации и податоци за профилов."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Не можеше да се избрише профилот."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Профилот не е избришан. Рестартираjте го уредот за повторен обид."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Профилов ќе се избрише кога ќе промените профил или ќе го рестартирате возилото."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Отфрли"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Повторно"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Како се употребува шемата на отклучување"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Грешка при зачувување на шемата"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Премногу погрешни обиди. Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунди."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Користете допир бидејќи шемата не поддржува внесување со вртење"</string>
<string name="okay" msgid="4589873324439764349">"Во ред"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Отстрани заклучување екран?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Ова ќе овозможи секој да пристапува до вашата сметка"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Обичните PIN-кодови се блокирани од вашиот IT-администратор. Обидете се со друг PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Лозинката не може да содржи неважечки знак."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Лозинката е неважечка, мора да има најмалку 4 знаци."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> буква</item>
- <item quantity="other">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> букви</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> мала буква</item>
- <item quantity="other">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> мали букви</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> голема буква</item>
- <item quantity="other">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> големи букви</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> цифра</item>
- <item quantity="other">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> цифри</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> специјален симбол</item>
- <item quantity="other">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> специјални симболи</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> знак што не е буква</item>
- <item quantity="other">Мора да содржи најмалку <xliff:g id="COUNT">%d</xliff:g> знаци што не се букви</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Администраторот на уредот не дозволува користење на неодамнешна лозинка"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Грешка при зачувување на лозинката"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Обичните лозинки се блокирани од вашиот IT-администратор. Обидете се со друга лозинка."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Додај профил"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Избриши го профилов"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Додај профил"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Осветленост на екранот"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"За да ги видите уредите, вклучете Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"За да спарите уред, отворете ги поставките за Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Администратор на системот за информации и забава"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Активирани апликации"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Деактивирани апликации"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Апликациите со дозволава имаат пристап до податоците на возилово"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Нема администраторски апликации за возилото"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Апликацијава за администратор на системот за информации и забава е активна и дозволува апликацијата <xliff:g id="APP_NAME">%1$s</xliff:g> да ги извршува следниве операции:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Активирањето на апликацијава на системот за информации и забава ќе овозможи апликацијата <xliff:g id="APP_NAME">%1$s</xliff:g> да ги извршува следниве операции:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Активирај апл. на сис. за инф. и забава?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Активирајте ја апликацијава на системот за информации и забава"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Деактивирај и деинсталирај"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Деактивирајте ја апликацијава на системот за информации и забава"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Повеќе детали"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Управникот на организацијата може да ги следи и да управува со апликациите и податоците поврзани со профилов, заедно со поставките, дозволите, корпоративниот пристап, мрежната активност и податоците за локацијата на возилото."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Управникот на организацијата може да ги следи и да управува со апликациите и податоците поврзани со профилов, заедно со поставките, дозволите, корпоративниот пристап, мрежната активност и податоците за локацијата на уредот."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Управникот на организацијата може да ги следи и да управува со апликациите и податоците поврзани со системов за информации и забава, заедно со поставките, дозволите, корпоративниот пристап, мрежната активност и податоците за локацијата на возилото."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Управникот на организацијата можеби ќе може да пристапува до податоците поврзани со системов за информации и забава, да управува со апликациите и да ги менува поставките за возилово."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Тоа е недостапно"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Не може да се промени јачината на звукот во управуваново возило"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Не може да се упатуваат повици во управуваново возило"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Испраќањето SMS не е дозволено во управуваново возило"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Камерата не е достапна во управуваново возило"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Не може да се зачувуваат слики од екранот во ова управувано возило"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Не може да се отвори апликацијава во управуваново возило"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Блокирано од давателот на кредит"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Организацијата го ограничила пристапот до одредени функции.\n\nАко имате прашања, контактирајте со менаџерот на организацијата."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Апликации за администратор на возило"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# активирана апликација}one{# активирана апликација}other{# активирани апликации}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Нема активирани апликации"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Правила за возило на <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Со поставките управува управникот на организацијата"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Дознајте повеќе за <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Да се сподели извештајот за грешки?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Управникот на организацијата на возилово побара извештај за грешки за да ви помогне да ги решите проблемите на уредов. Можно е да се споделат апликации и податоци."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Управникот на организацијата на возилово побара извештај за грешки за да ви помогне да ги решите проблемите на уредов. Можно е да се споделат апликации и податоци, а уредот привремено да биде побавен."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Извештајот за грешки е споделен со управникот на организацијата на возилово. За повеќе детали, контактирајте со него."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Сподели"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Одбиј"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Поставкава не може да се промени во моментов"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Пристапност"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Титлови"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Поставки за титлови"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Исклучено"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Вклучено"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Читач на екран"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Прикажувај титлови"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Големина на текст"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Големина и стил на титловите"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Многу мал"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Мал"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Стандарден"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Голем"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Многу голем"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Стил на титловите"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Поставено од апликација"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Бели на црно"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Црни на бело"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Жолти на црно"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Жолти на сино"</string>
</resources>
diff --git a/res/values-ml/arrays.xml b/res/values-ml/arrays.xml
index 2677c2e..260098e 100644
--- a/res/values-ml/arrays.xml
+++ b/res/values-ml/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"ഒരിക്കലും അനുവദിക്കരുത്"</item>
<item msgid="1154273129608299386">"എല്ലായ്പ്പോഴും അനുവദിക്കുക"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index c908dea..2a09949 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"നൈറ്റ് മോഡ്"</string>
<string name="network_and_internet" msgid="4229023630498537530">"നെറ്റ്വർക്കും ഇന്റർനെറ്റും"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"മൊബൈൽ നെറ്റ്വർക്ക്"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-കള്</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# സിം}other{# സിമ്മുകൾ}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"സജീവം / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"നിഷ്ക്രിയം / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"സജീവം / ഡൗൺലോഡ് ചെയ്ത SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"കൂടുതൽ ചേർക്കുക"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"മൊബൈൽ ഡാറ്റ"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"മൊബൈൽ നെറ്റ്വർക്ക് ഉപയോഗിച്ച് ഡാറ്റ ആക്സസ് ചെയ്യുക"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"മൊബൈൽ നെറ്റ്വർക്ക്"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കുക"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"മൊബൈൽ ഡാറ്റ ഓഫാക്കണോ?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"തിരഞ്ഞെടുക്കേണ്ടത് ആവശ്യമാണ്"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"മൊബൈൽ ഡാറ്റയ്ക്ക് <xliff:g id="CARRIER">%1$s</xliff:g> വേണോ?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> ഡാറ്റാ മുന്നറിയിപ്പ്"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> ഡാറ്റാ പരിധി"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> ഡാറ്റാ മുന്നറിയിപ്പ് / <xliff:g id="ID_2">^2</xliff:g> ഡാറ്റാ പരിധി"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d ദിവസം ശേഷിക്കുന്നു</item>
- <item quantity="one">%d ദിവസം ശേഷിക്കുന്നു</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# ദിവസം ശേഷിക്കുന്നു}other{# ദിവസം ശേഷിക്കുന്നു}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"സമയമൊന്നും അവശേഷിക്കുന്നില്ല"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"ഒരു ദിവസത്തിൽ കുറഞ്ഞ സമയം ശേഷിക്കുന്നു"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> മുമ്പ് <xliff:g id="ID_1">^1</xliff:g> അപ്ഡേറ്റ് ചെയ്തു"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"സജ്ജീകരിക്കുക"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ഡാറ്റാ മുന്നറിയിപ്പും പരിധിയും"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"ആപ്പ് ഡാറ്റാ ഉപയോഗ സൈക്കിൾ"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"മൊബൈൽ ഡാറ്റാ ഉപയോഗം"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ഡാറ്റാ മുന്നറിയിപ്പ് സജ്ജീകരിക്കുക"</string>
<string name="data_warning" msgid="116776633806885370">"ഡാറ്റാ മുന്നറിയിപ്പ്"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ഡാറ്റാ പരിധി സജ്ജീകരിക്കുക"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"നിങ്ങൾ സജ്ജീകരിച്ചിരിക്കുന്ന പരിധി എത്തുമ്പോൾ നിങ്ങളുടെ വാഹനത്തിൻ്റെ ഹെഡ് യൂണിറ്റ്, മൊബൈൽ ഡാറ്റാ ഓഫാക്കും.\n\nഡാറ്റാ ഉപയോഗം ഹെഡ് യൂണിറ്റിൽ അളക്കുന്നതിനാലും, നിങ്ങളുടെ കാരിയർ വ്യത്യസ്ത രീതിയിൽ ഉപയോഗം കണക്കാക്കിയേക്കാം എന്നതിനാലും മിതമായ ഡാറ്റാ പരിധി സജ്ജീകരിക്കാൻ നോക്കുക."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ഡാറ്റാ ഉപയോഗ മുന്നറിയിപ്പ് സജ്ജീകരിക്കുക"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ഡാറ്റാ ഉപയോഗ പരിധി സജ്ജീകരിക്കുക"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"നിങ്ങളുടെ ഉപകരണം ഉപയോഗിച്ചാണ് ഡാറ്റാ ഉപയോഗം അളക്കുന്നത്. നിങ്ങളുടെ മൊബൈൽ സേവനദാതാവിന്റെ ഡാറ്റയിൽ നിന്ന് ഇത് വ്യത്യാസപ്പെടാം."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"സജ്ജീകരിക്കുക"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"സംരക്ഷിക്കുക"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM നെറ്റ്വർക്ക്"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"വാഹന ഇന്റർനെറ്റ്"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"വാഹന ഇന്റർനെറ്റ് ഓഫാക്കുന്നത്, വാഹനത്തിലെ ചില ഫീച്ചറുകളോ ആപ്പുകളോ പ്രവർത്തിക്കുന്നത് തടഞ്ഞേക്കാം.\n\nവാഹനത്തിന്റെ പ്രവർത്തനത്തിനാവശ്യമായ ഡാറ്റ വാഹന നിർമ്മാതാവുമായി തുടർന്നും പങ്കിടും."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"എന്തായാലും ഓഫാക്കുക"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"വാഹന ഇന്റർനെറ്റ് ഓഫാക്കി. വാഹനത്തിലെ ചില ഫീച്ചറുകളോ ആപ്പുകളോ പ്രവർത്തിക്കുന്നത് ഇത് തടഞ്ഞേക്കാം. വാഹനത്തിന്റെ പ്രവർത്തനത്തിനാവശ്യമായ ഡാറ്റ വാഹന നിർമ്മാതാവുമായി തുടർന്നും പങ്കിടും."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s മുതൽ - %3$s വരെ %1$s ഉപയോഗിച്ചു"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"മറ്റൊരു നെറ്റ്വർക്കിൽ ചേരുക"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"നെറ്റ്വർക്ക് മുൻഗണനകൾ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"നെറ്റ്വർക്ക് ചേർക്കുക"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"കണക്റ്റ് ചെയ്യൂ"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"കണക്റ്റ് ചെയ്യുന്നു…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"കണക്റ്റ് ചെയ്തില്ല"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"നെറ്റ്വർക്ക് പരിധിയിലില്ല"</string>
<string name="wifi_password" msgid="5565632142720292397">"പാസ്വേഡ്"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"പാസ്വേഡ് കാണിക്കുക"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"വൈഫൈ ഹോട്ട്സ്പോട്ടിനായി ഒരു ബാൻഡ് എങ്കിലും തിരഞ്ഞെടുക്കൂ:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ഹോട്ട്സ്പോട്ടും ടെതറിംഗും"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ഹോട്ട്സ്പോട്ട്"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ഓഫാണ്"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"ഹോട്ട്സ്പോട്ട് സ്വയമേവ ഓഫാക്കുക"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"ഉപകരണങ്ങളൊന്നും കണക്റ്റ് ചെയ്തില്ലെങ്കിൽ വൈഫൈ ഹോട്ട്സ്പോട്ട് ഓഫാകും"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g>വൈഫൈ ഓണാക്കാൻ ആഗ്രഹിക്കുന്നു"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"നിർബന്ധിതമായി നിർത്തുക"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"നിർബന്ധിതമായി നിർത്തണോ?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"നിങ്ങൾ ഒരു ആപ്പ് നിർബന്ധിതമായി നിർത്തിയാൽ, അത് ശരിയായി പ്രവർത്തിക്കാനിടയില്ല."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"പ്രകടനത്തിനുള്ള പരിരക്ഷ ഓഫാക്കണോ?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"ഓഫാക്കിയാൽ നിങ്ങളുടെ സോഫ്റ്റ്വെയറും ഹാർഡ്വെയറും മികച്ച രീതിയിൽ പ്രവർത്തിച്ചേക്കില്ല."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ഓണാക്കിയിടുക"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"ഓഫാക്കുക"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"ആപ്പിന്റെ പ്രകടനത്തിന് മുൻഗണ നൽകുക ഓണാക്കണോ?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"ഇത് ഓണാക്കുന്നത് സിസ്റ്റം അസ്ഥിരതാ സാധ്യതയോ ദീർഘ കാല ഹാർഡ്വെയർ ആഘാതമോ സൃഷ്ടിക്കാം. നിങ്ങൾക്ക് തുടരണമെന്നുണ്ടോ?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"വേണം"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"വേണ്ട"</string>
<string name="disable_text" msgid="4358165448648990820">"പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="enable_text" msgid="1794971777861881238">"പ്രവർത്തനക്ഷമമാക്കുക"</string>
<string name="uninstall_text" msgid="277907956072833012">"അൺഇൻസ്റ്റാൾ ചെയ്യുക"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"അനുമതികൾ"</string>
<string name="notifications_label" msgid="6586089149665170731">"അറിയിപ്പുകൾ"</string>
<string name="storage_application_label" msgid="5911779903670978586">"സ്റ്റോറേജും കാഷെയും"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"നല്ല പ്രകടനം ഉറപ്പാക്കൂ"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ആപ്പിന്റെ പ്രകടനത്തിന് മുൻഗണന നൽകുക"</string>
<string name="application_version_label" msgid="8556889839783311649">"പതിപ്പ്: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"അനുമതികളൊന്നും അനുവദിച്ചില്ല"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"അനുമതികളൊന്നും അഭ്യർത്ഥിച്ചില്ല"</string>
<string name="unused_apps" msgid="648471933781010395">"ഉപയോഗിക്കാത്ത ആപ്പുകൾ"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">ഉപയോഗിക്കാത്ത <xliff:g id="COUNT_1">%d</xliff:g> ആപ്പുകൾ</item>
- <item quantity="one">ഉപയോഗിക്കാത്ത <xliff:g id="COUNT_0">%d</xliff:g> ആപ്പ്</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{ഉപയോഗിക്കാത്ത # ആപ്പ്}other{ഉപയോഗിക്കാത്ത # ആപ്പുകൾ}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"അനുമതികൾ നീക്കം ചെയ്ത് ഇടം സൃഷ്ടിക്കുക"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"ഉള്ളിലെ മെമ്മറിയിൽ %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"ഉറവിടങ്ങളുടെ അമിതോപയോഗം തടയാൻ ആപ്പ് അടയ്ക്കൂ"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ആപ്പിന്റെ പ്രകടനത്തിന് മുൻഗണന നൽകാൻ സിസ്റ്റം വിഭവങ്ങൾ ഉപയോഗിക്കുന്നു"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ഡാറ്റ ഉപയോഗം"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ആപ്പ് ഡാറ്റ ഉപയോഗം"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"ഉപയോഗ ചരിത്രം"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"എല്ലാ ആപ്പുകളും"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ഡാറ്റാ, വൈഫൈ ഉപയോഗം"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"ഉപയോഗ ചരിത്രം"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"മൊത്തം ഉപയോഗം"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ഫോർഗ്രൗണ്ട്"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"പശ്ചാത്തലം"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"മൊബൈൽ ഡാറ്റ അനുവദിക്കുക"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"ഈ ആപ്പിനെ മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കാൻ അനുവദിക്കുക"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"മൊബൈൽ ഡാറ്റ നിയന്ത്രിക്കൂ"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ആപ്പ് ഫോർഗ്രൗണ്ടിലുള്ളപ്പോൾ മാത്രം ഡാറ്റ ഉപയോഗിക്കൂ"</string>
<string name="computing_size" msgid="5791407621793083965">"കണക്കാക്കുന്നു…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> അധിക അനുമതികൾ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> അധിക അനുമതി</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# അധിക അനുമതി}other{# അധിക അനുമതികൾ}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"കുറിപ്പ്: റീബൂട്ട് ചെയ്ത ശേഷം, വാഹനം അൺലോക്ക് ചെയ്യുന്നത് വരെ ഈ ആപ്പിന് പ്രവർത്തനം തുടങ്ങാൻ കഴിയില്ല."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"അസിസ്റ്റും വോയ്സ് ഇൻപുട്ടും"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"സഹായ ആപ്പ്"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"വൈഫൈ ഓണാക്കാനോ ഓഫാക്കാനോ, സ്കാൻ ചെയ്ത് വൈഫൈ നെറ്റ്വർക്കുകളിലേക്ക് കണക്റ്റ് ചെയ്യാനും നെറ്റ്വർക്കുകൾ ചേർക്കാനോ നീക്കം ചെയ്യാനോ, ഉപകരണം ഉള്ളിടത്ത് മാത്രം പ്രവർത്തിക്കുന്ന ഹോട്ട്സ്പോട്ട് ആരംഭിക്കാനോ വൈഫൈ നിയന്ത്രണം ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="more_special_access_title" msgid="166115485446645971">"കൂടുതൽ"</string>
<string name="location_settings_title" msgid="901334356682423679">"ലൊക്കേഷൻ"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"ലൊക്കേഷൻ ഉപയോഗിക്കുക"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"നിങ്ങൾ വ്യക്തമാക്കുന്ന ആപ്പുകളെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ അനുവദിക്കൂ"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"ഇത് ഓഫാക്കിയാൽ എല്ലാ ആപ്പുകൾക്കുമുള്ള ലൊക്കേഷൻ ആക്സസ് നീക്കം ചെയ്യപ്പെടും. ഡ്രൈവർ സഹായി ആപ്പുകൾക്ക് തുടർന്നും ആക്സസ് ഉണ്ടായിരിക്കും."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ഡ്രൈവർ സഹായിക്ക് ലൊക്കേഷൻ ഉപയോഗിക്കുക"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"വാഹന ലൊക്കേഷൻ ഓഫാണ്"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ഡ്രൈവർ സഹായി ആപ്പുകൾക്ക് ലൊക്കേഷൻ ആക്സസ് ചെയ്യാനാകില്ല"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"മാറ്റുക"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"ഡ്രെെവിംഗിന് സഹായിക്കുന്ന ആപ്പുകളെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ അനുവദിക്കൂ"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"ഇത് ഓഫാക്കിയാൽ, ലൊക്കേഷൻ വിവരങ്ങളെ ആശ്രയിക്കുന്ന ഡ്രൈവർ സഹായി ആപ്പുകൾ പ്രവർത്തനരഹിതമാകും."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"എന്തായാലും ഓഫാക്കുക"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"അടുത്തിടെയുള്ള ലൊക്കേഷൻ അഭ്യർത്ഥനകൾ"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"അടുത്തിടെയുള്ള ലൊക്കേഷൻ അഭ്യർത്ഥനകളൊന്നുമില്ല"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ആപ്പ്-തല അനുമതികൾ"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"ലൊക്കേഷൻ സേവനങ്ങൾ"</string>
<string name="location_use_location_title" msgid="117735895374606680">"ലൊക്കേഷൻ ഉപയോഗിക്കുക"</string>
<string name="location_settings_footer" msgid="296892848338100051">"നിങ്ങളുടെ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ കണക്കാക്കാൻ സഹായിക്കുന്നതിന് GPS, വൈഫൈ, മൊബൈൽ നെറ്റ്വർക്കുകൾ, സെൻസറുകൾ പോലുള്ള ഉറവിടങ്ങൾ ലൊക്കേഷൻ ഉപയോഗിച്ചേക്കാം."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ഡ്രൈവർ സഹായി"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ഡ്രൈവർ സഹായി ആപ്പുകളിലേക്ക് അയച്ച ലൊക്കേഷൻ വിവരങ്ങളിൽ നിങ്ങളെ തിരിച്ചറിയാൻ സഹായിക്കുന്ന വിവരങ്ങളില്ല. ഇത് ഇല്ലാതാക്കുന്നതിന് മുമ്പ് പരമാവധി 2 ദിവസത്തേക്ക് സംഭരിക്കും."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"മൈക്രോഫോൺ"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"മൈക്രോഫോൺ ഉപയോഗിക്കുക"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"നിങ്ങളുടെ മൈക്രോഫോൺ ആക്സസ് ചെയ്യാൻ എല്ലാ ആപ്പുകളെയും അനുവദിക്കുക"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"മൈക്രോഫോൺ അനുമതികൾ മാനേജ് ചെയ്യുക"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"അടുത്തിടെ ആക്സസ് ചെയ്തവ"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"അടുത്തിടെ ഉപയോഗിച്ച ആപ്പുകളൊന്നുമില്ല"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"ആപ്പുകൾക്കൊന്നിനും ആക്സസ് ഇല്ല"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count} ആപ്പുകളിൽ #-ന് ആക്സസ് ഉണ്ട്}other{{total_count} ആപ്പുകളിൽ #-ന് ആക്സസ് ഉണ്ട്}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"അടുത്തിടെ ആക്സസ് ചെയ്തവ"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"എല്ലാം കാണുക"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"ലോഡ് ചെയ്യുന്നു…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"സിസ്റ്റം"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"സിസ്റ്റം അപ്ഡേറ്റുകൾ"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"വിപുലമായത്"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"മൂന്നാം കക്ഷി ലൈസൻസുകൾ"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ലൈസൻസുകൾ ലോഡ് ചെയ്യുന്നതിൽ ഒരു പ്രശ്നമുണ്ട്."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"ലോഡ് ചെയ്യുന്നു…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">ഒരു ഡെവലപ്പറാകുന്നതിൽ നിന്നും <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ചുവടുകൾ അകലെയാണ് നിങ്ങളിപ്പോൾ.</item>
- <item quantity="one">ഒരു ഡെവലപ്പറാകുന്നതിൽ നിന്നും <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ചുവട് അകലെയാണ് നിങ്ങളിപ്പോൾ.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{നിങ്ങൾ ഒരു ഡെവലപ്പറാകുന്നതിൽ നിന്നും # ചുവട് അകലെയാണ്.}other{നിങ്ങൾ ഒരു ഡെവലപ്പറാകുന്നതിൽ നിന്നും # ചുവടുകൾ അകലെയാണ്.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"നിങ്ങൾ ഇപ്പോൾ ഒരു ഡവലപ്പറാണ്!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"ആവശ്യമില്ല, നിങ്ങൾ മുമ്പേ ഒരു ഡവലപ്പറാണ്."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ഡെവലപ്പർ ഓപ്ഷനുകൾ"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"നിങ്ങൾ പുതിയൊരു പ്രൊഫെെൽ സൃഷ്ടിച്ചതിന് ശേഷം, അത് ഉപയോഗിക്കേണ്ടയാൾ അത് ഇഷ്ടാനുസൃതമാക്കേണ്ടതുണ്ട്."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"മറ്റെല്ലാ പ്രൊഫെെലുകൾക്കും ഉപയോഗിക്കാൻ, ആപ്പുകൾ ഏത് പ്രൊഫെെലിൽ നിന്നും അപ്ഡേറ്റ് ചെയ്യാനാകും."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"അനുവദിച്ച പ്രൊഫൈൽ പരിധിയെത്തി"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">നിങ്ങൾക്ക് <xliff:g id="COUNT">%d</xliff:g> പ്രൊഫൈലുകൾ വരെ സൃഷ്ടിക്കാം.</item>
- <item quantity="one">ഒരു പ്രൊഫൈൽ മാത്രമേ സൃഷ്ടിക്കാനാകൂ.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{ഒരു പ്രൊഫൈൽ മാത്രമേ സൃഷ്ടിക്കാനാകൂ.}other{നിങ്ങൾക്ക് # പ്രൊഫൈലുകൾ വരെ സൃഷ്ടിക്കാനാകും.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"പുതിയ പ്രൊഫെെൽ സൃഷ്ടിക്കാനായില്ല"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ഈ പ്രൊഫൈൽ ഇല്ലാതാക്കണോ?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ഈ പ്രൊഫൈലിലെ എല്ലാ ആപ്പുകളും ഡാറ്റയും ഇല്ലാതാക്കും"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"പ്രൊഫെെൽ ഇല്ലാതാക്കാനായില്ല."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"പ്രൊഫൈൽ ഇല്ലാതാക്കിയില്ല. ഉപകരണം റീസ്റ്റാർട്ടുചെയ്ത് വീണ്ടും ശ്രമിക്കൂ."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"പ്രൊഫൈലുകൾ പരസ്പരം മാറുമ്പോഴോ വാഹനം റീസ്റ്റാർട്ട് ചെയ്യുമ്പോഴോ ഈ പ്രൊഫൈൽ ഇല്ലാതാക്കപ്പെടും."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ഡിസ്മിസ്സ് ചെയ്യുക"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"വീണ്ടും ശ്രമിക്കുക"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"ഒരു അൺലോക്ക് പാറ്റേൺ വരയ്ക്കേണ്ടതെങ്ങനെ"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"പാറ്റേൺ സംരക്ഷിക്കുന്നതിൽ പിശക്"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"നിരവധി തെറ്റായ ശ്രമങ്ങൾ. <xliff:g id="NUMBER">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"റോട്ടറിക്ക് പാറ്റേണിന്റെ പിന്തുണയില്ല, ടച്ച് ഉപയോഗിക്കൂ"</string>
<string name="okay" msgid="4589873324439764349">"ശരി"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"സ്ക്രീൻ ലോക്ക് നീക്കം ചെയ്യണോ?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"ഇത് നിങ്ങളുടെ അക്കൗണ്ട് ആർക്കും ആക്സസ് ചെയ്യാൻ അനുവദിക്കും"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"നിങ്ങളുടെ ഐടി അഡ്മിൻ സാധാരണ പിന്നുകൾ ബ്ലോക്ക് ചെയ്തിട്ടുണ്ട്. മറ്റൊരു പിൻ പരീക്ഷിച്ച് നോക്കുക."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"ഇതിൽ അസാധുവായൊരു പ്രതീകം ഉണ്ടായിരിക്കാൻ പാടില്ല."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"പാസ്വേഡ് അസാധുവാണ്, കുറഞ്ഞത് 4 പ്രതീകങ്ങളെങ്കിലും ഉണ്ടായിരിക്കണം."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">കുറഞ്ഞത് <xliff:g id="COUNT">%d</xliff:g> അക്ഷരങ്ങളെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- <item quantity="one">കുറഞ്ഞത് ഒരു അക്ഷരമെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">കുറഞ്ഞത് <xliff:g id="COUNT">%d</xliff:g> ചെറിയക്ഷരങ്ങളെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- <item quantity="one">കുറഞ്ഞത് ഒരു ചെറിയക്ഷരമെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">കുറഞ്ഞത് <xliff:g id="COUNT">%d</xliff:g> വലിയക്ഷരങ്ങളെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- <item quantity="one">കുറഞ്ഞത് ഒരു വലിയക്ഷരമെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">കുറഞ്ഞത് <xliff:g id="COUNT">%d</xliff:g> അക്കങ്ങളെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- <item quantity="one">കുറഞ്ഞത് ഒരു അക്കമെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">കുറഞ്ഞത് <xliff:g id="COUNT">%d</xliff:g> സവിശേഷ ചിഹ്നങ്ങളെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- <item quantity="one">കുറഞ്ഞത് ഒരു സവിശേഷ ചിഹ്നമെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">കുറഞ്ഞത് അക്ഷരമല്ലാത്ത <xliff:g id="COUNT">%d</xliff:g> പ്രതീകങ്ങളെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- <item quantity="one">കുറഞ്ഞത് അക്ഷരമല്ലാത്ത ഒരു പ്രതീകമെങ്കിലും അടങ്ങിയിരിക്കണം</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ഒരു സമീപകാല പാസ്വേഡ് ഉപയോഗിക്കാൻ ഉപകരണ അഡ്മിൻ അനുവദിക്കുന്നില്ല"</string>
<string name="error_saving_password" msgid="8334882262622500658">"പാസ്വേഡ് സംരക്ഷിക്കുന്നതിൽ പിശക്"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"നിങ്ങളുടെ ഐടി അഡ്മിൻ സാധാരണ പാസ്വേഡുകൾ ബ്ലോക്ക് ചെയ്തിട്ടുണ്ട്. മറ്റൊരു പാസ്വേഡ് പരീക്ഷിച്ച് നോക്കുക."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"ഒരു പ്രൊഫൈൽ ചേര്ക്കുക"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ഈ പ്രൊഫൈൽ ഇല്ലാതാക്കുക"</string>
<string name="add_profile_text" msgid="9118410102199116969">"പ്രൊഫൈൽ ചേർക്കുക"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ഡിസ്പ്ലേ തെളിച്ചം"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"നിങ്ങളുടെ ഉപകരണങ്ങൾ കാണാൻ Bluetooth ഓണാക്കുക"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"ഒരു ഉപകരണം ജോടിയാക്കാൻ Bluetooth ക്രമീകരണം തുറക്കുക"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"ഇൻഫോറ്റേയിൻമെന്റ് സിസ്റ്റം അഡ്മിൻ"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"സജീവമാക്കിയ ആപ്പുകൾ"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"നിഷ്ക്രിയമാക്കിയ ആപ്പുകൾ"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ഈ അനുമതിയുള്ള ആപ്പുകൾക്ക് ഈ വാഹനത്തിന്റെ ഡാറ്റയിലേക്ക് ആക്സസ് ഉണ്ട്"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"വാഹന അഡ്മിൻ ആപ്പുകൾ ഒന്നുമില്ല"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"ഈ ഇൻഫോറ്റേയിൻമെന്റ് സിസ്റ്റം അഡ്മിൻ സജീവമായതിനാൽ ഇനിപ്പറയുന്ന പ്രവർത്തനങ്ങൾ നിർവ്വഹിക്കാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിനെ അനുവദിക്കുന്നു:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"ഈ ഇൻഫോറ്റേയിൻമെന്റ് സിസ്റ്റം അഡ്മിനെ സജീവമാക്കുന്നത്, ഇനിപ്പറയുന്ന പ്രവർത്തനങ്ങൾ നിർവ്വഹിക്കാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിനെ അനുവദിക്കുന്നു:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"ഈ ഇൻഫോറ്റേയിൻമെന്റ് സിസ്റ്റം ആപ്പ് സജീവമാക്കണോ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"ഈ ഇൻഫോറ്റേയിൻമെന്റ് സിസ്റ്റം ആപ്പ് സജീവമാക്കുക"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"നിഷ്ക്രിയമാക്കുക, അൺഇൻസ്റ്റാൾ ചെയ്യുക"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"ഈ ഇൻഫോറ്റേയിൻമെന്റ് സിസ്റ്റം ആപ്പ് നിഷ്ക്രിയമാക്കുക"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"കൂടുതൽ വിശദാംശങ്ങൾ"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"ക്രമീകരണവും അനുമതികളും കോർപ്പറേറ്റ് ആക്സസും നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റിയും വാഹനത്തിന്റെ ലൊക്കേഷൻ വിവരങ്ങളും ഉൾപ്പെടെ, ഈ പ്രൊഫൈലുമായി ബന്ധപ്പെട്ട ആപ്പുകളും ഡാറ്റയും നിരീക്ഷിക്കാനും മാനേജ് ചെയ്യാനും നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ മാനേജർക്ക് കഴിയും."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"ക്രമീകരണവും അനുമതികളും കോർപ്പറേറ്റ് ആക്സസും നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റിയും ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരങ്ങളും ഉൾപ്പെടെ, ഈ പ്രൊഫൈലുമായി ബന്ധപ്പെട്ട ആപ്പുകളും ഡാറ്റയും നിരീക്ഷിക്കാനും മാനേജ് ചെയ്യാനും നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ മാനേജർക്ക് കഴിയും."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"ക്രമീകരണവും അനുമതികളും കോർപ്പറേറ്റ് ആക്സസും നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റിയും വാഹനത്തിന്റെ ലൊക്കേഷൻ വിവരങ്ങളും ഉൾപ്പെടെ, ഈ ഇൻഫോറ്റേയിൻമെന്റ് സിസ്റ്റവുമായി ബന്ധപ്പെട്ട ആപ്പുകളും ഡാറ്റയും നിരീക്ഷിക്കാനും മാനേജ് ചെയ്യാനും സ്ഥാപനത്തിന്റെ മാനേജർക്ക് കഴിയും."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"ഈ ഇൻഫോറ്റേയിൻമെന്റ് സിസ്റ്റവുമായി ബന്ധപ്പെട്ട ഡാറ്റ ആക്സസ് ചെയ്യാനും ആപ്പുകൾ മാനേജ് ചെയ്യാനും ഈ വാഹനത്തിന്റെ ക്രമീകരണം മാറ്റാനും നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ മാനേജർക്ക് കഴിഞ്ഞേക്കാം."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ഇത് ലഭ്യമല്ല"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"മാനേജ് ചെയ്യപ്പെടുന്ന ഈ വാഹനത്തിൽ വോളിയം മാറ്റാനാകില്ല"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"മാനേജ് ചെയ്യപ്പെടുന്ന ഈ വാഹനത്തിൽ കോൾ ചെയ്യാനാകില്ല"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"മാനേജ് ചെയ്യപ്പെടുന്ന ഈ വാഹനത്തിൽ SMS അനുവദനീയമല്ല"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"മാനേജ് ചെയ്യപ്പെടുന്ന ഈ വാഹനത്തിൽ ക്യാമറ ലഭ്യമല്ല"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"മാനേജ് ചെയ്യപ്പെടുന്ന ഈ വാഹനത്തിൽ സ്ക്രീൻഷോട്ട് എടുക്കാനാകില്ല"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"മാനേജ് ചെയ്യപ്പെടുന്ന ഈ വാഹനത്തിൽ ഈ ആപ്പ് തുറക്കാനാകില്ല"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"നിങ്ങളുടെ ക്രെഡിറ്റ് ദാതാവ് ബ്ലോക്ക് ചെയ്തു"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"ചില ഫീച്ചറുകളിലേക്കുള്ള ആക്സസ് സ്ഥാപനം പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.\n\nചോദ്യങ്ങളുണ്ടെങ്കിൽ സ്ഥാപനത്തിന്റെ മാനേജരെ ബന്ധപ്പെടുക."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"വാഹന അഡ്മിൻ ആപ്പുകൾ"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{സജീവമാക്കിയ # ആപ്പ്}other{സജീവമാക്കിയ # ആപ്പുകൾ}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"സജീവമാക്കിയ ആപ്പുകളൊന്നുമില്ല"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> വാഹന നയം"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"സ്ഥാപനത്തിന്റെ മാനേജർ മാനേജ് ചെയ്യുന്ന ക്രമീകരണം"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> എന്നതിനെക്കുറിച്ച് കൂടുതലറിയുക"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"ബഗ് റിപ്പോർട്ട് പങ്കിടണോ?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"ഈ ഉപകരണത്തിലെ പ്രശ്നം പരിഹരിക്കാൻ സഹായിക്കുന്നതിന് ഈ വാഹനവുമായി ബന്ധപ്പെട്ട സ്ഥാപനത്തിന്റെ മാനേജർ ഒരു ബഗ് റിപ്പോർട്ട് അഭ്യർത്ഥിച്ചു. ആപ്പുകളും ഡാറ്റയും പങ്കിട്ടേക്കാം."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"ഈ ഉപകരണത്തിലെ പ്രശ്നം പരിഹരിക്കാൻ സഹായിക്കുന്നതിന് ഈ വാഹനവുമായി ബന്ധപ്പെട്ട സ്ഥാപനത്തിന്റെ മാനേജർ ഒരു ബഗ് റിപ്പോർട്ട് അഭ്യർത്ഥിച്ചു. ആപ്പുകളും ഡാറ്റയും പങ്കിട്ടേക്കാം, നിങ്ങളുടെ ഉപകരണത്തെ ഇത് താൽക്കാലികമായി മന്ദഗതിയിലാക്കിയേക്കാം."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"ഈ വാഹനവുമായി ബന്ധപ്പെട്ട സ്ഥാപനത്തിന്റെ മാനേജരുമായി ഈ ബഗ് റിപ്പോർട്ട് പങ്കിടുന്നു. കൂടുതൽ വിശദാംശങ്ങൾക്ക് അവരെ ബന്ധപ്പെടുക."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"പങ്കിടുക"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"നിരസിക്കുക"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"ഈ ക്രമീകരണം ഇപ്പോൾ മാറ്റാനാകില്ല"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ഉപയോഗസഹായി"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"അടിക്കുറിപ്പുകൾ"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"അടിക്കുറിപ്പ് മുൻഗണനകൾ"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ഓഫാണ്"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ഓണാണ്"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"സ്ക്രീൻ റീഡർ"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"അടിക്കുറിപ്പുകൾ കാണിക്കുക"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ടെക്സ്റ്റ് വലുപ്പം"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"അടിക്കുറിപ്പിന്റെ വലുപ്പവും സ്റ്റെെലും"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"വളരെ ചെറുത്"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"ചെറുത്"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ഡിഫോൾട്ട്"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"വലുത്"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"വളരെ വലുത്"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"അടിക്കുറിപ്പ് സ്റ്റൈൽ"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ആപ്പ് പ്രകാരം സജ്ജീകരിക്കുക"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"കറുപ്പിൽ വെള്ള"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"വെള്ളയിൽ കറുപ്പ്"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"കറുപ്പിൽ മഞ്ഞ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"നീലയിൽ മഞ്ഞ"</string>
</resources>
diff --git a/res/values-mn/arrays.xml b/res/values-mn/arrays.xml
index 9870bd6..55b373e 100644
--- a/res/values-mn/arrays.xml
+++ b/res/values-mn/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Хэзээ ч зөвшөөрөхгүй"</item>
<item msgid="1154273129608299386">"Үргэлж зөвшөөрөх"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index c8ecf7f..ecac43a 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Шөнийн горим"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Сүлжээ & интернэт"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Мобайл сүлжээ"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Идэвхтэй / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Идэвхгүй / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Идэвхтэй / Татаж авсан SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Бусдыг нэмэх"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобайл дата"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Мобайл сүлжээг ашиглан датад хандах"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Мобайл сүлжээ"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Мобайл датаг ашиглах"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Мобайл датаг унтраах уу?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Сонгох шаардлагатай"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"<xliff:g id="CARRIER">%1$s</xliff:g>-г мобайл датад ашиглах уу?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Дата хэрэглээний сануулга <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Дата хэрэглээний хязгаар <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Дата хэрэглээний сануулга <xliff:g id="ID_1">^1</xliff:g>/ Дата хэрэглээний хязгаар <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d өдөр үлдсэн</item>
- <item quantity="one">%d өдөр үлдсэн</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# хоног үлдсэн}other{# хоног үлдсэн}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Үлдсэн хугацаа алга"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Нэгээс бага өдөр үлдсэн"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>-н өмнө шинэчилсэн"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Тохируулах"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Дата ашиглалтын сануулга болон хязгаарлалт"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Аппын дата ашиглалтын мөчлөг"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Мобайл дата ашиглалт"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Дата ашиглалтын сануулга тавих"</string>
<string name="data_warning" msgid="116776633806885370">"Дата ашиглалтын сануулга"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Дата ашиглалтын хязгаарлалт тогтоох"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Таны тээврийн хэрэгслийн хөгжим тоглуулагч таны тогтоосон хязгаарлалтыг дуусмагц мобайл датаг унтраана.\n\nДата ашиглалтыг хөгжим тоглуулагч хэмждэг бөгөөд таны оператор компани ашиглалтыг өөрөөр тооцоолж магадгүй тул хязгаарлалтыг болгоомжтой тогтооно уу."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Дата ашиглалтын анхааруулга тохируулах"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Дата ашиглалтын хязгаар тохируулах"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Таны төхөөрөмж дата ашиглалтыг хэмждэг. Энэ нь таны мобайл оператор компанийн датагаас өөр байж болно."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Тохируулах"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Хадгалах"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM сүлжээ"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Тээврийн хэрэгслийн интернэт"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Тээврийн хэрэгслийн интернэтийг унтрааснаар зарим тээврийн хэрэгслийн онцлог эсвэл аппыг ажиллуулахад саад болж болзошгүй.\n\nТаны тээврийн хэрэгслийг ажиллуулахад шаардлагатай чухал өгөгдлийг тээврийн хэрэгсэл үйлдвэрлэгчтэй үргэлжлүүлэн хуваалцах болно."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Ямар ч байсан унтраах"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Тээврийн хэрэгслийн интернэт унтраалттай байна. Энэ нь тээврийн хэрэгслийн зарим онцлог эсвэл аппыг ажиллуулахад саад болж болзошгүй. Таны тээврийн хэрэгслийг ажиллуулахад шаардлагатай чухал мэдээллийг тээврийн хэрэгсэл үйлдвэрлэгчтэй үргэлжлүүлэн хуваалцах болно."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s-н хооронд %1$s-г ашигласан"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Бусад сүлжээнд нэгдэх"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Сүлжээний тохиргоо"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Сүлжээ нэмэх"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Холбох"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Холбогдож байна…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Холбогдоогүй"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Сүлжээ хүрээнд алга"</string>
<string name="wifi_password" msgid="5565632142720292397">"Нууц үг"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Нууц үгийг харуулах"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi-Fi сүлжээний цэгт хамгийн багадаа нэг мессеж сонгоно уу:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Сүлжээний цэг, модем болгох"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Сүлжээний цэг"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Унтраалттай байна"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Сүлжээний цэгийг автоматаар унтраах"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Хэрэв төхөөрөмж холбогдоогүй бол Wi‑Fi сүлжээний цэг унтарна"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> Wi-Fi-г асаах хүсэлтэй байна"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Хүчээр зогсоох"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Хүчээр зогсоох уу?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Та аппыг хүчээр зогсоосон тохиолдолд энэ нь буруу ажиллаж болзошгүй."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Гүйцэтгэлийн хамгаалалтыг унтраах уу?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Хэрэв та үүнийг хийвэл таны программ хангамж болон техник хангамж мөн ажиллахгүй байж болзошгүй."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Асаалттай орхих"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Унтраах"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Аппын гүйцэтгэлийг эрэмбэлэхийг асаах уу?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Үүнийг асаах нь системийн тогтворгүй байдал эсвэл техник хангамжийн урт хугацааны нөлөөллийг үүсгэх боломжтой. Та үргэлжлүүлэхийг хүсэж байна уу?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Тийм"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Үгүй, баярлалаа"</string>
<string name="disable_text" msgid="4358165448648990820">"Идэвхгүй болгох"</string>
<string name="enable_text" msgid="1794971777861881238">"Идэвхжүүлэх"</string>
<string name="uninstall_text" msgid="277907956072833012">"Устгах"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Зөвшөөрлүүд"</string>
<string name="notifications_label" msgid="6586089149665170731">"Мэдэгдэл"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Хадгалах сан болон завсрын санах ойд хадгалах"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Дээд гүйцэтгэлээр хангах"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Аппын гүйцэтгэлийг эрэмбэлэх"</string>
<string name="application_version_label" msgid="8556889839783311649">"Хувилбар: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Зөвшөөрөл олгоогүй байна"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ямар ч зөвшөөрөл хүсээгүй байна"</string>
<string name="unused_apps" msgid="648471933781010395">"Ашиглаагүй апп"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">Ашиглаагүй <xliff:g id="COUNT_1">%d</xliff:g> апп</item>
- <item quantity="one">Ашиглаагүй <xliff:g id="COUNT_0">%d</xliff:g> апп</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{Ашиглаагүй # апп}other{Ашиглаагүй # апп}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Зөвшөөрөл хасаж, сул зай гаргах"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s-н дотоод сан"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Шаардлагатай үед нөөцийн хэт их ашиглалтаас зайлсхийхийн тулд аппыг унтраана уу"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Аппын гүйцэтгэлийг эрэмбэлэхийн тулд системийн нөөцийг ашигладаг"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Дата ашиглалт"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Аппын дата ашиглалт"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Ашиглалтын түүх"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Бүх апп"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Дата болон Wi-Fi ашиглалт"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Ашиглалтын түүх"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Нийт ашиглалт"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Ил"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Далд"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Датаг зөвшөөрөх"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Энэ аппад мобайл дата ашиглахыг зөвшөөрнө үү"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Датаг хязгаарлах"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Мобайл датаг зөвхөн апп ил байгаа үед ашиглах"</string>
<string name="computing_size" msgid="5791407621793083965">"Тооцоолж байна…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other">Нэмэлт <xliff:g id="COUNT_1">%d</xliff:g> зөвшөөрөл</item>
- <item quantity="one">Нэмэлт <xliff:g id="COUNT_0">%d</xliff:g> зөвшөөрөл</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# нэмэлт зөвшөөрөл}other{# нэмэлт зөвшөөрөл}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Санамж: Дахин асаасны дараа та тээврийн хэрэгслийн түгжээг тайлах хүртэл энэ апп эхлэх боломжгүй."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Туслах ба дуугаар оруулах"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Туслах апп"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi хяналт нь аппад Wi-Fi-г унтраах эсвэл асаах, Wi-Fi сүлжээнд скан хийх болон холбогдох, сүлжээ нэмэх эсвэл хасах, эсвэл зөвхөн дотоодод ашиглах сүлжээний цэгийг эхлүүлэхийг зөвшөөрдөг."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Бусад"</string>
<string name="location_settings_title" msgid="901334356682423679">"Байршил"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Байршлыг ашиглах"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Заасан аппууддаа таны байршилд хандахыг зөвшөөрнө"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Хэрэв та үүнийг унтраавал энэ нь бүх аппын байршилд хандах эрхийг хасна. Жолоочийн туслах аппууд хандах эрхтэй хэвээр байна."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Жолоочийн туслахын байршлыг ашиглах"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Тээврийн хэрэгслийн байршил унтраалттай"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Жолоочийн туслах апп таны байршилд хандах боломжгүй"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Өөрчлөх"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Жолоодлогод тусалдаг аппуудыг байршилдаа хандахыг зөвшөөрнө"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Хэрэв та үүнийг унтраавал байршлын мэдээлэлд тулгуурладаг Жолоочийн туслах аппуудыг идэвхгүй болгоно."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Ямартай ч унтраах"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Саяхны байршлын хүсэлтүүд"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Саяхны байршлын хүсэлт алга"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Аппын түвшний зөвшөөрөл"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Байршлын үйлчилгээ"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Байршлыг ашиглах"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Байршил нь таны төхөөрөмжийн байршлыг тооцоолоход туслах зорилгоор GPS, Wi-Fi, мобайл сүлжээ болон мэдрэгч зэрэг эх сурвалжийг ашиглаж болзошгүй."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Жолоочийн туслах"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Жолоочийн туслах апп руу илгээсэн байршлын мэдээлэлд таныг тодорхойлох мэдээлэл агуулдаггүй. Үүнийг устгахаас өмнө хамгийн ихдээ 2 хоног хадгалдаг."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Микрофон"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Микрофоныг ашиглах"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Бүх аппад таны микрофонд хандахыг зөвшөөрнө үү"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Микрофоны зөвшөөрлийг удирдах"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Саяхан хандсан"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Саяхан хандсан апп алга"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 апп хандах эрхтэй байна"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count}-н # апп хандах эрхтэй байна}other{{total_count}-н # апп хандах эрхтэй байна}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Саяхан хандсан"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Бүгдийг харах"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Ачаалж байна…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Систем"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Системийн шинэчлэлт"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Дэвшилтэт"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Гуравдагч талын лиценз"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Лицензүүдийг ачаалах явцад алдаа гарлаа."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Ачаалж байна..."</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Танд хөгжүүлэгч болоход одоо <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> алхам дутуу байна.</item>
- <item quantity="one">Танд хөгжүүлэгч болоход одоо <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> алхам дутуу байна.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Та одоо хөгжүүлэгч болоход # алхам дутуу байна.}other{Та одоо хөгжүүлэгч болоход # алхам дутуу байна.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Та одоо хөгжүүлэгч боллоо!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Та аль хэдийн хөгжүүлэгч болсон тул шаардлагагүй."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Хөгжүүлэгчийн тохиргоо"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Таныг шинэ профайл үүсгэсний дараа тухайн хүн үүнийг өөртөө зориулж өөрчлөх хэрэгтэй."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Аппыг бусад бүх профайлаас ашиглахын тулд дурын профайлаас шинэчлэх боломжтой."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Профайлын хязгаарт хүрсэн"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Зөвхөн <xliff:g id="COUNT">%d</xliff:g> профайл үүсгэх боломжтой.</item>
- <item quantity="one">Зөвхөн нэг профайл үүсгэх боломжтой.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Зөвхөн нэг профайл үүсгэх боломжтой.}other{Та хамгийн ихдээ # профайл үүсгэх боломжтой.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Шинэ профайл үүсгэж чадсангүй"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Энэ профайлыг устгах уу?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Энэ профайлын бүх апп болон өгөгдлийг устгана"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Профайлыг устгаж чадсангүй."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Профайлыг устгаагүй. Та төхөөрөмжийг дахин эхлүүлээд дахин оролдох боломжтой."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Таныг профайлыг сэлгэх эсвэл тээврийн хэрэгслийг дахин эхлүүлэх үед энэ профайлыг устгах болно."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Үл хэрэгсэх"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Дахин оролдох"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Түгжээг тайлах хээг хэрхэн зурах вэ?"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Загварыг хадгалахад алдаа гарлаа"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Хэт олон удаа буруу оруулсан байна. <xliff:g id="NUMBER">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Хээ нь эргүүлэхийг дэмждэггүй тул мэдрэгчийг ашиглана уу"</string>
<string name="okay" msgid="4589873324439764349">"ОК"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Дэлгэцийн түгжээг хасах уу?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Ингэснээр хүн бүхэн таны бүртгэлд хандах боломжтой болно"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Таны IT админ түгээмэл ПИН-г блоклосон байна. Өөр ПИН оруулж үзнэ үү."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Үүнд буруу тэмдэгт агуулах боломжгүй."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Нууц үг буруу байна. Хамгийн багадаа 4 тэмдэгттэй байх ёстой."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Хамгийн багадаа <xliff:g id="COUNT">%d</xliff:g> үсэг агуулах ёстой</item>
- <item quantity="one">Хамгийн багадаа 1 үсэг агуулах ёстой</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Хамгийн багадаа <xliff:g id="COUNT">%d</xliff:g> жижиг үсэг агуулах ёстой</item>
- <item quantity="one">Хамгийн багадаа 1 жижиг үсэг агуулах ёстой</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Хамгийн багадаа <xliff:g id="COUNT">%d</xliff:g> том үсэг агуулах ёстой</item>
- <item quantity="one">Хамгийн багадаа 1 том үсэг агуулах ёстой</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Хамгийн багадаа <xliff:g id="COUNT">%d</xliff:g> цифр агуулах ёстой</item>
- <item quantity="one">Хамгийн багадаа 1 цифр агуулах ёстой</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Хамгийн багадаа <xliff:g id="COUNT">%d</xliff:g> тусгай дүрс тэмдэг агуулах ёстой</item>
- <item quantity="one">Хамгийн багадаа 1 тусгай дүрс тэмдэг агуулах ёстой</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Хамгийн багадаа үсэгнээс өөр <xliff:g id="COUNT">%d</xliff:g> тэмдэгт агуулах ёстой</item>
- <item quantity="one">Хамгийн багадаа үсэгнээс өөр 1 тэмдэгт агуулах ёстой</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Төхөөрөмжийн админ саяхны нууц үг ашиглахыг зөвшөөрдөггүй"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Нууц үгийг хадгалахад алдаа гарлаа"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Таны IT админ түгээмэл нууц үгийг блоклосон байна. Өөр нууц үг оруулж үзнэ үү."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Профайл нэмэх"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Энэ профайлыг устгах"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Профайл нэмэх"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Дэлгэцийн гэрэлтүүлэг"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Төхөөрөмжүүдээ харахын тулд Bluetooth-г асаана уу"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Төхөөрөмжийг хослуулахын тулд Bluetooth тохиргоог нээнэ үү"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Инфотэйнмент системийн админ"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Аппуудыг идэвхжүүлсэн"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Аппуудыг идэхгүй болгосон"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Энэ зөвшөөрөлтэй аппууд нь энэ тээврийн хэрэгслийн өгөгдөлд хандах эрхтэй"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Тээврийн хэрэгслийн админ аппууд алга"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Энэ инфотэйнмент системийн админы апп идэвхтэй байгаа бөгөөд <xliff:g id="APP_NAME">%1$s</xliff:g> аппад дараах үйл ажиллагаа хийхийг зөвшөөрдөг:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Энэ инфотэйнмент системийг идэвхжүүлснээр <xliff:g id="APP_NAME">%1$s</xliff:g> аппад дараах үйл ажиллагааг хийхийг зөвшөөрнө:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Энэ инфотэйнмент системийн аппыг идэвхжүүлэх үү?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Энэ инфотэйнмент системийн аппыг идэвхжүүлэх"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Идэвхгүй болгох, устгах"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Энэ инфотэйнмент системийн аппыг идэвхгүй болгох"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Дэлгэрэнгүй мэдээлэл"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Байгууллагын менежер нь тохиргоо, зөвшөөрөл, байгууллагын хандалт, сүлжээний үйл ажиллагаа, тээврийн хэрэгслийн байршлын мэдээлэл зэрэг энэ профайлтай холбоотой апп болон өгөгдлийг хянах, удирдах боломжтой."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Байгууллагын менежер нь тохиргоо, зөвшөөрөл, байгууллагын хандалт, сүлжээний үйл ажиллагаа, төхөөрөмжийн байршлын мэдээлэл зэрэг энэ профайлтай холбоотой апп болон өгөгдлийг хянах, удирдах боломжтой."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Байгууллагын менежер нь тохиргоо, зөвшөөрөл, байгууллагын хандалт, сүлжээний үйл ажиллагаа, тээврийн хэрэгслийн байршлын мэдээлэл зэрэг энэ инфотэйнмент системтэй холбоотой апп болон өгөгдлийг хянах, удирдах боломжтой."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Байгууллагын менежер нь энэ инфотэйнмент системтэй холбоотой өгөгдөлд хандах, аппыг удирдах болон энэ тээврийн хэрэгслийн тохиргоог өөрчлөх боломжтой байж болзошгүй."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Энэ нь боломжгүй байна"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Энэ удирдлагатай тээврийн хэрэгслийн дууны түвшинг өөрчлөх боломжгүй"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Энэ удирдлагатай тээврийн хэрэгсэлд дуудлага хийх боломжгүй"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Энэ удирдлагатай тээврийн хэрэгсэлд мессеж бичихийг зөвшөөрдөггүй"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Энэ удирдлагатай тээврийн хэрэгсэлд камер ажиллах боломжгүй"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Энэ удирдлагатай тээврийн хэрэгсэлд дэлгэцийн агшин авах боломжгүй"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Энэ удирдлагатай тээврийн хэрэгсэлд энэ аппыг нээх боломжгүй"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Таны кредит зээлийн үйлчилгээ үзүүлэгч блоклосон"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Тухайн байгууллага зарим онцлогт хандах эрхийг хязгаарладаг.\n\nХэрэв танд асуулт байвал тухайн байгууллагын менежертэй холбогдоно уу."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Тээврийн хэрэгслийн админы апп"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# аппыг идэвхжүүлсэн}other{# аппыг идэвхжүүлсэн}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Идэвхжүүлсэн аппууд алга"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>-н тээврийн хэрэгслийн бодлого"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Байгууллагын менежерийн удирддаг тохиргоо"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g>-н талаар нэмэлт мэдээлэл авах"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Алдааны мэдээг хуваалцах уу?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Энэ тээврийн хэрэгслийн байгууллагын менежер энэ төхөөрөмжийн асуудлыг шийдэхэд туслахын тулд алдааны мэдээ хүссэн байна. Апп болон өгөгдлийг хуваалцаж болзошгүй."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Энэ тээврийн хэрэгслийн байгууллагын менежер энэ төхөөрөмжийн асуудлыг шийдэхэд туслахын тулд алдааны мэдээ хүссэн байна. Апп болон өгөгдлийг хуваалцаж болзошгүй бөгөөд таны төхөөрөмж түр зуур удааширч болзошгүй."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Энэ алдааны мэдээг энэ тээврийн хэрэгслийн байгууллагын менежертэй хуваалцаж байна. Дэлгэрэнгүй мэдээлэл авахын тулд тэдэнтэй холбогдоно уу."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Хуваалцах"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Татгалзах"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Энэ тохиргоог яг одоо өөрчлөх боломжгүй байна"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Хандалт"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Тайлбар"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Тайлбарын сонголт"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Унтраалттай"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Асаалттай"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Дэлгэц уншигч"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Тайлбарыг харуулах"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Текстийн хэмжээ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Тайлбарын үсгийн хэмжээ, загвар"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Маш жижиг"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Жижиг"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Өгөгдмөл"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Том"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Маш том"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Тайлбарын загвар"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Аппаар тохируулсан"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Хар дээр цагаан"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Цагаан дээр хар"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Хар дээр шар"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Цэнхэр дээр шар"</string>
</resources>
diff --git a/res/values-mr/arrays.xml b/res/values-mr/arrays.xml
index 6c70cab..4d5ff99 100644
--- a/res/values-mr/arrays.xml
+++ b/res/values-mr/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"कधीही अनुमती देऊ नका"</item>
<item msgid="1154273129608299386">"नेहमी अनुमती द्या"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index a0d530c..8f40e12 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"नाइट मोड"</string>
<string name="network_and_internet" msgid="4229023630498537530">"नेटवर्क आणि इंटरनेट"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"मोबाइल नेटवर्क"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> सिम</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> सिम</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# सिम}other{# सिम}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"अॅक्टिव्ह / सिम"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"अॅक्टिव्ह नसलेले / सिम"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"ॲक्टिव्ह / डाउनलोड केलेले सिम"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"अधिक जोडा"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"मोबाइल डेटा"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"मोबाइल नेटवर्क वापरून डेटा ॲक्सेस करा"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"मोबाइल नेटवर्क"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"मोबाइल डेटा वापरा"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"मोबाइल डेटा बंद करायचा आहे का?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"निवड आवश्यक आहे"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"मोबाइल डेटासाठी <xliff:g id="CARRIER">%1$s</xliff:g> वापरायचे का?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> डेटा चेतावणी"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> डेटा मर्यादा"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> डेटा चेतावणी / <xliff:g id="ID_2">^2</xliff:g> डेटा मर्यादा"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d दिवस शिल्लक</item>
- <item quantity="one">%d दिवस शिल्लक</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# दिवस शिल्लक आहे}other{# दिवस शिल्लक आहेत}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"वेळ शिल्लक नाही"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"एका पेक्षा कमी दिवस शिल्लक"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> ने <xliff:g id="ID_2">^2</xliff:g> पूर्वी अपडेट केले"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"सेट करा"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"डेटा चेतावणी आणि मर्यादा"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"अॅप डेटा वापर सायकल"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"मोबाइल डेटा वापर"</string>
<string name="set_data_warning" msgid="6628236612886588097">"डेटा चेतावणी सेट करा"</string>
<string name="data_warning" msgid="116776633806885370">"डेटा चेतावणी"</string>
<string name="set_data_limit" msgid="7136539812414500084">"डेटा मर्यादा सेट करा"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"मोबाइल डेटाने तुम्ही सेट केलेली मर्यादा गाठल्यानंतर तुमच्या वाहनाचे मुख्य युनिट मोबाइल डेटा बंद करेल.\n\n मोबाइल डेटाचा वापर मुख्य युनिटमध्ये मोजला जात असल्यामुळे आणि तुमचा वाहक भिन्नपणे वापर लक्षात घेत असल्यामुळे, संवर्धन मर्यादा सेटिंग वापरण्याचा विचार करा."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"डेटा वापर चेतावणी सेट करा"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"डेटा वापर मर्यादा सेट करा"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"तुमच्या डिव्हाइसद्वारे डेटा वापर मोजला जातो. तुमच्या मोबाइल वाहकाच्या डेटानुसार तो वेगळा असू शकतो."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"सेट करा"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"सेव्ह करा"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM नेटवर्क"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"वाहनामधील इंटरनेट"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"वाहनामधील इंटरनेट बंद केल्यामुळे त्याची काही वैशिष्ट्ये किंवा ॲप्स काम करणे थांबवू शकतात.\n\nतुमचे वाहन काम करावे यासाठी आवश्यक असलेला महत्त्वाचा डेटा वाहनाच्या उत्पादकासोबत शेअर करणे पुढे सुरू ठेवले जाईल."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"तरीही बंद करा"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"वाहनामधील इंटरनेट बंद केले आहे. त्यामुळे वाहनाची काही वैशिष्ट्ये किंवा ॲप्स काम करणे थांबवू शकतात. तुमचे वाहन काम करावे यासाठी आवश्यक असलेला महत्त्वाचा डेटा वाहनाच्या उत्पादकासोबत शेअर करणे पुढे सुरू ठेवले जाईल."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s दरम्यान %1$s वापरला"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"इतर नेटवर्कमध्ये सामील व्हा"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"नेटवर्क प्राधान्ये"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"नेटवर्क जोडा"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"कनेक्ट करा"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"कनेक्ट करत आहे…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"कनेक्ट केलेले नाही"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"नेटवर्क रेंजमध्ये नाही"</string>
<string name="wifi_password" msgid="5565632142720292397">"पासवर्ड"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"पासवर्ड दाखवा"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"हॉटस्पॉटसाठी १ बँड निवडा"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"हॉटस्पॉट आणि टेदरिंग"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"हॉटस्पॉट"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"बंद आहे"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"हॉटस्पॉट आपोआप बंद करा"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"कोणतीही डिव्हाइस कनेक्ट केलेली नसल्यास, वाय-फाय हॉटस्पॉट बंद होईल"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ला वाय-फाय सुरू करू करायचे आहे"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"सक्तीने थांबवा"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"सक्तीने थांबवायचे आहे का?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"तुम्ही सक्तीने अॅप थांबवल्यास, ते गैरवर्तन करू शकते."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"परफॉर्मन्स संरक्षण बंद करायचे का?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"तुम्ही तसे केल्यास, तुमचे सॉफ्टवेअर आणि हार्डवेअरदेखील कदाचित काम करणार नाहीत."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"तसेच सोडा"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"बंद करा"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"अॅप परफॉर्मन्सचे प्राधान्य सुरू करायचे आहे का?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"हे सुरू केल्यामुळे सिस्टीममध्ये संभाव्य अस्थिरता येऊ शकते किंवा हार्डवेअरवर दीर्घकाळासाठी परिणाम होऊ शकतो. तुम्हाला पुढे सुरू ठेवायचे आहे का?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"होय"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"नाही, नको"</string>
<string name="disable_text" msgid="4358165448648990820">"बंद करा"</string>
<string name="enable_text" msgid="1794971777861881238">"सुरू करा"</string>
<string name="uninstall_text" msgid="277907956072833012">"अनइंस्टॉल करा"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"परवानग्या"</string>
<string name="notifications_label" msgid="6586089149665170731">"सूचना"</string>
<string name="storage_application_label" msgid="5911779903670978586">"स्टोरेज आणि कॅशे"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"पिक परफॉर्मन्सची खात्री करा"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"अॅपच्या परफॉर्मन्सला प्राधान्य द्या"</string>
<string name="application_version_label" msgid="8556889839783311649">"आवृत्त्या: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"कोणत्याही परवानग्यांना मंजूरी दिली नाही"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"कोणत्याही परवानग्यांची विनंती केली नाही"</string>
<string name="unused_apps" msgid="648471933781010395">"न वापरलेली अॅप्स"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> न वापरलेली ॲप्स</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> न वापरलेले ॲप</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# न वापरलेले ॲप}other{# न वापरेलेली ॲप्स}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"परवानग्या काढून टाका आणि जागा मोकळी करा"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s अंतर्गत स्टोरेजमध्ये"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"गरज असल्यास, स्रोतांचा अतिवापर टाळण्यासाठी ॲप बंद करा"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"अॅपच्या परफॉर्मन्सला प्राधान्य देण्यासाठी सिस्टीमचे स्रोत वापरते"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"डेटा वापर"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ॲप डेटा वापर"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"वापराचा इतिहास"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"सर्व अॅप्स"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"डेटा आणि वाय-फायचा वापर"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"वापराचा इतिहास"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"एकूण वापर"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"फोरग्राउंड"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"बॅकग्राउंड"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"डेटाला अनुमती द्या"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"या ॲपला मोबाइल डेटा वापरू द्या"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"डेटा प्रतिबंधित करा"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ॲप फोरग्राउंडमध्ये असेल तेव्हाच मोबाइल डेटा वापरा"</string>
<string name="computing_size" msgid="5791407621793083965">"गणना करत आहे…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> अतिरिक्त परवानग्या</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> अतिरिक्त परवानगी</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# अतिरिक्त परवानगी}other{# अतिरिक्त परवानग्या}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"टीप: रीबूट केल्यानंतर, तुम्ही तुमचे वाहन अनलॉक करेपर्यंत हे अॅप सुरू होऊ शकत नाही."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"साहाय्य आणि व्हॉइस इनपुट"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"साहाय्य अॅप"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"वाय-फाय नियंत्रण ॲपला वाय-फाय सुरू किंवा बंद करण्याची, वाय-फाय नेटवर्क स्कॅन आणि त्याच्याशी कनेक्ट करण्याची, नेटवर्क जोडण्याची किंवा काढण्याची किंवा फक्त स्थानिक हॉटस्पॉट सुरू करण्याची अनुमती देते."</string>
<string name="more_special_access_title" msgid="166115485446645971">"आणखी"</string>
<string name="location_settings_title" msgid="901334356682423679">"स्थान"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"स्थान वापरा"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"तुम्ही नमूद केलेल्या ॲप्सना तुमचे स्थान अॅक्सेस करण्याची अनुमती द्या"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"तुम्ही हे बंद केल्यास, यामुळे सर्व ॲप्सचा स्थान अॅक्सेस काढून टाकला जाईल. ड्रायव्हर साहाय्य अॅप्सना अजूनही अॅक्सेस असेल."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ड्रायव्हर साहाय्य यासाठी स्थान वापरणे"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"वाहनाचे स्थान बंद आहे"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ड्रायव्हर साहाय्य ॲप्स तुमचे स्थान अॅक्सेस करू शकत नाहीत"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"बदला"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"तुमचे स्थान अॅक्सेस करण्यासाठी ड्राइव्ह करण्यात मदत करणाऱ्या ॲप्सना अनुमती द्या"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"तुम्ही हे बंद केल्यास, स्थान माहितीवर अवलंबून असलेली ड्रायव्हर साहाय्य ॲप्स बंद केली जातील."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"तरीही बंद करा"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"अलीकडील स्थान विनंत्या"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"अलीकडील कोणत्याही स्थान विनंत्या नाहीत"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ॲप पातळी परवानग्या"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"स्थान सेवा"</string>
<string name="location_use_location_title" msgid="117735895374606680">"स्थान वापरा"</string>
<string name="location_settings_footer" msgid="296892848338100051">"तुमच्या डिव्हाइसच्या स्थानाचा अंदाज घेण्यात मदत करण्यासाठी स्थान GPS, वाय-फाय, मोबाइल नेटवर्क आणि सेन्सर यांसारखे स्रोत वापरू शकते."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ड्रायव्हर साहाय्य"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ड्रायव्हर साहाय्य अॅप्सना पाठवलेल्या स्थानाच्या माहितीमध्ये तुमची ओळख करून देणाऱ्या माहितीचा समावेश नसतो. ती हटवली जाण्यापूर्वी किमान दोन दिवसांसाठी स्टोअर केली जाते."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"मायक्रोफोन"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"मायक्रोफोन वापरा"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"सर्व ॲप्सना तुमचा मायक्रोफोन अॅक्सेस करण्याची अनुमती द्या"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"मायक्रोफोन परवानग्या व्यवस्थापित करा"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"अलीकडे अॅक्सेस केला"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"कोणतीही अलीकडील अॅप्स नाहीत"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"कोणत्याही अॅप्सना अॅक्सेस नाही"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# पैकी {total_count} ॲपला अॅक्सेस आहे}other{# पैकी {total_count} ॲप्सना अॅक्सेस आहे}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"अलीकडे अॅक्सेस केलेला"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"सर्व पहा"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"लोड होत आहे…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"सिस्टम"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"सिस्टम अपडेट"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"प्रगत"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"तृतीय-पक्ष परवाने"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"परवाने लोड करताना समस्या आली."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"लोड करत आहे…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">आता तुम्ही डेव्हलपर होण्यापासून <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> पायऱ्या लांब आहात.</item>
- <item quantity="one">आता तुम्ही डेव्हलपर होण्यापासून <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> पायरी लांब आहात.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{तुम्ही आता डेव्हलपर बनण्यापासून # पायरी दूर आहात.}other{तुम्ही आता डेव्हलपर बनण्यापासून # पायऱ्या दूर आहात.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"आता तुम्ही एक डेव्हलपर आहात!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"आवश्यकता नाही, तुम्ही आधीपासून डेव्हलपर आहात."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"डेव्हलपर पर्याय"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"तुम्ही नवीन प्रोफाइल तयार केल्यानंतर, त्या व्यक्तीने ती स्वतःसाठी कस्टमाइझ करणे आवश्यक आहे."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"इतर सर्व प्रोफाइलना वापरता येण्यासाठी कोणत्याही प्रोफाइलवरून ॲप्स अपडेट केली जाऊ शकतात."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"प्रोफाइल मर्यादा गाठली"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">तुम्ही कमाल <xliff:g id="COUNT">%d</xliff:g> प्रोफाइल तयार करू शकता.</item>
- <item quantity="one">फक्त एक प्रोफाइल तयार केली जाऊ शकते.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{फक्त एक प्रोफाइल तयार केली जाऊ शकते.}other{तुम्ही कमाल # प्रोफाइल तयार करू शकता.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"नवीन प्रोफाइल तयार करता आली नाही"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ही प्रोफाइल हटवायची का?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"या प्रोफाइलमधील सर्व अॅप्स आणि डेटा हटवला जाईल"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"प्रोफाइल हटवता आली नाही."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"प्रोफाइल हटवली नव्हती. तुम्ही डिव्हाइस रीस्टार्ट करून पुन्हा प्रयत्न करू शकता."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"तुम्ही प्रोफाइल स्विच केल्यावर किंवा वाहन रीस्टार्ट केल्यावर, ही प्रोफाइल हटवली जाईल."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"डिसमिस करा"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"पुन्हा प्रयत्न करा"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"अनलॉक पॅटर्न कसा काढावा"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"पॅटर्न सेव्ह करताना एरर आली"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"बरेच चुकीचे प्रयत्न. <xliff:g id="NUMBER">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"पॅटर्न हा रोटरीला सपोर्ट करत नाही, कृपया स्पर्शाचा वापर करा"</string>
<string name="okay" msgid="4589873324439764349">"ठीक आहे"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"स्क्रीन लॉक काढायचा?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"तुमचे खाते ॲक्सेस करण्यासाठी हे कोणालाही अनुमती देईल"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"तुमच्या IT ॲडमिनने सामान्यत: वापरले जाणारे पिन ब्लॉक केले आहेत. दुसरा पिन वापरून पहा."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"यामध्ये चुकीच्या वर्णांचा समावेश असू शकत नाही."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"पासवर्ड चुकीचा आहे, किमान 4 वर्ण असणे आवश्यक आहे."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">किमान <xliff:g id="COUNT">%d</xliff:g> अक्षरे असणे आवश्यक आहे</item>
- <item quantity="one">किमान एक अक्षर असणे आवश्यक आहे</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">किमान <xliff:g id="COUNT">%d</xliff:g> लोअरकेस अक्षरे असणे आवश्यक आहे</item>
- <item quantity="one">किमान एक लोअरकेस अक्षर असणे आवश्यक आहे</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">किमान <xliff:g id="COUNT">%d</xliff:g> अप्परकेस अक्षरे असणे आवश्यक आहे</item>
- <item quantity="one">किमान 1 अप्परकेस अक्षर असणे आवश्यक आहे</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">किमान <xliff:g id="COUNT">%d</xliff:g> संख्यात्मक अंक असणे आवश्यक आहे</item>
- <item quantity="one">किमान एक संख्यात्मक अंक असणे आवश्यक आहे</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">किमान <xliff:g id="COUNT">%d</xliff:g> विशेष चिन्हे असणे आवश्यक आहे</item>
- <item quantity="one">किमान एक विशेष चिन्ह असणे आवश्यक आहे</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">किमान <xliff:g id="COUNT">%d</xliff:g> अक्षर नसलेले वर्ण असणे आवश्यक आहे</item>
- <item quantity="one">किमान एक अक्षर नसलेला वर्ण असणे आवश्यक आहे</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"डिव्हाइस प्रशासक अलीकडील पासवर्ड वापरण्याची अनुमती देत नाही"</string>
<string name="error_saving_password" msgid="8334882262622500658">"पासवर्ड सेव्ह करताना एरर आली"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"तुमच्या IT ॲडमिनने सामान्यत: वापरले जाणारे पासवर्ड ब्लॉक केले आहेत. दुसरा पासवर्ड वापरून पहा."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"प्रोफाइल जोडा"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ही प्रोफाइल हटवा"</string>
<string name="add_profile_text" msgid="9118410102199116969">"प्रोफाइल जोडा"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"डिस्प्लेचा ब्राइटनेस"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"तुमची डिव्हाइस पाहण्यासाठी, ब्लूटूथ सुरू करा"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"डिव्हाइस पेअर करण्यासाठी, ब्लूटूथ सेटिंग्ज उघडा"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"इंफोटेनमेंट सिस्टीम ॲडमिन"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"ॲक्टिव्हेट केलेली ॲप्स"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"डीॲक्टिव्हेट केलेली ॲप्स"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ही परवानगी असलेल्या ॲप्सना या वाहनाच्या डेटाचा अॅक्सेस आहे"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"वाहन ॲडमिन ॲप्स नाहीत"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"हे इंफोटेनमेंट सिस्टीम ॲडमिन ॲप अॅक्टिव्ह आहे आणि <xliff:g id="APP_NAME">%1$s</xliff:g> अॅपला खालील ऑपरेशन करण्याची अनुमती देते:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"हे इंफोटेनमेंट सिस्टीम अॅप ॲक्टिव्हेट केल्याने ते <xliff:g id="APP_NAME">%1$s</xliff:g> अॅपला पुढील ऑपरेशन करण्याची अनुमती देईल:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"हे इंफोटेनमेंट सिस्टीम ॲप अॅक्टिव्हेट करायचे का?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"हे इंफोटेनमेंट सिस्टीम ॲप अॅक्टिव्हेट करा"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"डीॲक्टिव्हेट करा & अनइंस्टॉल करा"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"हे इंफोटेनमेंट सिस्टीम ॲप डीॲक्टिव्हेट करा"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"अधिक तपशील"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"संस्थेचा व्यवस्थापक सेटिंग्ज, परवानग्या, कॉर्पोरेट अॅक्सेस, नेटवर्क अॅक्टिव्हिटी आणि वाहनाच्या स्थान माहितीसह या प्रोफाइलसंबंधित अॅप्स व डेटाचे परीक्षण आणि व्यवस्थापन करू शकतो."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"संस्थेचा व्यवस्थापक सेटिंग्ज, परवानग्या, कॉर्पोरेट अॅक्सेस, नेटवर्क अॅक्टिव्हिटी आणि डिव्हाइसच्या स्थान माहितीसह या प्रोफाइलसंबंधित अॅप्स व डेटाचे परीक्षण आणि व्यवस्थापन करू शकतो."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"संस्थेचा व्यवस्थापक सेटिंग्ज, परवानग्या, कॉर्पोरेट अॅक्सेस, नेटवर्क अॅक्टिव्हिटी आणि वाहनाच्या स्थान माहितीसह या इंफोटेनमेंट सिस्टीमसंबंधित अॅप्स व डेटाचे परीक्षण आणि व्यवस्थापन करू शकतो."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"संस्थेचा व्यवस्थापक कदाचित या इंफोटेनमेंट सिस्टीमसंबंधित डेटा अॅक्सेस करू शकतो, ॲप्सचे व्यवस्थापन करू शकतो आणि ही वाहनाची सेटिंग्ज बदलू शकतो."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ते उपलब्ध नाही"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"व्यवस्थापित केलेल्या या वाहनामध्ये व्हॉल्यूम बदलू शकत नाही"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"व्यवस्थापित केलेल्या या वाहनामध्ये कॉल करू शकत नाही"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"व्यवस्थापित केलेल्या या वाहनामध्ये एसएमएस ला अनुमती नाही"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"व्यवस्थापित केलेल्या या वाहनामध्ये कॅमेरा उपलब्ध नाही"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"या व्यवस्थापित केलेल्या वाहनामध्ये स्क्रीनशॉट घेऊ शकत नाही"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"व्यवस्थापित केलेल्या या वाहनामध्ये हे ॲप उघडू शकत नाही"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"तुमच्या क्रेडिट पुरवठादाराने ब्लॉक केले"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"संस्थेने काही वैशिष्ट्यांचा अॅक्सेस मर्यादित केला आहे.\n\nतुम्हाला प्रश्न असल्यास, संस्थेच्या व्यवस्थापकाशी संपर्क साधा."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"वाहन ॲडमिन ॲप्स"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# अॅक्टिव्हेट केलेले ॲप}other{# अॅक्टिव्हेट केलेली ॲप्स}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"अॅक्टिव्हेट केलेली कोणतीही ॲप्स नाहीत"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> चे वाहनाशी संबंधित धोरण"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"संस्थेच्या व्यवस्थापकाद्वारे व्यवस्थापित केली जाणारी सेटिंग्ज"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> बद्दल अधिक जाणून घ्या"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"बग रिपोर्ट शेअर करायचा का?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"या वाहनाच्या संस्था व्यवस्थापकाने हे डिव्हाइस ट्रबलशूट करण्यात अॅडमिनने मदत करण्यासाठी बग रिपोर्टची विनंती केली. अॅप्स आणि डेटा शेअर केला जाऊ शकतो."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"या वाहनाच्या संस्था व्यवस्थापकाने हे डिव्हाइस ट्रबलशूट करण्यात अॅडमिनने मदत करण्यासाठी बग रिपोर्टची विनंती केली. अॅप्स आणि डेटा शेअर केला जाऊ शकतो आणि तुमच्या डिव्हाइसचा वेग तात्पुरता कमी होऊ शकतो."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"हा बग रिपोर्ट वाहनाच्या संस्था व्यवस्थापकासह शेअर केला जात आहे. अधिक तपशिलांसाठी त्यांच्याशी संपर्क साधा."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"शेअर करा"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"नकार द्या"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"हे सेटिंग आता बदलू शकत नाही"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"अॅक्सेसिबिलिटी"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"कॅप्शन"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"कॅप्शनशी संबंधित प्राधान्ये"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"बंद आहेत"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"सुरू आहेत"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"स्क्रीन रीडर"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"कॅप्शन दाखवा"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"मजकूराचा आकार"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"कॅप्शनचा आकार आणि शैली"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"खूप छोटी"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"छोटी"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"डीफॉल्ट"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"मोठी"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"खूप मोठी"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"कॅप्शनची शैली"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ॲपनुसार सेट करा"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"काळ्यावर पांढरे"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"पांढर्यावर काळे"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"काळ्यावर पिवळे"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"निळ्यावर पिवळे"</string>
</resources>
diff --git a/res/values-ms/arrays.xml b/res/values-ms/arrays.xml
index 85320bc..0b08494 100644
--- a/res/values-ms/arrays.xml
+++ b/res/values-ms/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Jangan sekali-kali benarkan"</item>
<item msgid="1154273129608299386">"Sentiasa benarkan"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index b1f9559..5abb7f9 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Mod malam"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Rangkaian & Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Rangkaian mudah alih"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktif / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Tidak aktif / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktif / SIM Dimuat Turun"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Tambah lagi"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Data mudah alih"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Akses data menggunakan rangkaian mudah alih"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Rangkaian mudah alih"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Gunakan data mudah alih"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Matikan data mudah alih?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Pilihan diperlukan"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Gunakan data mudah alih <xliff:g id="CARRIER">%1$s</xliff:g>?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Amaran data <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Had data <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Amaran data <xliff:g id="ID_1">^1</xliff:g>/Had data <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d hari lagi</item>
- <item quantity="one">%d hari lagi</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# hari lagi}other{# hari lagi}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Tiada baki masa"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Kurang daripada 1 hari lagi"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Dikemas kini oleh <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> yang lalu"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Tetapkan"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Amaran data & had"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Kitaran penggunaan data apl"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Penggunaan data mudah alih"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Tetapkan amaran data"</string>
<string name="data_warning" msgid="116776633806885370">"Amaran data"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Tetapkan had data"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Unit kepala kenderaan anda akan mematikan data mudah alih setelah mencapai had yang anda tetapkan.\n\nMemandangkan penggunaan data diukur oleh unit kepala dan pembawa anda mungkin mengira penggunaan secara berbeza, anda disyorkan supaya menetapkan had yang konservatif."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Tetapkan amaran penggunaan data"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Tetapkan had penggunaan data"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Penggunaan data diukur oleh peranti anda. Penggunaan mungkin berbeza daripada data pembawa mudah alih anda."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Tetapkan"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Simpan"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Rangkaian OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet kenderaan"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Tindakan mematikan Internet kenderaan mungkin menghalang sesetengah ciri kenderaan atau apl daripada berfungsi.\n\nData kritikal yang diperlukan untuk mengendalikan kenderaan anda akan terus dikongsikan dengan pengilang kenderaan."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Matikan juga"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet kenderaan dimatikan. Keadaan ini mungkin menghalang sesetengah ciri kenderaan atau apl daripada berfungsi. Data kritikal yang diperlukan untuk mengendalikan kenderaan anda akan terus dikongsikan dengan pengilang kenderaan."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s digunakan %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Sertai rangkaian lain"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Pilihan rangkaian"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Tambah rangkaian"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Sambung"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Menyambung…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Tidak disambungkan"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Rangkaian di luar liputan"</string>
<string name="wifi_password" msgid="5565632142720292397">"Kata Laluan"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Tunjukkan kata laluan"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Pilih jalur untuk tempat liputan Wi-Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Tempat liputan & penambatan"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Tempat liputan"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Mati"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Matikan tempat liputan secara automatik"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Tempat liputan Wi‑Fi akan dimatikan jika tiada peranti disambungkan"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> mahu menghidupkan Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Henti paksa"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Henti paksa?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Jika anda menghentikan apl secara paksa, fungsinya mungkin terganggu."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Matikan perlindungan prestasi?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Jika anda berbuat sedemikian, perisian dan perkakasan anda mungkin tidak berfungsi dengan baik."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Biarkan hidup"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Matikan"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Hidupkan utamakan prestasi apl?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Tindakan menghidupkan tetapan boleh menyebabkan ketidakstabilan sistem yang berpotensi atau impak perkakasan jangka panjang. Adakah anda mahu meneruskan proses?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ya"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Tidak perlu"</string>
<string name="disable_text" msgid="4358165448648990820">"Lumpuhkan"</string>
<string name="enable_text" msgid="1794971777861881238">"Dayakan"</string>
<string name="uninstall_text" msgid="277907956072833012">"Nyahpasang"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Kebenaran"</string>
<string name="notifications_label" msgid="6586089149665170731">"Pemberitahuan"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Storan & cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Pastikan prestasi puncak"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Utamakan prestasi apl"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versi: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Tiada kebenaran diberikan"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Tiada kebenaran diminta"</string>
<string name="unused_apps" msgid="648471933781010395">"Apl yang tidak digunakan"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apl yang tidak digunakan</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> apl tidak digunakan</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# apl yang tidak digunakan}other{# apl yang tidak digunakan}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Alih keluar kebenaran dan kosongkan ruang"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s dalam storan dalaman"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Jika perlu, tutup apl untuk mengelakkan penggunaan sumber yang berlebihan"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Gunakan sumber sistem untuk mengutamakan prestasi apl"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Penggunaan data"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Penggunaan data apl"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Sejarah penggunaan"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Semua apl"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Penggunaan data & Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Sejarah penggunaan"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Jumlah penggunaan"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Latar depan"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Latar belakang"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Benarkan data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Benarkan apl ini menggunakan data mudah alih"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Hadkan data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Gunakan data mudah alih hanya apabila apl berada di latar depan"</string>
<string name="computing_size" msgid="5791407621793083965">"Mengira…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kebenaran tambahan</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> kebenaran tambahan</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# kebenaran tambahan}other{# kebenaran tambahan}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Perhatian: Selepas but semula, apl ini tidak dapat dimulakan sehingga anda membuka kunci kenderaan."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Bantu & input suara"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Apl Bantu"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Kawalan Wi-Fi membenarkan apl menghidupkan atau mematikan Wi-Fi, mengimbas dan menyambung ke rangkaian Wi-Fi, menambah atau mengalih keluar rangkaian, atau memulakan tempat liputan setempat sahaja."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Lagi"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lokasi"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Gunakan lokasi"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Benarkan apl tertentu mengakses lokasi"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Jika anda mematikan tetapan ini, akses lokasi akan dialih keluar untuk semua apl. Apl Bantuan Pemandu masih akan mempunyai akses."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Gunakan lokasi untuk Bantuan Pemandu"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Lokasi kenderaan dimatikan"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Apl Bantuan Pemandu tidak boleh mengakses lokasi anda"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Tukar"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Benarkan akses lokasi kepada apl bantuan pemandu"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Jika anda mematikan tetapan ini, apl Bantuan Pemandu yang bergantung pada maklumat lokasi akan dilumpuhkan."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Matikan juga"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Permintaan Lokasi Terbaharu"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Tiada permintaan lokasi terbaharu"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Kebenaran tahap apl"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Perkhidmatan Lokasi"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Gunakan lokasi"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Lokasi mungkin menggunakan sumber seperti GPS, Wi-Fi, rangkaian mudah alih dan penderia untuk menganggarkan lokasi peranti anda."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Bantuan pemandu"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Maklumat lokasi yang dihantar ke apl Bantuan Pemandu tidak mengandungi maklumat yang mengenal pasti anda. Maklumat disimpan selama maksimum 2 hari sebelum dipadamkan."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Gunakan mikrofon"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Benarkan semua apl mengakses mikrofon anda"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Urus kebenaran mikrofon"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Diakses baru-baru ini"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Tiada apl terbaharu"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apl yang mempunyai akses"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# daripada {total_count} apl mempunyai akses}other{# daripada {total_count} apl mempunyai akses}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Diakses baru-baru ini"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Lihat semua"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Memuatkan…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Kemas kini sistem"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Lanjutan"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Lesen pihak ketiga"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Terdapat masalah memuatkan lesen."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Memuatkan…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Anda kini <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> langkah daripada menjadi seorang pembangun.</item>
- <item quantity="one">Anda kini <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> langkah daripada menjadi seorang pembangun.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Tinggal # langkah lagi untuk anda menjadi pembangun.}other{Tinggal # langkah lagi untuk anda menjadi pembangun.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Anda kini seorang pembangun!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Tidak perlu, anda sudah pun menjadi seorang pembangun."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Pilihan pembangun"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Selepas anda mencipta profil baharu, orang itu perlu menyesuaikan profil untuk diri sendiri."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apl boleh dikemas kini daripada mana-mana profil untuk kegunaan semua profil lain."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Had profil dicapai"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Anda boleh membuat sehingga <xliff:g id="COUNT">%d</xliff:g> profil.</item>
- <item quantity="one">Hanya satu profil boleh dibuat.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Hanya satu profil boleh dibuat.}other{Anda boleh membuat sehingga # profil.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Tidak dapat mencipta profil baharu"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Padamkan profil ini?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Semua apl dan data untuk profil ini akan dipadamkan"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Tidak dapat memadam profil."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil tidak dipadamkan. Anda boleh memulakan semula peranti dan cuba lagi."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Profil ini akan dipadamkan apabila anda menukar profil atau menghidupkan semula kenderaan."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Ketepikan"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Cuba semula"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Cara melukis corak buka kunci"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Ralat semasa menyimpan corak"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Terlalu banyak percubaan yang salah. Cuba lagi dalam <xliff:g id="NUMBER">%d</xliff:g> saat."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Corak tidak menyokong putaran, sila gunakan sentuhan"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Alih keluar kunci skrin?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Tindakan ini membolehkan sesiapa sahaja mengakses akaun anda"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"PIN lazim disekat oleh pentadbir IT anda. Cuba PIN yang lain."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Tidak boleh menyertakan aksara yang tidak sah."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Kata laluan tidak sah, mesti sekurang-kurangnya 4 aksara."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Mesti mengandungi sekurang-kurangnya <xliff:g id="COUNT">%d</xliff:g> huruf</item>
- <item quantity="one">Mesti mengandungi sekurang-kurangnya 1 huruf</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Mesti mengandungi sekurang-kurangnya <xliff:g id="COUNT">%d</xliff:g> huruf kecil</item>
- <item quantity="one">Mesti mengandungi sekurang-kurangnya 1 huruf kecil</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Mesti mengandungi sekurang-kurangnya <xliff:g id="COUNT">%d</xliff:g> huruf besar</item>
- <item quantity="one">Mesti mengandungi sekurang-kurangnya 1 huruf besar</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Mesti mengandungi sekurang-kurangnya <xliff:g id="COUNT">%d</xliff:g> angka</item>
- <item quantity="one">Mesti mengandungi sekurang-kurangnya 1 angka</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Mesti mengandungi sekurang-kurangnya <xliff:g id="COUNT">%d</xliff:g> simbol khas</item>
- <item quantity="one">Mesti mengandungi sekurang-kurangnya 1 simbol khas</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Mesti mengandungi sekurang-kurangnya <xliff:g id="COUNT">%d</xliff:g> aksara bukan huruf</item>
- <item quantity="one">Mesti mengandungi sekurang-kurangnya 1 aksara bukan huruf</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Pentadbir peranti tidak membenarkan penggunaan kata laluan terbaharu"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Ralat semasa menyimpan kata laluan"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Kata laluan lazim disekat oleh pentadbir IT anda. Cuba kata laluan yang lain."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Tambah profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Padamkan profil ini"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Tambah profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Kecerahan paparan"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Untuk melihat peranti anda, hidupkan Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Untuk menggandingkan peranti, buka tetapan Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Pentadbir sistem maklumat hibur"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Apl yang diaktifkan"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Apl yang dinyahaktifkan"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apl dengan kebenaran ini mempunyai akses kepada data kenderaan ini"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Tiada apl pentadbir kenderaan"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Apl pentadbir sistem maklumat hibur ini aktif dan membenarkan apl <xliff:g id="APP_NAME">%1$s</xliff:g> melaksanakan pengendalian yang berikut:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Mengaktifkan apl sistem maklumat hibur ini akan membenarkan apl <xliff:g id="APP_NAME">%1$s</xliff:g> melaksanakan pengendalian yang berikut:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktifkan apl sistem maklumat hibur ini?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktifkan apl sistem maklumat hibur ini"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Nyahaktifkan & nyahpasang"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Nyahaktifkan apl sistem maklumat hibur ini"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Lagi butiran"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Pengurus organisasi boleh memantau dan mengurus apl serta data yang berkaitan dengan profil ini, termasuk tetapan, kebenaran, akses korporat, aktiviti rangkaian dan maklumat lokasi kenderaan."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Pengurus organisasi boleh memantau dan mengurus apl serta data yang berkaitan dengan profil ini, termasuk tetapan, kebenaran, akses korporat, aktiviti rangkaian dan maklumat lokasi peranti."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Pengurus organisasi boleh memantau dan mengurus apl serta data yang berkaitan dengan sistem maklumat hibur ini, termasuk tetapan, kebenaran, akses korporat, aktiviti rangkaian dan maklumat lokasi kenderaan."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Pengurus organisasi mungkin dapat mengakses data yang berkaitan dengan sistem maklumat hibur ini, mengurus apl dan menukar tetapan kenderaan ini."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Tetapan ini tidak tersedia"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Tidak dapat menukar kelantangan dalam kenderaan terurus ini"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Tidak dapat membuat panggilan dalam kenderaan terurus ini"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS tidak dibenarkan dalam kenderaan terurus ini"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera tidak tersedia dalam kenderaan terurus ini"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Tidak dapat mengambil tangkapan skrin dalam kenderaan terurus ini"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Tidak dapat membuka apl ini dalam kenderaan terurus ini"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Disekat oleh pembekal kredit anda"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Akses kepada beberapa ciri dihadkan oleh organisasi.\n\nJika anda mempunyai soalan, hubungi pengurus organisasi."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Apl pentadbir kenderaan"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# apl yang diaktifkan}other{# apl yang diaktifkan}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Tiada apl yang diaktifkan"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Dasar kenderaan <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Tetapan diurus oleh pengurus organisasi"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Ketahui lebih lanjut tentang <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Kongsi laporan pepijat?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Pengurus organisasi kenderaan ini meminta laporan pepijat untuk membantu menyelesaikan masalah peranti ini. Apl dan data mungkin dikongsi."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Pengurus organisasi kenderaan ini meminta laporan pepijat untuk membantu menyelesaikan masalah peranti ini. Apl dan data mungkin dikongsi dan peranti anda mungkin menjadi perlahan untuk sementara waktu."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Laporan pepijat ini dikongsi dengan pengurus organisasi kenderaan ini. Hubungi pengurus organisasi untuk mendapatkan maklumat lanjut."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Kongsi"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Tolak"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Tetapan ini tidak boleh ditukar sekarang"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Kebolehaksesan"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Sari kata"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Pilihan sari kata"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Mati"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Hidup"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Pembaca skrin"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Tunjukkan sari kata"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Saiz teks"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Saiz dan gaya sari kata"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Sangat kecil"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Kecil"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Lalai"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Besar"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Sangat besar"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Gaya sari kata"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Ditetapkan oleh apl"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Putih pada hitam"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Hitam pada putih"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Kuning pada hitam"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Kuning pada biru"</string>
</resources>
diff --git a/res/values-my/arrays.xml b/res/values-my/arrays.xml
index 4754122..2f08079 100644
--- a/res/values-my/arrays.xml
+++ b/res/values-my/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"လုံးဝ ခွင့်မပြုပါ"</item>
<item msgid="1154273129608299386">"အမြဲခွင့်ပြုပါ"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 77fac80..f148da0 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"ညသုံးမုဒ်"</string>
<string name="network_and_internet" msgid="4229023630498537530">"ကွန်ရက်နှင့် အင်တာနက်"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"မိုဘိုင်းကွန်ရက်"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other">ဆင်းမ်ကတ် <xliff:g id="COUNT_1">%1$d</xliff:g> ခု</item>
- <item quantity="one">ဆင်းမ်ကတ် <xliff:g id="COUNT_0">%1$d</xliff:g> ခု</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{ဆင်းမ် # ကတ်}other{ဆင်းမ် # ကတ်}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"သုံးနေသော / ဆင်းမ်ကတ်"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"မသုံးသော / ဆင်းမ်ကတ်"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"သုံးနေသော / ဒေါင်းလုဒ်လုပ်ထားသော ဆင်းမ်"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"ထပ်ထည့်ရန်"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"မိုဘိုင်းဒေတာ"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"မိုဘိုင်းကွန်ရက်သုံးပြီး ဒေတာကို ဝင်သုံးခွင့်ပေးပါ"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"မိုဘိုင်းကွန်ရက်"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"မိုဘိုင်းဒေတာ သုံးမည်"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"မိုဘိုင်းဒေတာ ပိတ်လိုသလား။"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"ရွေးချယ်မှု လိုအပ်သည်"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"မိုဘိုင်းဒေတာအတွက် <xliff:g id="CARRIER">%1$s</xliff:g> သုံးမလား။"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"ဒေတာသတိပေးချက် <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"ဒေတာကန့်သတ်ချက် <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"ဒေတာသတိပေးချက် <xliff:g id="ID_1">^1</xliff:g> / ဒေတာကန့်သတ်ချက် <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d ရက် ကျန်သည်</item>
- <item quantity="one">%d ရက် ကျန်သည်</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# ရက်ကျန်သည်}other{# ရက်ကျန်သည်}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"အချိန် မကျန်တော့ပါ"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"၁ ရက်အောက်သာ ကျန်သည်"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> က ပြီးခဲ့သော <xliff:g id="ID_2">^2</xliff:g> က အပ်ဒိတ်လုပ်သည်"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"သတ်မှတ်ရန်"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ဒေတာသတိပေး/ကန့်သတ်ချက်"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"အက်ပ်ဒေတာ အသုံးပြုမှု စက်ဝန်း"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"မိုဘိုင်းဒေတာ သုံးစွဲမှု"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ဒေတာသတိပေးချက် သတ်မှတ်ရန်"</string>
<string name="data_warning" msgid="116776633806885370">"ဒေတာသတိပေးချက်"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ဒေတာကန့်သတ်ရန်"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"သင်သတ်မှတ်ထားသည့် ကန့်သတ်ချက်ရောက်သည်နှင့် သင့်ယာဉ်၏ ဦးပိုင်းယူနစ်သည် မိုဘိုင်းဒေတာကို ပိတ်သွားပါမည်။\n\nဒေတာသုံးစွဲမှုကို ဦးပိုင်းယူနစ်က တိုင်းတာခြင်းဖြစ်ပြီး ဖုန်းလိုင်းဝန်ဆောင်မှုပေးသူ၏ တွက်ချက်မှုနှင့် ကွာခြားနိုင်သောကြောင့် ကန့်သတ်ချက်မကျော်လွန်အောင် သတ်မှတ်ပါ။"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ဒေတာသုံးစွဲမှု သတိပေးချက် သတ်မှတ်ခြင်း"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ဒေတာသုံးစွဲမှု ကန့်သတ်ချက် သတ်မှတ်ခြင်း"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"ဒေတာသုံးစွဲမှုကို သင်၏စက်ဖြင့် တိုင်းတာသည်။ သင့်မိုဘိုင်းဖုန်းကုမ္ပဏီ၏ ဒေတာအလိုက် ကွဲပြားနိုင်သည်။"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"သတ်မှတ်ရန်"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"သိမ်းရန်"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM ကွန်ရက်"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"ယာဉ်သုံးအင်တာနက်"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"ယာဉ်သုံးအင်တာနက်ပိတ်ခြင်းသည် ယာဉ်ဝန်ဆောင်မှု (သို့) အက်ပ်အချို့ ရပ်သွားနိုင်သည်။\n\nယာဉ်လည်ပတ်ရန် အရေးကြီးဒေတာကို ယာဉ်ထုတ်လုပ်သူနှင့် ဆက်လက်မျှဝေမည်။"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"မည်သို့ဖြစ်စေ ပိတ်ရန်"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"ယာဉ်သုံးအင်တာနက် ပိတ်ထားသည်။ ယာဉ်ဝန်ဆောင်မှု (သို့) အက်ပ်အချို့ ရပ်သွားနိုင်သည်။ ယာဉ်လည်ပတ်ရန် အရေးကြီးဒေတာကို ယာဉ်ထုတ်လုပ်သူနှင့် ဆက်လက်မျှဝေမည်။"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s တွင် %1$s သုံးထားသည်"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"အခြားကွန်ရက်သို့ ချိတ်ဆက်ရန်"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"ကွန်ရက် သတ်မှတ်ချက်များ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"ကွန်ရက်ထည့်ရန်"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"ချိတ်ရန်"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"ချိတ်ဆက်နေသည်…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"ချိတ်ဆက်မထားပါ"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"ကွန်ရက်သည် ရနိုင်သောအကွာအဝေးတွင် မရှိပါ"</string>
<string name="wifi_password" msgid="5565632142720292397">"စကားဝှက်"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"စကားဝှက်ကို ပြရန်"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi‑Fi ဟော့စပေါ့ လိုင်း-"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ဟော့စပေါ့နှင့် မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ်သုံးခြင်း"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ဟော့စပေါ့"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ပိတ်"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"ဟော့စပေါ့ကို အလိုအလျောက် ပိတ်ခြင်း"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"မည်သည့် စက်ပစ္စည်းကိုမျှ ချိတ်ဆက်ထားခြင်း မရှိလျှင် Wi‑Fi ဟော့စပေါ့ ပိတ်သွားပါမည်"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> က Wi-Fi ဖွင့်လိုသည်"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"ချက်ချင်း ရပ်ရန်"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"မဖြစ်မနေ ရပ်ခိုင်းမလား။"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"အက်ပ်ကို မဖြစ်မနေရပ်ခိုင်းလျှင် ပုံမှန် အလုပ်လုပ်တော့မည် မဟုတ်ပါ။"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"စွမ်းဆောင်ရည်ကာကွယ်မှုကို ပိတ်မလား။"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"ဤသို့လုပ်ဆောင်ပါက သင်၏ဆော့ဖ်ဝဲနှင့် ကွန်ပျူတာဆိုင်ရာ စက်ပစ္စည်းများလည်း အလုပ်လုပ်နိုင်မည် မဟုတ်ပါ။"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ဖွင့်ထားရန်"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"ပိတ်ရန်"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"အက်ပ်စွမ်းဆောင်ရည် ဦးစားပေးကိုဖွင့်မလား။"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"၎င်းကိုဖွင့်ပါက စနစ်မတည်ငြိမ်မှု (သို့) ရေရှည်တွင် စက်ပစ္စည်းအပေါ် သက်ရောက်မှုများ ဖြစ်နိုင်ချေရှိသည်။ ရှေ့ဆက်လိုသလား။"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Yes"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"မလိုပါ"</string>
<string name="disable_text" msgid="4358165448648990820">"ပိတ်ရန်"</string>
<string name="enable_text" msgid="1794971777861881238">"ဖွင့်ရန်"</string>
<string name="uninstall_text" msgid="277907956072833012">"ဖြုတ်ရန်"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"ခွင့်ပြုချက်များ"</string>
<string name="notifications_label" msgid="6586089149665170731">"အကြောင်းကြားချက်များ"</string>
<string name="storage_application_label" msgid="5911779903670978586">"သိုလှောင်ခန်းနှင့် ကက်ရှ်"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"အကောင်းဆုံးစွမ်းဆောင်ရည် ရယူရန်"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"အက်ပ်စွမ်းဆောင်ရည်ကို ဦးစားပေးရန်"</string>
<string name="application_version_label" msgid="8556889839783311649">"ဗားရှင်း− %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ခွင့်ပြုထားသည့် အရာများ မရှိပါ"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"တောင်းဆိုထားသော ခွင့်ပြုချက်များ မရှိပါ"</string>
<string name="unused_apps" msgid="648471933781010395">"အသုံးမပြုသော အက်ပ်များ"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">အသုံးမပြုသောအက်ပ် <xliff:g id="COUNT_1">%d</xliff:g> ခု</item>
- <item quantity="one">အသုံးမပြုသောအက်ပ် <xliff:g id="COUNT_0">%d</xliff:g> ခု</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{အသုံးမပြုသောအက်ပ် # ခု}other{အသုံးမပြုသောအက်ပ် # ခု}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"ခွင့်ပြုချက်ဖယ်ရှားပြီး နေရာလွတ်လုပ်ရန်"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"စက်အတွင်းသိမ်းဆည်းရန်နေရာတွင် %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"ရင်းမြစ်လွန်ကဲစွာမသုံးရန် အက်ပ်ကိုပိတ်ပါ"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"အက်ပ်စွမ်းဆောင်ရည်ကို ဦးစားပေးရန် စနစ်ရင်းမြစ်များကို သုံးနိုင်သည်"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ဒေတာသုံးစွဲမှု"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"အက်ပ်ဒေတာ သုံးစွဲမှု"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"သုံးစွဲမှုမှတ်တမ်း"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"အက်ပ်အားလုံး"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ဒေတာနှင့် Wi‑Fi သုံးစွဲမှု"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"သုံးစွဲမှုမှတ်တမ်း"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"စုစုပေါင်း သုံးစွဲမှု"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"မျက်နှာစာ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"နောက်ခံ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ဒေတာ သုံးခွင့်ပြုရန်"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"ဤအက်ပ်ကို မိုဘိုင်းဒေတာ သုံးခွင့်ပြုမည်"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ဒေတာ ကန့်သတ်ရန်"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"အက်ပ်သည် မျက်နှာစာတွင်ရှိမှသာ မိုဘိုင်းဒေတာသုံးမည်"</string>
<string name="computing_size" msgid="5791407621793083965">"တွက်ချက်နေသည်…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other">နောက်ထပ် ခွင့်ပြုချက် <xliff:g id="COUNT_1">%d</xliff:g> ခု</item>
- <item quantity="one">နောက်ထပ် ခွင့်ပြုချက် <xliff:g id="COUNT_0">%d</xliff:g> ခု</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{ထပ်ဆောင်းခွင့်ပြုချက် # ခု}other{ထပ်ဆောင်းခွင့်ပြုချက် # ခု}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"မှတ်ချက်- ပြန်လည်စတင်ပြီးနောက် သင့်ယာဉ်ကို လော့ခ်မဖွင့်မချင်း ဤအက်ပ်ကို အသုံးပြု၍မရပါ။"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"အကူနှင့် အသံဖြင့်စာရိုက်ခြင်း"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"အကူအညီ အက်ပ်"</string>
@@ -386,12 +396,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi ထိန်းချုပ်မှုသည် အက်ပ်တစ်ခုအား Wi-Fi ဖွင့်ရန် သို့မဟုတ် ပိတ်ရန်၊ Wi-Fi ကွန်ရက်များ ရှာဖွေရန်နှင့် ၎င်းတို့သို့ ချိတ်ဆက်ရန်၊ ကွန်ရက်များ ထည့်ရန် သို့မဟုတ် ဖယ်ရှားရန် သို့မဟုတ် စက်တွင်းသာသုံးသည့် ဟော့စပေါ့စတင်ရန်တို့ကို ခွင့်ပြုသည်။"</string>
<string name="more_special_access_title" msgid="166115485446645971">"နောက်ထပ်"</string>
<string name="location_settings_title" msgid="901334356682423679">"တည်နေရာ"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"တည်နေရာကို သုံးရန်"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"သတ်မှတ်ထားသော အက်ပ်များကို တည်နေရာသုံးခွင့်ပြုနိုင်သည်"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"ပိတ်လိုက်ပါက အက်ပ်အားလုံးအတွက် တည်နေရာသုံးခွင့်ကို ဖယ်ရှားပါမည်။ ‘ယာဉ်မောင်းသူ အထောက်အကူ’ အက်ပ်များက ဆက်သုံးခွင့်ရနေပါမည်။"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"‘ယာဉ်မောင်းသူ အထောက်အကူ’ အတွက် တည်နေရာသုံးပါ"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"ကား၏ တည်နေရာဝန်ဆောင်မှု ပိတ်ထားသည်"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"‘ယာဉ်မောင်းအထောက်အကူအက်ပ်’ ကတည်နေရာသုံးခွင့်မရှိပါ"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"ပြောင်းရန်"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"ယာဉ်မောင်းအကူအညီအက်ပ်များကို တည်နေရာသုံးခွင့်ပြုနိုင်သည်"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"ပိတ်လိုက်ပါက တည်နေရာအချက်အလက်အပေါ် အားထားရသော ‘ယာဉ်မောင်းသူ အထောက်အကူ’ အက်ပ်များ ပိတ်သွားပါမည်။"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"မည်သို့ဖြစ်စေ ပိတ်ရန်"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"လတ်တလော တည်နေရာတောင်းဆိုချက်များ"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"လတ်တလော တည်နေရာတောင်းဆိုချက်များ မရှိပါ"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"အက်ပ်အဆင့် ခွင့်ပြုချက်များ"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"တည်နေရာဝန်ဆောင်မှုများ"</string>
<string name="location_use_location_title" msgid="117735895374606680">"တည်နေရာကို သုံးရန်"</string>
<string name="location_settings_footer" msgid="296892848338100051">"တည်နေရာဝန်ဆောင်မှုက သင့်စက်၏တည်နေရာ ခန့်မှန်းရာတွင် အကူအညီရယူရန် GPS၊ Wi-Fi၊ မိုဘိုင်းကွန်ရက်နှင့် အာရုံခံကိရိယာများကဲ့သို့ ရင်းမြစ်များကို အသုံးပြုနိုင်သည်။"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ယာဉ်မောင်းသူ အထောက်အကူ"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"‘ယာဉ်မောင်းသူ အထောက်အကူပြုအက်ပ်များ’ သို့ပို့ထားသော တည်နေရာအချက်အလက်တွင် သင့်ကို ခွဲခြားဖော်ထုတ်နိုင်သော အချက်အလက် မပါဝင်ပါ။ ၎င်းကို မဖျက်မီ အများဆုံး ၂ ရက်အထိ သိမ်းပါသည်။"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"မိုက်ခရိုဖုန်း"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"မိုက်ခရိုဖုန်း အသုံးပြုရန်"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"အက်ပ်အားလုံးကို မိုက်ခရိုဖုန်းသုံးခွင့်ပေးနိုင်သည်"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"မိုက်ခရိုဖုန်း ခွင့်ပြုချက်များကို စီမံခြင်း"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"လတ်တလော သုံးထားသည်များ"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"လတ်တလောအက်ပ်များ မရှိပါ"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"အက်ပ် 0 ခုတွင် ခွင့်ပြုချက်ရှိသည်"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{အက်ပ် {total_count} ခုအနက် # ခုတွင် ခွင့်ပြုချက်ရှိသည်}other{အက်ပ် {total_count} ခုအနက် # ခုတွင် ခွင့်ပြုချက်ရှိသည်}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"လတ်တလော သုံးထားသည်များ"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"အားလုံးကြည့်ရန်"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"ဖွင့်နေသည်…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"စနစ်"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"စနစ်အပ်ဒိတ်များ"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"အဆင့်မြင့်"</string>
@@ -430,10 +463,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"ပြင်ပကုမ္ပဏီလိုင်စင်များ"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"လိုင်စင်များကို ဖွင့်ရာတွင် ပြသနာရှိနေသည်။"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"ဖွင့်နေသည်…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">သင် ဆော့ဖ်ဝဲအင်ဂျင်နီယာ ဖြစ်ရန် အဆင့် <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ဆင့် လိုပါသေးသည်။</item>
- <item quantity="one">သင် ဆော့ဖ်ဝဲအင်ဂျင်နီယာ ဖြစ်ရန် အဆင့် <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ဆင့် လိုပါသေးသည်။</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{သင် ဆော့ဖ်ဝဲအင်ဂျင်နီယာဖြစ်ရန် ယခုအခါ အဆင့် # ဆင့်သာလိုပါသည်။}other{သင် ဆော့ဖ်ဝဲအင်ဂျင်နီယာဖြစ်ရန် ယခုအခါ အဆင့် # ဆင့်သာလိုပါသည်။}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"သင်သည် ယခု ဆော့ဖ်ဝဲအင်ဂျင်နီယာ တစ်ဦး ဖြစ်နေပါပြီ။"</string>
<string name="show_dev_already" msgid="1678087328973865736">"မလိုပါ၊ သင်က ဆော့ဖ်ဝဲအင်ဂျင်နီယာ ဖြစ်ပြီးသားပါ။"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"တီထွင်သူများရွေးစရာ"</string>
@@ -502,14 +532,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"ပရိုဖိုင်အသစ် ပြုလုပ်ပြီးနောက် ထိုသူသည် ၎င်းကိုယ်တိုင်အတွက် စိတ်ကြိုက်ပြင်ဆင်ရပါမည်။"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"အခြားပရိုဖိုင်အားလုံးက သုံးရန်အတွက် အက်ပ်များကို နှစ်သက်ရာပရိုဖိုင်မှ အပ်ဒိတ်လုပ်နိုင်သည်။"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"ပရိုဖိုင်ကန့်သတ်ချက် ပြည့်သွားပါပြီ"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">ပရိုဖိုင် <xliff:g id="COUNT">%d</xliff:g> ခုအထိ ပြုလုပ်နိုင်သည်။</item>
- <item quantity="one">ပရိုဖိုင်တစ်ခုသာ ပြုလုပ်နိုင်သည်။</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{ပရိုဖိုင်တစ်ခုသာ ပြုလုပ်နိုင်သည်။}other{ပရိုဖိုင် # ခုအထိ ပြုလုပ်နိုင်သည်။}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"ပရိုဖိုင်အသစ် ပြုလုပ်၍မရပါ"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ဤပရိုဖိုင်ကို ဖျက်မလား။"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ဤပရိုဖိုင်အတွက် အက်ပ်နှင့် ဒေတာအားလုံးကို ဖျက်လိုက်ပါမည်"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"ပရိုဖိုင်ကို ဖျက်၍မရပါ။"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"ပရိုဖိုင် မဖျက်ထားပါ။ စက်ကို ပြန်စ၍ ထပ်စမ်းကြည့်နိုင်သည်။"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"ပရိုဖိုင်များပြောင်းသောအခါ (သို့) ယာဉ်ကိုပြန်စတင်သောအခါ ဤပရိုဖိုင်ကို ဖျက်လိုက်ပါမည်။"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ပယ်ရန်"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ထပ်စမ်းကြည့်ရန်"</string>
@@ -622,6 +649,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"လော့ခ်ဖွင့်ရန်ပုံစံ ဆွဲနည်း"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"ပုံစံကို သိမ်းရာတွင် အမှားရှိနေသည်"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"အလွန်များသည့် မမှန်ကန်သော ကြိုးစားမှုများရှိသည်။ <xliff:g id="NUMBER">%d</xliff:g> စက္ကန့်ကြာမှ ထပ်မံကြိုးစားပါ။"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"ပုံစံက လှည့်ပတ်မှုကိုမထောက်ပံ့၍ ထိတွေ့မှုကိုသုံးပါ"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"မျက်နှာပြင်လော့ခ် ဖယ်လိုသလား။"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"၎င်းက မည်သူ့ကိုမဆို သင့်အကောင့်ထဲ ဝင်ခွင့်ပေးမည်"</string>
@@ -653,30 +681,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"အသုံးပြုလေ့ရှိသော ပင်နံပါတ်များကို သင်၏ IT စီမံခန့်ခွဲသူက ပိတ်ထားသည်။ အခြား ပင်နံပါတ်တစ်ခုဖြင့် စမ်းကြည့်ပါ။"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"၎င်းတွင် မမှန်ကန်သည့် အက္ခရာများ ပါဝင်၍မရပါ။"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"စကားဝှက် မမှန်ပါ၊ အနည်းဆုံး အက္ခရာ ၄ လုံး ရှိရမည်။"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">အနည်းဆုံး စာလုံး <xliff:g id="COUNT">%d</xliff:g> လုံးပါဝင်ရမည်</item>
- <item quantity="one">အနည်းဆုံး စာလုံး ၁ လုံးပါဝင်ရမည်</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">အနည်းဆုံး စာလုံးငယ် <xliff:g id="COUNT">%d</xliff:g> လုံးပါဝင်ရမည်</item>
- <item quantity="one">အနည်းဆုံး စာလုံးငယ် ၁ လုံးပါဝင်ရမည်</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">အနည်းဆုံး စာလုံးကြီး <xliff:g id="COUNT">%d</xliff:g> လုံး ပါဝင်ရမည်</item>
- <item quantity="one">အနည်းဆုံး စာလုံးကြီး ၁ လုံး ပါဝင်ရမည်</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">အနည်းဆုံး ဂဏန်း <xliff:g id="COUNT">%d</xliff:g> လုံးပါဝင်ရမည်</item>
- <item quantity="one">အနည်းဆုံး ဂဏန်း ၁ လုံးပါဝင်ရမည်</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">အနည်းဆုံး အထူးသင်္ကေတ <xliff:g id="COUNT">%d</xliff:g> ခု ပါဝင်ရမည်</item>
- <item quantity="one">အနည်းဆုံး အထူးသင်္ကေတ ၁ ခု ပါဝင်ရမည်</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">အနည်းဆုံး စာမဟုတ်သည့်အက္ခရာ <xliff:g id="COUNT">%d</xliff:g> လုံး ပါဝင်ရမည်</item>
- <item quantity="one">အနည်းဆုံး စာမဟုတ်သည့်အက္ခရာ ၁ လုံး ပါဝင်ရမည်</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"စက်ပစ္စည်းစီမံခန့်ခွဲသူသည် မကြာသေးမီက အသုံးပြုခဲ့သည့် စကားဝှက်ကို သုံးခွင့်မပြုပါ"</string>
<string name="error_saving_password" msgid="8334882262622500658">"စကားဝှက်ကို သိမ်းရာတွင် အမှားရှိနေသည်"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"အသုံးပြုလေ့ရှိသော စကားဝှက်များကို သင်၏ IT စီမံခန့်ခွဲသူက ပိတ်ထားသည်။ အခြား စကားဝှက်တစ်ခုဖြင့် စမ်းကြည့်ပါ။"</string>
@@ -719,5 +723,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"ပရိုဖိုင် ထည့်ရန်"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ဤပရိုဖိုင်ကို ဖျက်ရန်"</string>
<string name="add_profile_text" msgid="9118410102199116969">"ပရိုဖိုင် ထည့်ရန်"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"မျက်နှာပြင် တောက်ပမှု"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"သင့်စက်များကို တွေ့နိုင်ရန် ဘလူးတုသ်ဖွင့်ပါ"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"စက်နှင့်တွဲချိတ်ရန် ဘလူးတုသ် ဆက်တင်များကို ဖွင့်ပါ"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"သတင်းနှင့်ဖျော်ဖြေရေး စနစ် စီမံခန့်ခွဲသူ"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"ဖွင့်ထားသောအက်ပ်များ"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"ပိတ်ထားသောအက်ပ်များ"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ဤခွင့်ပြုချက်ရထားသည့် အက်ပ်များက ဤယာဉ်၏ဒေတာကို သုံးခွင့်ရှိသည်"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"ယာဉ်ဆိုင်ရာ စီမံရေးအက်ပ် မရှိပါ"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"ဤသတင်းနှင့်ဖျော်ဖြေရေး စနစ် စီမံခန့်ခွဲအက်ပ်ကို ဖွင့်ထားပြီး ၎င်းသည် အောက်ပါတို့ဆောင်ရွက်ရန် <xliff:g id="APP_NAME">%1$s</xliff:g> အက်ပ်ကို ခွင့်ပြုသည်-"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"ဤသတင်းနှင့်ဖျော်ဖြေရေး အက်ပ် ဖွင့်ခြင်းက <xliff:g id="APP_NAME">%1$s</xliff:g> အက်ပ်ကို အောက်ပါတို့ဆောင်ရွက်ရန် ခွင့်ပြုလိမ့်မည်-"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"သတင်းနှင့်ဖျော်ဖြေရေး စနစ် အက်ပ် ဖွင့်မလား။"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"ဤသတင်းနှင့်ဖျော်ဖြေရေး စနစ် အက်ပ်ကို ဖွင့်ရန်"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"ပိတ်သိမ်းပြီး ဖယ်ရှားရန်"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"ဤသတင်းနှင့်ဖျော်ဖြေရေး စနစ် အက်ပ်ကို ပိတ်ရန်"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"နောက်ထပ် အသေးစိတ်များ"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"အဖွဲ့အစည်းမန်နေဂျာသည် ဆက်တင်များ၊ ခွင့်ပြုချက်များ၊ ပူးပေါင်းသုံးစွဲခွင့်များ၊ ကွန်ရက်လုပ်ဆောင်ချက်နှင့် ယာဉ်၏ တည်နေရာ အချက်အလက်များအပါအဝင် ဤပရိုဖိုင်နှင့် ဆက်စပ်နေသည့် အက်ပ်နှင့် ဒေတာများကို စောင့်ကြည့်စီမံနိုင်ပါသည်။"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"အဖွဲ့အစည်းမန်နေဂျာသည် ဆက်တင်များ၊ ခွင့်ပြုချက်များ၊ ပူးပေါင်းသုံးစွဲခွင့်များ၊ ကွန်ရက်လုပ်ဆောင်ချက်နှင့် စက်ပစ္စည်း၏ တည်နေရာ အချက်အလက်များအပါအဝင် ဤပရိုဖိုင်နှင့် ဆက်စပ်နေသည့် အက်ပ်နှင့် ဒေတာများကို စောင့်ကြည့်စီမံနိုင်ပါသည်။"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"အဖွဲ့အစည်းမန်နေဂျာသည် ဆက်တင်များ၊ ခွင့်ပြုချက်များ၊ ပူးပေါင်းသုံးစွဲခွင့်များ၊ ကွန်ရက်လုပ်ဆောင်ချက်နှင့် ယာဉ်၏ တည်နေရာ အချက်အလက်များအပါအဝင် ဤသတင်းနှင့်ဖျော်ဖြေရေး စနစ်နှင့် ဆက်စပ်နေသည့် အက်ပ်နှင့် ဒေတာများကို စောင့်ကြည့်စီမံနိုင်ပါသည်။"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"အဖွဲ့အစည်းမန်နေဂျာသည် ဤသတင်းနှင့်ဖျော်ဖြေရေး စနစ်နှင့် ဆက်စပ်နေသည့် ဒေတာကို သုံးခြင်း၊ အက်ပ်များကို စီမံခြင်းနှင့် ယာဉ်ဆက်တင်များ ပြောင်းလဲခြင်းတို့ကို ပြုလုပ်နိုင်သည်။"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"၎င်းကို မရနိုင်ပါ"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"ဤစီမံခန့်ခွဲထားသော ယာဉ်တွင် အသံအတိုးအကျယ်ကို ပြောင်း၍မရနိုင်ပါ"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"ဤစီမံခန့်ခွဲထားသော ယာဉ်တွင် ဖုန်းဆက်၍မရနိုင်ပါ"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"ဤစီမံခန့်ခွဲထားသော ယာဉ်တွင် SMS စာတိုစနစ်ကို ခွင့်ပြုမထားပါ"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"ဤစီမံခန့်ခွဲထားသော ယာဉ်တွင် ကင်မရာကို အသုံးပြု၍မရနိုင်ပါ"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"ဤစီမံခန့်ခွဲထားသော ယာဉ်တွင် ဖန်သားပြင်ဓာတ်ပုံ မရိုက်နိုင်ပါ"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"ဤစီမံခန့်ခွဲထားသော ယာဉ်တွင် ဤအက်ပ်ကို ဖွင့်၍မရနိုင်ပါ"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"သင်၏ ခရက်ဒစ်ဝန်ဆောင်မှုပေးသူက ပိတ်ထားသည်"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"အချို့ဝန်ဆောင်မှုများ သုံးခွင့်ကို အဖွဲ့အစည်းက ကန့်သတ်ထားသည်။\n\nမေးမြန်းလိုပါက အဖွဲ့အစည်းမန်နေဂျာထံ ဆက်သွယ်ပါ။"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"ယာဉ်စီမံခန့်ခွဲအက်ပ်များ"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{ဖွင့်ထားသောအက်ပ် # ခု}other{ဖွင့်ထားသောအက်ပ် # ခု}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"ဖွင့်ထားသောအက်ပ် မရှိပါ"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ယာဉ်မူဝါဒ"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"အဖွဲ့အစည်းမန်နေဂျာက စီမံသော ဆက်တင်များ"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> အကြောင်း ပိုမိုလေ့လာရန်"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"ချွတ်ယွင်းမှု အစီရင်ခံစာကို မျှဝေမလား။"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"ဤယာဉ်၏ အဖွဲ့အစည်းမန်နေဂျာသည် ၎င်းစက်ကို ပြဿနာ ရှာဖွေဖြေရှင်းရာတွင် ကူညီရန် ချွတ်ယွင်းမှု အစီရင်ခံစာကို တောင်းဆိုထားသည်။ အက်ပ်များနှင့် ဒေတာများကို မျှဝေနိုင်ပါသည်။"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"ဤယာဉ်၏ အဖွဲ့အစည်းမန်နေဂျာသည် ၎င်းစက်ကို ပြဿနာ ရှာဖွေဖြေရှင်းရာတွင် ကူညီရန် ချွတ်ယွင်းမှု အစီရင်ခံစာကို တောင်းဆိုထားသည်။ အက်ပ်များနှင့် ဒေတာများကို မျှဝေနိုင်၍ သင့်စက်သည် ယာယီ နှေးကွေးသွားနိုင်ပါသည်။"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"ဤချွတ်ယွင်းမှု အစီရင်ခံစာကို ၎င်းယာဉ်၏ အဖွဲ့အစည်းမန်နေဂျာက မျှဝေနေပါသည်။ နောက်ထပ် အသေးစိတ်သိလိုပါက ၎င်းတို့ထံ ဆက်သွယ်ပါ။"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"မျှဝေရန်"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"ငြင်းပယ်ရန်"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"ဤဆက်တင်ကို ယခု ပြောင်း၍မရပါ"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"အများသုံးစွဲနိုင်မှု"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"စာတန်းများ"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"စာတန်း သတ်မှတ်ချက်များ"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ပိတ်"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ဖွင့်"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"ဖန်သားပြင်ဖတ် အက်ပ်"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"စာတန်းများ ပြပါ"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"စာသားအရွယ်အစား"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"စာတန်းအရွယ်နှင့် ပုံစံ"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"အလွန်သေး"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"သေး"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"မူရင်း"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ကြီး"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"အလွန်ကြီး"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"စာတန်းပုံစံ"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"အက်ပ်က သတ်မှတ်ထားသည်"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"အမည်းပေါ်အဖြူ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"အဖြူပေါ်အမည်း"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"အမည်းပေါ်အဝါ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"အပြာပေါ်အဝါ"</string>
</resources>
diff --git a/res/values-nb/arrays.xml b/res/values-nb/arrays.xml
index 7f9d7ee..c9a68be 100644
--- a/res/values-nb/arrays.xml
+++ b/res/values-nb/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Tillat aldri"</item>
<item msgid="1154273129608299386">"Tillat alltid"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 208540f..4727497 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Nattmodus"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Nettverk og internett"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilnettverk"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-kort</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM-kort</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-kort}other{# SIM-kort}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktiv / SIM-kort"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inaktiv / SIM-kort"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktiv / nedlastet SIM-kort"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Legg til mer"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobildata"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Bruk data via mobilnettverket"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilnettverk"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Bruk mobildata"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vil du slå av mobildata?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Du må velge en SIM-innstilling"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Vil du bruke <xliff:g id="CARRIER">%1$s</xliff:g> for mobildata?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Advarsel for databruk: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> datagrense"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Advarsel for databruk: <xliff:g id="ID_1">^1</xliff:g> brukt, <xliff:g id="ID_2">^2</xliff:g> datagrense"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d dager igjen</item>
- <item quantity="one">%d dag igjen</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# dag igjen}other{# dager igjen}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Ingen tid gjenstår"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Mindre enn én dag igjen"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Oppdatert av <xliff:g id="ID_1">^1</xliff:g> for <xliff:g id="ID_2">^2</xliff:g> siden"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Angi"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Datavarsel og -grense"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Syklus for appdatabruk"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Bruk av mobildata"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Angi varsel om databruk"</string>
<string name="data_warning" msgid="116776633806885370">"Varsel om databruk"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Angi datagrense"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Kjøretøyets hovedenhet slår av mobildata når den når grensen du angir.\n\nSiden databruken måles av hovedenheten og operatøren din kan beregne bruken annerledes, kan det være lurt å angi en lav grense."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Angi advarsel for databruk"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Angi grense for databruk"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Enheten måler databruken. Den kan være forskjellig fra databruken målt av mobiloperatøren din."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Angi"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Lagre"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-nettverk"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internett i kjøretøyet"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Hvis du slår av internettet i kjøretøyet, kan det hende noen av kjøretøyets funksjoner eller apper ikke fungerer.\n\nKritiske data som trengs for å drive kjøretøyet, deles fortsatt med produsenten av kjøretøyet."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Slå av likevel"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internett er slått av i kjøretøyet. Dette kan gjøre at noen av kjøretøyets funksjoner eller apper ikke fungerer. Kritiske data som trengs for å drive kjøretøyet, deles fortsatt med produsenten av kjøretøyet."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s brukt %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Koble til et annet nettverk"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Nettverksinnstillinger"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Legg til nettverk"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Koble til"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Kobler til …"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Ikke tilkoblet"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Nettverket er ikke innen rekkevidde"</string>
<string name="wifi_password" msgid="5565632142720292397">"Passord"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Vis passordet"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Velg minst ett bånd for Wi-Fi-sonen:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Wi-Fi-sone og internettdeling"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Wi-Fi-sone"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Av"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Slå av Wi-Fi-sone automatisk"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi-sonen blir slått av hvis ingen enheter er koblet til"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ønsker å slå på Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Tving avslutning"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Vil du tvinge avslutning?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Hvis du tvinger avslutning av en app, kan det oppstå problemer."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Vil du slå av ytelsesbeskyttelse?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Hvis du gjør det, kan det føre til at programvaren og maskinvaren ikke fungerer optimalt."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"La den være på"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Slå av"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Vil du slå på Prioriter appytelse?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Hvis du slår dette på, kan det gjøre systemet ustabilt eller ha langsiktig virkning på maskinvaren. Vil du fortsette?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ja"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nei, takk"</string>
<string name="disable_text" msgid="4358165448648990820">"Deaktiver"</string>
<string name="enable_text" msgid="1794971777861881238">"Aktivér"</string>
<string name="uninstall_text" msgid="277907956072833012">"Avinstaller"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Tillatelser"</string>
<string name="notifications_label" msgid="6586089149665170731">"Varsler"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Lagring og buffer"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Sikre best ytelse"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioriter appytelse"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versjon: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ingen tillatelser er gitt"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ingen tillatelser er forespurt"</string>
<string name="unused_apps" msgid="648471933781010395">"Ubrukte apper"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ubrukte apper</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ubrukt app</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ubrukt app}other{# ubrukte apper}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Fjern tillatelser og frigjør plass"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s i internminne"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Lukk appen for å unngå overdreven bruk av ressurser (ved behov)"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Bruker systemressurser til å prioritere appytelse"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Databruk"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Appens databruk"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Brukslogg"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Alle apper"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data- og Wi-Fi-bruk"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Brukslogg"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Total bruk"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Forgrunnen"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Bakgrunnen"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Tillat data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"La denne appen bruke mobildata"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Begrens data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Bruk mobildata bare når appen er i forgrunnen"</string>
<string name="computing_size" msgid="5791407621793083965">"Beregner …"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tillatelser til</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tillatelse til</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# tillatelse til}other{# tillatelser til}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Merk: Etter en ny oppstart kan ikke denne appen starte før du låser opp kjøretøyet ditt."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistent og taleinndata"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assistentapp"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Med Wi-Fi-kontroll kan en app slå Wi-Fi på eller av, søke etter og koble til Wi-Fi-nettverk, legge til eller fjerne nettverk eller starte en lokal Wi-Fi-sone"</string>
<string name="more_special_access_title" msgid="166115485446645971">"Mer"</string>
<string name="location_settings_title" msgid="901334356682423679">"Posisjon"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Bruk posisjon"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Gi spesifiserte apper tilgang til posisjonen din"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Hvis du slår dette av, fjernes posisjonstilgang for alle appene. Apper for sjåførhjelp har fortsatt tilgang."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Bruk posisjon for sjåførhjelp"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Posisjonen til kjøretøyet er av"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Apper for sjåførhjelp kan ikke se posisjonen din"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Endre"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"La apper som hjelper med kjøring, få tilgang til posisjonen din"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Hvis du slår av dette, blir apper for sjåførhjelp som trenger posisjonsinformasjon, slått av."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Slå av likevel"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nylige posisjonsforespørsler"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ingen nylige posisjonsforespørsler"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Tillatelser på appnivå"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Posisjonstjenester"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Bruk posisjon"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Posisjonstjenestene kan bruke kilder som GPS, Wi-Fi, mobilnettverk og sensorer for å fastslå posisjonen til enheten."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Sjåførhjelp"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Posisjonsinformasjon som sendes til apper for sjåførhjelp, inneholder ikke informasjon som identifiserer deg. Den lagres i maksimalt to dager før den slettes."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Bruk mikrofonen"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Gi alle apper tilgang til mikrofonen"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Administrer mikrofontillatelser"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Nylig brukt"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Ingen nylige apper"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apper har tilgang"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# av {total_count} apper har tilgang}other{# av {total_count} apper har tilgang}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nylig brukt"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Se alle"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Laster inn …"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Systemoppdateringer"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Avansert"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Tredjepartslisenser"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Det oppsto et problem ved innlasting av lisensene."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Laster inn …"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Du er nå <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> trinn fra å bli en utvikler.</item>
- <item quantity="one">Du er nå <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> trinn fra å bli en utvikler.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Du er nå # trinn fra å bli en utvikler.}other{Du er nå # trinn fra å bli en utvikler.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Du er en utvikler nå!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Det trengs ikke. Du er allerede en utvikler."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Utvikleralternativer"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Etter at du har opprettet en ny profil, kan brukeren tilpasse den selv."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apper kan oppdateres fra hvilken som helst profil for bruk av alle andre profiler."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Grensen for antall profiler er nådd"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Du kan opprette opptil <xliff:g id="COUNT">%d</xliff:g> profiler.</item>
- <item quantity="one">Du kan bare opprette én profil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Du kan bare opprette én profil.}other{Du kan opprette opptil # profiler.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Kunne ikke opprette ny profil"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Vil du slette denne profilen?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Alle appene og dataene tilknyttet denne profilen blir slettet."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Kunne ikke slette profilen."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profilen ble ikke slettet. Start enheten på nytt og prøv igjen."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Denne profilen blir slettet når du bytter profil eller starter kjøretøyet på nytt."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Avvis"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Prøv på nytt"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Slik tegner du et opplåsingsmønster"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Feil ved lagring av mønster"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"For mange ugyldige forsøk. Prøv på nytt om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Mønsteret støtter ikke rotasjon. Bruk berøring."</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Vil du fjerne skjermlåsen?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Dette gir hvem som helst tilgang til kontoen din"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Vanlige PIN-koder er blokkert av IT-administratoren din. Prøv en annen PIN-kode."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Dette kan ikke inkludere et ugyldig tegn."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Passordet er ugyldig – det må bestå av minst fire tegn."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Må inneholde minst <xliff:g id="COUNT">%d</xliff:g> bokstaver</item>
- <item quantity="one">Må inneholde minst én bokstav</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Må inneholde minst <xliff:g id="COUNT">%d</xliff:g> små bokstaver</item>
- <item quantity="one">Må inneholde minst én liten bokstav</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Må inneholde minst <xliff:g id="COUNT">%d</xliff:g> store bokstaver</item>
- <item quantity="one">Må inneholde minst én stor bokstav</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Må inneholde minst <xliff:g id="COUNT">%d</xliff:g> sifre</item>
- <item quantity="one">Må inneholde minst ett siffer</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Må inneholde minst <xliff:g id="COUNT">%d</xliff:g> spesialtegn</item>
- <item quantity="one">Må inneholde minst ett spesialtegn</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Må inneholde minst <xliff:g id="COUNT">%d</xliff:g> andre tegn enn bokstaver</item>
- <item quantity="one">Må inneholde minst ett annet tegn enn bokstaver</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Enhetsadministratoren forbyr nylig brukte passord"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Feil ved lagring av passord"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Vanlige passord er blokkert av IT-administratoren din. Prøv et annet passord."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Legg til en profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Slett denne profilen"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Legg til en profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Lysstyrken på skjermen"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Slå på Bluetooth for å se enhetene dine"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Åpne Bluetooth-innstillingene for å koble til enheter"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Infotainmentsystem-admin"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktiverte apper"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktiverte apper"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apper med denne tillatelsen har tilgang til dette kjøretøyets data"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Ingen admin-apper for kjøretøyet"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Denne admin-appen for infotainment-systemet er aktiv og tillater appen <xliff:g id="APP_NAME">%1$s</xliff:g> å utføre følgende operasjoner:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Hvis du aktiverer denne infotainment-systemappen, tillates appen <xliff:g id="APP_NAME">%1$s</xliff:g> å utføre følgende operasjoner:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktivere denne infotainment-systemappen?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktiver denne infotainment-systemappen"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktiver og avinstaller"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deaktiver denne infotainment-systemappen"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Mer informasjon"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Organisasjonsadministratoren kan overvåke og administrere apper og data tilknyttet denne profilen, inkludert innstillinger, tillatelser, bedriftstilgang, nettverksaktivitet og kjøretøyets posisjonsinformasjon."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Organisasjonsadministratoren kan overvåke og administrere apper og data tilknyttet denne profilen, inkludert innstillinger, tillatelser, bedriftstilgang, nettverksaktivitet og enhetens posisjonsinformasjon."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Organisasjonsadministratoren kan overvåke og administrere apper og data tilknyttet dette infotainment-systemet, inkludert innstillinger, tillatelser, bedriftstilgang, nettverksaktivitet og kjøretøyets posisjonsinformasjon."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Organisasjonsadministratoren kan få tilgang til data tilknyttet dette infotainment-systemet, administrere apper og endre dette kjøretøyets innstillinger."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Den er utilgjengelig"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Kan ikke endre volumet i dette administrerte kjøretøyet"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Kan ikke starte anrop i dette administrerte kjøretøyet"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS er ikke tillatt i dette administrerte kjøretøyet"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kameraet er utilgjengelig i dette administrerte kjøretøyet"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Kan ikke ta skjermdumper i dette administrerte kjøretøyet"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Kan ikke åpne denne appen i dette administrerte kjøretøyet"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blokkert av kredittleverandøren din"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Tilgang til enkelte funksjoner er begrenset av organisasjonen.\n\nHvis du har spørsmål, kan du kontakte organisasjonsadministratoren."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Admin-apper for kjøretøy"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivert app}other{# aktiverte apper}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Ingen aktiverte apper"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Retningslinjer for kjøretøy for <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Innstillinger administreres av organisasjonsadministratoren"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Finn ut mer om <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Vil du dele feilrapporten?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Organisasjonsadministratoren for dette kjøretøyet har bedt om en feilrapport for å hjelpe med feilsøkingen på denne enheten. Apper og data kan bli delt."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Organisasjonsadministratoren for dette kjøretøyet har bedt om en feilrapport for å hjelpe med feilsøkingen på denne enheten. Apper og data kan bli delt. Dette kan midlertidig gjøre enheten din tregere."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Denne feilrapporten blir delt med organisasjonsadministratoren for dette kjøretøyet. Kontakt administratoren for å få mer informasjon."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Del"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Avvis"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Du kan ikke endre denne innstillingen akkurat nå"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Tilgjengelighet"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Teksting"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Valg for teksting"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Av"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"På"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Skjermleser"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Vis teksting"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Tekststørrelse"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Størrelse og stil for teksting"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Veldig liten"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Liten"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Standard"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Stor"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Veldig stor"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Tekststil"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Angitt av app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Hvitt på svart"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Svart på hvitt"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Gult på svart"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Gult på blått"</string>
</resources>
diff --git a/res/values-ne/arrays.xml b/res/values-ne/arrays.xml
index 3ee6c50..6a3997b 100644
--- a/res/values-ne/arrays.xml
+++ b/res/values-ne/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"कहिल्यै पनि अनुमति नदिनुहोस्"</item>
<item msgid="1154273129608299386">"सधैँ अनुमति दिनुहोस्"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 9fee10b..48c8c45 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"रात्रि मोड"</string>
<string name="network_and_internet" msgid="4229023630498537530">"नेटवर्क र इन्टरनेट"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"मोबाइल नेटवर्क"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM हरू</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# वटा SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"सक्रिय / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"निष्क्रिय / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"सक्रिय / डाउनलोड गरिएको SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"अरू थप्नुहोस्"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"मोबाइल डेटा"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"मोबाइल नेटवर्क प्रयोग गरी डेटामाथि पहुँच राख्नु…"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"मोबाइल नेटवर्क"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"मोबाइल डेटा प्रयोग गर्नुहोस्"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"मोबाइल डेटा निष्क्रिय पार्ने हो?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"चयन गर्न आवश्यक छ"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"मोबाइल डेटाका लागि <xliff:g id="CARRIER">%1$s</xliff:g> प्रयोग गर्ने हो?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"डेटाको खपतसम्बन्धी चेतावनी: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"डेटाको सीमा: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"डेटाको खपतसम्बन्धी चेतावनी: <xliff:g id="ID_1">^1</xliff:g> / डेटाको सीमा: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d दिन बाँकी</item>
- <item quantity="one">%d दिन बाँकी</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# दिन बाँकी}other{# दिन बाँकी}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"समय बाँकी छैन"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"१ दिनभन्दा कम समय बाँकी"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> ले <xliff:g id="ID_2">^2</xliff:g> अघि अद्यावधिक गरेको"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"सेट गर्नुहोस्"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"डेटाको खपतसम्बन्धी चेतावनी तथा सीमा"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"एपको डेटा प्रयोगको चक्र"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"मोबाइल डेटाको प्रयोग"</string>
<string name="set_data_warning" msgid="6628236612886588097">"डेटा खपतको चेतावनी सेट गर्नुहोस्"</string>
<string name="data_warning" msgid="116776633806885370">"डेटाको खपतसम्बन्धी चेतावनी"</string>
<string name="set_data_limit" msgid="7136539812414500084">"डेटाको डेटा खपतको सीमा सेट गरियोस्"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"तपाईंले सेट गर्नुभएको अधिकतम डेटा प्रयोगको सीमामा पुगेपछि तपाईंको सवारी साधनको मुख्य भागले मोबाइल डेटालाई निष्क्रिय पार्ने छ।\n\nतपाईंको सवारी साधनको मुख्य भागले र तपाईंको सेवा प्रदायकले फरक तरिकाले डेटा प्रयोगको मापन गर्ने हुनाले विवेकपूर्ण तरिकाले यसको सीमा सेट गर्ने कुराबारे विचार गर्नुहोस्।"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"डेटा उपयोगसम्बन्धी चेतावनी सेट गर्नुहोस्"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"डेटा खपतको सीमा तोक्नुहोस्"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"तपाईंको डिभाइसले डेटाको प्रयोग मापन गर्छ। यसको दर तपाईंको मोबाइल सेवा प्रदायक कम्पनीको डेटाको दरभन्दा फरक हुन सक्छ।"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"सेट गर्नुहोस्"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"सेभ गर्नुहोस्"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM नेटवर्क"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"सवारी साधनको इन्टरनेट"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"तपाईंले सवारी साधनको इन्टरनेट अफ गर्नुभयो भने सवारी साधनका केही सुविधा वा एपहरूले काम नगर्न सक्छन्।\n\nतपाईंको सवारी साधन सञ्चालन गर्न आवश्यक पर्ने महत्त्वपूर्ण डेटा भने सवारी साधनका निर्मातासँग सेयर भइ नै रहने छ।"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"जे भए पनि अफ गर्नुहोस्"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"सवारी साधनको इन्टरनेट अफ गरिएको छ। यसले गर्दा सवारी साधनका केही सुविधा वा एपहरूले काम नगर्न सक्छन्। तपाईंको सवारी साधन सञ्चालन गर्न आवश्यक पर्ने महत्त्वपूर्ण डेटा भने सवारी साधनका निर्मातासँग सेयर भइ नै रहने छ।"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s देखि %3$s सम्म %1$s प्रयोग भएको छ"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"कुनै अर्को नेटवर्कमा कनेक्ट गर्नुहोस्"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"नेटवर्कसम्बन्धी प्राथमिकताहरू"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"नेटवर्क थप्नुहोस्"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"जडान गर्ने"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"कनेक्ट गरिँदै छ…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"कनेक्ट गरिएको छैन"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"नेटवर्क दायरामा छैन"</string>
<string name="wifi_password" msgid="5565632142720292397">"पासवर्ड"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"पासवर्ड देखाउनुहोस्"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi‑Fi हटस्पटका लागि कम्तीमा एक ब्यान्ड छनौट गर्नुहोस्:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"हटस्पट तथा टेदरिङ"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"हटस्पट"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"अफ छ"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"स्वतः Wi‑Fi हटस्पट अफ गर्नुहोस्"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"कुनै पनि यन्त्र नजोडिँदा Wi‑Fi हटस्पट स्वतः निष्क्रिय हुने छ"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> Wi-Fi सक्रिय गर्न चाहन्छ"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"जबर्जस्ती रोक्नुहोस्"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"जबरजस्ती रोक्ने हो?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"तपाईंले कुनै एपलाई जबरजस्ती रोक्नुभयो भने त्यसले सही तरिकाले काम नगर्न सक्छ।"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"\"कार्यसम्पादन संरक्षण\" अफ गर्ने हो?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"तपाईंले यो सुविधा अफ गर्नुभयो भने तपाईंको सफ्टवेयर र हार्डवेयर पनि नचल्न सक्छ।"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"अन नै छाड्नुहोस्"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"अफ गर्नुहोस्"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"एपको पर्फर्मेन्सलाई प्राथमिकता दिने सुविधा अन गर्ने हो?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"तपाईंले यो सुविधा अन गर्नुभयो भने सिस्टममा अस्थिरता हुने वा यसले लामो समयका लागि हार्डवेयरमा असर गर्ने सम्भावना हुन्छ। तपाईं जारी राख्न चाहनुहुन्छ?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"अँ"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"अहँ, धन्यवाद"</string>
<string name="disable_text" msgid="4358165448648990820">"असक्षम पार्नुहोस्"</string>
<string name="enable_text" msgid="1794971777861881238">"सक्षम पार्नुहोस्"</string>
<string name="uninstall_text" msgid="277907956072833012">"स्थापना रद्द गर्नुहोस्"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"अनुमतिहरू"</string>
<string name="notifications_label" msgid="6586089149665170731">"सूचनाहरू"</string>
<string name="storage_application_label" msgid="5911779903670978586">"भण्डारण र क्यास"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"उच्च कार्यसम्पादन सुनिश्चित गर्नुहोस्"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"एपको पर्फर्मेन्सलाई प्राथमिकता दिनुहोस्"</string>
<string name="application_version_label" msgid="8556889839783311649">"संस्करण: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"कुनै पनि अनुमति प्रदान गरिएको छैन"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"कुनै पनि अनुमतिका लागि अनुरोध गरिएको छैन"</string>
<string name="unused_apps" msgid="648471933781010395">"प्रयोग नगरिएका एपहरू"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">प्रयोग नगरिएका <xliff:g id="COUNT_1">%d</xliff:g> वटा एप</item>
- <item quantity="one">प्रयोग नगरिएको <xliff:g id="COUNT_0">%d</xliff:g> एप</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{प्रयोग नगरिएको # एप}other{प्रयोग नगरिएका # वटा एप}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"अनुमति रद्द गरियोस् र ठाउँ खाली गरियोस्"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s इन्चको आन्तरिक भण्डारण"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"स्रोतको अत्यधिक प्रयोग हुन नदिन आवश्यकताअनुसार एप बन्द गर्नुहोस्"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"एपको पर्फर्मेन्सलाई प्राथमिकता दिन सिस्टमसम्बन्धी स्रोतहरू प्रयोग गर्नुहोस्"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"डेटाको प्रयोग"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"एपले खपत गरेको डेटा"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"प्रयोगको इतिहास"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"सबै एप"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"डेटा तथा Wi-Fi को प्रयोग"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"प्रयोगको इतिहास"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"कुल प्रयोग"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"फोरग्राउन्ड"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ब्याकग्राउन्ड"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"डेटा प्रयोग गर्न दिनुहोस्"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"यो एपलाई मोबाइल डेटा प्रयोग गर्न दिनुहोस्"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"डेटा प्रतिबन्ध गर्नुहोस्"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"एप फोरग्राउन्डमा भएका बेला मात्र मोबाइल डेटा प्रयोग गर्नुहोस्"</string>
<string name="computing_size" msgid="5791407621793083965">"गणना गरिँदै…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> अतिरिक्त अनुमतिहरू</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> अतिरिक्त अनुमति</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# अतिरिक्त अनुमति}other{# वटा अतिरिक्त अनुमति}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"टिपोट: पुनः बुट गरेप्रश्चात तपाईंले आफ्नो सवारी साधन अनलक नगरेसम्म यो एप सुरु हुन सक्दैन।"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"सहायक र आवाज संलग्न इनपुट"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"सहायक एप"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi नियन्त्रकले एपलाई Wi-Fi सक्रिय गर्ने वा निष्क्रिय पार्ने, स्क्यान गरी Wi-Fi नेटवर्कमा जडान गर्ने, नेटवर्कहरू थप्ने वा हटाउने, वा स्थानीय रूपमा मात्र प्रयोग गर्न मिल्ने हटस्पट सुरु गर्ने अनुमति दिन्छ।"</string>
<string name="more_special_access_title" msgid="166115485446645971">"थप"</string>
<string name="location_settings_title" msgid="901334356682423679">"स्थान"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"लोकेसन प्रयोग गरियोस्"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"तपाईंले तोकेका एपहरूलाई लोकेसन प्रयोग गर्न दिइयोस्"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"तपाईंले लोकेसन अफ गर्नुभयो भने कुनै पनि एपले लोकेसन प्रयोग गर्न पाउने छैन। तर चालकलाई अझ सुरक्षित पार्ने एपहरूले भने अझै पनि लोकेसन प्रयोग गर्न पाइरहने छन्।"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"चालकलाई अझ सुरक्षित पार्ने प्रविधि चलाउन लोकेसन प्रयोग गरियोस्"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"सवारी साधनको लोकेसन अफ छ"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"चालकलाई अझ सुरक्षित पार्ने प्रविधिसँग सम्बन्धित एपहरूले तपाईंको लोकेसन प्रयोग गर्न सक्दैनन्"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"परिवर्तन गर्नुहोस्"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"सुरक्षित तरिकाले गाडी चलाउन मद्दत गर्ने एपलाई तपाईंको लोकेसन प्रयोग गर्ने अनुमति दिइयोस्"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"तपाईंले यो प्रविधि अफ गर्नुभयो भने लोकेसनसम्बन्धी जानकारीमा निर्भर हुने चालकलाई अझ सुरक्षित पार्ने प्रविधिसँग सम्बन्धित सुविधाहरू अफ गरिने छन्।"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"जे भए पनि अफ गर्नुहोस्"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"हालका स्थानसम्बन्धी अनुरोधहरू"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"हालसालैका स्थानसम्बन्धी कुनै पनि अनुरोध छैन"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"एप स्तरीय अनुमति"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"लोकेसन सर्भिस"</string>
<string name="location_use_location_title" msgid="117735895374606680">"लोकेसन प्रयोग गरियोस्"</string>
<string name="location_settings_footer" msgid="296892848338100051">"तपाईंको डिभाइसको स्थान अनुमान गर्न लोकेसन सर्भिसले GPS, Wi‑Fi, मोबाइल नेटवर्क र सेन्सरलगायतका स्रोतहरू प्रयोग गर्न सक्छ।"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"चालकलाई अझ सुरक्षित पार्ने प्रविधि"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"चालकलाई अझ सुरक्षित पार्ने प्रविधिसँग सम्बन्धित एपअन्तर्गत पठाइएको लोकेसनसम्बन्धी जानकारीमा तपाईंको पहिचान खुलाउने जानकारी समावेश गरिएको हुँदैन। यो सूचना बढीमा २ दिनसम्म राखिन्छ अनि मेटाइन्छ।"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"माइक्रोफोन"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"माइक्रोफोन प्रयोग गर्नुहोस्"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"सबै एपहरूलाई तपाईंको माइक्रोफोन प्रयोग गर्न दिनुहोस्"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"माइक्रोफोनसम्बन्धी अनुमतिहरू व्यवस्थापन गर्नुहोस्"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"हालसालै प्रयोग गरेको"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"कुनै नयाँ एपहरू छैनन्"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"० एपलाई माइक्रोफोन प्रयोग गर्ने अनुमति दिइएको छ"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count} मध्ये # वटा एपलाई माइक्रोफोन प्रयोग गर्ने अनुमति दिइएको छ}other{{total_count} मध्ये # वटा एपलाई माइक्रोफोन प्रयोग गर्ने अनुमति दिइएको छ}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"हालसालै प्रयोग गरिएको"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"सबै हेर्नुहोस्"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"लोड गरिँदै छ…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"प्रणाली"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"प्रणालीसम्बन्धी अद्यावधिकहरू"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"उन्नत"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"तेस्रो पक्षीय इजाजतपत्रहरू"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"इजाजतपत्रहरू लोड गर्दा समस्या भयो।"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"लोड गर्दै…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">तपाईं अब एउटा विकासकर्ता हुनबाट <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>चरण टाढा हुनुहुन्छ।</item>
- <item quantity="one">तपाईं अब एउटा विकासकर्ता हुनबाट <xliff:g id="STEP_COUNT_0">%1$d</xliff:g>चरण टाढा हुनुहुन्छ।</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{तपाईं अब # चरण पूरा गरेपछि विकासकर्ता बन्नु हुने छ।}other{तपाईं अब # वटा चरण पूरा गरेपछि विकासकर्ता बन्नु हुने छ।}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"तपाईं अब एउटा विकासकर्ता हुनुभएको छ!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"आवश्यक छैन, तपाईं आफैँ नै एउटा विकासकर्ता हुनुहुन्छ।"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"विकासकर्ताका विकल्पहरू"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"तपाईंले नयाँ प्रोफाइल बनाइसकेपछि सम्बन्धित व्यक्तिले उक्त प्रोफाइल आफ्नो आवश्यकता अनुकूल बनाउनु पर्छ।"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"एपहरू अन्य सबै प्रोफाइलमा प्रयोग गर्न सकिने गरी जुनसुकै प्रोफाइलबाट अपडेट गर्न सकिन्छ।"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"योभन्दा बढी प्रोफाइल थप्न मिल्दैन"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">तपाईं बढीमा <xliff:g id="COUNT">%d</xliff:g> वटा प्रोफाइल सिर्जना गर्न सक्नुहुन्छ।</item>
- <item quantity="one">तपाईं एउटा मात्र प्रोफाइल सिर्जना गर्न सक्नुहुन्छ।</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{तपाईं एउटा मात्र प्रोफाइल सिर्जना गर्न सक्नुहुन्छ।}other{तपाईं बढीमा # वटा प्रोफाइल सिर्जना गर्न सक्नुहुन्छ।}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"नयाँ प्रोफाइल सिर्जना गर्न सकिएन"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"यो प्रोफाइल मेटाउने हो?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"यो प्रोफाइलसँग सम्बन्धित सबै एप तथा डेटा मेटाइने छन्"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"प्रोफाइल मेटाउन सकिएन।"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"प्रोफाइल मेटाउन सकिएन। आफ्नो डिभाइस रिस्टार्ट गर्नुहोस् र फेरि प्रयास गर्नुहोस्।"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"तपाईंले प्रोफाइल बदल्दा वा यो सवारी साधन पुनः स्टार्ट गर्दा यो प्रोफाइल मेटाइने छ।"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"खारेज गर्नुहोस्"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"पुनः प्रयास गर्नुहोस्"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"अनलक शैली कोर्ने तरिका"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"प्याटर्न सुरक्षित गर्ने क्रममा त्रुटि भयो"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"अत्यन्तै धेरै गलत प्रयास गरिए। <xliff:g id="NUMBER">%d</xliff:g> सेकेन्डपछि फेरि प्रयास गर्नुहोस्।"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"रोटरी प्रयोग गरी प्याटर्न कोर्न मिल्दैन, कृपया स्क्रिनमा छोएर प्याटर्न कोर्नुहोस्"</string>
<string name="okay" msgid="4589873324439764349">"ठिक छ"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"स्क्रिन लक हटाउने हो?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"यस कार्यले जुनसुकै व्यक्तिलाई तपाईंको खाता प्रयोग गर्न दिने छ"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"तपाईंका सूचना प्रविधि व्यवस्थापकले धेरै प्रयोग हुने PIN हरूको प्रयोगमा रोक लगाउनु भएको छ। कुनै फरक PIN प्रयोग गरी हेर्नुहोस्।"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"यसमा कुनै अमान्य वर्ण समावेश गर्न मिल्दैन।"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"अमान्य पासवर्ड, कम्तीमा ४ वर्णको हुनु पर्छ।"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">कम्तीमा <xliff:g id="COUNT">%d</xliff:g> वटा अक्षरहरू हुनु अनिवार्य छ</item>
- <item quantity="one">कम्तीमा एउटा अक्षर हुनु अनिवार्य छ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">कम्तीमा <xliff:g id="COUNT">%d</xliff:g> वटा लोअरकेसका अक्षरहरू हुनु अनिवार्य छ</item>
- <item quantity="one">कम्तीमा पनि एउटा लोअरकेसको अक्षर हुनु अनिवार्य छ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">कम्तीमा पनि <xliff:g id="COUNT">%d</xliff:g> वटा अपरकेसका अक्षरहरू हुनु अनिवार्य छ</item>
- <item quantity="one">कम्तीमा पनि एउटा अपरकेसको अक्षर हुनु अनिवार्य छ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">कम्तीमा पनि <xliff:g id="COUNT">%d</xliff:g> वटा सङ्ख्यात्मक अङ्कहरू हुनु अनिवार्य छ</item>
- <item quantity="one">कम्तीमा पनि एउटा सङ्ख्यात्मक अङ्क हुनु अनिवार्य छ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">कम्तीमा पनि <xliff:g id="COUNT">%d</xliff:g> वटा विशेष प्रतीकहरू हुनु अनिवार्य छ</item>
- <item quantity="one">कम्तीमा पनि एउटा विशेष प्रतीक हुनु अनिवार्य छ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">कम्तीमा <xliff:g id="COUNT">%d</xliff:g> वटा अक्षरभन्दा भिन्न वर्णहरू हुनु अनिवार्य छ</item>
- <item quantity="one">कम्तीमा पनि एउटा अक्षरभन्दा भिन्न वर्ण हुनु अनिवार्य छ</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"यन्त्रको व्यवस्थापकले पछिल्लो पासवर्ड प्रयोग गर्ने अनुमति दिँदैन"</string>
<string name="error_saving_password" msgid="8334882262622500658">"पासवर्ड सुरक्षित गर्ने क्रममा त्रुटि भयो"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"तपाईंका सूचना प्रविधि व्यवस्थापकले धेरै प्रयोग हुने पासवर्डहरूको प्रयोगमा रोक लगाउनु भएको छ। कुनै फरक पासवर्ड प्रयोग गरी हेर्नुहोस्।"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"कुनै प्रोफाइल थप्नुहोस्"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"यो प्रोफाइल मेटाउनुहोस्"</string>
<string name="add_profile_text" msgid="9118410102199116969">"प्रोफाइल थप्नुहोस्"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"डिस्प्लेको चमक"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"आफ्ना डिभाइस हेर्न ब्लुटुथ अन गर्नुहोस्"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"डिभाइस कनेक्ट गर्न ब्लुटुथ सेटिङ खोल्नुहोस्"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"इन्फोटेनमेन्ट प्रणालीका एड्मिन"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"एक्टिभेट गरिएका एपहरू"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"डिएक्टिभेट गरिएका एपहरू"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"यो अनुमति प्राप्त एपहरूले यस सवारी साधनको डेटा हेर्न सक्छन्"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"सवारी साधनका एड्मिनका लागि कुनै पनि एप बनाइएको छैन"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"इन्फोटेनमेन्ट प्रणालीका एड्मिनले चलाउने यो एप सक्रिय छ। यसले <xliff:g id="APP_NAME">%1$s</xliff:g> एपलाई निम्न कार्यहरू गर्न दिन्छ:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"तपाईंले इन्फोटेनमेन्ट प्रणालीको यो एप एक्टिभेट गर्नुभयो भने <xliff:g id="APP_NAME">%1$s</xliff:g> ले निम्न कार्यहरू गर्न सक्ने छ:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"इन्फोटेनमेन्ट प्रणालीको यो एप एक्टिभेट गर्ने हो?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"इन्फोटेनमेन्ट प्रणालीको यो एप एक्टिभेट गर्नुहोस्"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"डिएक्टिभेट गर्नुहोस् र अनइन्स्टल गर्नुहोस्"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"इन्फोटेनमेन्ट प्रणालीको यो एप डिएक्टिभेट गर्नुहोस्"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"थप विवरणहरू"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"सङ्गठनका प्रबन्धक सम्बन्धित सेटिङ, अनुमति, संस्थागत पहुँच, नेटवर्कसम्बन्धी क्रियाकलाप र सवारी साधनको लोकेसनसम्बन्धी जानकारीसहित यो प्रोफाइलसँग सम्बन्धित एप र डेटाको निरीक्षण तथा व्यवस्थापन गर्न सक्छन्।"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"सङ्गठनका प्रबन्धक सम्बन्धित सेटिङ, अनुमति, संस्थागत पहुँच, नेटवर्कसम्बन्धी क्रियाकलाप र यो डिभाइसको लोकेसनसम्बन्धी जानकारीसहित यो प्रोफाइलसँग सम्बन्धित एप र डेटाको निरीक्षण तथा व्यवस्थापन गर्न सक्छन्।"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"सङ्गठनका प्रबन्धक सम्बन्धित सेटिङ, अनुमति, संस्थागत पहुँच, नेटवर्कसम्बन्धी क्रियाकलाप र सवारी साधनको लोकेसनसम्बन्धी जानकारीसहित यो इन्फोटेनमेन्ट प्रणालीसँग सम्बन्धित एप र डेटाको निरीक्षण तथा व्यवस्थापन गर्न सक्छन्।"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"सङ्गठनका प्रबन्धक यो इन्फोटेनमेन्ट प्रणालीसँग सम्बन्धित डेटा हेर्न तथा प्रयोग गर्न, एपहरू व्यवस्थापन गर्न र यो सवारी साधनका सेटिङ परिवर्तन गर्न सक्छन्।"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"तपाईं यो सेटिङ खोल्न सक्नुहुन्न"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"व्यवस्थापन गरिएको यो सवारी साधनमा भोल्युम घटबढ गर्न सकिँदैन"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"व्यवस्थापन गरिएको यो सवारी साधनबाट कल गर्न मिल्दैन"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"व्यवस्थापन गरिएको यो सवारी साधनबाट SMS पठाउन मिल्दैन"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"व्यवस्थापन गरिएको यो सवारी साधनमा क्यामेरा उपलब्ध छैन"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"व्यवस्थापन गरिएको यो सवारी साधनमा स्क्रिनसट लिन मिल्दैन"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"व्यवस्थापन गरिएको यो सवारी साधनमा यो एप खोल्न मिल्दैन"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"तपाईंको ऋणदाता कम्पनीले ब्लक गरेको छ"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"सङ्गठनले केही सुविधाहरू प्रयोग गर्न नमिल्ने बनाएको छ।\n\nतपाईंसँग कुनै प्रश्न छ भने सङ्गठनका प्रबन्धकसँग सम्पर्क गर्नुहोस्।"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"सवारी साधनका एड्मिनका लागि बनाइएका एप"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# एक्टिभेट गरिएको एप}other{# वटा एक्टिभेट गरिएका एप}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"एक्टिभेट गरिएका कुनै पनि एप छैन"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को सवार साधनसम्बन्धी नीति"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"सङ्गठनका प्रबन्धकले व्यवस्थापन गर्ने सेटिङ"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> का बारेमा थप जान्नुहोस्"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"बग रिपोर्ट सेयर गर्ने हो?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"यो सवारी साधनको सङ्गठनका प्रबन्धकले यो डिभाइसको समस्या निवारण गर्न सघाउ पुगोस् भन्नाका खातिर एउटा त्रुटिको रिपोर्ट सेयर गर्न अनुरोध गर्नुभएको छ। डिभाइसमा भएका एप तथा डेटा सेयर गरिन सक्छन्।"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"यो सवारी साधनको सङ्गठनका प्रबन्धकले यो डिभाइसको समस्या निवारण गर्न सघाउ पुगोस् भन्नाका खातिर एउटा त्रुटिको रिपोर्ट सेयर गर्न अनुरोध गर्नुभएको छ। डिभाइसमा भएका एप तथा डेटा सेयर गरिन सक्छन् र तपाईंको डिभाइस केही समयका लागि सुस्त चल्न सक्छ।"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"यो त्रुटिको रिपोर्ट यस सवारी साधनको सङ्गठनका प्रबन्धकसँग सेयर गरिँदै छ। यस सम्बन्धमा थप विवरणका लागि उहाँसँग सम्पर्क गर्नुहोस्।"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"सेयर गर्नुहोस्"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"अस्वीकार गर्नुहोस्"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"यो सेटिङ अहिले नै परिवर्तन गर्न मिल्दैन"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"सर्वसुलभता"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"क्याप्सनहरू"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"क्याप्सनसम्बन्धी प्राथमिकताहरू"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"अफ छ"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"अन छ"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"स्क्रिन रिडर"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"क्याप्सनहरू देखाइयोस्"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"टेक्स्टको आकार"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"क्याप्सनको आकार र शैली"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"ज्यादै सानो"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"सानो"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"डिफल्ट"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ठुलो"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ज्यादै ठुलो"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"क्याप्सनको शैली"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"एपअनुसार सेट गर्नुहोस्"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"कालो ब्याकग्राउन्डमा सेतो टेक्स्ट"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"सेतो ब्याकग्राउन्डमा कालो टेक्स्ट"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"कालो ब्याकग्राउन्डमा पहेँलो टेक्स्ट"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"नीलो ब्याकग्राउन्डमा पहेँलो टेक्स्ट"</string>
</resources>
diff --git a/res/values-nl/arrays.xml b/res/values-nl/arrays.xml
index 372331c..920144e 100644
--- a/res/values-nl/arrays.xml
+++ b/res/values-nl/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nooit toestaan"</item>
<item msgid="1154273129608299386">"Altijd toestaan"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 1eb3a8a..47b3e62 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Nachtstand"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Netwerk en internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobiel netwerk"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> simkaarten</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> simkaart</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# simkaart}other{# simkaarten}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Actief/simkaart"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactief/simkaart"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Actief, gedownloade simkaart"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Meer toevoegen"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiele data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Datatoegang via mobiel netwerk"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobiel netwerk"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Mobiele data gebruiken"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobiele data uitzetten?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Selectie vereist"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"<xliff:g id="CARRIER">%1$s</xliff:g> gebruiken voor mobiele data?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> datawaarschuwing"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> datalimiet"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> datawaarschuwing/<xliff:g id="ID_2">^2</xliff:g> datalimiet"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Nog %d dagen</item>
- <item quantity="one">Nog %d dag</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Nog # dag}other{Nog # dagen}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Geen tijd resterend"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Minder dan 1 dag over"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> geleden geüpdatet door <xliff:g id="ID_1">^1</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Instellen"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Datawaarschuwing- en limiet"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Gebruikscyclus app-data"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Gebruik van mobiele data"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Datawaarschuwing instellen"</string>
<string name="data_warning" msgid="116776633806885370">"Datawaarschuwing"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Datalimiet instellen"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"De hoofdeenheid van je voertuig schakelt mobiele data uit zodra je de ingestelde limiet bereikt.\n\nAangezien het datagebruik wordt gemeten door de hoofdeenheid, en je provider tot een ander totaal kan komen, kun je het beste een voorzichtige limiet instellen."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Waarschuwing voor datagebruik instellen"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Limiet voor datagebruik instellen"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Het datagebruik wordt gemeten door je apparaat. Dit kan verschillen van de data die je mobiele provider meet."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Instellen"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Opslaan"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-netwerk"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet van voertuig"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Als je het internet van het voertuig uitzet, werken sommige voertuigfuncties of -apps misschien niet meer.\n\nBelangrijke gegevens voor de bediening van je voertuig worden nog steeds met de voertuigfabrikant gedeeld."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Toch uitzetten"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Het internet van je voertuig is uitgezet. Hierdoor werken sommige voertuigfuncties of -apps misschien niet meer. Belangrijke gegevens die nodig zijn voor de bediening van je voertuig worden nog steeds met de voertuigfabrikant gedeeld."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s gebruikt in de periode %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Verbinding met ander netwerk maken"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Netwerkvoorkeuren"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Netwerk toevoegen"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Verbinden…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Niet verbonden"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Netwerk is niet binnen bereik"</string>
<string name="wifi_password" msgid="5565632142720292397">"Wachtwoord"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Wachtwoord tonen"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Kies minimaal één band voor wifi-hotspot:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot en tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Uit"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Hotspot automatisch uitzetten"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wifi-hotspot wordt uitgezet als er geen apparaten verbonden zijn"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> wil wifi aanzetten"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Gedwongen stoppen"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Gedwongen stoppen?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Als je een app gedwongen stopt, kan deze onverwacht gedrag vertonen."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Prestatiebescherming uitzetten?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Als je dit doet, werken je software en hardware misschien minder goed."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Aan laten staan"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Uitzetten"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"App-prestaties prioriteren aanzetten?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Als je deze instelling aanzet, kan dit potentiële instabiliteit van het systeem veroorzaken of langdurige impact op de hardware hebben. Wil je doorgaan?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ja"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nee, bedankt"</string>
<string name="disable_text" msgid="4358165448648990820">"Uitzetten"</string>
<string name="enable_text" msgid="1794971777861881238">"Aanzetten"</string>
<string name="uninstall_text" msgid="277907956072833012">"Verwijderen"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Rechten"</string>
<string name="notifications_label" msgid="6586089149665170731">"Meldingen"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Opslag en cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Topprestaties garanderen"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"App-prestaties prioriteren"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versie: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Geen rechten verleend"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Geen rechten aangevraagd"</string>
<string name="unused_apps" msgid="648471933781010395">"Niet-gebruikte apps"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> niet-gebruikte apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> niet-gebruikte app</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# niet-gebruikte app}other{# niet-gebruikte apps}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Rechten intrekken en ruimte vrijmaken"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s in interne opslag"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Waar nodig de app sluiten om overmatig energiegebruik te voorkomen"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Gebruikt systeembronnen om de app-prestaties te prioriteren"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Datagebruik"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Gegevensgebruik van app"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Gebruiksgeschiedenis"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Alle apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data- en wifi-gebruik"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Gebruiksgeschiedenis"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Totaal gebruik"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Voorgrond"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Achtergrond"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Data toestaan"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Deze app mobiele data laten gebruiken"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Data beperken"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Alleen mobiele data gebruiken bij app op voorgrond"</string>
<string name="computing_size" msgid="5791407621793083965">"Berekenen…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aanvullende rechten</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aanvullend recht</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# aanvullend recht}other{# aanvullende rechten}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Opmerking: Na opnieuw opstarten kan deze app pas worden gestart nadat je je voertuig hebt ontgrendeld."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"De Assistent en spraakinvoer"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"App voor assistentie"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Met \'Wifi-beheer\' kun je een app toestaan om wifi aan of uit te zetten, wifi-netwerken te scannen en er verbinding mee te maken, netwerken toe te voegen of te verwijderen of een hotspot \'Alleen lokaal\' te starten."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Meer"</string>
<string name="location_settings_title" msgid="901334356682423679">"Locatie"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Locatie gebruiken"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Apps die je opgeeft toegang tot je locatie geven"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Als je dit uitzet, wordt locatietoegang verwijderd voor alle apps. Apps voor bestuurdersondersteuning hebben nog wel toegang."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Locatie gebruiken voor bestuurdersondersteuning"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Voertuiglocatie staat uit"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Apps voor bestuurdersondersteuning hebben geen toegang tot je locatie"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Wijzigen"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Apps die helpen bij het rijden toegang tot je locatie geven"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Als je dit uitzet, gaan functies voor bestuurdersondersteuning die locatie-informatie nodig hebben ook uit."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Toch uitzetten"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recente locatieverzoeken"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Geen recente locatieverzoeken"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Rechten op app-niveau"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Locatieservices"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Locatie gebruiken"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Voor de schatting van je apparaatlocatie kunnen bronnen worden gebruikt zoals gps, wifi, mobiele netwerken en sensoren."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Bestuurdersondersteuning"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Locatie-informatie die naar apps voor bestuurdersondersteuning wordt gestuurd, bevat geen informatie waarmee je kunt worden geïdentificeerd. De informatie wordt maximaal 2 dagen opgeslagen en daarna verwijderd."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microfoon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Microfoon gebruiken"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Alle apps toegang tot je microfoon geven"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Microfoonrechten beheren"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Recent gebruikt"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Geen recente apps"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apps hebben toegang"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# van {total_count} apps heeft toegang}other{# van {total_count} apps hebben toegang}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Recent gebruikt"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Alles bekijken"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Laden…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Systeem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Systeemupdates"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Geavanceerd"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licenties van derden"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Er is een probleem bij het laden van de licenties."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Laden…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Je moet nog <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> stappen uitvoeren om ontwikkelaar te worden.</item>
- <item quantity="one">Je moet nog <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> stap uitvoeren om ontwikkelaar te worden.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Je moet nog # stap uitvoeren om ontwikkelaar te worden.}other{Je moet nog # stappen uitvoeren om ontwikkelaar te worden.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Je bent nu ontwikkelaar!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Niet nodig, je bent al ontwikkelaar."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Ontwikkelaarsopties"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Nadat je een nieuw profiel hebt gemaakt, kan die persoon het zelf personaliseren."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Apps kunnen vanuit elk profiel worden geüpdatet voor gebruik door alle andere profielen."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Maximaal aantal profielen bereikt"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Je kunt maximaal <xliff:g id="COUNT">%d</xliff:g> profielen maken.</item>
- <item quantity="one">Je kunt maar één profiel maken.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Je kunt maar één profiel maken.}other{Je kunt maximaal # profielen maken.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Kan nieuw profiel niet maken"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Dit profiel verwijderen?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Alle apps en gegevens voor dit profiel worden verwijderd"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Kan profiel niet verwijderen."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profiel is niet verwijderd. Start het apparaat opnieuw op en probeer het opnieuw."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Dit profiel wordt verwijderd als je van profiel wisselt of het voertuig opnieuw start."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Sluiten"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Opnieuw proberen"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Ontgrendelingspatroon tekenen"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Fout bij patroon opslaan"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Te veel onjuiste pogingen. Probeer het over <xliff:g id="NUMBER">%d</xliff:g> seconden opnieuw."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Patroon ondersteunt geen draaien, gebruik tikken"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Schermvergrendeling verwijderen?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Zo kan iedereen toegang tot je account krijgen"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Veelvoorkomende pincodes worden geblokkeerd door je IT-beheerder. Probeer een andere pincode."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Mag geen ongeldig teken bevatten"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Wachtwoord ongeldig. Moet ten minste vier tekens zijn."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Moet ten minste <xliff:g id="COUNT">%d</xliff:g> letters bevatten</item>
- <item quantity="one">Moet ten minste één letter bevatten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Moet ten minste <xliff:g id="COUNT">%d</xliff:g> kleine letters bevatten</item>
- <item quantity="one">Moet ten minste één kleine letter bevatten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Moet ten minste <xliff:g id="COUNT">%d</xliff:g> hoofdletters bevatten</item>
- <item quantity="one">Moet ten minste één hoofdletter bevatten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Moet ten minste <xliff:g id="COUNT">%d</xliff:g> cijfers bevatten</item>
- <item quantity="one">Moet ten minste één cijfer bevatten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Moet ten minste <xliff:g id="COUNT">%d</xliff:g> speciale symbolen bevatten</item>
- <item quantity="one">Moet ten minste één speciaal symbool bevatten</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Moet ten minste <xliff:g id="COUNT">%d</xliff:g> tekens bevatten die geen letters zijn</item>
- <item quantity="one">Moet ten minste één teken bevatten dat geen letter is</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Apparaatbeheer staat het gebruik van een recent wachtwoord niet toe"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Fout bij wachtwoord opslaan"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Veelvoorkomende wachtwoorden worden geblokkeerd door je IT-beheerder. Probeer een ander wachtwoord."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Profiel toevoegen"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Dit profiel verwijderen"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Profiel toevoegen"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Helderheid van het scherm"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Zet bluetooth aan als je je apparaten wilt zien"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Open de bluetooth-instellingen om een apparaat te koppelen"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Beheer van infotainmentsysteem"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Geactiveerde apps"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Gedeactiveerde apps"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Apps met dit recht hebben toegang tot de gegevens van dit voertuig"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Geen beheer-apps voor voertuigen"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Deze beheer-app voor het infotainmentsysteem is actief en staat toe dat de app <xliff:g id="APP_NAME">%1$s</xliff:g> de volgende bewerkingen uitvoert:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Als je deze beheer-app voor het infotainmentsysteem activeert, sta je de app <xliff:g id="APP_NAME">%1$s</xliff:g> toe de volgende bewerkingen uit te voeren:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Deze infotainmentsysteem-app activeren?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Deze infotainmentsysteem-app activeren"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deactiveren en verwijderen"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deze infotainmentsysteem-app deactiveren"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Meer informatie"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"De organisatiebeheerder kan apps en gegevens monitoren en beheren die aan dit profiel zijn gekoppeld, waaronder instellingen, rechten, zakelijke toegang, netwerkactiviteit en locatiegegevens van het voertuig."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"De organisatiebeheerder kan apps en gegevens monitoren en beheren die aan dit profiel zijn gekoppeld, waaronder instellingen, rechten, zakelijke toegang, netwerkactiviteit en locatiegegevens van het apparaat."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"De organisatiebeheerder kan apps en gegevens monitoren en beheren die aan dit infotainmentsysteem zijn gekoppeld, waaronder instellingen, rechten, zakelijke toegang, netwerkactiviteit en locatiegegevens van het voertuig."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"De organisatiebeheerder kan misschien toegang krijgen tot gegevens die aan dit infotainmentsysteem zijn gekoppeld, apps beheren en de instellingen van dit voertuig wijzigen."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Die instelling is niet beschikbaar"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Kan volume niet wijzigen in dit beheerde voertuig"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Kan niet bellen in dit beheerde voertuig"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Sms niet toegestaan in dit beheerde voertuig"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Camera is niet beschikbaar in dit beheerde voertuig"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Kan geen screenshots maken in dit beheerde voertuig"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Kan deze app niet openen in dit beheerde voertuig"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Geblokkeerd door je kredietverstrekker"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Toegang tot bepaalde functies is beperkt door de organisatie.\n\nAls je vragen hebt, neem je contact op met de beheerder van de organisatie."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Beheer-apps voor voertuig"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# geactiveerde app}other{# geactiveerde apps}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Geen geactiveerde apps"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Voertuigbeleid van <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Instellingen beheerd door de organisatiebeheerder"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Meer informatie over <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Bugrapport delen?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"De organisatiebeheerder van dit voertuig heeft een bugrapport aangevraagd om problemen met dit apparaat op te lossen. Apps en gegevens kunnen worden gedeeld."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"De organisatiebeheerder van dit voertuig heeft een bugrapport aangevraagd om problemen met dit apparaat op te lossen. Apps en gegevens kunnen worden gedeeld. Dit kan je apparaat tijdelijk vertragen."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Dit bugrapport wordt gedeeld met de organisatiebeheerder van dit voertuig. Neem contact op met de beheerder voor meer informatie."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Delen"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Weigeren"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Deze instelling kan nu niet worden gewijzigd"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Toegankelijkheid"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Ondertiteling"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Voorkeuren voor ondertiteling"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Uit"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Aan"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Schermlezer"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Ondertiteling tonen"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Tekstgrootte"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Grootte en stijl van ondertiteling"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Zeer klein"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Klein"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Standaard"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Groot"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Zeer groot"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Ondertitelstijl"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Ingesteld door app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Wit op zwart"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Zwart op wit"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Geel op zwart"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Geel op blauw"</string>
</resources>
diff --git a/res/values-or/arrays.xml b/res/values-or/arrays.xml
index ec65b14..1d6b5c9 100644
--- a/res/values-or/arrays.xml
+++ b/res/values-or/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"ଆଦୌ ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ"</item>
<item msgid="1154273129608299386">"ସର୍ବଦା ଅନୁମତି ଦିଅନ୍ତୁ"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 30eef91..1427449 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"ନାଇଟ୍ ମୋଡ୍"</string>
<string name="network_and_internet" msgid="4229023630498537530">"ନେଟ୍ୱର୍କ ଓ ଇର୍ଣ୍ଟନେଟ୍"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"ମୋବାଇଲ୍ ନେଟ୍ୱର୍କ"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>ଟି SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>ଟି SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{#ଟି SIM}other{#ଟି SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"ସକ୍ରିୟ / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"ନିଷ୍କ୍ରିୟ / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"ସକ୍ରିୟ / ଡାଉନଲୋଡ୍ କରଯାଇଥିବା SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"ଅଧିକ ଯୋଗ କରନ୍ତୁ"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"ମୋବାଇଲ୍ ଡାଟା"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ମୋବାଇଲ୍ ନେଟ୍ୱର୍କକୁ ବ୍ୟବହାରକରି ଡାଟା ଆକ୍ସେସ୍ କରନ୍ତୁ"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"ମୋବାଇଲ ନେଟୱାର୍କ"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"ମୋବାଇଲ ଡାଟା ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"ମୋବାଇଲ୍ ଡାଟା ବନ୍ଦ କରିବେ?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"ଆବଶ୍ୟକୀୟ ମନୋନୟନ"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"ମୋବାଇଲ୍ ଡାଟା ପାଇଁ <xliff:g id="CARRIER">%1$s</xliff:g> ବ୍ୟବହାର କରିନ୍ତୁ?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g>ର ଡାଟା ସମ୍ପର୍କିତ ଚେତାବନୀ"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g>ର ଡାଟା ସୀମା"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g>ର ଡାଟା ସମ୍ପର୍କିତ ଚେତାବନୀ / <xliff:g id="ID_2">^2</xliff:g>ର ଡାଟା ସୀମା"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d ଦିନ ବାକି ଅଛି</item>
- <item quantity="one">%d ଦିନ ବାକି ଅଛି</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# ଦିନ ବାକି ଅଛି}other{# ଦିନ ବାକି ଅଛି}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"ବିଲିଂ ସମୟ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 ଦିନରୁ କମ୍ ସମୟ ବାକି ଅଛି"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> ପୂର୍ବରୁ <xliff:g id="ID_1">^1</xliff:g> ଦ୍ଵାରା ଅପଡେଟ୍ ହୋଇଛି"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"ସେଟ୍ କରନ୍ତୁ"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ଡାଟା ଚେତାବନୀ ଓ ସୀମା"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"ଆପ୍ ଡାଟା ବ୍ୟବହାର ଚକ୍ର"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"ମୋବାଇଲ ଡାଟା ବ୍ୟବହାର"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ଡାଟା ଚେତାବନୀ ସେଟ୍ କରନ୍ତୁ"</string>
<string name="data_warning" msgid="116776633806885370">"ଡାଟା ଚେତାବନୀ"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ଡାଟା ସୀମା ସେଟ୍ କରନ୍ତୁ"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ଡାଟାର ବ୍ୟବହାର ଆପଣ ସେଟ୍ କରିଥିବା ସୀମାରେ ପହଞ୍ଚିଗଲେ, ଆପଣଙ୍କ ବାହାନର ହେଡ୍ ୟୁନିଟ୍ ମୋବାଇଲ୍ ଡାଟାକୁ ବନ୍ଦ କରିଦେବ।\n\nଯେହେତୁ ବାହାନର ହେଡ୍ ୟୁନିଟ୍ ଡାଟା ବ୍ୟବହାରର ହିସାବ ରଖିଥାଏ ଏବଂ ଆପଣଙ୍କ ବାହାକ ଦ୍ୱାରା ରଖାଯାଇଥିବା ହିସାବ ସାମାନ୍ୟ ଭିନ୍ନ ହୋଇପାରେ, ତେଣୁ ମୋବାଇଲ୍ ଡାଟାର ବ୍ୟବହାର କମ୍ ହେବ, ଏକ ରକ୍ଷଣଶୀଳ ସୀମା ସେଟିଂ କରନ୍ତୁ।"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ଡାଟା ବ୍ୟବହାର ଚେତାବନୀ ସେଟ୍ କରନ୍ତୁ"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ଡାଟା ବ୍ୟବହାରର ସୀମା ସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"ଡାଟା ବ୍ୟବହାର ଆପଣଙ୍କ ଡିଭାଇସ ଦ୍ୱାରା ମାପ କରାଯାଏ। ଏହା ଆପଣଙ୍କ ମୋବାଇଲ କ୍ୟାରିଅରର ଡାଟାଠାରୁ ଭିନ୍ନ ହୋଇପାରେ।"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"ସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"ସେଭ କରନ୍ତୁ"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM ନେଟୱାର୍କ"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"ଗାଡ଼ିର ଇଣ୍ଟରନେଟ"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"ଗାଡ଼ିର ଇଣ୍ଟରନେଟ ବନ୍ଦ କରିବା ଗାଡ଼ିର କିଛି ଫିଚର କିମ୍ବା ଆପଗୁଡ଼ିକୁ କାମ କରିବାରୁ ପ୍ରତିରୋଧ କରିପାରେ।\n\nଆପଣଙ୍କ ଗାଡ଼ି ଚଲାଇବା ପାଇଁ ଆବଶ୍ୟକ ହେଉଥିବା ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଡାଟା ଗାଡ଼ିର ନିର୍ମାତାଙ୍କ ସହ ସେୟାର କରାଯିବା ଜାରି ରହିବ।"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"ଯେ କୌଣସି ଉପାୟରେ ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"ଗାଡ଼ିର ଇଣ୍ଟରନେଟକୁ ବନ୍ଦ କରାଯାଇଛି। ଏହା ଗାଡ଼ିର କିଛି ଫିଚର କିମ୍ବା ଆପଗୁଡ଼ିକୁ କାମ କରିବାରୁ ପ୍ରତିରୋଧ କରିପାରେ। ଆପଣଙ୍କ ଗାଡ଼ି ଚଲାଇବା ପାଇଁ ଆବଶ୍ୟକ ହେଉଥିବା ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଡାଟା ଗାଡ଼ିର ନିର୍ମାତାଙ୍କ ସହ ସେୟାର କରାଯିବା ଜାରି ରହିବ।"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s ଭିତରେ %1$s ବ୍ୟବହାର କରାଯାଇଛି"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"ଅନ୍ୟ ନେଟୱାର୍କରେ ଯୋଗ ଦିଅନ୍ତୁ"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"ନେଟୱାର୍କ ପସନ୍ଦଗୁଡ଼ିକ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"ନେଟ୍ୱର୍କ ଯୋଗ କରନ୍ତୁ"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"ସଂଯୋଗ"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"ସଂଯୋଗ କରାଯାଉଛି…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"ସଂଯୋଗ ହୋଇନାହିଁ"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"ନେଟୱାର୍କ ରେଞ୍ଜ ମଧ୍ୟରେ ନାହିଁ"</string>
<string name="wifi_password" msgid="5565632142720292397">"ପାସୱର୍ଡ"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"ପାସୱାର୍ଡ ଦେଖାନ୍ତୁ"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"ୱାଇ-ଫାଇ ହଟ୍ସ୍ପଟ୍ ପାଇଁ ଅତିକମ୍ରେ ଗୋଟିଏ ବ୍ୟାଣ୍ଡ୍ ବାଛନ୍ତୁ:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ହଟ୍ସ୍ପଟ୍ ଏବଂ ଟିଥରିଂ"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ହଟସ୍ପଟ୍"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ବନ୍ଦ ଅଛି"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"ସ୍ୱଚାଳିତ ଭାବେ ହଟ୍ସ୍ପଟ୍ ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"ଯଦି କୌଣସି ଡିଭାଇସ୍ ସଂଯୋଗ ନଥାଏ, ତେବେ ୱାଇ-ଫାଇ ହଟ୍ସ୍ପଟ୍ ବନ୍ଦ ହୋଇଯିବ"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ୱାଇ-ଫାଇ ଚାଲୁ କରିବାକୁ ଚାହୁଁଛନ୍ତି"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"ବାଧ୍ୟତାର ସହ ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"ବାଧ୍ୟତାର ସହ ବନ୍ଦ କରିବେ?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"ଯଦି ଆପଣ ଏକ ଆପ୍ ବାଧ୍ୟତାର ସହ ବନ୍ଦ କରନ୍ତି, ତେବେ ଏହା ଅସ୍ୱାଭାବିକ ବ୍ୟବହାର କରିପାରେ।"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"ପରଫରମାନ୍ସର ସୁରକ୍ଷା ବନ୍ଦ କରିବେ?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"ଯଦି ଆପଣ ଏହା କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ସଫ୍ଟୱେର୍ ଏବଂ ହାର୍ଡୱେର୍ ମଧ୍ୟ କାମ କରିନପାରେ।"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ଚାଲୁ ରଖନ୍ତୁ"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"\"ଆପ ପରଫରମାନ୍ସକୁ ପ୍ରାଥମିକତା\" ଚାଲୁ କରିବେ?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"ଏହାକୁ ଚାଲୁ କରିବା ଦ୍ୱାରା ସମ୍ଭାବ୍ୟ ସିଷ୍ଟମ ଅସ୍ଥିରତା ସୃଷ୍ଟି ହୋଇପାରେ କିମ୍ବା ହାର୍ଡୱେର ଉପରେ ଦୀର୍ଘ-କାଳୀନ ପ୍ରଭାବ ପଡ଼ିପାରେ। ଆପଣ ଜାରି ରଖିବାକୁ ଚାହୁଁଛନ୍ତି କି?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"ହଁ"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"ନା, ଧନ୍ୟବାଦ"</string>
<string name="disable_text" msgid="4358165448648990820">"ଅକ୍ଷମ"</string>
<string name="enable_text" msgid="1794971777861881238">"ସକ୍ଷମ"</string>
<string name="uninstall_text" msgid="277907956072833012">"ଅନ୍ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"ଅନୁମତିଗୁଡ଼ିକ"</string>
<string name="notifications_label" msgid="6586089149665170731">"ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</string>
<string name="storage_application_label" msgid="5911779903670978586">"ଷ୍ଟୋରେଜ୍ & କେଚ୍"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"ସର୍ବୋତ୍ତମ ପରଫରମାନ୍ସକୁ ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ଆପ ପରଫରମାନ୍ସକୁ ପ୍ରାଥମିକତା ଦିଅନ୍ତୁ"</string>
<string name="application_version_label" msgid="8556889839783311649">"ଭର୍ସନ୍: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"କୌଣସି ଅନୁମତି ଦିଆଯାଇ ନାହିଁ"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"କୌଣସି ଅନୁମତିର ଅନୁରୋଧ କରାଯାଇ ନାହିଁ"</string>
<string name="unused_apps" msgid="648471933781010395">"ଅବ୍ୟବହୃତ ଆପଗୁଡ଼ିକ"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ଟି ଅବ୍ୟବହୃତ ଆପ୍</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ଟି ଅବ୍ୟବହୃତ ଆପ୍</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{#ଟି ଅବ୍ୟବହୃତ ଆପ}other{#ଟି ଅବ୍ୟବହୃତ ଆପ}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ସ୍ପେସ୍ ଖାଲି କରନ୍ତୁ"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"ଇଣ୍ଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍ରେ %s ଅଛି"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"ରିସୋର୍ସଗୁଡ଼ିକର ଅତ୍ୟଧିକ ବ୍ୟବହାରକୁ ଏଡ଼ାଇବା ପାଇଁ, ଆବଶ୍ୟକ ହେଲେ ଆପ୍ ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ଆପ ପରଫରମାନ୍ସକୁ ପ୍ରାଥମିକତା ଦେବା ପାଇଁ ସିଷ୍ଟମ ରିସୋର୍ସଗୁଡ଼ିକୁ ବ୍ୟବହାର କରେ"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ଡାଟାର ବ୍ୟବହାର"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ଆପ୍ ଦ୍ୱାରା ଡାଟା ବ୍ୟବହାର"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"ବ୍ୟବହାରର ଇତିହାସ"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"ସବୁ ଆପ"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ଡାଟା ଏବଂ ୱାଇ-ଫାଇ ବ୍ୟବହାର"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"ବ୍ୟବହାରର ଇତିହାସ"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"ମୋଟ ବ୍ୟବହାର"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ଫୋରଗ୍ରାଉଣ୍ଡ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ପୃଷ୍ଠପଟ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ଡାଟା ବ୍ୟବହାର କରିବାକୁ ଦିଅ"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"ଏହି ଆପକୁ ମୋବାଇଲ ଡାଟା ବ୍ୟବହାର କରିବାକୁ ଦିଅନ୍ତୁ"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ଡାଟାକୁ ପ୍ରତିବନ୍ଧିତ କରନ୍ତୁ"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ଆପ ଫୋରଗ୍ରାଉଣ୍ଡରେ ଥିବା ବେଳେ ମୋବାଇଲ ଡାଟା ବ୍ୟବହାର କର"</string>
<string name="computing_size" msgid="5791407621793083965">"ଗଣୁଛି…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ଟି ଅତିରିକ୍ତ ଅନୁମତି</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ଟି ଅତିରିକ୍ତ ଅନୁମତି</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{#ଟି ଅତିରିକ୍ତ ଅନୁମତି}other{#ଟି ଅତିରିକ୍ତ ଅନୁମତି}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"ଟିପ୍ପଣୀ: ରିବୁଟ୍ କରିବା ପରେ, ଯେପର୍ଯ୍ୟନ୍ତ ଆପଣ ଆପଣଙ୍କର ବାହାନକୁ ଅନଲକ୍ ନକରିଛନ୍ତି, ସେପର୍ଯ୍ୟନ୍ତ ଏହି ଆପ୍ ଆରମ୍ଭ ହୋଇପାରିବ ନାହିଁ।"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ଆସିଷ୍ଟାଣ୍ଟ ଓ ଭଏସ୍ ଇନପୁଟ୍"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"ସହାୟକ ଆପ୍"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"ୱାଇ-ଫାଇ ନିୟନ୍ତ୍ରଣ କୌଣସି ଆପ୍କୁ ୱାଇ-ଫାଇ ଚାଲୁ କରିବା କିମ୍ବା ବନ୍ଦ କରିବା, ସ୍କାନ୍ କରି ୱାଇ-ଫାଇ ନେଟ୍ୱାର୍କ ସହ ସଂଯୋଗ କରିବା, ନେଟ୍ୱାର୍କଗୁଡ଼ିକୁ ଯୋଗ କରିବା କିମ୍ବା କାଢ଼ି ଦେବା କିମ୍ବା କେବଳ ଏକ ସ୍ଥାନୀୟ ହଟ୍ସ୍ପଟ୍ ଆରମ୍ଭ କରିବାକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="more_special_access_title" msgid="166115485446645971">"ଅଧିକ"</string>
<string name="location_settings_title" msgid="901334356682423679">"ଲୋକେସନ୍"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"ଲୋକେସନ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"ଲୋକେସନ ସୂଚନା ଆକ୍ସେସ କରିବାକୁ ଆପଣ ନିର୍ଦ୍ଦିଷ୍ଟ କରିଥିବା ଆପ୍ସକୁ ଅନୁମତି ଦିଅ"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"ଯଦି ଆପଣ ଏହାକୁ ବନ୍ଦ କରନ୍ତି, ତେବେ ଏହା ସମସ୍ତ ଆପ ପାଇଁ ଲୋକେସନ ଆକ୍ସେସକୁ କାଢ଼ି ଦେବ। ଡ୍ରାଇଭର ସହାୟତା ଆପଗୁଡ଼ିକର ଏବେ ବି ଆକ୍ସେସ ରହିବ।"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ଡ୍ରାଇଭର ସହାୟତା ପାଇଁ ଲୋକେସନ ସୂଚନା ବ୍ୟବହାର"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"ଗାଡ଼ିର ଲୋକେସନ ଫିଚର ବନ୍ଦ ଅଛି"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ଡ୍ରାଇଭର ସହାୟତା ଆପ୍ସ ଲୋକେସନ ସୂଚନାକୁ ଆକ୍ସେସ କରିପାରିବ ନାହିଁ"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"ବଦଳାନ୍ତୁ"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"ଲୋକେସନ ସୂଚନା ଆକ୍ସେସ କରିବାକୁ ଡ୍ରାଇଭିଂରେ ସାହାଯ୍ୟ କରୁଥିବା ଆପ୍ସକୁ ଅନୁମତି ଦିଅ"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"ଯଦି ଆପଣ ଏହାକୁ ବନ୍ଦ କରନ୍ତି, ତେବେ ଲୋକେସନ ସୂଚନା ଉପରେ ନିର୍ଭର କରୁଥିବା ଡ୍ରାଇଭର ସହାୟତା ଆପଗୁଡ଼ିକ ଅକ୍ଷମ ହୋଇଯିବ।"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"ଯେ କୌଣସି ଉପାୟରେ ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ବର୍ତ୍ତମାନର ଲୋକେସନ୍ ଅନୁରୋଧ"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"କୌଣସି ନିକଟର ଲୋକେସନ୍ ଅନୁରୋଧ ହୋଇନାହିଁ"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ଆପ୍-ସ୍ତରୀୟ ଅନୁମତି"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"ଲୋକେସନ୍ ସମ୍ପର୍କିତ ସେବା"</string>
<string name="location_use_location_title" msgid="117735895374606680">"ଲୋକେସନ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="location_settings_footer" msgid="296892848338100051">"ଆପଣଙ୍କ ଡିଭାଇସର ଲୋକେସନ୍ ଅନୁମାନ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ GPS, ୱାଇ‑ଫାଇ, ମୋବାଇଲ୍ ନେଟୱାର୍କ ଏବଂ ସେନ୍ସରଗୁଡ଼ିକ ଭଳି ସୋର୍ସଗୁଡ଼ିକୁ ଲୋକେସନ୍ ବ୍ୟବହାର କରିପାରେ।"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ଡ୍ରାଇଭର୍ ସହାୟତା"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ଡ୍ରାଇଭର ସହାୟତା ଆପଗୁଡ଼ିକୁ ପଠାଯାଇଥିବା ଲୋକେସନ ସୂଚନାରେ ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଥିବା ସୂଚନା ଅନ୍ତର୍ଭୁକ୍ତ ନାହିଁ। ଡିଲିଟ କରାଯିବା ପୂର୍ବରୁ ଏହାକୁ ସର୍ବାଧିକ 2 ଦିନ ପାଇଁ ଷ୍ଟୋର କରାଯାଏ।"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"ମାଇକ୍ରୋଫୋନ୍"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"ଆପଣଙ୍କ ମାଇକ୍ରୋଫୋନକୁ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ସମସ୍ତ ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"ମାଇକ୍ରୋଫୋନ୍ ଅନୁମତିଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"ବର୍ତ୍ତମାନ ଆକ୍ସେସ୍ କରାଯାଇଛି"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"ବର୍ତ୍ତମାନର କୌଣସି ଆପ୍ ନାହିଁ"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0ଟି ଆପର ଆକ୍ସେସ୍ ଅଛି"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count}ଟିରୁ #ଟି ଆପର ଆକ୍ସେସ ଅଛି}other{{total_count}ଟିରୁ #ଟି ଆପର ଆକ୍ସେସ ଅଛି}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"ବର୍ତ୍ତମାନ ଆକ୍ସେସ୍ କରାଯାଇଛି"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"ସବୁ ଦେଖନ୍ତୁ"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"ଲୋଡ୍ ହେଉଛି…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"ସିଷ୍ଟମ୍"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"ସିଷ୍ଟମ୍ ଅପ୍ଡେଟ୍"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"ଉନ୍ନତ"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"ତୃତୀୟ-ପକ୍ଷ ଲାଇସେନ୍ସ"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ଲାଇସେନ୍ସ ଲୋଡ୍ କରିବାରେ ସମସ୍ୟା ହୋଇଛି।"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"ଲୋଡ୍ କରୁଛି…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">ଆପଣ ଜଣେ ଡେଭେଲପର୍ ହେବାରେ ଆପଣ ବର୍ତ୍ତମାନ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>ଟି ଷ୍ଟେପ୍ ଦୂରରେ ଅଛନ୍ତି।</item>
- <item quantity="one">ଆପଣ ଜଣେ ଡେଭେଲପର୍ ହେବାରେ ଆପଣ ବର୍ତ୍ତମାନ <xliff:g id="STEP_COUNT_0">%1$d</xliff:g>ଟି ଷ୍ଟେପ୍ ଦୂରରେ ଅଛନ୍ତି।</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ଆପଣ ଜଣେ ଡେଭେଲପର ହେବା ପାଇଁ ବର୍ତ୍ତମାନ #ଟି ଷ୍ଟେପ ଦୂରରେ ଅଛନ୍ତି।}other{ଆପଣ ଜଣେ ଡେଭେଲପର ହେବା ପାଇଁ ବର୍ତ୍ତମାନ #ଟି ଷ୍ଟେପ ଦୂରରେ ଅଛନ୍ତି।}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"ବର୍ତ୍ତମାନ ଆପଣ ଜଣେ ଡେଭେଲପର୍ ଅଟନ୍ତି!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"ଆବଶ୍ୟକତା ନାହିଁ, ଆପଣ ଜଣେ ଡେଭେଲପର୍ ଅଟନ୍ତି।"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ଡେଭ୍ଲପର୍ମାନଙ୍କ ପାଇଁ ବିକଳ୍ପଗୁଡ଼ିକ"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"ଆପଣ କୌଣସି ବ୍ୟକ୍ତିଙ୍କ ପାଇଁ ଏକ ନୂଆ ପ୍ରୋଫାଇଲ୍ ତିଆରି କରିବା ପରେ, ସେ ନିଜ ପାଇଁ ତା\'କୁ କଷ୍ଟମାଇଜ୍ କରିବା ଉଚିତ।"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"ଅନ୍ୟ ସମସ୍ତ ପ୍ରୋଫାଇଲ୍ ଦ୍ୱାରା ବ୍ୟବହାର କରାଯିବା ପାଇଁ ଯେ କୌଣସି ପ୍ରୋଫାଇଲରୁ ଆପଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରାଯାଇପାରିବ।"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"ଅଧିକ ପ୍ରୋଫାଇଲ୍ ପାଇଁ ଅନୁମତି ନାହିଁ"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">ଆପଣ <xliff:g id="COUNT">%d</xliff:g>ଟି ପର୍ଯ୍ୟନ୍ତ ପ୍ରୋଫାଇଲ୍ ତିଆରି କରିପାରିବେ।</item>
- <item quantity="one">କେବଳ ଗୋଟିଏ ପ୍ରୋଫାଇଲ୍ ତିଆରି କରାଯାଇପାରିବ।</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{କେବଳ ଗୋଟିଏ ପ୍ରୋଫାଇଲ ତିଆରି କରାଯାଇପାରିବ।}other{ଆପଣ #ଟି ପର୍ଯ୍ୟନ୍ତ ପ୍ରୋଫାଇଲ ତିଆରି କରିପାରିବେ।}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"ନୂଆ ପ୍ରୋଫାଇଲ୍ ତିଆରି କରାଯାଇପାରିଲା ନାହିଁ"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ଏହି ପ୍ରୋଫାଇଲକୁ ଡିଲିଟ୍ କରିବେ?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ଏହି ପ୍ରୋଫାଇଲ୍ ପାଇଁ ସମସ୍ତ ଆପ୍ ଏବଂ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"ପ୍ରୋଫାଇଲ୍ ଡିଲିଟ୍ କରାଯାଇପାରିଲା ନାହିଁ।"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"ପ୍ରୋଫାଇଲ ଡିଲିଟ ହୋଇନାହିଁ। ଡିଭାଇସ ରିଷ୍ଟାର୍ଟ କରି ପୁଣି ଦେଖିପାରିବେ।"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"ଆପଣ ପ୍ରୋଫାଇଲ୍ ସ୍ୱିଚ୍ କଲେ କିମ୍ବା ଗାଡ଼ିକୁ ରିଷ୍ଟାର୍ଟ କଲେ ଏହି ପ୍ରୋଫାଇଲ୍ ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ଖାରଜ କରନ୍ତୁ"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"ଏକ ଅନ୍ଲକ୍ ପାଟର୍ନ କିପରି ଅଙ୍କାଯିବ"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"ପାଟର୍ନ ସେଭ୍ କରିବାରେ ତ୍ରୁଟି"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"ଅନେକଗୁଡ଼ିଏ ଭୁଲ୍ ପ୍ରଚେଷ୍ଟା। <xliff:g id="NUMBER">%d</xliff:g> ସେକେଣ୍ଡରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"ପାଟର୍ନ ରୋଟାରୀକୁ ସମର୍ଥନ କରେ ନାହିଁ, ସ୍ପର୍ଶ ବ୍ୟବହାର କର"</string>
<string name="okay" msgid="4589873324439764349">"ଓକେ"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"ସ୍କ୍ରୀନ ଲକ୍ ରିମୁଭ୍ କରିବେ କି?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"ଏହା ଯେକୌଣସି ବ୍ୟକ୍ତି ଆପଣଙ୍କ ଆକାଉଣ୍ଟରେ ପ୍ରବେଶ ପାଇଁ ଅନୁମତି ଦେବ"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"ଆପଣଙ୍କ IT ଆଡମିନଙ୍କ ଦ୍ୱାରା ସାଧାରଣ PINଗୁଡ଼ିକ ବ୍ଲକ୍ କରାଯାଇଛି। ଏକ ଭିନ୍ନ PIN ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ।"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"ଏହା ଗୋଟିଏ ଭୁଲ ଅକ୍ଷରକୁ ଯୋଡ଼ିପାରିବନାହିଁ"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"ପାସ୍ୱର୍ଡ ଭୁଲ ଅଟେ, ଅତିକମ୍ରେ 4 ଅକ୍ଷର ରହିବା ଦରକାର।"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">ଅତିକମରେ <xliff:g id="COUNT">%d</xliff:g>ଟି ଅକ୍ଷର ରହିବା ଦରକାର</item>
- <item quantity="one">ଅତିକମରେ ୧ଟି ଅକ୍ଷର ରହିବା ଦରକାର</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">ଅତିକମ୍ରେ <xliff:g id="COUNT">%d</xliff:g> ଟି ଲୋୱର୍କେସ୍ ଅକ୍ଷର ରହିବା ଦରକାର</item>
- <item quantity="one">ଅତିକମ୍ରେ 1ଟି ଲୋୱର୍କେସ୍ ଅକ୍ଷର ରହିବା ଦରକାର</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">ଅତିକମ୍ରେ <xliff:g id="COUNT">%d</xliff:g>ଟି ବଡ଼ ଅକ୍ଷର ଆବଶ୍ୟକ</item>
- <item quantity="one"> ଅତିକମ୍ରେ 1ଟି ବଡ଼ ଅକ୍ଷର ଆବଶ୍ୟକ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">ଅତିକମ୍ରେ <xliff:g id="COUNT">%d</xliff:g>ଟି ସଂଖ୍ୟା ନିହାତି ରହିବା ଦରକାର</item>
- <item quantity="one">ଅତିକମ୍ରେ 1ଟି ସଂଖ୍ୟା ନିହାତି ରହିବା ଦରକାର</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">ଅତିକମ୍ରେ <xliff:g id="COUNT">%d</xliff:g> ଟି ବିଶେଷ ସଙ୍କେତ ରହିଥିବା ଜରୁରୀ</item>
- <item quantity="one">ଅତିକମ୍ରେ 1 ବିଶେଷ ସଙ୍କେତ ରହିଥିବା ଜରୁରୀ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">ଅତିକମ୍ରେ <xliff:g id="COUNT">%d</xliff:g>ଟି ବିଶେଷ ଅକ୍ଷର କିମ୍ୱା ସଂଖ୍ୟା ଆବଶ୍ୟକ</item>
- <item quantity="one">ଅତିକମ୍ରେ 1ଟି ବିଶେଷ ଅକ୍ଷର କିମ୍ୱା ସଂଖ୍ୟା ଆବଶ୍ୟକ</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ଏକ ସମ୍ପ୍ରତି ପାସ୍ୱର୍ଡ ବ୍ୟବହାର କରିବାକୁ ଡିଭାଇସ୍ ଆଡମିନ୍ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
<string name="error_saving_password" msgid="8334882262622500658">"ପାସୱର୍ଡ ସେଭ୍ କରିବାରେ ତ୍ରୁଟି"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ଆପଣଙ୍କ IT ଆଡମିନଙ୍କ ଦ୍ୱାରା ସାଧାରଣ ପାସୱାର୍ଡଗୁଡ଼ିକ ବ୍ଲକ୍ କରାଯାଇଛି। ଏକ ଭିନ୍ନ ପାସୱାର୍ଡ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ।"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"ଏକ ପ୍ରୋଫାଇଲ୍ ଯୋଗ କରନ୍ତୁ"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ଏହି ପ୍ରୋଫାଇଲକୁ ଡିଲିଟ୍ କରନ୍ତୁ"</string>
<string name="add_profile_text" msgid="9118410102199116969">"ପ୍ରୋଫାଇଲ୍ ଯୋଗ କରନ୍ତୁ"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ଡିସପ୍ଲେ ଉଜ୍ଜ୍ୱଳତା"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"ଆପଣଙ୍କ ଡିଭାଇସଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ, ବ୍ଲୁଟୁଥ ଚାଲୁ କରନ୍ତୁ"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"ଏକ ଡିଭାଇସକୁ ପେୟାର କରିବା ପାଇଁ, ବ୍ଲୁଟୁଥ ସେଟିଂସ ଖୋଲନ୍ତୁ"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"ଇନଫୋଟେନମେଣ୍ଟ ସିଷ୍ଟମ ଆଡମିନ୍"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"ସକ୍ରିୟ ଥିବା ଆପଗୁଡ଼ିକ"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"ନିଷ୍କ୍ରିୟ ଥିବା ଆପଗୁଡ଼ିକ"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ଏହି ଅନୁମତି ଥିବା ଆପଗୁଡ଼ିକର ଏହି ଗାଡ଼ିର ଡାଟାକୁ ଆକ୍ସେସ ଅଛି"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"ଗାଡ଼ିର କୌଣସି ଆଡମିନ ଆପ ନାହିଁ"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"ଏହି ଇନଫୋଟେନମେଣ୍ଟ ସିଷ୍ଟମ ଆଡମିନ୍ ଆପଟି ସକ୍ରିୟ ଅଛି ଏବଂ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପକୁ ନିମ୍ନୋକ୍ତ କାର୍ଯ୍ୟଗୁଡ଼ିକ କରିବାକୁ ଅନୁମତି ଦିଏ:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"ଏହି ଇନଫୋଟେନମେଣ୍ଟ ସିଷ୍ଟମ ଆପକୁ ସକ୍ରିୟ କରିବା ଫଳରେ ଏହା <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପକୁ ନିମ୍ନୋକ୍ତ କାର୍ଯ୍ୟଗୁଡ଼ିକ କରିବାକୁ ଅନୁମତି ଦେବ:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"ଏହି ଇନଫୋଟେନମେଣ୍ଟ ସିଷ୍ଟମ ଆପ ସକ୍ରିୟ କରିବେ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"ଏହି ଇନଫୋଟେନମେଣ୍ଟ ସିଷ୍ଟମ ଆପକୁ ସକ୍ରିୟ କରନ୍ତୁ"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"ନିଷ୍କ୍ରିୟ ଏବଂ ଅନଇନଷ୍ଟଲ କରନ୍ତୁ"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"ଏହି ଇନଫୋଟେନମେଣ୍ଟ ସିଷ୍ଟମ ଆପକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"ଅଧିକ ବିବରଣୀ"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"ସେଟିଂସ, ଅନୁମତି, କର୍ପୋରେଟ ଆକ୍ସେସ, ନେଟୱାର୍କ କାର୍ଯ୍ୟକଳାପ ଏବଂ ଗାଡ଼ିର ଲୋକେସନ ସୂଚନା ସମେତ ଏହି ପ୍ରୋଫାଇଲ ସହ ସମ୍ବନ୍ଧିତ ଥିବା ଆପ ଓ ଡାଟାକୁ ସଂସ୍ଥା ପରିଚାଳକ ମନିଟର ଓ ପରିଚାଳନା କରିପାରିବେ।"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"ସେଟିଂସ, ଅନୁମତି, କର୍ପୋରେଟ ଆକ୍ସେସ, ନେଟୱାର୍କ କାର୍ଯ୍ୟକଳାପ ଏବଂ ଡିଭାଇସର ଲୋକେସନ ସୂଚନା ସମେତ ଏହି ପ୍ରୋଫାଇଲ ସହ ସମ୍ବନ୍ଧିତ ଥିବା ଆପ ଓ ଡାଟାକୁ ସଂସ୍ଥା ପରିଚାଳକ ମନିଟର ଓ ପରିଚାଳନା କରିପାରିବେ।"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"ସେଟିଂସ, ଅନୁମତି, କର୍ପୋରେଟ ଆକ୍ସେସ, ନେଟୱାର୍କ ସମ୍ବନ୍ଧିତ କାର୍ଯ୍ୟକଳାପ ଓ ଗାଡ଼ିର ଲୋକେସନ ସୂଚନା ସମେତ ଏହି ଇନଫୋଟେନମେଣ୍ଟ ସିଷ୍ଟମ ସହ ସମ୍ବନ୍ଧିତ ଥିବା ଆପ ଓ ଡାଟାକୁ ସଂସ୍ଥା ପରିଚାଳକ ମନିଟର ଏବଂ ପରିଚାଳନା କରିପାରିବେ।"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"ଏହି ଇନଫୋଟେନମେଣ୍ଟ ସିଷ୍ଟମ ସହ ସମ୍ବନ୍ଧିତ ଡାଟାକୁ ଆକ୍ସେସ କରିବା, ଆପଗୁଡ଼ିକୁ ପରିଚାଳନା କରିବା ଏବଂ ଏହି ଗାଡ଼ିର ସେଟିଂସ ପରିବର୍ତ୍ତନ କରିବାକୁ ସଂସ୍ଥା ପରିଚାଳକ ସକ୍ଷମ ହୋଇପାରନ୍ତି।"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ତାହା ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"ଏହି ପରିଚାଳିତ ଗାଡ଼ିରେ ଭଲ୍ୟୁମ ପରିବର୍ତ୍ତନ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"ଏହି ପରିଚାଳିତ ଗାଡ଼ିରେ କଲ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"ଏହି ପରିଚାଳିତ ଗାଡ଼ିରେ SMS ପଠାଇବାର ଅନୁମତି ନାହିଁ"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"ଏହି ପରିଚାଳିତ ଗାଡ଼ିରେ କ୍ୟାମେରା ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"ଏହି ପରିଚାଳିତ ଗାଡ଼ିରେ ସ୍କ୍ରିନସଟଗୁଡ଼ିକ ନିଆଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"ଏହି ପରିଚାଳିତ ଗାଡ଼ିରେ ଏହି ଆପ ଖୋଲାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"ଆପଣଙ୍କ କ୍ରେଡିଟ ପ୍ରଦାନକାରୀଙ୍କ ଦ୍ୱାରା ବ୍ଲକ୍ କରାଯାଇଛି"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"ସଂସ୍ଥା ଦ୍ୱାରା କିଛି ଫିଚରକୁ ଆକ୍ସେସ ସୀମିତ କରାଯାଇଛି।\n\nଯଦି ଆପଣଙ୍କର କିଛି ପ୍ରଶ୍ନ ଅଛି, ତେବେ ସଂସ୍ଥାର ପରିଚାଳକଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"ଗାଡ଼ିର ଆଡମିନ୍ ଆପ୍"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{#ଟି ସକ୍ରିୟ ଥିବା ଆପ}other{#ଟି ସକ୍ରିୟ ଥିବା ଆପ}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"କୌଣସି ସକ୍ରିୟ ଥିବା ଆପ ନାହିଁ"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ଗାଡ଼ିର ନୀତି"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"ସଂସ୍ଥା ପରିଚାଳକଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଥିବା ସେଟିଂସ"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"ବଗ ରିପୋର୍ଟ ସେୟାର କରିବେ?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"ଏହି ଡିଭାଇସର ଟ୍ରବୁଲସୁଟ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ ଏହି ଗାଡ଼ିର ସଂସ୍ଥା ପରିଚାଳକ ଏକ ବଗ ରିପୋର୍ଟ ପାଇଁ ଅନୁରୋଧ କରିଛନ୍ତି। ଆପ୍ସ ଓ ଡାଟା ସେୟାର କରାଯାଇପାରେ।"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"ଏହି ଡିଭାଇସର ଟ୍ରବୁଲସୁଟ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ ଏହି ଗାଡ଼ିର ସଂସ୍ଥା ପରିଚାଳକ ଏକ ବଗ ରିପୋର୍ଟ ପାଇଁ ଅନୁରୋଧ କରିଛନ୍ତି। ଆପ୍ସ ଓ ଡାଟା ସେୟାର କରାଯାଇପାରେ ଏବଂ ଆପଣଙ୍କ ଡିଭାଇସ ଅସ୍ଥାୟୀ ଭାବେ ଧୀର ହୋଇଯାଇପାରେ।"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"ଏହି ଗାଡ଼ିର ସଂସ୍ଥା ପରିଚାଳକଙ୍କ ସହ ଏହି ବଗ ରିପୋର୍ଟ ସେୟାର କରାଯାଉଛି। ଅଧିକ ବିବରଣୀ ପାଇଁ ତାଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"ସେୟାର କରନ୍ତୁ"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"ଅଗ୍ରାହ୍ୟ କରନ୍ତୁ"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"ବର୍ତ୍ତମାନ ଏହି ସେଟିଂକୁ ବଦଳାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ଆକ୍ସେସିବିଲିଟୀ"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"କ୍ୟାପସନଗୁଡ଼ିକ"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"କ୍ୟାପସନ ପସନ୍ଦଗୁଡ଼ିକ"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ବନ୍ଦ ଅଛି"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ଚାଲୁ ଅଛି"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"ସ୍କ୍ରିନ ରିଡର"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"କ୍ୟାପସନଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ଟେକ୍ସଟ ଆକାର"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"କ୍ୟାପସନ ଆକାର ଏବଂ ଷ୍ଟାଇଲ"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"ବହୁତ ଛୋଟ"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"ଛୋଟ"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ଡିଫଲ୍ଟ"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ବଡ଼"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ବହୁତ ବଡ଼"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"କ୍ୟାପସନ ଷ୍ଟାଇଲ"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ଆପ ଅନୁସାରେ ସେଟ କରନ୍ତୁ"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"କଳା ଉପରେ ଧଳା"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"ଧଳା ଉପରେ କଳା"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"କଳା ଉପରେ ହଳଦିଆ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"ନୀଳ ଉପରେ ହଳଦିଆ"</string>
</resources>
diff --git a/res/values-pa/arrays.xml b/res/values-pa/arrays.xml
index 2cd3675..5b1faf9 100644
--- a/res/values-pa/arrays.xml
+++ b/res/values-pa/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"ਕਦੇ ਵੀ ਕਰਨ ਨਾ ਦਿਓ"</item>
<item msgid="1154273129608299386">"ਹਮੇਸ਼ਾਂ ਕਰਨ ਦਿਓ"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index d9a8d6e..39a53a8 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"ਰਾਤ ਵਾਲਾ ਮੋਡ"</string>
<string name="network_and_internet" msgid="4229023630498537530">"ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਸਿਮ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਸਿਮ</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# ਸਿਮ}one{# ਸਿਮ}other{# ਸਿਮ}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"ਕਿਰਿਆਸ਼ੀਲ / ਸਿਮ"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"ਅਕਿਰਿਆਸ਼ੀਲ / ਸਿਮ"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"ਕਿਰਿਆਸ਼ੀਲ / ਡਾਊਨਲੋਡ ਕੀਤਾ ਸਿਮ"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"ਹੋਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"ਮੋਬਾਈਲ ਡਾਟਾ"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਵਰਤ ਕੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤੋ"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"ਕੀ ਮੋਬਾਈਲ ਡਾਟਾ ਬੰਦ ਕਰਨਾ ਹੈ?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"ਚੋਣ ਲੋੜੀਂਦੀ ਹੈ"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"ਕੀ ਮੋਬਾਈਲ ਡਾਟੇ ਲਈ <xliff:g id="CARRIER">%1$s</xliff:g> ਵਰਤਣਾ ਹੈ?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> ਡਾਟਾ ਚਿਤਾਵਨੀ"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> ਡਾਟਾ ਸੀਮਾ"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> ਡਾਟਾ ਚਿਤਾਵਨੀ / <xliff:g id="ID_2">^2</xliff:g> ਡਾਟਾ ਸੀਮਾ"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d ਦਿਨ ਬਾਕੀ</item>
- <item quantity="other">%d ਦਿਨ ਬਾਕੀ</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# ਦਿਨ ਬਾਕੀ}one{# ਦਿਨ ਬਾਕੀ}other{# ਦਿਨ ਬਾਕੀ}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"ਕੋਈ ਸਮਾਂ ਬਾਕੀ ਨਹੀਂ"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 ਦਿਨ ਤੋਂ ਘੱਟ ਸਮਾਂ ਬਾਕੀ"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> ਪਹਿਲਾਂ <xliff:g id="ID_1">^1</xliff:g> ਵੱਲੋਂ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"ਸੈੱਟ ਕਰੋ"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ਡਾਟਾ ਚਿਤਾਵਨੀ ਅਤੇ ਸੀਮਾ"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"ਐਪ ਦੀ ਡਾਟਾ ਵਰਤੋਂ ਦਾ ਚੱਕਰ"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤੋਂ"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ਡਾਟਾ ਚਿਤਾਵਨੀ ਸੈੱਟ ਕਰੋ"</string>
<string name="data_warning" msgid="116776633806885370">"ਡਾਟਾ ਚਿਤਾਵਨੀ"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ਡਾਟਾ ਸੀਮਾ ਸੈੱਟ ਕਰੋ"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ਤੁਹਾਡੇ ਵਾਹਨ ਦੀ ਸਕ੍ਰੀਨ ਤੋਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤੀ ਮੋਬਾਈਲ ਡਾਟੇ ਦੀ ਸੀਮਾ ਉੱਤੇ ਪਹੁੰਚਣ \'ਤੇ ਮੋਬਾਈਲ ਡਾਟਾ ਬੰਦ ਕਰ ਦੇਵੇਗਾ।\n\nਕਿਉਂਕਿ ਡਾਟਾ ਵਰਤੋਂ ਤੁਹਾਡੇ ਸਕ੍ਰੀਨ ਵੱਲੋਂ ਮਾਪੀ ਜਾਂਦੀ ਹੈ ਅਤੇ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਤੁਹਾਡਾ ਕੈਰੀਅਰ ਵਰਤੋਂ ਦਾ ਹਿਸਾਬ ਵੱਖਰੇ ਢੰਗ ਨਾਲ ਲਗਾਵੇ, ਇਸ ਕਰਕੇ ਕੋਈ ਕੰਜੂਸੀਕਾਰੀ ਸੀਮਾ ਸੈੱਟ ਕਰਨ ਬਾਰੇ ਵਿਚਾਰ ਕਰੋ।"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ਡਾਟਾ ਵਰਤੋਂ ਚਿਤਾਵਨੀ ਸੈੱਟ ਕਰੋ"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ਡਾਟਾ ਵਰਤੋਂ ਸੀਮਾ ਸੈੱਟ ਕਰੋ"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵੱਲੋਂ ਮਾਪੀ ਜਾਂਦੀ ਹੈ। ਇਹ ਤੁਹਾਡੇ ਮੋਬਾਈਲ ਕੈਰੀਅਰ ਦੇ ਡਾਟੇ ਤੋਂ ਵੱਖਰਾ ਹੋ ਸਕਦਾ ਹੈ।"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"ਸੈੱਟ ਕਰੋ"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM ਨੈੱਟਵਰਕ"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"ਵਾਹਨ ਦਾ ਇੰਟਰਨੈੱਟ"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"ਵਾਹਨ ਦੇ ਇੰਟਰਨੈੱਟ ਨੂੰ ਬੰਦ ਕਰਨ ਨਾਲ ਵਾਹਨ ਦੀਆਂ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਜਾਂ ਐਪਾਂ ਦੇ ਕੰਮ ਕਰਨ \'ਤੇ ਪ੍ਰਭਾਵ ਪੈ ਸਕਦਾ ਹੈ।\n\nਤੁਹਾਡੇ ਵਾਹਨ ਨੂੰ ਚਲਾਉਣ ਲਈ ਲੋੜੀਂਦੇ ਜ਼ਰੂਰੀ ਡਾਟੇ ਨੂੰ ਵਾਹਨ ਦੇ ਨਿਰਮਾਤਾ ਨਾਲ ਸਾਂਝਾ ਕਰਨਾ ਜਾਰੀ ਰੱਖਿਆ ਜਾਵੇਗਾ।"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"ਕਿਸੇ ਵੇਲੇ ਵੀ ਬੰਦ ਕਰੋ"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"ਵਾਹਨ ਦਾ ਇੰਟਰਨੈੱਟ ਬੰਦ ਹੈ। ਇਸ ਨਾਲ ਵਾਹਨ ਦੀਆਂ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਜਾਂ ਐਪਾਂ ਦੇ ਕੰਮ ਕਰਨ \'ਤੇ ਪ੍ਰਭਾਵ ਪੈ ਸਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵਾਹਨ ਨੂੰ ਚਲਾਉਣ ਲਈ ਲੋੜੀਂਦੇ ਜ਼ਰੂਰੀ ਡਾਟੇ ਨੂੰ ਵਾਹਨ ਦੇ ਨਿਰਮਾਤਾ ਨਾਲ ਸਾਂਝਾ ਕਰਨਾ ਜਾਰੀ ਰੱਖਿਆ ਜਾਵੇਗਾ।"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s ਨੂੰ %1$s ਡਾਟਾ ਵਰਤਿਆ ਗਿਆ"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"ਹੋਰ ਨੈੱਟਵਰਕ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"ਨੈੱਟਵਰਕ ਤਰਜੀਹਾਂ"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"ਨੈੱਟਵਰਕ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"ਕਨੈਕਟ ਕਰੋ"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"ਕਨੈਕਟ ਨਹੀਂ ਹੈ"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"ਨੈੱਟਵਰਕ ਰੇਂਜ ਵਿੱਚ ਨਹੀਂ ਹੈ"</string>
<string name="wifi_password" msgid="5565632142720292397">"ਪਾਸਵਰਡ"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"ਪਾਸਵਰਡ ਦਿਖਾਓ"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"ਵਾਈ-ਫਾਈ ਹੌਟਸਪੌਟ ਲਈ ਬੈਂਡ ਚੁਣੋ:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ਹੌਟਸਪੌਟ ਅਤੇ ਟੈਦਰਿੰਗ"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ਹੌਟਸਪੌਟ"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ਬੰਦ"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"ਹੌਟਸਪੌਟ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਬੰਦ ਕਰੋ"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"ਕਿਸੇ ਵੀ ਡੀਵਾਈਸ ਦੇ ਨਾ ਕਨੈਕਟ ਹੋਣ \'ਤੇ ਵਾਈ-ਫਾਈ ਹੌਟਸਪੌਟ ਬੰਦ ਹੋ ਜਾਵੇਗਾ"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ਦੀ ਵਾਈ-ਫਾਈ ਨੂੰ ਚਾਲੂ ਕਰਨ ਦੀ ਇੱਛਾ ਹੈ"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰੋ"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"ਕੀ ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰਨਾ ਹੈ?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਨੂੰ ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰਦੇ ਹੋ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਾ ਕਰੇ।"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"ਕੀ ਕਾਰਗੁਜ਼ਾਰੀ ਸੁਰੱਖਿਆ ਨੂੰ ਬੰਦ ਕਰਨਾ ਹੈ?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"ਜੇ ਤੁਸੀਂ ਇਸ ਤਰ੍ਹਾਂ ਕਰਦੇ ਹੋ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਤੁਹਾਡਾ ਸਾਫ਼ਟਵੇਅਰ ਅਤੇ ਹਾਰਡਵੇਅਰ ਚੰਗੀ ਤਰ੍ਹਾਂ ਕੰਮ ਨਾ ਕਰਨ।"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ਚਾਲੂ ਛੱਡੋ"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"ਬੰਦ ਕਰੋ"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"ਕੀ ਐਪ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਤਰਜੀਹ ਦੇਣਾ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"ਇਸਨੂੰ ਚਾਲੂ ਕਰਨ ਨਾਲ ਸੰਭਾਵੀ ਸਿਸਟਮ ਅਸਥਿਰਤਾ ਜਾਂ ਲੰਬੇ-ਸਮੇਂ ਦਾ ਹਾਰਡਵੇਅਰ ਪ੍ਰਭਾਵ ਹੋ ਸਕਦਾ ਹੈ। ਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"ਹਾਂ"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"ਨਹੀਂ, ਧੰਨਵਾਦ"</string>
<string name="disable_text" msgid="4358165448648990820">"ਬੰਦ ਕਰੋ"</string>
<string name="enable_text" msgid="1794971777861881238">"ਚਾਲੂ ਕਰੋ"</string>
<string name="uninstall_text" msgid="277907956072833012">"ਅਣਸਥਾਪਤ ਕਰੋ"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"ਇਜਾਜ਼ਤਾਂ"</string>
<string name="notifications_label" msgid="6586089149665170731">"ਸੂਚਨਾਵਾਂ"</string>
<string name="storage_application_label" msgid="5911779903670978586">"ਸਟੋਰੇਜ ਅਤੇ ਕੈਸ਼ੇ"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"ਉੱਚ-ਕਾਰਗੁਜ਼ਾਰੀ ਯਕੀਨੀ ਬਣਾਓ"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ਐਪ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਤਰਜੀਹ ਦੇਣਾ"</string>
<string name="application_version_label" msgid="8556889839783311649">"ਵਰਜਨ: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ਕੋਈ ਇਜਾਜ਼ਤਾਂ ਨਹੀਂ ਦਿੱਤੀਆਂ ਗਈਆਂ"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ਕਿਸੇ ਇਜਾਜ਼ਤਾਂ ਦੀ ਬੇਨਤੀ ਨਹੀਂ ਕੀਤੀ ਗਈ"</string>
<string name="unused_apps" msgid="648471933781010395">"ਅਣਵਰਤੀਆਂ ਐਪਾਂ"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਅਣਵਰਤੀ ਐਪ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਅਣਵਰਤੀਆਂ ਐਪਾਂ</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ਅਣਵਰਤੀ ਐਪ}one{# ਅਣਵਰਤੀ ਐਪ}other{# ਅਣਵਰਤੀਆਂ ਐਪਾਂ}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"ਇਜਾਜ਼ਤਾਂ ਹਟਾਓ ਅਤੇ ਜਗ੍ਹਾ ਖਾਲੀ ਕਰੋ"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"ਅੰਦਰੂਨੀ ਸਟੋਰੇਜ ਵਿੱਚ %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"ਲੋੜ ਪੈਣ \'ਤੇ, ਸਰੋਤਾਂ ਦੀ ਬੇਲੋੜੀ ਵਰਤੋਂ ਤੋਂ ਬਚਣ ਲਈ ਐਪ ਬੰਦ ਕਰੋ"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ਐਪ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਤਰਜੀਹ ਦੇਣ ਲਈ ਸਿਸਟਮ ਦੇ ਸਰੋਤਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ਡਾਟਾ ਵਰਤੋਂ"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ਐਪ ਡਾਟਾ ਵਰਤੋਂ"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"ਵਰਤੋਂ ਇਤਿਹਾਸ"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"ਸਾਰੀਆਂ ਐਪਾਂ"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ਡਾਟਾ ਅਤੇ ਵਾਈ-ਫਾਈ ਦੀ ਵਰਤੋਂ"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"ਵਰਤੋਂ ਇਤਿਹਾਸ"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"ਕੁੱਲ ਵਰਤੋਂ"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ਫੋਰਗ੍ਰਾਊਂਡ"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"ਬੈਕਗ੍ਰਾਊਂਡ"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ਡਾਟੇ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"ਇਸ ਐਪ ਨੂੰ ਮੋਬਾਈਲ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦਿਓ"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ਡਾਟੇ \'ਤੇ ਪਾਬੰਧੀ ਲਗਾਓ"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ਐਪ ਦੇ ਫੋਰਗ੍ਰਾਊਂਡ ਹੋਣ \'ਤੇ ਹੀ ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤੋ"</string>
<string name="computing_size" msgid="5791407621793083965">"ਗਣਨਾ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਵਧੀਕ ਇਜਾਜ਼ਤ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਵਧੀਕ ਇਜਾਜ਼ਤਾਂ</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# ਵਧੀਕ ਇਜਾਜ਼ਤ}one{# ਵਧੀਕ ਇਜਾਜ਼ਤ}other{# ਵਧੀਕ ਇਜਾਜ਼ਤਾਂ}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"ਨੋਟ ਕਰੋ: ਰੀਬੂਟ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਆਪਣਾ ਵਾਹਨ ਅਣਲਾਕ ਨਹੀਂ ਕਰਦੇ ਓਦੋਂ ਤੱਕ ਇਹ ਐਪ ਚਾਲੂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistant ਅਤੇ ਵੌਇਸ ਇਨਪੁੱਟ"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"ਸਹਾਇਕ ਐਪ"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"ਵਾਈ-ਫਾਈ ਕੰਟਰੋਲ ਰਾਹੀਂ ਕੋਈ ਐਪ ਵਾਈ-ਫਾਈ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕਰ ਸਕਦੀ ਹੈ, ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਸਕੈਨ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰ ਸਕਦੀ ਹੈ, ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਜਾਂ ਹਟਾ ਸਕਦੀ ਹੈ, ਜਾਂ ਸਿਰਫ਼-ਸਥਾਨਕ ਹੌਟਸਪੌਟ ਸ਼ੁਰੂ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="more_special_access_title" msgid="166115485446645971">"ਹੋਰ"</string>
<string name="location_settings_title" msgid="901334356682423679">"ਟਿਕਾਣਾ"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"ਟਿਕਾਣਾ ਵਰਤੋ"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"ਆਪਣੇ ਵੱਲੋਂ ਨਿਰਧਾਰਿਤ ਐਪਾਂ ਨੂੰ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"ਜੇ ਤੁਸੀਂ ਇਸ ਨੂੰ ਬੰਦ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਹ ਸਾਰੀਆਂ ਐਪਾਂ ਵਾਸਤੇ ਟਿਕਾਣਾ ਪਹੁੰਚ ਨੂੰ ਹਟਾ ਦੇਵੇਗਾ। ਡਰਾਈਵਰ ਸਹਾਇਤਾ ਐਪਾਂ ਦੀ ਪਹੁੰਚ ਹਾਲੇ ਵੀ ਬਣੀ ਰਹੇਗੀ।"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ਡਰਾਈਵਰ ਸਹਾਇਤਾ ਲਈ ਟਿਕਾਣਾ ਵਰਤੋ"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"ਵਾਹਨ ਟਿਕਾਣਾ ਬੰਦ ਹੈ"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ਡਰਾਈਵਰ ਸਹਾਇਤਾ ਐਪਾਂ ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"ਬਦਲੋ"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"ਗੱਡੀ ਚਲਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਨ ਵਾਲੀਆਂ ਐਪਾਂ ਨੂੰ ਆਪਣੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"ਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬੰਦ ਕਰਦੇ ਹੋ, ਤਾਂ ਡਰਾਈਵਰ ਸਹਾਇਤਾ ਵਾਲੀਆਂ ਉਨ੍ਹਾਂ ਐਪਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ ਜੋ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ \'ਤੇ ਨਿਰਭਰ ਕਰਦੀਆਂ ਹਨ।"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"ਕਿਸੇ ਵੇਲੇ ਵੀ ਬੰਦ ਕਰੋ"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ਹਾਲੀਆ ਟਿਕਾਣਾ ਬੇਨਤੀਆਂ"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ਕੋਈ ਹਾਲੀਆ ਟਿਕਾਣਾ ਬੇਨਤੀਆਂ ਨਹੀਂ"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ਐਪ-ਪੱਧਰ ਇਜਾਜ਼ਤਾਂ"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ"</string>
<string name="location_use_location_title" msgid="117735895374606680">"ਟਿਕਾਣਾ ਵਰਤੋ"</string>
<string name="location_settings_footer" msgid="296892848338100051">"ਟਿਕਾਣਾ ਸੇਵਾ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾਉਣ ਲਈ GPS, ਵਾਈ-ਫਾਈ, ਮੋਬਾਈਲ ਨੈੱਟਵਰਕਾਂ ਅਤੇ ਸੈਂਸਰਾਂ ਵਰਗੇ ਸਰੋਤਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ਡਰਾਈਵਰ ਸਹਾਇਤਾ"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ਡਰਾਈਵਰ ਸਹਾਇਤਾ ਐਪਾਂ ਨੂੰ ਭੇਜੀ ਗਈ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਵਿੱਚ ਅਜਿਹੀ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਨਹੀਂ ਹੁੰਦੀ ਜਿਸ ਨਾਲ ਤੁਹਾਡੀ ਪਛਾਣ ਹੋ ਸਕੇ। ਇਸਨੂੰ ਵੱਧ ਤੋਂ ਵੱਧ 2 ਦਿਨਾਂ ਲਈ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਇਸ ਤੋਂ ਬਾਅਦ ਇਸਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ।"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਵਰਤੋ"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"ਸਾਰੀਆਂ ਐਪਾਂ ਨੂੰ ਆਪਣੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"ਹਾਲ ਹੀ ਵਿੱਚ ਪਹੁੰਚ ਕੀਤੀ"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"ਕੋਈ ਹਾਲੀਆ ਐਪ ਨਹੀਂ"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 ਐਪਾਂ ਕੋਲ ਪੁਹੰਚ ਹੈ"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count} ਵਿੱਚੋਂ # ਐਪ ਕੋਲ ਪੁਹੰਚ ਹੈ}one{{total_count} ਵਿੱਚੋਂ # ਐਪ ਕੋਲ ਪੁਹੰਚ ਹੈ}other{{total_count} ਵਿੱਚੋਂ # ਐਪਾਂ ਕੋਲ ਪੁਹੰਚ ਹੈ}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"ਹਾਲ ਹੀ ਵਿੱਚ ਪਹੁੰਚ ਕੀਤੀ"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"ਸਭ ਦੇਖੋ"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"ਸਿਸਟਮ"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"ਸਿਸਟਮ ਅੱਪਡੇਟ"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"ਉੱਨਤ"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"ਤੀਜੀ-ਧਿਰ ਦੇ ਲਾਇਸੰਸ"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ਲਾਇਸੰਸ ਲੋਡ ਕਰਨ ਵਿੱਚ ਇੱਕ ਸਮੱਸਿਆ ਹੈ।"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">ਤੁਸੀਂ ਹੁਣ ਇੱਕ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ<xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ਕਦਮ ਦੂਰ ਹੋ।</item>
- <item quantity="other">ਤੁਸੀਂ ਹੁਣ ਇੱਕ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ਕਦਮ ਦੂਰ ਹੋ।</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ਤੁਸੀਂ ਹੁਣ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ # ਕਦਮ ਦੂਰ ਹੋ।}one{ਤੁਸੀਂ ਹੁਣ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ # ਕਦਮ ਦੂਰ ਹੋ।}other{ਤੁਸੀਂ ਹੁਣ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ # ਕਦਮ ਦੂਰ ਹੋ।}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"ਹੁਣ ਤੁਸੀਂ ਇੱਕ ਵਿਕਾਸਕਾਰ ਹੋ!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"ਕੋਈ ਲੋੜ ਨਹੀਂ, ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਇੱਕ ਵਿਕਾਸਕਾਰ ਹੋ।"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ਵਿਕਾਸਕਾਰ ਚੋਣਾਂ"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਨਵਾਂ ਪ੍ਰੋਫਾਈਲ ਬਣਾਉਣ ਤੋਂ ਬਾਅਦ, ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਖੁਦ ਲਈ ਇਸਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ।"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"ਐਪਾਂ ਨੂੰ ਹੋਰ ਸਾਰੇ ਪ੍ਰੋਫਾਈਲਾਂ ਵੱਲੋਂ ਵਰਤੇ ਜਾਣ ਲਈ ਕਿਸੇ ਵੀ ਪ੍ਰੋਫਾਈਲ ਤੋਂ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"ਪ੍ਰੋਫਾਈਲ ਬਣਾਉਣ ਦੀ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">ਤੁਸੀਂ <xliff:g id="COUNT">%d</xliff:g> ਪ੍ਰੋਫਾਈਲ ਤੱਕ ਬਣਾ ਸਕਦੇ ਹੋ।</item>
- <item quantity="other">ਤੁਸੀਂ <xliff:g id="COUNT">%d</xliff:g> ਪ੍ਰੋਫਾਈਲ ਤੱਕ ਬਣਾ ਸਕਦੇ ਹੋ।</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{ਸਿਰਫ਼ ਇੱਕ ਪ੍ਰੋਫਾਈਲ ਬਣਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।}one{ਤੁਸੀਂ # ਪ੍ਰੋਫਾਈਲ ਤੱਕ ਬਣਾ ਸਕਦੇ ਹੋ।}other{ਤੁਸੀਂ # ਪ੍ਰੋਫਾਈਲਾਂ ਤੱਕ ਬਣਾ ਸਕਦੇ ਹੋ।}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"ਨਵਾਂ ਪ੍ਰੋਫਾਈਲ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ਕੀ ਇਸ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ਇਸ ਪ੍ਰੋਫਾਈਲ ਦੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਡਾਟੇ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"ਪ੍ਰੋਫਾਈਲ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"ਪ੍ਰੋਫਾਈਲ ਨਹੀਂ ਮਿਟਿਆ। ਡੀਵਾਈਸ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਕੇ ਫਿਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"ਜਦੋਂ ਤੁਸੀਂ ਪ੍ਰੋਫਾਈਲ ਬਦਲਦੇ ਹੋ ਜਾਂ ਵਾਹਨ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਦੇ ਹੋ ਤਾਂ ਇਹ ਪ੍ਰੋਫਾਈਲ ਮਿਟ ਜਾਵੇਗਾ।"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ਖਾਰਜ ਕਰੋ"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"ਇੱਕ ਅਣਲਾਕ ਪੈਟਰਨ ਕਿਵੇਂ ਉਲੀਕੀਏ"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"ਪੈਟਰਨ ਰੱਖਿਅਤ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋਈ"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"ਬਹੁਤ ਸਾਰੀਆਂ ਗ਼ਲਤ ਕੋਸ਼ਿਸ਼ਾਂ। <xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"ਪੈਟਰਨ ਰੋਟਰੀ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ, ਕਿਰਪਾ ਕਰਕੇ ਸਪਰਸ਼ ਵਰਤੋ"</string>
<string name="okay" msgid="4589873324439764349">"ਠੀਕ ਹੈ"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"ਕੀ ਸਕ੍ਰੀਨ ਲਾਕ ਹਟਾਉਣਾ ਹੈ?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"ਇਹ ਕਿਸੇ ਨੂੰ ਤੁਹਾਡੇ ਖਾਤੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਵੇਗਾ"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"ਆਮ ਪਿੰਨ ਤੁਹਾਡੇ IT ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬਲਾਕ ਕੀਤੇ ਗਏ ਹਨ। ਕੋਈ ਵੱਖਰਾ ਪਿੰਨ ਵਰਤ ਕੇ ਦੇਖੋ।"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"ਇਸ ਵਿੱਚ ਇੱਕ ਅਵੈਧ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਨਹੀਂ ਹੋ ਸਕਦਾ।"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"ਪਾਸਵਰਡ ਵੈਧ ਹੈ, ਘੱਟੋ-ਘੱਟ 4 ਅੱਖਰ-ਚਿੰਨ੍ਹਾਂ ਦਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਅੱਖਰ ਸ਼ਾਮਲ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ</item>
- <item quantity="other">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਅੱਖਰ ਸ਼ਾਮਲ ਕਰਨੇ ਲਾਜ਼ਮੀ ਹਨ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਛੋਟੇ ਅੱਖਰ ਸ਼ਾਮਲ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ</item>
- <item quantity="other">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਛੋਟੇ ਅੱਖਰ ਸ਼ਾਮਲ ਕਰਨੇ ਲਾਜ਼ਮੀ ਹਨ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਵੱਡੇ ਅੱਖਰ ਸ਼ਾਮਲ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ</item>
- <item quantity="other">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਵੱਡੇ ਅੱਖਰ ਸ਼ਾਮਲ ਕਰਨੇ ਲਾਜ਼ਮੀ ਹਨ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਸੰਖਿਆਤਮਿਕ ਅੰਕ ਸ਼ਾਮਲ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ</item>
- <item quantity="other">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਸੰਖਿਆਤਮਿਕ ਅੰਕ ਸ਼ਾਮਲ ਕਰਨੇ ਲਾਜ਼ਮੀ ਹਨ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਖਾਸ ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ</item>
- <item quantity="other">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਖਾਸ ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਕਰਨੇ ਲਾਜ਼ਮੀ ਹਨ</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਗੈਰ-ਅੱਖਰੀ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ</item>
- <item quantity="other">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT">%d</xliff:g> ਗੈਰ-ਅੱਖਰੀ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਕਰਨੇ ਲਾਜ਼ਮੀ ਹਨ</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ਡੀਵਾਈਸ ਪ੍ਰਸ਼ਾਸਕ ਇੱਕ ਹਾਲੀਆ ਪਾਸਵਰਡ ਵਰਤਣ ਨਹੀਂ ਦਿੰਦਾ"</string>
<string name="error_saving_password" msgid="8334882262622500658">"ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋਈ"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ਆਮ ਪਾਸਵਰਡ ਤੁਹਾਡੇ IT ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬਲਾਕ ਕੀਤੇ ਗਏ ਹਨ। ਕੋਈ ਵੱਖਰਾ ਪਾਸਵਰਡ ਵਰਤ ਕੇ ਦੇਖੋ।"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"ਕੋਈ ਪ੍ਰੋਫਾਈਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ਇਹ ਪ੍ਰੋਫਾਈਲ ਮਿਟਾਓ"</string>
<string name="add_profile_text" msgid="9118410102199116969">"ਪ੍ਰੋਫਾਈਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ਡਿਸਪਲੇ ਚਮਕ"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"ਆਪਣੇ ਡੀਵਾਈਸ ਦੇਖਣ ਲਈ, ਬਲੂਟੁੱਥ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"ਕਿਸੇ ਡੀਵਾਈਸ ਨੂੰ ਜੋੜਾਬੱਧ ਕਰਨ ਲਈ, ਬਲੂਟੁੱਥ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"ਵਾਹਨ ਆਡੀਓ ਸਿਸਟਮ ਪ੍ਰਸ਼ਾਸਕ"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"ਕਿਰਿਆਸ਼ੀਲ ਕੀਤੀਆਂ ਐਪਾਂ"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"ਅਕਿਰਿਆਸ਼ੀਲ ਕੀਤੀਆਂ ਐਪਾਂ"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ਇਸ ਇਜਾਜ਼ਤ ਵਾਲੀਆਂ ਐਪਾਂ ਕੋਲ ਇਸ ਵਾਹਨ ਦੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਹੈ"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"ਵਾਹਨ ਲਈ ਕੋਈ ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਨਹੀਂ ਹੈ"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"ਇਹ ਵਾਹਨ ਆਡੀਓ ਸਿਸਟਮ ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਕਿਰਿਆਸ਼ੀਲ ਹੈ ਅਤੇ <xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ ਨੂੰ ਅੱਗੇ ਦਿੱਤੀਆਂ ਕਾਰਵਾਈਆਂ ਨੂੰ ਕਰਨ ਲਈ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"ਇਸ ਵਾਹਨ ਆਡੀਓ ਸਿਸਟਮ ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਨਾਲ <xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ ਨੂੰ ਅੱਗੇ ਦਿੱਤੀਆਂ ਕਾਰਵਾਈਆਂ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮਿਲੇਗੀ:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"ਕੀ ਇਹ ਵਾਹਨ ਆਡੀਓ ਸਿਸਟਮ ਐਪ ਕਿਰਿਆਸ਼ੀਲ ਕਰੀਏ?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"ਇਸ ਵਾਹਨ ਆਡੀਓ ਸਿਸਟਮ ਐਪ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"ਅਕਿਰਿਆਸ਼ੀਲ ਕਰੋ ਅਤੇ ਅਣਸਥਾਪਤ ਕਰੋ"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"ਇਸ ਵਾਹਨ ਆਡੀਓ ਸਿਸਟਮ ਐਪ ਨੂੰ ਅਕਿਰਿਆਸ਼ੀਲ ਕਰੋ"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"ਹੋਰ ਵੇਰਵੇ"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"ਸੰਸਥਾ ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਇਜਾਜ਼ਤਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਅਤੇ ਵਾਹਨ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਸਮੇਤ ਇਸ ਪ੍ਰੋਫਾਈਲ ਨਾਲ ਸੰਬੰਧਿਤ ਐਪਾਂ ਅਤੇ ਡਾਟੇ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"ਸੰਸਥਾ ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਇਜਾਜ਼ਤਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਅਤੇ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਸਮੇਤ ਇਸ ਪ੍ਰੋਫਾਈਲ ਨਾਲ ਸੰਬੰਧਿਤ ਐਪਾਂ ਅਤੇ ਡਾਟੇ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"ਸੰਸਥਾ ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਇਜਾਜ਼ਤਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਅਤੇ ਵਾਹਨ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਸਮੇਤ ਇਸ ਵਾਹਨ ਆਡੀਓ ਸਿਸਟਮ ਨਾਲ ਸੰਬੰਧਿਤ ਐਪਾਂ ਅਤੇ ਡਾਟੇ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"ਸੰਸਥਾ ਪ੍ਰਬੰਧਕ ਸ਼ਾਇਦ ਇਸ ਵਾਹਨ ਆਡੀਓ ਸਿਸਟਮ ਨਾਲ ਸੰਬੰਧਿਤ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦਾ ਹੈ, ਐਪਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਇਸ ਵਾਹਨ ਦੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹੈ।"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ਇਹ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"ਇਸ ਪ੍ਰਬੰਧਿਤ ਵਾਹਨ ਵਿੱਚ ਅਵਾਜ਼ ਨੂੰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"ਇਸ ਪ੍ਰਬੰਧਿਤ ਵਾਹਨ ਵਿੱਚ ਕਾਲਾਂ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"ਇਸ ਪ੍ਰਬੰਧਿਤ ਵਾਹਨ ਵਿੱਚ SMS ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"ਇਸ ਪ੍ਰਬੰਧਿਤ ਵਾਹਨ ਵਿੱਚ ਕੈਮਰਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"ਇਸ ਪ੍ਰਬੰਧਿਤ ਵਾਹਨ ਵਿੱਚ ਇਨ੍ਹਾਂ ਸਕ੍ਰੀਨਸ਼ਾਟਾਂ ਨੂੰ ਖੋਲ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"ਇਸ ਪ੍ਰਬੰਧਿਤ ਵਾਹਨ ਵਿੱਚ ਇਸ ਐਪ ਨੂੰ ਖੋਲ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"ਤੁਹਾਡੇ ਕ੍ਰੈਡਿਟ ਪ੍ਰਦਾਨਕ ਨੇ ਬਲਾਕ ਕੀਤੀ"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸੰਸਥਾ ਵੱਲੋਂ ਸੀਮਤ ਕੀਤਾ ਗਿਆ ਹੈ।\n\nਜੇ ਤੁਹਾਡਾ ਕੋਈ ਸਵਾਲ ਹੈ, ਤਾਂ ਸੰਸਥਾ ਦੇ ਪ੍ਰਬੰਧਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"ਵਾਹਨ ਪ੍ਰਸ਼ਾਸਕ ਐਪਾਂ"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# ਕਿਰਿਆਸ਼ੀਲ ਕੀਤੀ ਐਪ}one{# ਕਿਰਿਆਸ਼ੀਲ ਕੀਤੀ ਐਪ}other{# ਕਿਰਿਆਸ਼ੀਲ ਕੀਤੀਆਂ ਐਪਾਂ}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"ਕੋਈ ਕਿਰਿਆਸ਼ੀਲ ਕੀਤੀ ਐਪ ਨਹੀਂ"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਵਾਹਨ ਨੀਤੀ"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"ਸੰਸਥਾ ਪ੍ਰਬੰਧਕ ਵੱਲੋਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> ਬਾਰੇ ਹੋਰ ਜਾਣੋ"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"ਕੀ ਬੱਗ ਰਿਪੋਰਟ ਸਾਂਝੀ ਕਰਨੀ ਹੈ?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"ਇਸ ਵਾਹਨ ਦੇ ਸੰਸਥਾ ਪ੍ਰਬੰਧਕ ਨੇ ਇਸ ਡੀਵਾਈਸ ਦੀ ਸਮੱਸਿਆ ਦਾ ਨਿਪਟਾਰਾ ਕਰਨ ਵਿੱਚ ਮਦਦ ਲਈ ਬੱਗ ਰਿਪੋਰਟ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਐਪਾਂ ਅਤੇ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"ਇਸ ਵਾਹਨ ਦੇ ਸੰਸਥਾ ਪ੍ਰਬੰਧਕ ਨੇ ਇਸ ਡੀਵਾਈਸ ਦੀ ਸਮੱਸਿਆ ਦਾ ਨਿਪਟਾਰਾ ਕਰਨ ਵਿੱਚ ਮਦਦ ਲਈ ਬੱਗ ਰਿਪੋਰਟ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਐਪਾਂ ਅਤੇ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਅਤੇ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਕੁਝ ਸਮੇਂ ਲਈ ਹੌਲੀ ਹੋ ਸਕਦਾ ਹੈ।"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"ਇਸ ਬੱਗ ਰਿਪੋਰਟ ਨੂੰ ਇਸ ਵਾਹਨ ਦੇ ਸੰਸਥਾ ਪ੍ਰਬੰਧਕ ਨਾਲ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। ਹੋਰ ਵੇਰਵਿਆਂ ਲਈ ਉਨ੍ਹਾਂ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"ਸਾਂਝੀ ਕਰੋ"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"ਅਸਵੀਕਾਰ ਕਰੋ"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"ਫ਼ਿਲਹਾਲ ਇਹ ਸੈਟਿੰਗ ਬਦਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ਪਹੁੰਚਯੋਗਤਾ"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"ਸੁਰਖੀਆਂ"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"ਸੁਰਖੀ ਸੰਬੰਧੀ ਤਰਜੀਹਾਂ"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ਬੰਦ"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ਚਾਲੂ"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"ਸਕ੍ਰੀਨ ਰੀਡਰ"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"ਸੁਰਖੀਆਂ ਦਿਖਾਓ"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ਲਿਖਤ ਦਾ ਆਕਾਰ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"ਸੁਰਖੀ ਦਾ ਆਕਾਰ ਅਤੇ ਸਟਾਈਲ"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"ਬਹੁਤ ਛੋਟਾ"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"ਛੋਟਾ"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ਪੂਰਵ-ਨਿਰਧਾਰਿਤ"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ਵੱਡਾ"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ਬਹੁਤ ਵੱਡਾ"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"ਸੁਰਖੀ ਦਾ ਸਟਾਈਲ"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ਐਪ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"ਕਾਲੇ ਬੈਕਗ੍ਰਾਊਂਡ ਉੱਤੇ ਸਫ਼ੈਦ ਲਿਖਤ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"ਸਫ਼ੈਦ ਬੈਕਗ੍ਰਾਊਂਡ ਉੱਤੇ ਕਾਲੀ ਲਿਖਤ"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"ਕਾਲੇ ਬੈਕਗ੍ਰਾਊਂਡ ਉੱਤੇ ਪੀਲੀ ਲਿਖਤ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"ਨੀਲੇ ਬੈਕਗ੍ਰਾਊਂਡ ਉੱਤੇ ਪੀਲੀ ਲਿਖਤ"</string>
</resources>
diff --git a/res/values-pl/arrays.xml b/res/values-pl/arrays.xml
index a1b7498..844b363 100644
--- a/res/values-pl/arrays.xml
+++ b/res/values-pl/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nigdy nie zezwalaj"</item>
<item msgid="1154273129608299386">"Zawsze zezwalaj"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 5000ccb..0bdd6e4 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -27,12 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Tryb nocny"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Sieć i internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Sieć komórkowa"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> karty SIM</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> kart SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> karty SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> karta SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# karta SIM}few{# karty SIM}many{# kart SIM}other{# karty SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktywna / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Nieaktywna / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktywna / Pobrana karta SIM"</string>
@@ -40,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Dodaj więcej"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dane mobilne"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Korzystaj z danych przy użyciu sieci komórkowej"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Sieć komórkowa"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Użyj mobilnej transmisji danych"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Wyłączyć mobilną transmisję danych?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Musisz wybrać kartę"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Użyć: <xliff:g id="CARRIER">%1$s</xliff:g> do transmisji danych?"</string>
@@ -55,12 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Ostrzeżenie dotyczące danych: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Limit danych: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Ostrzeżenie dotyczące danych: <xliff:g id="ID_1">^1</xliff:g> / limit danych: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="few">%d dni do końca</item>
- <item quantity="many">%d dni do końca</item>
- <item quantity="other">%d dnia do końca</item>
- <item quantity="one">%d dzień do końca</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Pozostał # dzień}few{Pozostały # dni}many{Pozostało # dni}other{Pozostało # dnia}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Upłynął cały czas"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Mniej niż dzień do końca"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Zaktualizowano <xliff:g id="ID_2">^2</xliff:g> temu (<xliff:g id="ID_1">^1</xliff:g>)"</string>
@@ -75,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Ustaw"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Ostrzeżenie dotyczące danych i limit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cykl użycia danych w aplikacjach"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Użycie mobilnej transmisji danych"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Ustaw ostrzeżenie dotyczące danych"</string>
<string name="data_warning" msgid="116776633806885370">"Ostrzeżenie dotyczące danych"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Ustaw limit danych"</string>
@@ -83,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Po osiągnięciu ustawionego przez Ciebie limitu serwer pojazdu wyłączy mobilną transmisję danych.\n\nPonieważ transmisję danych mierzy serwer i może to robić inaczej niż operator, dobrze jest ustawić mniejszy limit."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Ustawianie ostrzeżenia o użyciu danych"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Ustawianie limitu użycia danych"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Użycie danych jest mierzone przez urządzenie. Może się różnić w zależności od połączenia danych operatora komórkowego."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Ustaw"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Zapisz"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Sieć OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet w pojeździe"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Wyłączenie internetu w pojeździe może uniemożliwić działanie jego niektórych funkcji lub aplikacji.\n\nNajważniejsze dane wymagane do obsługi pojazdu będą nadal udostępniane jego producentowi."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Wyłącz mimo to"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet w pojeździe jest wyłączony. Może to uniemożliwić działanie jego niektórych funkcji lub aplikacji. Najważniejsze dane wymagane do obsługi pojazdu będą nadal udostępniane jego producentowi."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Zużyto %1$s od %2$s do %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Połącz się z inną siecią"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Ustawienia sieci"</string>
@@ -98,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj sieć"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Połącz"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Łączę…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nie połączono"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Poza zasięgiem sieci"</string>
<string name="wifi_password" msgid="5565632142720292397">"Hasło"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Pokaż hasło"</string>
@@ -159,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wybierz co najmniej jedno pasmo dla hotspota Wi-Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot i tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Wyłączono"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Automatycznie wyłącz hotspot"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Hotspot Wi‑Fi wyłączy się, jeśli nie ma z nim połączonych żadnych urządzeń"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> chce włączyć Wi-Fi"</string>
@@ -301,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Wymuś zatrzymanie"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Wymusić zatrzymanie?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Jeśli wymusisz zatrzymanie aplikacji, może ona zadziałać nieprawidłowo."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Wyłączyć ochronę wydajności?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Jeśli to zrobisz, sprzęt i oprogramowanie mogą działać gorzej."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Pozostaw włączoną"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Wyłącz"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Włączyć zwiększoną wydajność aplikacji?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Włączenie tego ustawienia może spowodować niestabilne działanie systemu, a w dalszej perspektywie wpływać na komponenty sprzętowe. Czy chcesz kontynuować?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Tak"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nie, dziękuję"</string>
<string name="disable_text" msgid="4358165448648990820">"Wyłącz"</string>
<string name="enable_text" msgid="1794971777861881238">"Włącz"</string>
<string name="uninstall_text" msgid="277907956072833012">"Odinstaluj"</string>
@@ -314,29 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Uprawnienia"</string>
<string name="notifications_label" msgid="6586089149665170731">"Powiadomienia"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Miejsce na dane i pamięć podręczna"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Dbaj o wydajność"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Zwiększona wydajność aplikacji"</string>
<string name="application_version_label" msgid="8556889839783311649">"Wersja %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Brak przyznanych uprawnień"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Brak próśb o przyznanie uprawnień"</string>
<string name="unused_apps" msgid="648471933781010395">"Nieużywane aplikacje"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> nieużywane aplikacje</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> nieużywanych aplikacji</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> nieużywanej aplikacji</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> nieużywana aplikacja</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# nieużywana aplikacja}few{# nieużywane aplikacje}many{# nieużywanych aplikacji}other{# nieużywanej aplikacji}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Usuń uprawnienia i zwolnij miejsce"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s w pamięci wewnętrznej"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Zamykaj aplikacje, by zmniejszyć zużycie"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Wykorzystuje więcej zasobów systemu do uzyskania większej wydajności aplikacji"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Użycie danych"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Aplikacja – użycie danych"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historia użycia danych"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Wszystkie aplikacje"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Użycie danych i Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historia użycia danych"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Całkowite użycie"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Na pierwszym planie"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"W tle"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Zezwól na użycie danych"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Zezwól aplikacji na mobilną transmisję danych"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Ogranicz użycie danych"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Używaj danych mobilnych tylko w aplikacji na pierwszym planie"</string>
<string name="computing_size" msgid="5791407621793083965">"Przetwarzam…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatkowe uprawnienia</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> dodatkowych uprawnień</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatkowego uprawnienia</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dodatkowe uprawnienie</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# dodatkowe uprawnienie}few{# dodatkowe uprawnienia}many{# dodatkowych uprawnień}other{# dodatkowego uprawnienia}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Uwaga: po restarcie ta aplikacja będzie mogła się uruchomić dopiero po odblokowaniu pojazdu."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asystent i rozpoznawanie mowy"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplikacja asystująca"</string>
@@ -393,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Sterowanie Wi-Fi pozwala aplikacji na włączanie i wyłączanie Wi-Fi, wyszukiwanie sieci Wi-Fi i łączenie się z nimi, dodawanie oraz usuwanie sieci i uruchamianie lokalnego hotspota."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Więcej"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lokalizacja"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Włącz lokalizację"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Zezwól określonym aplikacjom na dostęp do lokalizacji"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Jeśli to wyłączysz, dostęp do lokalizacji stracą wszystkie aplikacje. Aplikacje do wspomagania kierowcy nadal będą mieć dostęp."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Funkcje wspomagania kierowcy mogą używać lokalizacji"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Lokalizacja pojazdu jest wyłączona"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Aplikacje wspomagające kierowcę nie mają dostępu do Twojej lokalizacji"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Zmień"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Zezwól aplikacjom wspomagającym kierowcę na dostęp do lokalizacji"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Jeśli to wyłączysz, aplikacje do wspomagania kierowcy korzystające z informacji o lokalizacji również zostaną wyłączone."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Wyłącz mimo to"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Ostatnie prośby o lokalizację"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Brak ostatnich próśb o lokalizację"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Uprawnienia na poziomie aplikacji"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Usługi lokalizacyjne"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Używaj lokalizacji"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Lokalizacja może używać takich źródeł jak GPS, sieci Wi-Fi i komórkowe oraz czujniki, aby łatwiej określać lokalizację urządzenia."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Funkcje wspomagania kierowcy"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Informacje o lokalizacji wysłane do aplikacji wspomagających kierowcę nie zawierają danych, które pozwalają Cię zidentyfikować. Są one przechowywane maksymalnie przez 2 dni. Potem zostają usunięte."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Używaj mikrofonu"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Pozwól wszystkim aplikacjom na dostęp do mikrofonu"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Zarządzaj dostępem do mikrofonu"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Ostatnie użycie"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Brak ostatnio uruchomionych aplikacji"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Żadna aplikacja nie ma dostępu"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Dostęp ma # z {total_count} aplikacji}few{Dostęp mają # z {total_count} aplikacji}many{Dostęp ma # z {total_count} aplikacji}other{Dostęp ma # z {total_count} aplikacji}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Ostatnie użycie"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Wyświetl wszystko"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Ładuję…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Aktualizacje systemu"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Zaawansowane"</string>
@@ -437,12 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licencje innych firm"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Wystąpił problem z wczytaniem licencji."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Ładuję…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="few">Od zostania programistą dzielą Cię już tylko <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroki.</item>
- <item quantity="many">Od zostania programistą dzieli Cię już tylko <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroków.</item>
- <item quantity="other">Od zostania programistą dzieli Cię już tylko <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroku.</item>
- <item quantity="one">Od zostania programistą dzieli Cię już tylko <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> krok.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Od włączenia trybu programisty dzieli Cię już tylko # krok.}few{Od włączenia trybu programisty dzielą Cię już tylko # kroki.}many{Od włączenia trybu programisty dzieli Cię już tylko # kroków.}other{Od włączenia trybu programisty dzieli Cię już tylko # kroku.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Jesteś teraz programistą."</string>
<string name="show_dev_already" msgid="1678087328973865736">"W porządku, jesteś już programistą."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opcje programisty"</string>
@@ -511,16 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Gdy utworzysz nowy profil, jego użytkownik powinien dostosować go do swoich potrzeb."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Każdy profil może aktualizować aplikacje używane przez inne profile."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Osiągnięto limit liczby profili"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="few">Możesz utworzyć maksymalnie <xliff:g id="COUNT">%d</xliff:g> profile.</item>
- <item quantity="many">Możesz utworzyć maksymalnie <xliff:g id="COUNT">%d</xliff:g> profili.</item>
- <item quantity="other">Możesz utworzyć maksymalnie <xliff:g id="COUNT">%d</xliff:g> profilu.</item>
- <item quantity="one">Możesz utworzyć tylko 1 profil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Możesz utworzyć tylko 1 profil.}few{Możesz utworzyć maksymalnie # profile.}many{Możesz utworzyć maksymalnie # profili.}other{Możesz utworzyć maksymalnie # profilu.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Nie udało się utworzyć nowego profilu"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Usunąć ten profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Wszystkie aplikacje i dane z tego profilu zostaną usunięte"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Nie udało się usunąć profilu"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil nie został usunięty. Uruchom ponownie urządzenie i spróbuj jeszcze raz."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ten profil zostanie usunięty, gdy przełączysz się na inny profil lub ponownie uruchomisz pojazd."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Zamknij"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Ponów"</string>
@@ -633,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Jak narysować wzór odblokowania"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Błąd podczas zapisywania wzoru"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Zbyt wiele nieudanych prób. Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Wzór nie obsługuje pokrętła, użyj dotyku"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Usunąć blokadę ekranu?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Każdy będzie mógł mieć dostęp do Twojego konta"</string>
@@ -664,42 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Popularne kody PIN zostały zablokowane przez administratora. Użyj innego kodu PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Nie może zawierać nieprawidłowego znaku."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Hasło jest nieprawidłowe. Musisz użyć co najmniej czterech znaków."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="few">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> litery</item>
- <item quantity="many">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> liter</item>
- <item quantity="other">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> litery</item>
- <item quantity="one">Musi zawierać co najmniej 1 literę</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="few">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> małe litery</item>
- <item quantity="many">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> małych liter</item>
- <item quantity="other">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> małej litery</item>
- <item quantity="one">Musi zawierać co najmniej 1 małą literę</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="few">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> wielkie litery</item>
- <item quantity="many">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> wielkich liter</item>
- <item quantity="other">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> wielkiej litery</item>
- <item quantity="one">Musi zawierać co najmniej 1 wielką literę</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="few">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> cyfry</item>
- <item quantity="many">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> cyfr</item>
- <item quantity="other">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> cyfry</item>
- <item quantity="one">Musi zawierać co najmniej 1 cyfrę</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="few">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> symbole specjalne</item>
- <item quantity="many">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> symboli specjalnych</item>
- <item quantity="other">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> symbolu specjalnego</item>
- <item quantity="one">Musi zawierać co najmniej 1 symbol specjalny</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="few">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> znaki niebędące literami</item>
- <item quantity="many">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> znaków niebędących literami</item>
- <item quantity="other">Musi zawierać co najmniej <xliff:g id="COUNT">%d</xliff:g> znaku niebędącego literą</item>
- <item quantity="one">Musi zawierać co najmniej 1 znak niebędący literą</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Administrator urządzenia nie zezwala na ustawianie niedawno używanego hasła"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Błąd podczas zapisywania hasła"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Popularne hasła zostały zablokowane przez administratora. Użyj innego hasła."</string>
@@ -742,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Dodaj profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Usuń ten profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Dodaj profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Jasność wyświetlacza"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Aby zobaczyć urządzenia, włącz Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Aby sparować urządzenie, otwórz ustawienia Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrator systemu multimedialno-rozrywkowego"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aplikacje aktywowane"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Aplikacje dezaktywowane"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplikacje z tymi uprawnieniami mają dostęp do danych tego pojazdu"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"W pojeździe nie ma żadnych aplikacji administratora"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Aplikacja do administrowania systemem multimedialno-rozrywkowym jest aktywna i pozwala aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> wykonywać te działania:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Aktywowanie tej aplikacji systemu multimedialno-rozrywkowego pozwoli aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na wykonywanie tych działań:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktywować tę aplikację?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktywuj tę aplikację systemu multimedialno-rozrywkowego"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Dezaktywuj i odinstaluj"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Dezaktywuj tę aplikację systemu multimedialno-rozrywkowego"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Więcej szczegółów"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Menedżer organizacji może monitorować aplikacje i dane powiązane z tym profilem (w tym ustawienia, uprawnienia, firmowe uprawnienia dostępu, aktywność w sieci i informacje o lokalizacji pojazdu) oraz nimi zarządzać."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Menedżer organizacji może monitorować aplikacje i dane powiązane z tym profilem służbowym (w tym ustawienia, uprawnienia, firmowe uprawnienia dostępu, aktywność w sieci i informacje o lokalizacji urządzenia) oraz nimi zarządzać."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Menedżer organizacji może monitorować aplikacje i dane powiązane z tym systemem multimedialno-rozrywkowym (w tym ustawienia, uprawnienia, firmowe uprawnienia dostępu, aktywność w sieci i informacje o lokalizacji pojazdu) oraz nimi zarządzać."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Menedżer organizacji może uzyskiwać dostęp do danych powiązanych z tym systemem multimedialno-rozrywkowym, zarządzać aplikacjami i zmieniać ustawienia tego pojazdu."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"To ustawienie jest niedostępne"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"W tym zarządzanym pojeździe nie można zmieniać głośności"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"W tym zarządzanym pojeździe nie można nawiązywać połączeń"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"W tym zarządzanym pojeździe nie można korzystać z SMS-ów"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera nie jest dostępna w tym zarządzanym pojeździe"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"W tym zarządzanym pojeździe nie można robić zrzutów ekranu"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"W tym zarządzanym pojeździe nie można otworzyć tej aplikacji"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Zablokowane przez operatora udzielającego kredytu"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Organizacja zablokowała dostęp do niektórych funkcji.\n\nJeśli masz pytania, skontaktuj się z kierownikiem."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Aplikacje administratora pojazdu"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktywowana aplikacja}few{# aktywowane aplikacje}many{# aktywowanych aplikacji}other{# aktywowanej aplikacji}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Brak aktywowanych aplikacji"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Zasady dotyczące pojazdów w organizacji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Ustawienia zarządzane przez menedżera organizacji"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Więcej informacji: <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Udostępnić raport o błędzie?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Menedżer organizacji zarządzającej tym pojazdem poprosił o raport o błędzie, który pomoże w rozwiązaniu problemów z tym urządzeniem. Raport może zawierać informacje o aplikacjach i inne dane."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Menedżer organizacji zarządzającej tym pojazdem poprosił o raport o błędzie, który pomoże w rozwiązaniu problemów z tym urządzeniem. Raport może zawierać informacje o aplikacjach i inne dane, a urządzenie może przez chwilę działać wolniej."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Raport o błędzie jest udostępniany administratorowi organizacji zarządzającej tym pojazdem. Aby dowiedzieć się więcej, skontaktuj się z administratorem."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Udostępnij"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Odrzuć"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Nie można teraz zmienić tego ustawienia"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Ułatwienia dostępu"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Napisy"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Ustawienia napisów"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Wyłączono"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Włączono"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Czytnik ekranu"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Pokazuj napisy"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Rozmiar tekstu"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Rozmiar i styl napisów"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Bardzo mały"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Mały"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Domyślny"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Duży"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Bardzo duży"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Styl napisów"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Ustawiony przez aplikację"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Biały na czarnym"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Czarny na białym"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Żółty na czarnym"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Żółty na niebieskim"</string>
</resources>
diff --git a/res/values-pt-rPT/arrays.xml b/res/values-pt-rPT/arrays.xml
index ffa51f0..1c99eaa 100644
--- a/res/values-pt-rPT/arrays.xml
+++ b/res/values-pt-rPT/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nunca permitir"</item>
<item msgid="1154273129608299386">"Permitir sempre"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 30d0b60..69c7533 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Modo noturno"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Rede e Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Rede móvel"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}one{# SIM(s)}other{# SIMs}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Ativo/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inativo/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Ativo/SIM transferido"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Adicione mais"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dados móveis"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Aceder aos dados através de rede móvel"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Rede móvel"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Utilizar dados móveis"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Pretende desativar os dados móveis?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"A seleção é necessária."</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Utilizar <xliff:g id="CARRIER">%1$s</xliff:g> para dados móveis?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Aviso de dados de <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Limite de dados de <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Aviso de dados de <xliff:g id="ID_1">^1</xliff:g>/limite de dados de <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d dia restante</item>
- <item quantity="other">%d dias restantes</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Falta # dia}one{Falta(m) # dia(s)}other{Faltam # dias}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Sem tempo restante"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Resta menos de 1 dia"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Atualizado por <xliff:g id="ID_1">^1</xliff:g> há <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Definir"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Limite e aviso de dados"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de utilização de dados da app"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Utilização de dados móveis"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Definir aviso de dados"</string>
<string name="data_warning" msgid="116776633806885370">"Aviso de dados"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Definir limite de dados"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"A unidade principal do seu veículo desativa os dados móveis quando alcança o limite definido.\n\nUma vez que a utilização de dados é medida pela unidade principal e o seu operador pode calcular a utilização de forma diferente, considere definir um limite de precaução."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Defina o aviso de utilização de dados"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Defina o limite de utilização de dados"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"A utilização de dados é medida pelo seu dispositivo. Pode ser diferente dos dados do operador móvel."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Definir"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Guardar"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Rede OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet do veículo"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Desativar a Internet do veículo pode impedir o funcion. de funcionalidades/apps do mesmo.\n\nOs dados críticos necessários p/ operar o veículo continuam a ser partilhados c/ o fabricante do mesmo."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Desativar mesmo assim"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"A Internet do veículo está desativada. Isto pode impedir o funcionamento de algumas funcionalidades ou apps do veículo. Os dados críticos necessários para operar o veículo continuam a ser partilhados com o fabricante do mesmo."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s utilizado(s) %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Aderir a outra rede"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferências de rede"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Adicionar rede"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Ligar"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"A ligar…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Não ligado"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"A rede não está ao alcance"</string>
<string name="wifi_password" msgid="5565632142720292397">"Palavra-passe"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Mostrar palavra-passe"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Selecione, pelo menos, uma banda para a zona Wi-Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Zona Wi-Fi e ligação via telemóvel"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Zona Wi-Fi"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Desligada"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Desative a zona Wi-Fi automaticamente"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"A zona Wi‑Fi será desativada se não forem ligados quaisquer dispositivos."</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"A aplicação <xliff:g id="REQUESTER">%s</xliff:g> pretende ativar o Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Forçar paragem"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Pretende forçar a paragem?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Se forçar a paragem de uma aplicação, esta poderá apresentar um comportamento anormal."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Desativar a proteção do desempenho?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Se o fizer, o software e o hardware podem não funcionar tão bem."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Deixar ativado"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Desativar"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Ativar priorização do desempenho da app?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Ativá-lo pode causar uma instabilidade potencial do sistema ou um impacto no harware a longo prazo. Pretende continuar?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Sim"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Não"</string>
<string name="disable_text" msgid="4358165448648990820">"Desativar"</string>
<string name="enable_text" msgid="1794971777861881238">"Ativar"</string>
<string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Autorizações"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notificações"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Armazenamento e cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Garantir máx. desemp."</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Dar prioridade ao desempenho da app"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versão: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nenhuma autorização concedida."</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nenhuma autorização solicitada."</string>
<string name="unused_apps" msgid="648471933781010395">"Apps não utilizadas"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app não utilizada</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps não utilizadas</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# app não utilizada}one{# app(s) não utilizada(s)}other{# apps não utilizadas}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Remover autorizações e libertar espaço"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s de memória de armazenamento interno"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Quando necessário, feche a app e evite sobreutilizar recursos"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Utiliza os recursos do sistema para dar prioridade ao desempenho da app"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Utilização de dados"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Utiliz. dados da app"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Histórico de utilização"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Todas as apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Utilização de dados/Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Histórico de utilização"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Utilização total"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Em primeiro plano"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Em segundo plano"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Permitir dados"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Permitir que esta app utilize dados móveis"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restringir dados"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Usar dados móveis só com a app em primeiro plano"</string>
<string name="computing_size" msgid="5791407621793083965">"A calcular…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> autorização adicional.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorizações adicionais.</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# autorização adicional}one{# autorização(ões) adicional(ais)}other{# autorizações adicionais}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Nota: após reiniciar, só é possível iniciar esta aplicação quando o veículo for desbloqueado."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistente e entrada de texto por voz"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"App de assistência"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"O controlo de Wi-Fi permite a uma aplicação ativar ou desativar o Wi-Fi, procurar e estabelecer ligação a redes Wi-Fi, adicionar ou remover redes, assim como iniciar uma zona Wi-Fi apenas local."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Mais"</string>
<string name="location_settings_title" msgid="901334356682423679">"Localização"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Utilizar a localização"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Permita que certas apps acedam à localização"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Se desativar esta opção, remove o acesso à localização para todas as apps. As apps de assistência ao condutor continuam a ter acesso."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Utilizar localiz. p/ assist. ao condutor"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"A localização do veículo está desativada"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Apps de ass. ao cond. sem acesso à loc."</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Alterar"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Permita que apps de assistência à condução acedam à localização"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Se desativar esta opção, as apps de assistência ao condutor que dependem de informações de localização serão desativadas."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Desativar mesmo assim"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Pedidos de localização recentes"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Sem pedidos de localização recentes."</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Autorizações de nível de app"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Serviços de localização"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Utilizar localização"</string>
<string name="location_settings_footer" msgid="296892848338100051">"A localização pode utilizar fontes como o GPS, o Wi‑Fi, as redes móveis e os sensores para ajudar a calcular a localização do seu dispositivo."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Assistência ao condutor"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"As informações de localização enviadas para as apps de assistência ao condutor não incluem informações de identificação. São armazenadas durante um período máximo de 2 dias antes de serem eliminadas."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microfone"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Utilizar microfone"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Permitir que todas as apps acedam ao microfone"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Gerir autorizações do microfone"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Acedido recentemente"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nenhuma app recente"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 apps têm acesso"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# de {total_count} apps tem acesso}one{# de {total_count} apps tem(têm) acesso}other{# de {total_count} apps têm acesso}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Acedido recentemente"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Ver tudo"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"A carregar…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Atualizações do sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Avançadas"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licenças de terceiros"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ocorreu um problema ao carregar as licenças."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"A carregar…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Está agora a <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> passo de se tornar um programador.</item>
- <item quantity="other">Está agora a <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> passos de se tornar um programador.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Está agora a # passo de se tornar um programador.}one{Está agora a # passo(s) de se tornar um programador.}other{Está agora a # passos de se tornar um programador.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Agora é um programador!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Não é necessário, já é um programador."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opções de programador"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Depois de criar um novo perfil, deve ser a pessoa em questão a personalizá-lo."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"As apps podem ser atualizadas a partir de qualquer perfil para utilização por todos os perfis."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Limite de perfis atingido"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Apenas pode criar um perfil.</item>
- <item quantity="other">Pode criar até <xliff:g id="COUNT">%d</xliff:g> perfis.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Apenas pode criar um perfil.}one{Pode criar até # perfil(is).}other{Pode criar até # perfis.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Não foi possível criar um perfil novo"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Pretende eliminar este perfil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Todos os dados e apps deste perfil serão eliminados"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Não foi possível eliminar o perfil."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Perfil não eliminado. Pode reiniciar o dispositivo e repetir."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Este perfil vai ser eliminado quando mudar de perfil ou arrancar novamente o veículo"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignorar"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Tentar novamente"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Como desenhar um padrão de desbloqueio"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Erro ao guardar o padrão."</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Demasiadas tentativas incorretas. Tente novamente dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Padrão s/ sup. de rot.; utilize o toque"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Remover o bloqueio de ecrã?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Desta forma, qualquer pessoa pode aceder à sua conta."</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Os PINs comuns estão bloqueados pelo seu Administrador de TI. Experimente outro PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Não pode incluir um caráter inválido."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Palavra-passe inválida. Tem de ter, pelo menos, 4 carateres."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Tem de incluir, pelo menos, 1 letra.</item>
- <item quantity="other">Tem de incluir, pelo menos, <xliff:g id="COUNT">%d</xliff:g> letras.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Tem de incluir, pelo menos, 1 letra minúscula.</item>
- <item quantity="other">Tem de incluir, pelo menos, <xliff:g id="COUNT">%d</xliff:g> letras minúsculas.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Tem de incluir, pelo menos, 1 letra maiúscula.</item>
- <item quantity="other">Tem de incluir, pelo menos, <xliff:g id="COUNT">%d</xliff:g> letras maiúsculas.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Tem de incluir, pelo menos, 1 dígito numérico.</item>
- <item quantity="other">Tem de incluir, pelo menos, <xliff:g id="COUNT">%d</xliff:g> dígitos numéricos.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Tem de incluir, pelo menos, 1 símbolo especial.</item>
- <item quantity="other">Tem de incluir, pelo menos, <xliff:g id="COUNT">%d</xliff:g> símbolos especiais.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Tem de incluir, pelo menos, 1 caráter que não seja uma letra.</item>
- <item quantity="other">Tem de incluir, pelo menos, <xliff:g id="COUNT">%d</xliff:g> carateres que não sejam letras.</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"O admin. do disp. não permite a utilização de uma palavra-passe recente."</string>
<string name="error_saving_password" msgid="8334882262622500658">"Erro ao guardar a palavra-passe."</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"As palavras-passe comuns estão bloqueadas pelo seu Administrador de TI. Experimente outra palavra-passe."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Adicionar um perfil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Eliminar este perfil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Adicionar perfil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Brilho do ecrã"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Para ver os seus dispositivos, ative o Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Para sincronizar um dispositivo, abra as definições de Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrador do sistema de infoentretenimento"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Apps ativadas"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Apps desativadas"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"As apps com esta autorização têm acesso aos dados deste veículo"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nenhuma app de administrador do veículo"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Esta app de administrador do sistema de infoentretenimento está ativa e permite que a app <xliff:g id="APP_NAME">%1$s</xliff:g> execute as seguintes operações:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"A ativação desta app de sistema de infoentretenimento permite que a app <xliff:g id="APP_NAME">%1$s</xliff:g> execute as seguintes operações:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Ativar app de sistema infoentretenimen.?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Ativar esta app de sistema de infoentretenimento"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Desativar e desinstalar"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Desativar esta app de sistema de infoentretenimento"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Mais detalhes"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"O gestor da organização pode monitorizar e gerir as apps e os dados associados a este perfil, incluindo as definições, as autorizações, o acesso empresarial, a atividade da rede e as informações de localização do veículo."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"O gestor da organização pode monitorizar e gerir as apps e os dados associados a este perfil, incluindo as definições, as autorizações, o acesso empresarial, a atividade da rede e as informações de localização do dispositivo."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"O gestor da organização pode monitorizar e gerir as apps e os dados associados a este sistema de infoentretenimento, incluindo as definições, as autorizações, o acesso empresarial, a atividade da rede e as informações de localização do veículo."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"O gestor da organização pode conseguir aceder aos dados associados a este sistema de infoentretenimento, gerir apps e alterar as definições deste veículo."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Está indisponível"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Não é possível alterar o volume neste veículo gerido"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Não é possível efetuar chamadas neste veículo gerido"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Os SMS não são permitidos neste veículo gerido"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"A câmara não está disponível neste veículo gerido"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Não é possível fazer capturas de ecrã neste veículo gerido"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Não é possível abrir esta app neste veículo gerido"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Bloqueada pelo seu fornecedor de crédito"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"O acesso a algumas funcionalidades está limitado pela organização.\n\nSe tiver dúvidas, contacte o gestor da mesma."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Apps de administrador de veículos"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# app ativada}one{# app(s) ativada(s)}other{# apps ativadas}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nenhuma app ativada"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Política de veículos da organização <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Definições geridas pelo gestor da organização"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Saiba mais sobre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Pretende partilhar o relatório de erro?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"O gestor da organização do veículo solicitou um relatório de erro para ajudar a resolver problemas com este dispositivo. As apps e os dados podem ser partilhados."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"O gestor da organização do veículo solicitou um relatório de erro para ajudar a resolver problemas com este dispositivo. As apps e os dados podem ser partilhados e o dispositivo pode tornar-se temporariamente mais lento."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Este relatório de erro está a ser partilhado com o gestor da organização deste veículo. Contacte-o para obter mais detalhes."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Partilhar"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Recusar"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Não é possível alterar esta definição neste momento"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Acessibilidade"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Legendas"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferências de legendas"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Desativadas"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Ativadas"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Leitor de ecrã"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Mostrar legendas"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Tamanho do texto"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Tamanho e estilo das legendas"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Muito pequeno"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Pequeno"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Predefinição"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Grande"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Muito grande"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Estilo das legendas"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Definido pela app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Branco em preto"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Preto em branco"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Amarelo em preto"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Amarelo em azul"</string>
</resources>
diff --git a/res/values-pt/arrays.xml b/res/values-pt/arrays.xml
index a0a1dd4..fadf00d 100644
--- a/res/values-pt/arrays.xml
+++ b/res/values-pt/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nunca permitir"</item>
<item msgid="1154273129608299386">"Sempre permitir"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 9053559..89a6223 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Modo noturno"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Rede e Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Rede móvel"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> chip</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> chips</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# chip}one{# chip}other{# chips}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Ativo/chip"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inativo/chip"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Ativo/chip transferido por download"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Adicionar mais"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dados móveis"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Acessar os dados pela rede móvel"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Rede móvel"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Usar dados móveis"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Desativar os dados móveis?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"É necessário selecionar uma opção"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Usar <xliff:g id="CARRIER">%1$s</xliff:g> para dados móveis?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Alerta de uso de dados em <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Limite de dados em <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Alerta de uso de dados em <xliff:g id="ID_1">^1</xliff:g> / Limite de dados em <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d dia restante</item>
- <item quantity="other">%d dias restantes</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# dia restante}one{# dia restante}other{# dias restantes}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Não há tempo restante"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Resta menos de um dia"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Atualizado pela <xliff:g id="ID_1">^1</xliff:g> há <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Definir"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Aviso e limite de dados"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de uso de dados do app"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Uso de dados móveis"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Definir alerta de uso de dados"</string>
<string name="data_warning" msgid="116776633806885370">"Alerta de uso de dados"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Definir limite de dados"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"A unidade principal do veículo desativará os dados móveis quando o limite especificado for atingido.\n\nComo o uso de dados é calculado pela unidade principal, e sua operadora pode entender o uso de forma diferente, defina um limite moderado."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Definir aviso de uso de dados"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Definir limite do uso de dados"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"O uso de dados é medido pelo seu dispositivo. Ele pode variar dos dados da sua operadora de celular."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Definir"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Salvar"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Rede OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet do veículo"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Desativar a Internet do veículo pode impedir que alguns recursos ou apps funcionem.\n\nOs dados essenciais necessários para operar o veículo continuarão sendo compartilhados com o fabricante."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Desativar mesmo assim"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"A Internet do veículo está desligada. Isso pode impedir que alguns recursos ou apps funcionem. Os dados essenciais necessários para operar o veículo continuarão sendo compartilhados com o fabricante."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s de dados usados entre %2$s e %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Conectar outra rede"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferências de rede"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Adicionar rede"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Conectar"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Conectando…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Não conectado"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Rede fora do alcance"</string>
<string name="wifi_password" msgid="5565632142720292397">"Senha"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Mostrar senha"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Escolha pelo menos uma banda para o ponto de acesso Wi-Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Ponto de acesso e tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Ponto de acesso"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Desativado"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Desativar ponto de acesso automaticamente"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"O ponto de acesso Wi‑Fi será desativado se nenhum dispositivo for conectado"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> quer ativar o Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Forçar fechamento"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Forçar fechamento?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Se você forçar o fechamento de um app, ele poderá apresentar mau funcionamento."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Desativar a proteção de desempenho?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ao fazer isso, talvez o software e hardware também deixem de funcionar."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Deixar ativado"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Desativar"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Ativar Priorizar o desempenho do app?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"A ativação pode causar instabilidade no sistema ou impacto de longo prazo no hardware. Continuar?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Sim"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Agora não"</string>
<string name="disable_text" msgid="4358165448648990820">"Desativar"</string>
<string name="enable_text" msgid="1794971777861881238">"Ativar"</string>
<string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permissões"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notificações"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Armazenamento e cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Usar desempenho máximo"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Priorizar o desempenho do app"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versão: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nenhuma permissão concedida"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nenhuma permissão solicitada"</string>
<string name="unused_apps" msgid="648471933781010395">"Apps não usados"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> app não usado</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps não usados</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# app não usado}one{# app não usado}other{# apps não usados}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Remover permissões e liberar espaço"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s no armazenamento interno"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Quando necessário, feche o app para evitar o uso excessivo de recursos"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Usa os recursos do sistema para priorizar o desempenho do app"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Uso de dados"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uso de dados do app"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Histórico de uso"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Todos os apps"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Uso de dados e Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Histórico de uso"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Uso total"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Primeiro plano"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Segundo plano"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Permitir dados"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Permitir que esse app use dados móveis"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restringir dados"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Usar dados móveis só com o app em primeiro plano"</string>
<string name="computing_size" msgid="5791407621793083965">"Calculando…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> permissão adicional</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permissões adicionais</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# outra permissão}one{# outra permissão}other{# outras permissões}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Observação: após uma reinicialização, não é possível iniciar este app até que você desbloqueie seu veículo."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistente e entrada de texto por voz"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"App assistivo"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"O controle de Wi-Fi permite que um app ative ou desative o Wi-Fi, verifique redes Wi-Fi e se conecte a elas, adicione ou remova redes, ou inicie um ponto de acesso somente local."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Mais"</string>
<string name="location_settings_title" msgid="901334356682423679">"Local"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Usar local"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Permitir acesso à localização a apps específicos"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Se você desativar essa configuração, o acesso ao local será removido de todos os apps. Os apps de assistência ao motorista manterão o acesso."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Usar local para assistência ao motorista"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"A localização do veículo está desativada"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Apps de assist. ao motorista sem acesso ao local"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Alterar"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Permitir acesso à localização a apps de assistência ao motorista"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Se você desativar essa configuração, os apps de assistência ao motorista que precisam de informações de localização serão desativados."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Desativar mesmo assim"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitações recentes"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nenhuma solicitação recente de local"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permissões no app"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Serviços de localização"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Usar local"</string>
<string name="location_settings_footer" msgid="296892848338100051">"A localização pode usar fontes como GPS, Wi-Fi, redes móveis e sensores para ajudar a estimar o local do dispositivo."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Assistência ao motorista"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"As informações de localização enviadas aos apps de assistência ao motorista não contêm dados que identifiquem você. Elas são armazenadas por no máximo dois dias antes de serem excluídas."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microfone"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Usar o microfone"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Permitir que todos os apps acessem seu microfone"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Gerenciar as permissões de microfone"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Acessado recentemente"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nenhum app recente"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Nenhum app tem acesso"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# app de {total_count} tem acesso}one{# app de {total_count} tem acesso}other{# apps de {total_count} têm acesso}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Acessado recentemente"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Ver tudo"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Carregando…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Atualizações do sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Avançadas"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licenças de terceiros"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ocorreu um problema ao carregar as licenças."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Carregando…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Falta <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> etapa para você se tornar um desenvolvedor.</item>
- <item quantity="other">Faltam <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> etapas para você se tornar um desenvolvedor.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Falta # etapa para você ativar as configurações de desenvolvimento.}one{Falta # etapa para você ativar as configurações de desenvolvimento.}other{Faltam # etapas para você ativar as configurações de desenvolvimento.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Você agora é um desenvolvedor!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Não é necessário. Você já é um desenvolvedor."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opções do desenvolvedor"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Depois que o perfil for criado, o proprietário dele ficará responsável pela customização."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Os apps podem ser atualizados em qualquer perfil para uso em todos os perfis."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Limite de perfis atingido"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Você pode criar até <xliff:g id="COUNT">%d</xliff:g> perfil.</item>
- <item quantity="other">Você pode criar até <xliff:g id="COUNT">%d</xliff:g> perfis.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Só um perfil pode ser criado.}one{Você pode criar até # perfil.}other{Você pode criar até # perfis.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Não foi possível criar um novo perfil"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Excluir este perfil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Todos os apps e dados deste perfil serão excluídos"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Não foi possível excluir o perfil."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"O perfil não foi excluído. Reinicie e tente novamente."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Este perfil será excluído ao trocar de perfis ou reiniciar o sistema do veículo."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Dispensar"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Tentar novamente"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Como desenhar um padrão de desbloqueio"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Erro ao salvar o padrão"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Excesso de tentativas incorretas. Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Sem seletor giratório: use o toque"</string>
<string name="okay" msgid="4589873324439764349">"Ok"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Remover bloqueio de tela?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Qualquer pessoa poderá acessar sua conta"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"PINs comuns foram bloqueados pelo administrador de TI. Tente um PIN diferente."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Não pode incluir um caractere inválido."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Senha inválida. Ela precisa ter pelo menos quatro caracteres."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> letra</item>
- <item quantity="other">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> letras</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> letra minúscula</item>
- <item quantity="other">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> letras minúsculas</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> letra maiúscula</item>
- <item quantity="other">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> letras maiúsculas</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> dígito numérico</item>
- <item quantity="other">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> dígitos numéricos</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> símbolo especial</item>
- <item quantity="other">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> símbolos especiais</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> caractere que não seja letra</item>
- <item quantity="other">Precisa ter pelo menos <xliff:g id="COUNT">%d</xliff:g> caracteres que não sejam letras</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"O administrador do dispositivo não permite usar uma senha recente"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Erro ao salvar a senha"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Senhas comuns foram bloqueadas pelo administrador de TI. Tente uma senha diferente."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Adicionar um perfil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Excluir este perfil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Adicionar perfil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Brilho da tela"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Para ver seus dispositivos, ative o Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Para parear um dispositivo, abra as configurações do Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administrador do sistema de infoentretenimento"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Apps ativados"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Apps desativados"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Os apps com essa permissão têm acesso aos dados do veículo"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nenhum app de administrador do veículo"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Este app de administrador do sistema de infoentretenimento está ativado e permite que o app <xliff:g id="APP_NAME">%1$s</xliff:g> execute as seguintes operações:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"A ativação deste app de sistema de infoentretenimento permitirá que o app <xliff:g id="APP_NAME">%1$s</xliff:g> execute as seguintes operações:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Ativar app de sist. infoentretenimento?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Ativar este app de sistema de infoentretenimento"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Desativar e desinstalar"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Desativar este app de sistema de infoentretenimento"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Mais detalhes"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"O administrador da organização pode monitorar e gerenciar apps e dados associados a este perfil, incluindo configurações, permissões, acesso corporativo, atividade de rede e informações de local do veículo."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"O administrador da organização pode monitorar e gerenciar apps e dados associados a este perfil, incluindo configurações, permissões, acesso corporativo, atividade de rede e informações de local do veículo."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"O administrador da organização pode monitorar e gerenciar apps e dados associados a esse sistema de infoentretenimento, incluindo configurações, permissões, acesso corporativo, atividade de rede e informações de local do veículo."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"O administrador da organização pode acessar dados associados ao sistema de infoentretenimento, gerenciar apps e mudar as configurações do veículo."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Indisponível"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Não é possível mudar o volume neste veículo gerenciado"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Não é possível fazer chamadas neste veículo gerenciado"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Não é permitido o envio de SMS neste veículo gerenciado"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"A câmera está indisponível neste veículo gerenciado"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Não é possível fazer capturas de tela neste veículo gerenciado"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Não é possível abrir este app neste veículo gerenciado"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Configuração bloqueada pelo provedor de crédito"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"O acesso a alguns recursos foi limitado pela organização.\n\nEm caso de dúvidas, entre em contato com o administrador."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Apps de administradores de veículos"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# app ativado}one{# app ativado}other{# apps ativados}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nenhum app ativado"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Política de veículos da <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Configurações gerenciadas pelo administrador da organização"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Saiba mais sobre o serviço <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Compartilhar relatório de bug?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"O administrador da organização deste veículo solicitou um relatório de bug para ajudar a resolver problemas no dispositivo. É possível que apps e dados sejam compartilhados."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"O administrador da organização deste veículo solicitou um relatório de bug para ajudar a resolver problemas no dispositivo. É possível que apps e dados sejam compartilhados, o que pode deixar seu dispositivo temporariamente mais lento."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Este relatório de bug será compartilhado com o administrador da organização do veículo. Entre em contato para mais detalhes."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Compartilhar"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Recusar"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Não é possível mudar essa configuração no momento"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Acessibilidade"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Legendas"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferências de legenda"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Desativada"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Ativada"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Leitor de tela"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Mostrar legendas"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Tamanho do texto"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Tamanho e estilo das legendas"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Muito pequena"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Pequena"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Padrão"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Grande"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Muito grande"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Estilo da legenda"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Definido pelo app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Branco sobre preto"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Preto sobre branco"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Amarelo sobre preto"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Amarelo sobre azul"</string>
</resources>
diff --git a/res/values-ro/arrays.xml b/res/values-ro/arrays.xml
index 3d69bf2..53d419a 100644
--- a/res/values-ro/arrays.xml
+++ b/res/values-ro/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nu permiteți niciodată"</item>
<item msgid="1154273129608299386">"Permiteți întotdeauna"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 34fa69e..96f0868 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -27,11 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Modul noapte"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Rețea și internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Rețea mobilă"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> carduri SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> de carduri SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> carduri SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# card SIM}few{# carduri SIM}other{# de carduri SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Activ/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inactiv/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Activ / SIM descărcat"</string>
@@ -39,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Adăugați mai multe"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Date mobile"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accesați datele folosind rețeaua mobilă"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Rețea mobilă"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Folosiți datele mobile"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Dezactivați datele mobile?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Selectați o opțiune"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Folosiți <xliff:g id="CARRIER">%1$s</xliff:g> pentru date mobile?"</string>
@@ -54,11 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Avertisment pentru date: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Limită de date: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Avertisment pentru date: <xliff:g id="ID_1">^1</xliff:g>/Limită de date: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="few">%d zile rămase</item>
- <item quantity="other">%d de zile rămase</item>
- <item quantity="one">%d zi rămasă</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{A mai rămas # zi}few{Au mai rămas # zile}other{Au mai rămas # de zile}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Nu a mai rămas timp"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"A rămas mai puțin de o zi"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Actualizat de <xliff:g id="ID_1">^1</xliff:g> acum <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -73,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Setați"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Avertisment și limită de date"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Ciclu de utilizare a datelor aplicației"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Utilizarea datelor mobile"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Setați avertisment pentru date"</string>
<string name="data_warning" msgid="116776633806885370">"Avertisment pentru date"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Setați o limită date"</string>
@@ -81,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Unitatea principală a vehiculului va dezactiva datele mobile când se atinge limita specificată.\n\nDeoarece utilizarea datelor este măsurată de unitatea principală, iar operatorul poate contoriza în mod diferit utilizarea, vă recomandăm să stabiliți o limită prudentă."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Setați un avertisment privind utilizarea datelor"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Setați o limită de utilizare a datelor"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Utilizarea datelor este măsurată de dispozitivul dvs. Aceasta ar putea varia în funcție de datele operatorului de telefonie mobilă."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Setați"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Salvați"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Rețea OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet pentru vehicul"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Dacă dezactivați internetul pentru vehicul, este posibil ca unele funcții sau aplicații să nu mai funcționeze.\n\nDatele importante necesare funcționării vehiculului vor fi trimise în continuare producătorului vehiculului."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Dezactivați oricum"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internetul pentru vehicul este dezactivat. Aceasta ar putea împiedica funcționarea unor aplicații sau funcții. Datele importante necesare funcționării vehiculului vor fi trimise în continuare producătorului vehiculului."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"S-au folosit %1$s în perioada %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Alăturați-vă unei alte rețele"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferințe privind rețeaua"</string>
@@ -96,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Adăugați o rețea"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Conectați"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Se conectează…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Neconectat"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Rețeaua este în afara ariei de acoperire"</string>
<string name="wifi_password" msgid="5565632142720292397">"Parolă"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Afișează parola"</string>
@@ -157,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Alegeți cel puțin o bandă pentru hotspot Wi-Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot și tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Dezactivat"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Dezactivați automat hotspotul"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Hotspotul Wi-Fi se va dezactiva dacă nu se conectează niciun dispozitiv"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> încearcă să activeze Wi-Fi"</string>
@@ -299,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Opriți forțat"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Opriți forțat?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Dacă forțați oprirea unei aplicații, aceasta se poate comporta necorespunzător."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Dezactivați protecția performanței?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Dacă alegeți această opțiune, este posibil ca software-ul și hardware-ul să nu funcționeze la fel de bine."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Mențineți-o activată"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Dezactivați"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Prioritizați performanța aplicațiilor?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Activarea poate duce la instabilitatea sistemului sau la efecte pe termen lung asupra componentelor hardware. Continuați?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Da"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nu, mulțumesc"</string>
<string name="disable_text" msgid="4358165448648990820">"Dezactivați"</string>
<string name="enable_text" msgid="1794971777861881238">"Activați"</string>
<string name="uninstall_text" msgid="277907956072833012">"Dezinstalați"</string>
@@ -312,27 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Permisiuni"</string>
<string name="notifications_label" msgid="6586089149665170731">"Notificări"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Spațiul de stocare și memoria cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Asigurați performanța optimă"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritizați performanța aplicațiilor"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versiunea: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nicio permisiune acordată"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nicio permisiune solicitată"</string>
<string name="unused_apps" msgid="648471933781010395">"Aplicații nefolosite"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplicații nefolosite</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> de aplicații nefolosite</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicație nefolosită</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# aplicație nefolosită}few{# aplicații nefolosite}other{# de aplicații nefolosite}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Eliminați permisiuni și eliberați spațiu"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s în memoria internă"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Când e nevoie, închideți aplicația pentru a evita consumul excesiv de resurse"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Folosește resursele de sistem pentru a prioritiza performanța aplicațiilor"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Utilizarea datelor"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Utilizare date aplicație"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Istoricul utilizării"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Toate aplicațiile"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Utilizare date și Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Istoricul utilizării"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Date utilizate în total"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Prim-plan"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Fundal"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Permiteți date"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Permiteți ca aplicația să folosească datele mobile"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Restricționați date"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Folosiți date mobile numai când aplicația este în prim-plan"</string>
<string name="computing_size" msgid="5791407621793083965">"Se calculează…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> permisiuni suplimentare</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> de permisiuni suplimentare</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permisiune suplimentară</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# permisiune suplimentară}few{# permisiuni suplimentare}other{# de permisiuni suplimentare}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Notă: după repornire, această aplicație nu poate porni până nu deblocați vehiculul."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistent și intrare vocală"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplicație asistent"</string>
@@ -389,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Cu controlul rețelei Wi-Fi, o aplicație poate să activeze sau să dezactiveze conexiunea Wi-Fi, să scaneze și să se conecteze la rețelele Wi-Fi, să adauge sau să elimine rețele sau să pornească un hotspot local."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Mai multe"</string>
<string name="location_settings_title" msgid="901334356682423679">"Locație"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Folosiți locația"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Permiteți aplicațiilor indicate accesul la locație"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Dacă dezactivați opțiunea, permisiunea de acces la locație va fi eliminată pentru toate aplicațiile. Aplicațiile de asistență pentru șofer vor avea în continuare acces."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Folosiți locația pentru asistență oferită șoferului"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Locația vehiculului este dezactivată"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Aplicațiile de asistență pentru șofer nu vă pot accesa locația"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Schimbați"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Permiteți accesul la locație aplicațiilor de asistență pentru șofer"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Dacă dezactivați opțiunea, aplicațiile de asistență pentru șofer care se bazează pe informațiile despre locație vor fi dezactivate."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Dezactivați oricum"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitări recente privind locația"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nu există solicitări recente privind locația"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisiuni la nivel de aplicație"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Servicii de localizare"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Folosiți locația"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Locația poate folosi surse precum GPS, Wi-Fi, rețele mobile și senzori pentru a ajuta la estimarea locației dispozitivului."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Asistență pentru șofer"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Informațiile despre locație trimise aplicațiilor de asistență pentru șofer nu conțin date care vă identifică. Acestea sunt stocate timp de maximum două zile înainte de a fi șterse."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Microfon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Folosiți microfonul"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Permiteți accesul tuturor aplicațiilor la microfon"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Gestionați permisiunile pentru microfon"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Accesate recent"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Nicio aplicație recentă"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 aplicații au acces"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# din {total_count} aplicații are acces}few{# din {total_count} aplicații au acces}other{# din {total_count} de aplicații au acces}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Accesate recent"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Afișați tot"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Se încarcă…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Actualizări de sistem"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Avansate"</string>
@@ -433,11 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licențe terță parte"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"A apărut o problemă la încărcarea licențelor."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Se încarcă…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="few">Mai aveți de parcurs <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pași pentru a deveni dezvoltator.</item>
- <item quantity="other">Mai aveți de parcurs <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> de pași pentru a deveni dezvoltator.</item>
- <item quantity="one">Mai aveți de parcurs <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> pas pentru a deveni dezvoltator.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Mai aveți de parcurs # pas pentru a deveni dezvoltator.}few{Mai aveți de parcurs # pași pentru a deveni dezvoltator.}other{Mai aveți de parcurs # de pași pentru a deveni dezvoltator.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Ați devenit dezvoltator!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Nu mai este nevoie, sunteți deja dezvoltator."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opțiuni dezvoltator"</string>
@@ -506,15 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"După ce creați un profil nou, utilizatorul respectiv trebuie să-l personalizeze."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Aplicațiile pot fi actualizate din orice profil ca să poată fi folosite de toate celelalte profiluri"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Ați atins limita de profiluri"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="few">Puteți crea maximum <xliff:g id="COUNT">%d</xliff:g> profiluri.</item>
- <item quantity="other">Puteți crea maximum <xliff:g id="COUNT">%d</xliff:g> de profiluri.</item>
- <item quantity="one">Puteți crea un singur profil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Puteți crea un singur profil.}few{Puteți crea maximum # profiluri.}other{Puteți crea maximum # de profiluri.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Nu s-a putut crea un profil nou"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Ștergeți profilul?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Toate aplicațiile și datele din acest profil vor fi șterse"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Nu s-a putut șterge profilul."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profilul nu a fost șters. Puteți să reporniți dispozitivul și să reîncercați."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Profilul va fi șters când comutați între profiluri sau reporniți mașina."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Închideți"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Reîncercați"</string>
@@ -627,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Desenarea unui model pentru deblocare"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Eroare la salvarea modelului"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Prea multe încercări incorecte. Încercați din nou peste <xliff:g id="NUMBER">%d</xliff:g> secunde."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Modelul nu acceptă accesul prin rotire. Folosiți atingerea."</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Eliminați blocarea ecranului?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Acțiunea va permite oricui să vă acceseze contul"</string>
@@ -658,36 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Codurile PIN obișnuite sunt blocate de administratorul IT. Încercați alt cod PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Aceasta nu poate include un caracter nevalid."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Parolă nevalidă. Trebuie să conțină minimum 4 caractere."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="few">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> litere</item>
- <item quantity="other">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> de litere</item>
- <item quantity="one">Trebuie să conțină cel puțin o literă</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="few">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> minuscule</item>
- <item quantity="other">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> de minuscule</item>
- <item quantity="one">Trebuie să conțină cel puțin o minusculă</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="few">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> majuscule</item>
- <item quantity="other">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> de majuscule</item>
- <item quantity="one">Trebuie să conțină cel puțin o majusculă</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="few">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> cifre</item>
- <item quantity="other">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> de cifre</item>
- <item quantity="one">Trebuie să conțină cel puțin o cifră</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="few">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> simboluri speciale</item>
- <item quantity="other">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> de simboluri speciale</item>
- <item quantity="one">Trebuie să conțină cel puțin un simbol special</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="few">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> caractere care să nu fie litere</item>
- <item quantity="other">Trebuie să conțină cel puțin <xliff:g id="COUNT">%d</xliff:g> de caractere care să nu fie litere</item>
- <item quantity="one">Trebuie să conțină cel puțin un caracter care să nu fie literă</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Administratorul dispozitivului nu permite folosirea unei parole recente"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Eroare la salvarea parolei"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Parolele obișnuite sunt blocate de administratorul IT. Încercați altă parolă."</string>
@@ -730,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Adăugați un profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Ștergeți profilul"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Adăugați un profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Luminozitatea ecranului"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Pentru a vedea dispozitivele, activați Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Pentru a asocia un dispozitiv, deschideți setările Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administratorul sistemului de infotainment"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aplicații activate"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Aplicații dezactivate"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplicațiile cu această permisiune au acces la datele vehiculului"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nicio aplicație de administrare a vehiculului"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Această aplicație pentru sistemul de infotainment este activă și permite aplicației <xliff:g id="APP_NAME">%1$s</xliff:g> să realizeze următoarele operațiuni:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Activând această aplicație pentru sistemul de infotainment, veți permite aplicației <xliff:g id="APP_NAME">%1$s</xliff:g> să realizeze următoarele operațiuni:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Activați aplicația pentru sistemul de infotainment?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Activați această aplicație pentru sistemul de infotainment"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Dezactivați și dezinstalați"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Dezactivați aplicația pentru sistemul de infotainment"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Mai multe detalii"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Administratorul organizației poate să monitorizeze și să gestioneze aplicațiile și datele asociate acestui profil, inclusiv setările, permisiunile, accesul la nivelul companiei, activitatea în rețea și informațiile despre locația vehiculului."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Administratorul organizației poate să monitorizeze și să gestioneze aplicațiile și datele asociate acestui profil, inclusiv setările, permisiunile, accesul la nivelul companiei, activitatea în rețea și informațiile despre locația dispozitivului."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Administratorul organizației poate să monitorizeze și să gestioneze aplicațiile și datele asociate acestui sistem de infotainment, inclusiv setările, permisiunile, accesul la nivelul companiei, activitatea în rețea și informațiile despre locația vehiculului."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Este posibil ca administratorul organizației să acceseze date asociate sistemului de infotainment, să gestioneze aplicații și să modifice setările acestui vehicul."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Setarea nu este disponibilă"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Nu se poate modifica volumul în vehiculul gestionat"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Nu se pot iniția apeluri în vehiculul gestionat"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS-urile nu sunt permise în vehiculul gestionat"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Camera foto nu este disponibilă în vehiculul gestionat"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Nu se pot realiza capturi de ecran în vehiculul gestionat"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Nu se poate deschide aplicația în vehiculul gestionat"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blocat de creditor"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Accesul la unele funcții este limitat de organizație.\n\nDacă aveți întrebări, contactați administratorul organizației."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Aplicații de administrare a vehiculului"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aplicație activată}few{# aplicații activate}other{# de aplicații activate}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nicio aplicație activată"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Politica <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> privind vehiculele"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Setări gestionate de administratorul organizației"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Aflați mai multe despre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Trimiteți raportul de eroare?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Administratorul organizației care deține vehiculul a solicitat un raport de eroare pentru a remedia problemele acestui dispozitiv. Este posibil să se permită accesul la aplicații și date."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Administratorul organizației care deține vehiculul a solicitat un raport de eroare pentru a remedia problemele acestui dispozitiv. Este posibil să se permită accesul la aplicații și date, iar funcționarea dispozitivului poate fi încetinită temporar."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Raportul de eroare este trimis administratorului organizației care deține vehiculul. Contactați administratorul pentru mai multe detalii."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Trimiteți"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Refuzați"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Setarea nu poate fi modificată momentan"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accesibilitate"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Subtitrări"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferințe pentru subtitrări"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Dezactivate"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Activate"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Cititor de ecran"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Afișează subtitrările"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Dimensiunea textului"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Dimensiunea și stilul subtitrărilor"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Foarte mici"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Mici"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Prestabilită"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Mari"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Foarte mari"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Stilul subtitrării"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Setat de aplicație"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Alb pe negru"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Negru pe alb"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Galben pe negru"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Galben pe albastru"</string>
</resources>
diff --git a/res/values-ru/arrays.xml b/res/values-ru/arrays.xml
index 6c4d79f..e3e18b9 100644
--- a/res/values-ru/arrays.xml
+++ b/res/values-ru/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Не разрешать"</item>
<item msgid="1154273129608299386">"Разрешать всегда"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 0f69f2a..9331b56 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -27,12 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Ночной режим"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Сеть и интернет"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Мобильная сеть"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карта</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карты</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карт</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карты</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-карта}one{# SIM-карта}few{# SIM-карты}many{# SIM-карт}other{# SIM-карты}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Активно (SIM-карта)"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Неактивно (SIM-карта)"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Активно (cкачанная SIM-карта)"</string>
@@ -40,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Добавить"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобильный интернет"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Доступ к Интернету по мобильной сети"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Мобильная сеть"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Использовать мобильный интернет"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Отключить мобильный Интернет?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Выберите SIM-карту"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Переключиться на оператора \"<xliff:g id="CARRIER">%1$s</xliff:g>\"?"</string>
@@ -55,12 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Предупреждение о расходе трафика: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Лимит трафика: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Предупреждение о расходе трафика: <xliff:g id="ID_1">^1</xliff:g>. Лимит трафика: <xliff:g id="ID_2">^2</xliff:g>."</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Остался %d день</item>
- <item quantity="few">Осталось %d дня</item>
- <item quantity="many">Осталось %d дней</item>
- <item quantity="other">Осталось %d дня</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Остался # день}one{Осталось # день}few{Осталось # дня}many{Осталось # дней}other{Осталось # дня}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Время истекло."</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Осталось меньше 1 дня"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Обновлено <xliff:g id="ID_2">^2</xliff:g> назад оператором <xliff:g id="ID_1">^1</xliff:g>"</string>
@@ -75,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Сохранить"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Предупреждения и лимит"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Период статистики"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Использование мобильного интернета"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Установить предупреждение"</string>
<string name="data_warning" msgid="116776633806885370">"Предупреждение"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Задать лимит трафика"</string>
@@ -83,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"После достижения установленного лимита передача данных по мобильной сети будет отключена.\n\nПри выборе ограничения учитывайте, что статистика оператора может отличаться от статистики головного устройства автомобиля."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Настройка предупреждения"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Лимит трафика"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Объем использованного трафика измеряется на устройстве. Полученные значения могут отличаться от данных вашего оператора мобильной связи."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Сохранить"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Сохранить"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Сеть OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Интернет в автомобиле"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"При отключенном интернете некоторые функции или приложения автомобиля могут не работать.\n\nДанные, которые критически важны для эксплуатации автомобиля, останутся доступны его производителю."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Отключить"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Интернет в автомобиле отключен. Некоторые функции или приложения автомобиля могут не работать. Данные, которые критически важны для эксплуатации автомобиля, останутся доступны его производителю."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Использовано %1$s с %2$s по %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Подключиться к другой сети"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Настройки сетевого подключения"</string>
@@ -98,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Добавить сеть"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Подключить"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Подключение…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Не подключено"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Вы находитесь вне зоны действия сети."</string>
<string name="wifi_password" msgid="5565632142720292397">"Пароль"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Показать пароль"</string>
@@ -159,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Диапазон частот для точек доступа Wi-Fi."</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Точка доступа и режим модема"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Точка доступа"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Отключено"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Автоматически выключать точку доступа"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Выключать точку доступа Wi‑Fi, если к ней не подключено ни одного устройства"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> запрашивает включение Wi-Fi"</string>
@@ -301,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Остановить"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Остановить принудительно?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Принудительное закрытие приложения может отразиться на его функциональности."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Отключить защиту производительности?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"В этом случае программное и аппаратное обеспечение тоже может не работать."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Не отключать"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Отключить"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Приоритизировать производительность приложения?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Включение этой настройки может привести к нестабильной работе системы и долговременному воздействию на аппаратное обеспечение. Продолжить?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Да"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Нет"</string>
<string name="disable_text" msgid="4358165448648990820">"Отключить"</string>
<string name="enable_text" msgid="1794971777861881238">"Включить"</string>
<string name="uninstall_text" msgid="277907956072833012">"Удалить"</string>
@@ -314,29 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Разрешения"</string>
<string name="notifications_label" msgid="6586089149665170731">"Уведомления"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Хранилище и кеш"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Макс. производительность"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Приоритизировать производительность приложения"</string>
<string name="application_version_label" msgid="8556889839783311649">"Версия: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"У приложения нет разрешений"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Приложение не запрашивало разрешения"</string>
<string name="unused_apps" msgid="648471933781010395">"Неиспользуемые приложения"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> неиспользуемое приложение</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> неиспользуемых приложения</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> неиспользуемых приложений</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> неиспользуемого приложения</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# неиспользуемое приложение}one{# неиспользуемое приложение}few{# неиспользуемых приложения}many{# неиспользуемых приложений}other{# неиспользуемого приложения}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Удалять разрешения и освобождать место"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s: внутренняя память"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Закрывать приложения для экономии ресурсов"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Чтобы приоритизировать производительность приложения, используются системные ресурсы"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Передача данных"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Трафик приложения"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"История использ. трафика"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Все приложения"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Моб. интернет и Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"История использ. трафика"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Общий объем трафика"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"В активном режиме"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"В фоновом режиме"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Разрешить моб. интернет"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Разрешить использовать мобильный интернет"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Ограничить трафик"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Использ. моб. интернет только в активном режиме"</string>
<string name="computing_size" msgid="5791407621793083965">"Вычисление…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дополнительное разрешение</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дополнительных разрешения</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> дополнительных разрешений</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дополнительного разрешения</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# дополнительное разрешение}one{# дополнительное разрешение}few{# дополнительных разрешения}many{# дополнительных разрешений}other{# дополнительного разрешения}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Примечание. После перезагрузки вам потребуется разблокировать экран автомобиля, чтобы запустить это приложение."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Помощник и голосовой ввод"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Помощник"</string>
@@ -393,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Эта настройка разрешает приложению сканировать, добавлять и удалять сети Wi-Fi, подключаться к ним, включать и отключать модуль Wi-Fi, а также создавать локальные точки доступа."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Ещё"</string>
<string name="location_settings_title" msgid="901334356682423679">"Геолокация"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Использовать данные о местоположении"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Разрешить для выбранных приложений"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Если вы отключите эту настройку, данные о местоположении будут недоступны всем приложениям, кроме системы помощи водителю."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Геолокация для системы помощи водителю"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Геоданные автомобиля не определяются"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Нет доступа к данным о местоположении"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Изменить"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Открыть доступ к данным о местоположении"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Если вы отключите эту настройку, приложения для помощи водителю, которым необходимы данные о местоположении, работать не будут."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Отключить"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Последние запросы местоположения"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Нет недавних запросов местоположения."</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Разрешения для приложений"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Геолокация"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Использовать данные о местоположении"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Для определения местоположения устройства могут использоваться данные GPS, Wi-Fi, мобильных сетей и датчиков."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Система помощи водителю"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Данные о местоположении, которые отправляются системе помощи водителю, не содержат идентифицирующей вас информации. Они хранятся не более двух дней и затем удаляются."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Микрофон"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Использовать микрофон"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Разрешить всем приложениям доступ к микрофону"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Управление разрешениями микрофона"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Недавние запросы на доступ к микрофону"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Нет недавних приложений."</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Доступа нет ни у одного приложения"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Доступ есть у # приложения из {total_count}}one{Доступ есть у # приложения из {total_count}}few{Доступ есть у # приложений из {total_count}}many{Доступ есть у # приложений из {total_count}}other{Доступ есть у # приложения из {total_count}}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Недавние запросы на доступ к микрофону"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Показать все"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Загрузка…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Система"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Обновления системы"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Дополнительно"</string>
@@ -437,12 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Лицензии третьих сторон"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Не удалось загрузить лицензии."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Загрузка…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Вы почти у цели. Остался <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> шаг.</item>
- <item quantity="few">Вы почти у цели. Осталось <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> шага.</item>
- <item quantity="many">Вы почти у цели. Осталось <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> шагов.</item>
- <item quantity="other">Вы почти у цели. Осталось <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> шага.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Вы почти у цели. Остался # шаг.}one{Вы почти у цели. Остался # шаг.}few{Вы почти у цели. Осталось # шага.}many{Вы почти у цели. Осталось # шагов.}other{Вы почти у цели. Осталось # шага.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Вы стали разработчиком!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Не нужно, вы уже разработчик."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Для разработчиков"</string>
@@ -511,16 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Когда вы создадите профиль, пользователю потребуется настроить его самостоятельно."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Любой пользователь может обновлять приложения для других профилей."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Нельзя создать больше профилей"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Можно создать до <xliff:g id="COUNT">%d</xliff:g> профиля.</item>
- <item quantity="few">Можно создать до <xliff:g id="COUNT">%d</xliff:g> профилей.</item>
- <item quantity="many">Можно создать до <xliff:g id="COUNT">%d</xliff:g> профилей.</item>
- <item quantity="other">Можно создать до <xliff:g id="COUNT">%d</xliff:g> профиля.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Можно создать только 1 профиль.}one{Можно создать до # профиля.}few{Можно создать до # профилей.}many{Можно создать до # профилей.}other{Можно создать до # профиля.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Не удалось создать профиль"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Удалить профиль?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Все приложения и данные этого профиля будут удалены."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Не удалось удалить профиль"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Не удалось удалить профиль. Перезапустите устройство и повторите попытку."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Этот профиль удалится, когда вы войдете в другой или перезапустите автомобиль"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Закрыть"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Повторить попытку"</string>
@@ -633,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Как начертить графический ключ"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Не удалось сохранить графический ключ"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Слишком много неудачных попыток разблокировки. Повторите через <xliff:g id="NUMBER">%d</xliff:g> сек."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Граф. ключ невозможно ввести вращением."</string>
<string name="okay" msgid="4589873324439764349">"ОК"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Отключить блокировку экрана?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Доступ к вашему аккаунту сможет получить кто угодно."</string>
@@ -664,42 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Системный администратор заблокировал простые PIN-коды. Выберите более сложную комбинацию."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Использованы недопустимые символы."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Пароль должен содержать не менее четырех символов."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> буквы.</item>
- <item quantity="few">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> букв.</item>
- <item quantity="many">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> букв.</item>
- <item quantity="other">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> буквы.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> строчной буквы.</item>
- <item quantity="few">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> строчных букв.</item>
- <item quantity="many">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> строчных букв.</item>
- <item quantity="other">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> строчной буквы.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> заглавной буквы.</item>
- <item quantity="few">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> заглавных букв.</item>
- <item quantity="many">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> заглавных букв.</item>
- <item quantity="other">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> заглавной буквы</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> цифры.</item>
- <item quantity="few">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> цифр.</item>
- <item quantity="many">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> цифр.</item>
- <item quantity="other">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> цифры.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> специального символа.</item>
- <item quantity="few">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> специальных символов.</item>
- <item quantity="many">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> специальных символов.</item>
- <item quantity="other">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> специального символа.</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> небуквенного символа.</item>
- <item quantity="few">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> небуквенных символов.</item>
- <item quantity="many">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> небуквенных символов.</item>
- <item quantity="other">Пароль должен содержать не менее <xliff:g id="COUNT">%d</xliff:g> небуквенного символа.</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Использовать недавний пароль запрещено"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Не удалось сохранить пароль"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Системный администратор заблокировал простые пароли. Выберите более сложную комбинацию."</string>
@@ -742,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Добавить профиль"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Удалить этот профиль"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Добавить профиль"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Яркость экрана"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Чтобы посмотреть список своих устройств, включите Bluetooth."</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Чтобы подключить устройство, откройте настройки Bluetooth."</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Администратор информационно-развлекательной системы"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Активные приложения"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Отключенные приложения"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"У приложений с этим разрешением есть доступ к данным автомобиля."</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Нет приложений для администратора автомобиля."</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Приложение администратора информационно-развлекательной системы активно и разрешает приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" выполнять следующие действия:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"После того как вы активируете это приложение администратора информационно-развлекательной системы, приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" сможет выполнять следующие действия:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Включить это приложение информационно-развлекательной системы?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Включить это приложение информационно-развлекательной системы"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Отключить и удалить"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Отключить это приложение информационно-развлекательной системы"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Дополнительная информация"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Менеджер организации может контролировать настройки, приложения, разрешения и параметры доступа к корпоративным ресурсам для этого профиля, а также связанные с ним данные, например сведения о местоположении автомобиля или действиях в сети."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Менеджер организации может контролировать настройки, приложения, разрешения и параметры доступа к корпоративным ресурсам для этого профиля, а также связанные с ним данные, например сведения о местоположении устройства или действиях в сети."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Менеджер организации может контролировать настройки, приложения, разрешения и параметры доступа к корпоративным ресурсам для этой информационно-развлекательной системы, а также связанные с ней данные, например сведения о местоположении автомобиля или действиях в сети."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"У менеджера организации есть доступ к данным, связанным с этой информационно-развлекательной системой, а также он может изменять настройки автомобиля и управлять приложениями."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Нет доступа"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"В этом автомобиле нельзя изменять громкость"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"В этом автомобиле нельзя звонить"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"В этом автомобиле нельзя отправлять SMS"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Камера в этом автомобиле недоступна"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"В этом автомобиле нельзя делать скриншоты"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Приложение недоступно в этом автомобиле"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Заблокировано кредитором"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Организация ограничила доступ к некоторым функциям.\n\nЕсли у вас есть вопросы, обратитесь к менеджеру организации."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Приложения для администратора автомобиля"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# активное приложение}one{# активное приложение}few{# активных приложения}many{# активных приложений}other{# активного приложения}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Нет активных приложений"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Правила организации \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" в отношении автотранспорта"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Настройки, которыми управляет менеджер организации"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Подробнее о сервисе \"<xliff:g id="SERVICE">%1$s</xliff:g>\""</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Поделиться отчетом об ошибке?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Менеджер организации, которой принадлежит этот автомобиль, запросил отчет об ошибке. Это поможет ему устранить неполадку. Кроме того, менеджер может получить доступ к приложениям и данным."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Менеджер организации, которой принадлежит этот автомобиль, запросил отчет об ошибке. Это поможет ему устранить неполадку. Менеджер может получить доступ к приложениям и данным. Кроме того, возможно временное снижение скорости работы устройства."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Менеджер организации, которой принадлежит этот автомобиль, скоро получит отчет об ошибке. Свяжитесь с ним, чтобы получить дополнительную информацию."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Отправить"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Отклонить"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Сейчас эту настройку изменить нельзя."</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Специальные возможности"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Субтитры"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Настройки субтитров"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Отключено"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Включено"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Программа чтения с экрана"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Показывать субтитры"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Размер шрифта"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Размер и стиль субтитров"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Очень мелкий"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Мелкий"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"По умолчанию"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Крупный"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Очень крупный"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Стиль субтитров"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Задано приложением"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Белый на черном"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Черный на белом"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Желтый на черном"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Желтый на синем"</string>
</resources>
diff --git a/res/values-si/arrays.xml b/res/values-si/arrays.xml
index 72928c5..37d4a8e 100644
--- a/res/values-si/arrays.xml
+++ b/res/values-si/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"කිසිවිටෙකත් ඉඩ නොදෙන්න"</item>
<item msgid="1154273129608299386">"සැමවිටම ඉඩ දෙන්න"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 004ba45..03bd6cb 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"රාත්රී ප්රකාරය"</string>
<string name="network_and_internet" msgid="4229023630498537530">"ජාලය සහ අන්තර්ජාලය"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"ජංගම ජාලය"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one">SIMs <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="other">SIMs <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{SIM #}one{SIM #}other{SIM #}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"සක්රිය / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"අක්රිය / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"සක්රිය / බාගත් SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"තව එක් කරන්න"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"ජංගම දත්ත"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ජංගම ජාලය භාවිතයෙන් දත්තවලට ප්රවේශය"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"ජංගම ජාලය"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"ජංගම දත්ත භාවිත කරන්න"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"ජංගම දත්ත ක්රියාවිරහිත කරන්න ද?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"තේරීම අවශ්යයි"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"ජංගම දත්ත සඳහා <xliff:g id="CARRIER">%1$s</xliff:g> භාවිත කරන්න ද?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> දත්ත අනතුරු ඇඟවීම"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> දත්ත සීමාව"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> දත්ත අනතුරු ඇඟවීම / <xliff:g id="ID_2">^2</xliff:g> දත්ත සීමාව"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">දින %dක් ඉතිරියි</item>
- <item quantity="other">දින %dක් ඉතිරියි</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{දින #ක් ඉතිරිව ඇත}one{දින #ක් ඉතිරිව ඇත}other{දින #ක් ඉතිරිව ඇත}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"කාලය ඉතිරිව නැත"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"දින 1කට වඩා අඩුවෙන් ඉතිරිව ඇත"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> විසින් <xliff:g id="ID_2">^2</xliff:g> පෙර යාවත්කාලීනයි"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"සකසන්න"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"දත්ත අනතුරු ඇඟවීම සහ සීමාව"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"යෙදුම් දත්ත භාවිත චක්රය"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"ජංගම දත්ත භාවිතය"</string>
<string name="set_data_warning" msgid="6628236612886588097">"දත්ත අනතුරු ඇඟවීම සකසන්න"</string>
<string name="data_warning" msgid="116776633806885370">"දත්ත අනතුරු ඇඟවීම"</string>
<string name="set_data_limit" msgid="7136539812414500084">"දත්ත සීමාව සකසන්න"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ජංගම දත්ත ඔබ සැකසූ සීමාවට ළඟා වූ විට ඔබගේ වාහනයේ ශීර්ෂ ඒකකය එය අක්රිය කරයි.\n\nඔබගේ ශීර්ෂ ඒකකයෙන් දත්ත භාවිතය ගණනය කරනු ලබන අතර භාවිතය වෙනස් වීම සඳහා ඔබගේ වාහකයා ගිණුම මධ්යස්ථ සීමාවකට සැකසිය හැකි බව සලකන්න."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"දත්ත භාවිතයේ අවවාද සකසන්න"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"දත්ත භාවිත සීමාවක් සකසන්න"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"දත්ත භාවිතය ඔබගේ උපාංගයෙන් මනිනු ලැබේ. එය ඔබගේ ජංගම වාහකයේ දත්ත අනුව වෙනස් විය හැකිය."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"සකසන්න"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"සුරකින්න"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM ජාලය"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"වාහන අන්තර්ජාලය"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"වාහන අන්තර්ජාලය ක්රියාවිරහිත කිරීම සමහර වාහන විශේෂාංග හෝ යෙදුම් ක්රියා කිරීම වැළැක්විය හැකිය.\n\nඔබේ වාහනය ක්රියා කිරීමට අවශ්ය තීරණාත්මක දත්ත වාහන නිෂ්පාදකයා සමඟ දිගටම බෙදා ගනු ඇත."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"කෙසේ වෙතත් ක්රියාවිරහිත කරන්න"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"වාහන අන්තර්ජාලය ක්රියාවිරහිත කර ඇත. මෙය සමහර වාහන විශේෂාංග හෝ යෙදුම් ක්රියා කිරීම වළක්වනු ඇත. ඔබේ වාහනය ක්රියා කිරීමට අවශ්ය තීරණාත්මක දත්ත වාහන නිෂ්පාදකයා සමඟ දිගටම බෙදා ගනු ඇත."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s භාවිත කරන ලදි %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"වෙනත් ජාලයකට එක් වන්න"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"ජාල මනාප"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"ජාලය එක් කරන්න"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"සබඳින්න"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"සම්බන්ධ වෙමින්…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"සම්බන්ධ නැත"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"ජාලය පරාසය තුළ නැත"</string>
<string name="wifi_password" msgid="5565632142720292397">"මුරපදය"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"මුරපදය පෙන්වන්න"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi‑Fi හොට්ස්පොට් සඳහා අවම වශයෙන් එක් කලාපයක් තෝරන්න:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"හොට්ස්පොට් සහ ටෙදරින්"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"හොට්ස්පොට්"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ක්රියාවිරහිතයි"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"හොට්ස්පොට් ස්වයංක්රීයව ක්රියාවිරහිත කරන්න"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"උපාග සම්බන්ධ කර නැතිනම් Wi‑Fi හොට්ස්පොට් ක්රියාවිරහිත වනු ඇත"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> හට Wi-Fi සක්රීය කිරීමට අවශ්යයි"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"බලෙන් නවත්වන්න"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"බලෙන් නවතන්න ද?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"ඔබ යෙදුමක් බලෙන් නැවතුවහොත්, එය වැරදි ලෙස ක්රියා කරනු ඇත."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"කාර්යසාධන ආරක්ෂාව ක්රියාවිරහිත කරන්නද?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"ඔබ එසේ කළහොත්, ඔබගේ මෘදුකාංග හා දෘඪාංගද ක්රියා නොකළ හැකිය."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ක්රියාත්මක කර තබන්න"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"ක්රියාවිරහිත කරන්න"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"යෙදු. කාර්යසාධ. ප්රමුඛ කි. සක්රිය කර.?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"එය ක්රියාත්මක කිරීම පද්ධති අස්ථාවර බව හෝ දිගු කාලීන දෘඪාංග බලපෑමක් ඇති කළ හැකිය. ඔබට ඉදිරියට යාමට අවශ්යද?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"ඔව්"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"එපා, ස්තුතියි"</string>
<string name="disable_text" msgid="4358165448648990820">"අබල කරන්න"</string>
<string name="enable_text" msgid="1794971777861881238">"සබල කරන්න"</string>
<string name="uninstall_text" msgid="277907956072833012">"අස්ථාපනය"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"අවසර"</string>
<string name="notifications_label" msgid="6586089149665170731">"දැනුම්දීම්"</string>
<string name="storage_application_label" msgid="5911779903670978586">"ආචයනය සහ කෑෂය"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"කාර්යබ. කාර්යසා. සහ. ක."</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"යෙදුම් කාර්යසාධනය ප්රමුඛ කිරීම"</string>
<string name="application_version_label" msgid="8556889839783311649">"අනුවාදය: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"අවසර ලබා දී නැත"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"අවසර ඉල්ලා නැත"</string>
<string name="unused_apps" msgid="648471933781010395">"භාවිත නොකළ යෙදුම්"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one">භාවිත නොකළ යෙදුම් <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">භාවිත නොකළ යෙදුම් <xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{භාවිත නොකළ යෙදුම් #}one{භාවිත නොකළ යෙදුම් #}other{භාවිත නොකළ යෙදුම් #}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"අවසර ඉවත් කරන්න සහ ඉඩ හිස් කරන්න"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"අභ්යන්තර ආචයනයේ %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"අවශ්ය විට, සම්පත් අධික ලෙස භාවිත නොකිරීමට යෙදුම වසන්න"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"යෙදුම් කාර්යසාධනය ප්රමුඛ කිරීමට පද්ධති සම්පත් භාවිත කරයි"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"දත්ත භාවිතය"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"යෙදුම් දත්ත භාවිතය"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"භාවිතයේ ඉතිහාසය"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"සියලු යෙදුම්"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"දත්ත & Wi‑Fi භාවිතය"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"භාවිතයේ ඉතිහාසය"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"මුළු භාවිතය"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"පෙරබිම"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"පසුබිම"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"දත්තවලට ඉඩ දෙන්න"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"මෙම යෙදුමට ජංගම දත්ත භාවිත කිරීමට ඉඩ දෙන්න"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"දත්ත සිමා කරන්න"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"යෙදුම පෙරබිමින් ඇති විට පමණක් ජංගම දත්ත භාවිත කර."</string>
<string name="computing_size" msgid="5791407621793083965">"ගණනය කරමින්…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one">අතිරේක අවසර <xliff:g id="COUNT_1">%d</xliff:g>ක්</item>
- <item quantity="other">අතිරේක අවසර <xliff:g id="COUNT_1">%d</xliff:g>ක්</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{අතිරේක අවසර #}one{අතිරේක අවසර #}other{අතිරේක අවසර #}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"සටහන: යළි පණ ගැන්වීමකට පසුව, ඔබ ඔබේ වාහනය අගුළු හරින තෙක් මෙම යෙදුම ඇරඹිය නොහැක."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"සහය සහ හඬ ආදානය"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"සහාය යෙදුම"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi පාලනය යෙදුමකට Wi-Fi ක්රියාත්මක හෝ ක්රියාවිරහිත කිරීමට, Wi-Fi ජාල ස්කෑන් කර සබැඳීමට, ජාල එක් කිරීමට හෝ ඉවත් කිරීමට, හෝ ස්ථානීය-පමණි හොට්ස්පොටයක් ඇරඹීමට ඉඩ දෙයි."</string>
<string name="more_special_access_title" msgid="166115485446645971">"තව"</string>
<string name="location_settings_title" msgid="901334356682423679">"ස්ථානය"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"ස්ථානය භාවිත කරන්න"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"ඔබ සඳහන් කරන යෙදුම්වලට ඔබේ ස්ථානයට පිවිසීමට ඉඩ දෙන්න"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"ඔබ මෙය ක්රියාවිරහිත කළහොත්, එය සියලු යෙදුම් සඳහා ස්ථාන ප්රවේශය ඉවත් කරනු ඇත. රියදුරු සහාය යෙදුම්වලට තවම ප්රවේශය තිබෙනු ඇත."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"රියදුරු සහාය සඳහා ස්ථානය භාවිත කරන්න"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"වාහනයේ ස්ථානය ක්රියාවිරහිත කර ඇත"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"රියදුරු සහායක යෙදුම්වලට ඔබේ ස්ථානයට පිවිසිය නොහැකිය"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"වෙනස් කරන්න"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"රිය පැදවීමට උදවු වන යෙදුම්වලට ඔබේ ස්ථානයට පිවිසීමට ඉඩ දෙන්න"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"ඔබ මෙය ක්රියාවිරහිත කළහොත්, ස්ථාන තොරතුරු මත යැපෙන රියදුරු සහාය යෙදුම් අබල කරනු ඇත."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"කෙසේ වෙතත් ක්රියාවිරහිත කරන්න"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"මෑත ස්ථාන ඉල්ලීම්"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"මෑත ස්ථාන ඉල්ලීම් නැත"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"යෙදුම්-මට්ටමේ අවසර"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"ස්ථානීය සේවා"</string>
<string name="location_use_location_title" msgid="117735895374606680">"ස්ථානය භාවිත කරන්න"</string>
<string name="location_settings_footer" msgid="296892848338100051">"ස්ථානය ඔබගේ උපාංගයෙහි ස්ථානය තක්සේරු කිරීමට උදවු කිරීමට, GPS, Wi-Fi, ජංගම ජාල සහ සංවේදක වැනි මූලාශ්ර භාවිත කළ හැකිය."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"රියදුරු සහාය"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"රියදුරු සහායක යෙදුම් වෙත යවන ස්ථාන තොරතුරුවල ඔබව හඳුනා ගන්නා තොරතුරු අඩංගු නොවේ. මැකීමට පෙර එය උපරිම වශයෙන් දින 2ක් ගබඩා කෙරේ."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"මයික්රෆෝනය"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"මයික්රෆෝනය භාවිත කරන්න"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"ඔබගේ මයික්රෆෝනයට ප්රවේශ වීමට සියලු යෙදුම්වලට ඉඩ දෙන්න"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"මයික්රෆෝන අවසර කළමනාකරණය කරන්න"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"මෑතකදී පිවිසි"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"මෑත යෙදුම් නැත"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"යෙදුම් 0කට ප්රවේශය ඇත"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{යෙදුම් {total_count}කින් #කට ප්රවේශය ඇත}one{යෙදුම් {total_count}කින් #කට ප්රවේශය ඇත}other{යෙදුම් {total_count}කින් #කට ප්රවේශය ඇත}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"මෑතකදී පිවිසි"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"සියල්ල බලන්න"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"පූරණය කරමින්…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"පද්ධතිය"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"පද්ධති යාවත්කාලීන"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"උසස්"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"තුන් වන පාර්ශ්ව බලපත්ර"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"බලපත්ර පූරණය කිරීමේදී ගැටලුවක් විය."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"පූරණය කරමින්…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">දැන් ඔබ සංවර්ධකයෙක් වීමට ඇත්තේ පියවර <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> කි.</item>
- <item quantity="other">දැන් ඔබ සංවර්ධකයෙක් වීමට ඇත්තේ පියවර <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> කි.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ඔබට දැන් සංවර්ධකයෙක් වීමට ඇත්තේ පියවර #කි.}one{ඔබට දැන් සංවර්ධකයෙක් වීමට ඇත්තේ පියවර #කි.}other{ඔබට දැන් සංවර්ධකයෙක් වීමට ඇත්තේ පියවර #කි.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"ඔබ දැන් වර්ධකයෙකි"</string>
<string name="show_dev_already" msgid="1678087328973865736">"අවශ්ය නැත, ඔබ දැනටමත් වර්ධකයෙකි."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"සංවර්ධක විකල්ප"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"ඔබ නව පැතිකඩක් තැනීමෙන් පසුව, එම පුද්ගලයා එය තමා සඳහා අභිරුචිකරණය කළ යුතුය."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"අනෙක් සියලු පැතිකඩවල භාවිතය සඳහා යෙදුම් ඕනෑම පැතිකඩකින් යාවත්කාලීන කළ හැකිය."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"පැතිකඩ සීමාව ළඟා විය"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">ඔබට පැතිකඩ <xliff:g id="COUNT">%d</xliff:g>ක් දක්වා තැනිය හැකිය.</item>
- <item quantity="other">ඔබට පැතිකඩ <xliff:g id="COUNT">%d</xliff:g>ක් දක්වා තැනිය හැකිය.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{එක් පැතිකඩක් පමණක් තැනිය හැකිය.}one{ඔබට පැතිකඩවල් #ක් දක්වා තැනිය හැකිය.}other{ඔබට පැතිකඩවල් #ක් දක්වා තැනිය හැකිය.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"නව පැතිකඩ තැනීමට නොහැකි විය"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"මෙම පැතිකඩ මකන්නද?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"මෙම පැතිකඩ සඳහා වන සියලු යෙදුම් සහ දත්ත මකනු ඇත."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"පැතිකඩ මැකීමට නොහැකි විය."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"පැතිකඩ නොමකන ලදි. ඔබට උපාංගය යළි පණ ගන්වා නැවත උත්සාහ කළ හැකිය."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"ඔබ පැතිකඩවල් මාරු කරන විට හෝ වාහනය යළි පණගන්වන විට මෙම පැතිකඩ මකනු ඇත."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ඉවතලන්න"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"යළි උත්සාහ කරන්න"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"අඟුළු හැරීමේ රටාවක් අඳින ආකාරය"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"රටාව සුරැකීමේ දෝෂයකි"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"වැරදි උත්සාහයන් ගණන වැඩියි. තත්පර <xliff:g id="NUMBER">%d</xliff:g> කින් නැවත උත්සාහ කරන්න."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"රටාව භ්රමණයට සහය නොදක්වයි, කරුණාකර ස්පර්ශය භාවිත කරන්න"</string>
<string name="okay" msgid="4589873324439764349">"හරි"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"තිර අගුල ඉවත් කරන්නද?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"මෙය ඔබගේ ගිණුමට පිවිසීමට ඕනෑම අයෙකුට ඉඩ දෙනු ඇත"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"ඔබගේ IT පරිපාලක විසින් සුලබ PIN අවහිර කරනු ලැබේ. වෙනත් PIN එකක් උත්සාහ කරන්න."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"මෙහි අවලංගු අනුලකුණක් ඇතුළත් විය නොහැකිය."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"මුරපදය වලංගු නොවන අතර, අවම වශයෙන් අනුලකුණු 4ක් විය යුතුය."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">අඩු තරමින් අකුරු <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- <item quantity="other">අඩු තරමින් අකුරු <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">අඩු තරමින් කුඩා අකුරු <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- <item quantity="other">අඩු තරමින් කුඩා අකුරු <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">අඩු තරමින් විශාල අකුරු <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- <item quantity="other">අඩු තරමින් විශාල අකුරු <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">අඩු තරමින් සංඛ්යාමය ඉලක්කම් <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- <item quantity="other">අඩු තරමින් සංඛ්යාමය ඉලක්කම් <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">අඩු තරමින් විශේෂ සංකේත <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- <item quantity="other">අඩු තරමින් විශේෂ සංකේත <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">අඩු තරමින් අකුරු නොවන අනුලකුණු <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- <item quantity="other">අඩු තරමින් අකුරු නොවන අනුලකුණු <xliff:g id="COUNT">%d</xliff:g>ක් අඩංගු විය යුතුය</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"උපාංග පරිපාලක මෑත මුරපදයක් භාවිතා කිරීමට අවසර නොදේ"</string>
<string name="error_saving_password" msgid="8334882262622500658">"මුරපදය සුරැකීමේ දෝෂයකි"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ඔබගේ IT පරිපාලක විසින් සුලබ මුරපද අවහිර කරනු ලැබේ. වෙනත් මුරපදයක් උත්සාහ කරන්න."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"පැතිකඩක් එක් කරන්න"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"මෙම පැතිකඩ මකන්න"</string>
<string name="add_profile_text" msgid="9118410102199116969">"පැතිකඩ එක් කරන්න"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"සංදර්ශක දීප්තිය"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"ඔබගේ උපාංග බැලීමට, බ්ලූටූත් ක්රියාත්මක කරන්න"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"උපාංගයක් යුගල කිරීමට, බ්ලූටූත් සැකසීම් විවෘත කරන්න"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"තොරතුරු විනෝදාස්වාද පද්ධති පරිපාලක"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"සක්රිය කළ යෙදුම්"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"අක්රිය කළ යෙදුම්"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"මෙම අවසරය ඇති යෙදුම්වලට වාහනයේ දත්තවලට ප්රවේශය ඇත"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"වාහන පරිපාලක යෙදුම් නොමැත"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"මෙම තොරතුරු විනෝදාස්වාද පද්ධති පරිපාලක සක්රිය අතර <xliff:g id="APP_NAME">%1$s</xliff:g> යෙදුමට පහත මෙහෙයුම් සිදු කිරීමට ඉඩ දෙයි:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"මෙම තොරතුරු විනෝදාස්වාද පද්ධති යෙදුම සක්රිය කිරීම <xliff:g id="APP_NAME">%1$s</xliff:g> යෙදුමට පහත මෙහෙයුම් සිදු කිරීමට ඉඩ දෙනු ඇත:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"තොර. විනෝද. පද්ධති යෙදුම සක්රිය කරන්නද?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"මෙම තොරතුරු විනෝදාස්වාද පද්ධතිය සක්රිය කරන්න"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"අක්රිය කරන්න සහ අස්ථාපනය කරන්න"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"මෙම තොරතුරු විනෝදාස්වාද පද්ධති යෙදුම අක්රිය කරන්න"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"වැඩි විස්තර"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"සැකසීම්, අවසර, සංස්ථාපිත ප්රවේශය, ජාල ක්රියාකාරකම සහ වාහනයේ ස්ථාන තොරතුරු ඇතුළුව, මෙම පැතිකඩ සමඟ සම්බන්ධිත යෙදුම් සහ දත්ත නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට ඔබගේ සංවිධාන කළමනාකරුට හැකිය."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"සැකසීම්, අවසර, සංස්ථාපිත ප්රවේශය, ජාල ක්රියාකාරකම සහ උපාංගයේ ස්ථාන තොරතුරු ඇතුළුව, මෙම පැතිකඩ සමඟ සම්බන්ධිත යෙදුම් සහ දත්ත නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට ඔබගේ සංවිධාන කළමනාකරුට හැකිය."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"සැකසීම්, අවසර, සංස්ථාපිත ප්රවේශය, ජාල ක්රියාකාරකම සහ වාහනයේ ස්ථාන තොරතුරු ඇතුළුව, මෙම තොරතුරු විනෝදාස්වාද පද්ධතිය සමඟ සම්බන්ධිත යෙදුම් සහ දත්ත නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට සංවිධාන කළමනාකරුට හැකිය."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"මෙම තොරතුරු විනෝදාස්වාද පද්ධතිය හා සම්බන්ධ දත්ත වෙත ප්රවේශ වීමට, යෙදුම් කළමනාකරණය කිරීමට සහ මෙම වාහන සැකසීම් වෙනස් කිරීමට සංවිධාන කළමනාකරුට හැකි වීමට ඉඩ ඇත."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"එය ලබා ගත නොහැකිය"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"මෙම කළමනාකරණය කළ වාහනය තුළ හඬ පරිමාව වෙනස් කළ නොහැකිය"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"මෙම කළමනාකරණය කළ වාහනය තුළ ඇමතුම් සිදු කළ නොහැකිය"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"මෙම කළමනාකරණය කළ වාහනය තුළ SMS ඉඩ නොදේ"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"මෙම කළමනාකරණය කළ වාහනය තුළ කැමරාව ලබා ගත නොහැකිය"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"මෙම කළමනාකරණය කළ වාහනය තුළ තිර රූ ගැනීමට නොහැකිය"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"මෙම කළමනාකරණය කළ වාහනය තුළ මෙම යෙදුම විවෘත කළ නොහැකිය"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"ඔබගේ ණය සැපයුම්කරු විසින් අවහිර කර ඇත"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"සමහර විශේෂාංග වෙත ප්රවේශය සංවිධානය විසින් සීමා කර ඇත.\n\nඔබට ප්රශ්න තිබේ නම්, සංවිධාන කළමනාකරු සම්බන්ධ කර ගන්න."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"වාහන පරිපාලක යෙදුම්"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{සක්රිය කළ යෙදුම් #}one{සක්රිය කළ යෙදුම් #}other{සක්රිය කළ යෙදුම් #}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"සක්රිය කළ යෙදුම් නැත"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> වාහන ප්රතිපත්තිය"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"සංවිධාන කළමනාකරු විසින් කළමනාකරණය කරන සැකසීම්"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> ගැන තව දැන ගන්න"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"දෝෂ වාර්තාව බෙදා ගන්නද?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"මෙම උපාංගය දෝෂාවේක්ෂණය සඳහා උදවු කිරීමට ඔබගේ වාහනයේ සංවිධාන කළමනාකරු දෝෂ වාර්තාවක් ඉල්ලා ඇත. යෙදුම් සහ දත්ත බෙදා ගත හැකිය."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"මෙම උපාංගය දෝෂාවේක්ෂණය සඳහා උදවු කිරීමට ඔබගේ වාහනයේ සංවිධාන කළමනාකරු දෝෂ වාර්තාවක් ඉල්ලා ඇත. යෙදුම් සහ දත්ත බෙදා ගත හැකි අතර, ඔබගේ උපාංගය තාවකාලිකව මන්දගාමී විය හැකිය."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"මෙම දෝෂ වාර්තාව මෙම වාහනයේ සංවිධාන කළමනාකරු සමගින් බෙදා ගනිමින් ඇත. වැඩි විස්තර සඳහා ඔවුන්ව සම්බන්ධ කර ගන්න."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"බෙදා ගන්න"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"ප්රතික්ෂේප කරන්න"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"මෙම සැකසීම මේ අවස්ථාවේදී වෙනස් කළ නොහැකිය"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ප්රවේශ්යතාව"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"සිරස්තල"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"සිරස්තල මනාප"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ක්රියාවිරහිතයි"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ක්රියාත්මකයි"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"තිර කියවනය"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"සිරස්තල පෙන්වන්න"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"පෙළ තරම"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"සිරස්තල තරම සහ මෝස්තරය"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"ඉතා කුඩා"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"කුඩා"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"පෙරනිමි"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"විශාල"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ඉතා විශාල"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"සිරස්තල මෝස්තරය"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"යෙදුමෙන් සකසන ලදි"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"කළු පසුබිමෙහි සුදු"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"සුදු පසුබිමෙහි කළු"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"කළු පසුබිමෙහි කහ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"නිල් පසුබිමෙහි කහ"</string>
</resources>
diff --git a/res/values-sk/arrays.xml b/res/values-sk/arrays.xml
index 6151dca..226068d 100644
--- a/res/values-sk/arrays.xml
+++ b/res/values-sk/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nikdy nepovoliť"</item>
<item msgid="1154273129608299386">"Vždy povoliť"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index cb589ba..90790eb 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -27,12 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Nočný režim"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Sieť a internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilná sieť"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM karty</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM kariet</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM karta</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}few{# SIM karty}many{# SIMs}other{# SIM kariet}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktívne / SIM karta"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Neaktívne / SIM karta"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktívne / stiahnutá SIM karta"</string>
@@ -40,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Pridať ďalšie"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilné dáta"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Prístup k dátam pomocou mobilnej siete"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilná sieť"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Používať mobilné dáta"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vypnúť mobilné dáta?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Vyžaduje sa výber"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Používať <xliff:g id="CARRIER">%1$s</xliff:g> na mobilné dáta?"</string>
@@ -55,12 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Dátové upozornenie: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Dátový limit: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Dátové upozornenie: <xliff:g id="ID_1">^1</xliff:g> / dátový limit: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="few">Zostávajú %d dni</item>
- <item quantity="many">Zostáva %d dňa</item>
- <item quantity="other">Zostáva %d dní</item>
- <item quantity="one">Zostáva %d deň</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Zostáva # deň}few{Zostávajú # dni}many{Zostáva # dňa}other{Zostáva # dní}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Žiadny zostávajúci čas"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Zostáva menej ako 1 deň"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Aktualizované pred <xliff:g id="ID_2">^2</xliff:g> – <xliff:g id="ID_1">^1</xliff:g>"</string>
@@ -75,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Nastaviť"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Upozornenie o dátach a limit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cyklus spotreby dát aplikáciami"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Spotreba mobilných dát"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Nastaviť dátové upozornenie"</string>
<string name="data_warning" msgid="116776633806885370">"Dátové upozornenie"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Nastaviť dátový limit"</string>
@@ -83,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Autorádio vozidla vypne po dosiahnutí nastaveného limitu mobilné dátové pripojenie.\n\nKeďže spotrebu dát meria autorádio, ale váš operátor môže spotrebu vyčísliť inak, je vhodné nastaviť si nižší limit."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Nastavenie upozornenia na spotrebu dát"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Nastavenie limitu spotreby dát"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Spotrebu dát meria vaše zariadenie. Môže sa líšiť v závislosti od mobilných dát operátora."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Nastaviť"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Uložiť"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Sieť OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet vo vozidle"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Ak vo vozidle vypnete internet, niektoré jeho funkcie či aplikácie môžu prestať fungovať.\n\nKľúčové údaje, ktoré vyžaduje prevádzka vozidla, sa budú ďalej zdieľať s výrobcom vozidla."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Aj tak vypnúť"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet vo vozidle je vypnutý. Môže to spôsobiť, že niektoré funkcie alebo aplikácie vozidla prestanú fungovať. Kľúčové údaje, ktoré vyžaduje prevádzka vozidla, sa budú ďalej zdieľať s výrobcom vozidla."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s využité %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Pripojenie k inej sieti"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Nastavenia siete"</string>
@@ -98,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Pridať sieť"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Pripojiť"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Pripája sa…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nepripojené"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Sieť nie je v dosahu"</string>
<string name="wifi_password" msgid="5565632142720292397">"Heslo"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Zobraziť heslo"</string>
@@ -159,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Vyberte aspoň jedno pásmo hotspotu Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot a tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Vypnuté"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Hotspot automaticky vypínať"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Ak nebudú pripojené žiadne zariadenia, hotspot Wi‑Fi sa vypne"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> chce zapnúť Wi‑Fi"</string>
@@ -301,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Vynútiť zastavenie"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Chcete vynútiť zastavenie?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ak vynútite zastavenie aplikácie, môže sa správať zvláštne."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Chcete vypnúť ochranu výkonu?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ak to urobíte, váš softvér a hardvér tiež nemusia fungovať."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Ponechať zapnuté"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Vypnúť"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Zapnúť priorizáciu výkonu aplikácie?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Zapnutie môže potenciálne spôsobiť nestabilitu systému alebo mať dlhodobý vplyv na hardvér. Chcete pokračovať?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Áno"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nie, ďakujem"</string>
<string name="disable_text" msgid="4358165448648990820">"Zakázať"</string>
<string name="enable_text" msgid="1794971777861881238">"Povoliť"</string>
<string name="uninstall_text" msgid="277907956072833012">"Odinštalovať"</string>
@@ -314,29 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Povolenia"</string>
<string name="notifications_label" msgid="6586089149665170731">"Upozornenia"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Ukladací priestor a vyrovnávacia pamäť"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Použiť skvelý výkon"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Priorizovať výkon aplikácie"</string>
<string name="application_version_label" msgid="8556889839783311649">"Verzia: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Neboli udelené žiadne povolenia"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Neboli požadované žiadne povolenia"</string>
<string name="unused_apps" msgid="648471933781010395">"Nepoužívané aplikácie"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> nepoužívané aplikácie</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> unused apps</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> nepoužívaných aplikácií</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> nepoužívaná aplikácia</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# nepoužívaná aplikácia}few{# nepoužívané aplikácie}many{# unused apps}other{# nepoužívaných aplikácií}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Odstraňovať povol. a uvoľňovať priestor"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s v internom úložisku"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Ak to bude potrebné, aplikácia sa zavrie"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Priorizuje výkon aplikácie pomocou systémových zdrojov"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Spotreba dát"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Spotreba dát aplikácie"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"História spotreby"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Všetky aplikácie"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Spotreba dát a používanie siete Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"História spotreby"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Celková spotreba"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Popredie"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Pozadie"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Povoliť dáta"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Povoliť tejto aplikácii používať mobilné dáta"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Obmedziť dáta"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Používať mobilné dáta, iba keď je aplik. v popredí"</string>
<string name="computing_size" msgid="5791407621793083965">"Prebieha výpočet…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> ďalšie povolenia</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ďalších povolení</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ďalšie povolenie</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# ďalšie povolenie}few{# ďalšie povolenia}many{# additional permissions}other{# ďalších povolení}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Poznámka: Po reštartovaní sa táto aplikácia spustí až vtedy, keď odomknete vozidlo."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomoc a hlasový vstup"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Asistenčná aplikácia"</string>
@@ -393,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Ovládanie Wi‑Fi umožňuje aplikácii zapnúť alebo vypnúť pripojenie Wi‑Fi, vyhľadávať siete Wi‑Fi a pripájať sa k nim, pridávať ich alebo odstraňovať, prípadne spustiť výhradne miestny hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Viac"</string>
<string name="location_settings_title" msgid="901334356682423679">"Poloha"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Použiť polohu"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Povoľte vybr. aplikác. prístup k polohe"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Ak túto funkciu vypnete, odstráni prístup k polohe všetkým aplikáciám. Aplikáciám asistencie pre vodiča sa prístup zachová."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Používať polohu pre asistenc. pre vodiča"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Poloha vozidla je vypnutá"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Asistenčné aplikácie pre vodiča nemajú prístup k polohe"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Zmeniť"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Povoľte prístup k polohe aplikáciám, ktoré pomáhajú pri šoférovaní"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ak túto možnosť vypnete, aplikácie asistencie pre vodiča, ktoré fungujú na základe údajov o polohe, sa deaktivujú."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Aj tak vypnúť"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedávne žiadosti o polohu"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Žiadne nedávne žiadosti o polohu"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Povolenia na úrovni aplikácie"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Služby určovania polohy"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Používať polohu"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Nastavenie Poloha pomáha odhadnúť polohu vášho zariadenia pomocou zdrojov, ako sú GPS, Wi-Fi, mobilné siete a senzory."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Asistencia pre vodiča"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Informácie o polohe odoslané asistenčným aplikáciám pre vodiča neobsahujú údaje, ktoré umožňujú zistenie vašej totožnosti. Sú uchovávané maximálne dva dni a potom odstránené."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofón"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Použiť mikrofón"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Povoliť všetkým aplikáciám prístup k mikrofónu"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Spravovať povolenia mikrofónu"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Nedávno použité"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Žiadne nedávne aplikácie"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Prístup nemajú žiadne aplikácie"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Prístup má # z {total_count} aplikácií}few{Prístup majú # z {total_count} aplikácií}many{# of {total_count} apps have access}other{Prístup má # z {total_count} aplikácií}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nedávno použité"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Zobraziť všetko"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Načítava sa…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Systém"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Aktualizácie systému"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Rozšírené"</string>
@@ -437,12 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licencie tretích strán"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Pri načítavaní licencií sa vyskytla chyba."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Načítava sa…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="few">Ešte <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroky a bude z vás vývojár.</item>
- <item quantity="many">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
- <item quantity="other">Ešte <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> krokov a bude z vás vývojár.</item>
- <item quantity="one">Ešte <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> krok a bude z vás vývojár.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Ešte # krok a bude z vás vývojár.}few{Ešte # kroky a bude z vás vývojár.}many{Ešte # kroku a bude z vás vývojár.}other{Ešte # krokov a bude z vás vývojár.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Teraz ste vývojár!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Nie je to potrebné, už ste vývojár."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Pre vývojárov"</string>
@@ -511,16 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Po vytvorení by si mala príslušná osoba nový profil prispôsobiť podľa seba."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Aplikácie môžu byť aktualizované z ľubovoľného profilu a potom používané všetkými ostatnými."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Dosiahnutý maximálny počet profilov"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="few">Môžete vytvoriť až <xliff:g id="COUNT">%d</xliff:g> profily.</item>
- <item quantity="many">You can create up to <xliff:g id="COUNT">%d</xliff:g> profiles.</item>
- <item quantity="other">Môžete vytvoriť až <xliff:g id="COUNT">%d</xliff:g> profilov.</item>
- <item quantity="one">Dá sa vytvoriť iba jeden profil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Vytvoriť sa dá iba jeden profil.}few{Môžete vytvoriť až # profily.}many{You can create up to # profiles.}other{Môžete vytvoriť až # profilov.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Nový profil sa nepodarilo vytvoriť"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Chcete odstrániť tento profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Všetky aplikácie a údaje v tomto profile budú odstránené"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profil sa nepodarilo odstrániť."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil nebol odstránený. Reštartujte zariadenie a skúste to znova."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Keď prepnete profily alebo reštartujete vozidlo, tento profil bude odstránený."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Zavrieť"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Skúsiť znova"</string>
@@ -633,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Ako kresliť bezpečnostný vzor obrazovky"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Pri ukladaní vzoru sa vyskytla chyba"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Príliš veľa chybných pokusov. Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Vzor nepodporuje otočné ovládanie, zadajte ho klepnutím"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Odstrániť zámku obrazovky?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Ktokoľvek bude mať prístup do vášho účtu"</string>
@@ -664,42 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Bežné kódy PIN zablokoval váš správca IT. Skúste iný PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Musí obsahovať iba platné znaky."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Heslo nie je platné, musí obsahovať najmenej 4 znaky."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="few">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> písmená</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
- <item quantity="other">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> písmen</item>
- <item quantity="one">Musí obsahovať aspoň 1 písmeno</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="few">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> malé písmená</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
- <item quantity="other">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> malých písmen</item>
- <item quantity="one">Musí obsahovať aspoň 1 malé písmeno</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="few">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> veľké písmená</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
- <item quantity="other">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> veľkých písmen</item>
- <item quantity="one">Musí obsahovať aspoň 1 veľké písmeno</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="few">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> čísla</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
- <item quantity="other">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> čísel</item>
- <item quantity="one">Musí obsahovať aspoň 1 číslo</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="few">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> špeciálne symboly</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
- <item quantity="other">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> špeciálnych symbolov</item>
- <item quantity="one">Musí obsahovať aspoň 1 špeciálny symbol</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="few">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> znaky, ktoré nie sú písmená</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
- <item quantity="other">Musí obsahovať aspoň <xliff:g id="COUNT">%d</xliff:g> znakov, ktoré nie sú písmená</item>
- <item quantity="one">Musí obsahovať aspoň 1 znak, ktorý nie je písmeno</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Správca zariadenia neumožňuje používať nedávne heslo"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Pri ukladaní hesla sa vyskytla chyba"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Bežné heslá zablokoval správca IT. Skúste iné heslo."</string>
@@ -742,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Pridať profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Odstrániť tento profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Pridanie profilu"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Jas displeja"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Ak chcete vidieť svoje zariadenia, zapnite Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Ak chcete spárovať zariadenie, otvorte nastavenia Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"správca palubného systému"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivované aplikácie"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktivované aplikácie"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplikácie s týmto povolením majú prístup k údajom tohto vozidla"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Žiadne aplikácie na správu vozidla"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Táto aplikácia správcu palubného systému je aktívna a umožňuje aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> vykonávať nasledujúce operácie:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Aktiváciou tejto aplikácie palubného systému umožníte aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> vykonávať nasledujúce operácie:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktivovať túto aplik. palubného systému?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktivovať túto aplikáciu palubného systému"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktivovať a odinštalovať"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Deaktivovať túto aplikáciu palubného systému"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Ďalšie podrobnosti"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Správca organizácie môže sledovať a spravovať aplikácie a údaje spojené s týmto profilom vrátane nastavení, povolení, podnikového prístupu, aktivity v sieti a informácií o polohe vozidla."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Správca organizácie môže sledovať a spravovať aplikácie a údaje spojené s týmto profilom vrátane nastavení, povolení, podnikového prístupu, aktivity v sieti a informácií o polohe zariadenia."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Správca organizácie môže sledovať a spravovať aplikácie a údaje spojené s týmto palubným systémom vrátane nastavení, povolení, podnikového prístupu, aktivity v sieti a informácií o polohe vozidla."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Správca organizácie môže získať prístup k údajom spojeným s týmto palubným systémom, spravovať aplikácie a zmeniť nastavenia tohto vozidla."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Nie je k dispozícii"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"V tomto spravovanom vozidle nemôžete meniť hlasitosť"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"V tomto spravovanom vozidle nemôžete volať"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"V tomto spravovanom vozidle nie sú povolené SMS"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"V tomto spravovanom vozidle nie je k dispozícii kamera"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"V tomto spravovanom vozidle nemôžete vytvárať snímky obrazovky"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"V tomto spravovanom vozidle sa táto aplikácia nedá otvoriť"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blokované vaším poskytovateľom úveru"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Prístup k niektorým funkciám obmedzila organizácia.\n\nAk máte otázky, kontaktujte správcu organizácie."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Aplikácie správcu vozidiel"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivovaná aplikácia}few{# aktivované aplikácie}many{# activated apps}other{# aktivovaných aplikácií}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Žiadne aktivované aplikácie"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Pravidlá pre vozidlá organizácie <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Nastavenia ovláda správca organizácie"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Ďalšie informácie o službe <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Chcete zdieľať hlásenie chyby?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Správca organizácie tohto vozidla požiadal o hlásenie chyby, ktoré pomôže riešiť problém s týmto vozidlom. Aplikácie a údaje môžu byť zdieľané."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Správca organizácie tohto vozidla požiadal o hlásenie chyby, ktoré pomôže riešiť problém s týmto vozidlom. Aplikácie a údaje môžu byť zdieľané. Môže to dočasne spomaliť vaše zariadenie."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Toto hlásenie chyby je zdieľané so správcom organizácie tohto vozidla. Ak potrebujete ďalšie podrobnosti, kontaktujte ho."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Zdieľanie"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Odmietnuť"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Toto nastavenie teraz nie je možné zmeniť."</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Dostupnosť"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Titulky"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Predvoľby titulkov"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Vypnuté"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Zapnuté"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Čítačka obrazovky"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Zobrazovať titulky"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Veľkosť textu"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Veľkosť a štýl titulkov"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Veľmi malé"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Malé"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Predvolené"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Veľké"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Veľmi veľké"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Štýl titulkov"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Nastavené aplikáciou"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Biele na čiernom"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Čierne na bielom"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Žlté na čiernom"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Žlté na modrom"</string>
</resources>
diff --git a/res/values-sl/arrays.xml b/res/values-sl/arrays.xml
index b07a4ce..99c89d4 100644
--- a/res/values-sl/arrays.xml
+++ b/res/values-sl/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Nikoli ne dovoli"</item>
<item msgid="1154273129608299386">"Vedno dovoli"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index a8b2cc8..032acdc 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -27,12 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Nočni način"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Omrežje in internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilno omrežje"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> kartica SIM</item>
- <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> kartici SIM</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> kartice SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> kartic SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# kartica SIM}one{# kartica SIM}two{# kartici SIM}few{# kartice SIM}other{# kartic SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktivno/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Neaktivno/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktivno/prenesena kartica SIM"</string>
@@ -40,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Dodaj več"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Prenos pod. v mobilnem omrežju"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Dostop do podatkov prek mobilnega omrežja"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilno omrežje"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Uporaba prenosa podatkov v mobilnem omrežju"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Želite izklopiti prenos pod. v mobilnih omrežjih?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Izbira je obvezna"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Podatki v mob. omr. z oper. <xliff:g id="CARRIER">%1$s</xliff:g>?"</string>
@@ -55,12 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Opozorilo ob prenes. količini podatkov <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Omejitev prenosa podatkov pri <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Opozorilo ob preneseni količini podatkov <xliff:g id="ID_1">^1</xliff:g>/omejitev prenosa podatkov pri <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Še %d dan</item>
- <item quantity="two">Še %d dneva</item>
- <item quantity="few">Še %d dni</item>
- <item quantity="other">Še %d dni</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Še # dan}one{Še # dan}two{Še # dneva}few{Še # dni}other{Še # dni}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Ni preostalega časa"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Še manj kot 1 dan"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Posodobil operater <xliff:g id="ID_1">^1</xliff:g> pred <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -75,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Nastavi"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Opozorilo in omejitev za prenos podatk."</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cikel porabe podatkov aplikacije"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Prenos podatkov v mobilnem omrežju"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Nastavi opoz. za prenos podat."</string>
<string name="data_warning" msgid="116776633806885370">"Opozorilo o prenosu podatkov"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Nastavi omejitev prenosa pod."</string>
@@ -83,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Glavna enota vozila bo izklopila prenos podatkov v mobilnih omrežjih, ko bo dosežena nastavljena omejitev.\n\nKer količino prenesenih podatkov meri glavna enota, operater pa jo morda drugače, priporočamo, da nastavite nekoliko manjšo omejitev."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Nastavitev opozorila o prenes. količini podatkov"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Nastavitev omejitve količine prenesenih podatkov"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Preneseno količino podatkov meri naprava. Morda se razlikuje od količine prenesenih podatkov, ki jih izmeri mobilni operater."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Nastavi"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Shrani"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Omrežje OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet v vozilu"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Če izklopite internet v vozilu, lahko nekatere funkcije vozila ali aplikacije nehajo delovati.\n\nNujno pomembni podatki, potrebni za upravljanje vozila, se bodo še naprej razkrivali proizvajalcu vozila."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Vseeno izklopi"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet v vozilu je izklopljen. Zaradi tega lahko nekatere funkcije vozila ali aplikacije nehajo delovati. Nujno pomembni podatki, potrebni za upravljanje vozila, se bodo še naprej razkrivali proizvajalcu vozila."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s je bilo uporabljenih v obdobju %2$s–%3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Pridružitev drugemu omrežju"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Omrežne nastavitve"</string>
@@ -98,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj omrežje"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Poveži"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Povezovanje …"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Povezava ni vzpostavljena"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Omrežje ni v dosegu"</string>
<string name="wifi_password" msgid="5565632142720292397">"Geslo"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Prikaži geslo"</string>
@@ -159,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Izberite vsaj en pas za dostopno točko Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Dostopna točka in skupna raba mobilnega interneta"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Dostopna točka"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Izklopljeno"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Samodejni izklop dostopne točke"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Dostopna točka Wi‑Fi se bo izklopila, če ni povezana nobena naprava"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"Aplikacija <xliff:g id="REQUESTER">%s</xliff:g> želi vklopiti Wi-Fi"</string>
@@ -301,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Prisilna ustavitev"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Želite prisilno ustaviti aplikacijo?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Če prisilno ustavite aplikacijo, morda ne bo pravilno delovala."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Želite izklopiti zaščito zmogljivosti?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Če naredite to, programska oprema in strojna oprema morda ne bosta delovali najbolje."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Pusti vklopljeno"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Izklopi"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Želite vklopiti prednost učinkovitosti delovanja aplikacije?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Če vklopite, lahko pride do nestabilnosti sistema ali dolgoročnega vpliva na strojno opremo. Ali želite nadaljevati?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Da"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ne, hvala"</string>
<string name="disable_text" msgid="4358165448648990820">"Onemogoči"</string>
<string name="enable_text" msgid="1794971777861881238">"Omogoči"</string>
<string name="uninstall_text" msgid="277907956072833012">"Odmesti"</string>
@@ -314,29 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Dovoljenja"</string>
<string name="notifications_label" msgid="6586089149665170731">"Obvestila"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Shramba in predpomnilnik"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Zagotovitev največje zmogljivosti"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prednost učinkovitosti delovanja aplikacije"</string>
<string name="application_version_label" msgid="8556889839783311649">"Različica: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ni odobrenih dovoljenj"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ni zahtevanih dovoljenj"</string>
<string name="unused_apps" msgid="648471933781010395">"Neuporabljene aplikacije"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> neuporabljena aplikacija</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> neuporabljeni aplikaciji</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> neuporabljene aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> neuporabljenih aplikacij</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# neuporabljena aplikacija}one{# neuporabljena aplikacija}two{# neuporabljeni aplikaciji}few{# neuporabljene aplikacije}other{# neuporabljenih aplikacij}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Odstrani dovoljenja in sprosti prostor"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s v notranji shrambi"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Po potrebi zaprite aplikacijo v izogib čezmerni rabi sredstev."</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Uporablja sistemska sredstva zaradi prednosti učinkovitosti delovanja aplikacije"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Prenes. količina podatkov"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Pren. kol. podat. aplik."</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Zgodovina pren. podatkov"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Vse aplikacije"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Prenos podatkov in Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Zgodovina pren. podatkov"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Prenos podatkov skupno"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"V ospredju"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"V ozadju"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Dovoli prenos podatkov"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Aplikaciji dovolite prenos podatkov v mob. omrežju"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Omeji prenos podatkov"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Uporaba pren. p. v m. o. le, ko je apl. v ospredju"</string>
<string name="computing_size" msgid="5791407621793083965">"Izračunavanje …"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dodatno dovoljenje</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> dodatni dovoljenji</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatna dovoljenja</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatnih dovoljenj</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# dodatno dovoljenje}one{# dodatno dovoljenje}two{# dodatni dovoljenji}few{# dodatna dovoljenja}other{# dodatnih dovoljenj}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Opomba: po vnovičnem zagonu se ta aplikacija ne more zagnati, če ne odklenete vozila."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomočnik in glasovni vnos"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplikacija za pomoč"</string>
@@ -393,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Upravljanje povezave Wi-Fi aplikaciji omogoča vklop ali izklop povezave Wi-Fi, iskanje omrežij Wi-Fi in povezovanje z njimi, dodajanje ali odstranjevanje omrežij ali zagon lokalne dostopne točke."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Več"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lokacija"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Uporaba lokacije"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Navedenim aplikacijam omogočite dostop do lokacije"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Če to izklopite, nobena aplikacija ne bo imela dostopa do lokacije. Aplikacije za pomoč vozniku bodo še vedno imele dostop."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Uporaba lokacije za pomoč vozniku"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Lokacija vozila je izklopljena"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Aplikacije za pomoč vozniku nimajo dostopa do lokacije."</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Spremeni"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Aplikacijam za pomoč pri vožnji omogočite dostop do lokacije"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Če to izklopite, boste onemogočili aplikacije za pomoč vozniku, ki delujejo na podlagi podatkov o lokaciji."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Vseeno izklopi"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedavne zahteve za lokacijo"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ni nedavnih zahtev za lokacijo"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Dovoljenja na ravni aplikacije"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Lokacijske storitve"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Uporaba lokacije"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Lokacijska storitev si pri zaznavanju lokacije naprave pomaga z viri, kot so GPS, omrežja Wi-Fi, mobilna omrežja in tipala."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Pomoč vozniku"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Podatki o lokaciji, poslani aplikacijam za pomoč vozniku, ne vsebujejo podatkov, ki bi omogočali vašo prepoznavo. Pred izbrisom se hranijo največ dva dneva."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Uporaba mikrofona"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Dostop do mikrofona omogoči vsem aplikacijam"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Upravljanje dovoljenj mikrofona"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Aplikacije z nedavnim dostopom"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Ni nedavnih aplikacij"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Dostop ima 0 aplikacij"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Dostop ima # od toliko aplikacij: {total_count}}one{Dostop ima # od toliko aplikacij: {total_count}}two{Dostop ima # od toliko aplikacij: {total_count}}few{Dostop ima # od toliko aplikacij: {total_count}}other{Dostop ima # od toliko aplikacij: {total_count}}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nedavno dostopano"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Ogled vseh"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Nalaganje …"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Posodobitve sistema"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Dodatno"</string>
@@ -437,12 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licence drugih ponudnikov"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Težava pri nalaganju licenc."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Nalaganje …"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak vas loči od tega, da postanete razvijalec.</item>
- <item quantity="two"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka vas ločita od tega, da postanete razvijalec.</item>
- <item quantity="few"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraki vas ločijo od tega, da postanete razvijalec.</item>
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korakov vas loči od tega, da postanete razvijalec.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{# korak vas loči od tega, da postanete razvijalec.}one{# korak vas loči od tega, da postanete razvijalec.}two{# koraka vas ločita od tega, da postanete razvijalec.}few{# koraki vas ločijo od tega, da postanete razvijalec.}other{# korakov vas loči od tega, da postanete razvijalec.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Zdaj ste razvijalec."</string>
<string name="show_dev_already" msgid="1678087328973865736">"Ni treba, ker ste že razvijalec."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Možnosti za razvijalce"</string>
@@ -511,16 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Ko ustvarite nov profil, si ga mora ta oseba prilagoditi."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Aplikacije je mogoče posodobiti s katerim koli profilom za uporabo v vseh drugih profilih."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Dosežena omejitev števila profilov"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Ustvariti je mogoče do <xliff:g id="COUNT">%d</xliff:g> profil.</item>
- <item quantity="two">Ustvariti je mogoče do <xliff:g id="COUNT">%d</xliff:g> profila.</item>
- <item quantity="few">Ustvariti je mogoče do <xliff:g id="COUNT">%d</xliff:g> profile.</item>
- <item quantity="other">Ustvariti je mogoče do <xliff:g id="COUNT">%d</xliff:g> profilov.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Ustvariti je mogoče samo en profil.}one{Ustvariti je mogoče do # profil.}two{Ustvariti je mogoče do # profila.}few{Ustvariti je mogoče do # profile.}other{Ustvariti je mogoče do # profilov.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Novega profila ni bilo mogoče ustvariti."</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Želite izbrisati ta profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Vse aplikacije in podatki za ta profil bodo izbrisani."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profila ni bilo mogoče izbrisati."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil ni bil izbrisan. Napravo lahko znova zaženete in poskusite znova."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ta profil bo izbrisan, ko preklopite med profili ali znova zaženete vozilo."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Opusti"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Poskusi znova"</string>
@@ -633,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Kako narisati vzorec za odklepanje"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Napaka pri shranjevanju vzorca"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Preveč napačnih poskusov. Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Vzorec ne podpira sukanja, uporabite dotik."</string>
<string name="okay" msgid="4589873324439764349">"V redu"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Želite odstr. zaklep. zaslona?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"S tem bo lahko vsak dostopal do računa."</string>
@@ -664,42 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Skrbnik za IT je blokiral pogoste kode PIN. Poskusite z drugo kodo PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Ne sme vsebovati neveljavnih znakov."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Geslo je neveljavno, vsebovati mora najmanj 4 znake."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> črko</item>
- <item quantity="two">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> črki</item>
- <item quantity="few">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> črke</item>
- <item quantity="other">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> črk</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> malo črko</item>
- <item quantity="two">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> mali črki</item>
- <item quantity="few">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> male črke</item>
- <item quantity="other">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> malih črk</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> veliko črko</item>
- <item quantity="two">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> veliki črki</item>
- <item quantity="few">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> velike črke</item>
- <item quantity="other">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> velikih črk</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> števko</item>
- <item quantity="two">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> števki</item>
- <item quantity="few">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> števke</item>
- <item quantity="other">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> števk</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> posebni znak</item>
- <item quantity="two">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> posebna znaka</item>
- <item quantity="few">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> posebne znake</item>
- <item quantity="other">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> posebnih znakov</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> znak, ki ni črka</item>
- <item quantity="two">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> znaka, ki nista črka</item>
- <item quantity="few">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> znake, ki niso črka</item>
- <item quantity="other">Vsebovati mora vsaj <xliff:g id="COUNT">%d</xliff:g> znakov, ki niso črka</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Skrbnik naprave ne dovoli uporabe nedavnega gesla."</string>
<string name="error_saving_password" msgid="8334882262622500658">"Napaka pri shranjevanju gesla"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Skrbnik za IT je blokiral pogosta gesla. Poskusite z drugim geslom."</string>
@@ -742,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Dodaj profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Izbriši ta profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Dodajanje profila"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Svetlost zaslona"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Če si želite ogledati naprave, vklopite Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Če želite seznaniti napravo, odprite nastavitve za Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Skrbnik informativno-razvedrilnega sistema"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktivirane aplikacije"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Deaktivirane aplikacije"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplikacije s tem dovoljenjem imajo dostop do podatkov o tem vozilu."</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Ni skrbniških aplikacij vozila"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Ta skrbniška aplikacija za informativno-razvedrilni sistem je aktivna in aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> omogoča izvajanje teh postopkov:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Če aktivirate to aplikacijo za informativno-razvedrilni sistem, boste aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> omogočili izvajanje teh postopkov:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Akt. apl. za inform.-razvedrilni sistem?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktiviraj to aplikacijo za informativno-razvedrilni sistem"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Deaktiviraj in odstrani"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Onemogoči to aplikacijo za informativno-razvedrilni sistem"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Več podrobnosti"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Upravitelj organizacije lahko nadzira in upravlja aplikacije ter podatke, povezane s tem profilom, vključno z nastavitvami, dovoljenji, dostopom za podjetje, omrežno dejavnostjo in podatki o lokaciji vozila."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Upravitelj organizacije lahko nadzira in upravlja aplikacije ter podatke, povezane s tem profilom, vključno z nastavitvami, dovoljenji, dostopom za podjetje, omrežno dejavnostjo in podatki o lokaciji naprave."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Upravitelj organizacije lahko nadzira in upravlja aplikacije ter podatke, povezane s tem informativno-razvedrilnim sistemom, vključno z nastavitvami, dovoljenji, dostopom za podjetje, omrežno dejavnostjo in podatki o lokaciji vozila."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Upravitelj organizacije morda lahko dostopa do podatkov, povezanih s tem informativno-razvedrilnim sistemom, upravlja aplikacije in spreminja nastavitve tega vozila."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"To ni na voljo"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Glasnosti v tem upravljanem vozilu ni mogoče spremeniti"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Klicanje v tem upravljanem vozilu ni mogoče"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Pošiljanje SMS-jev v tem upravljanem vozilu ni dovoljeno"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera v tem upravljanem vozilu ni na voljo"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Posnetkov zaslona v tem upravljanem vozilu ni mogoče ustvarjati"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Te aplikacije v tem upravljanem vozilu ni mogoče odpreti"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blokiral posojilodajalec"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Dostop do nekaterih funkcij omejuje organizacija.\n\nČe imate vprašanja, se obrnite na upravitelja organizacije."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Skrbniške aplikacije za vozila"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktivirana aplikacija}one{# aktivirana aplikacija}two{# aktivirani aplikaciji}few{# aktivirane aplikacije}other{# aktiviranih aplikacij}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Ni aktiviranih aplikacij"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Pravilnik o vozilih organizacije <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Nastavitve upravlja upravitelj organizacije"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Več o storitvi <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Želite poslati poročilo o napakah?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Upravitelj organizacije tega vozila je zahteval poročilo o napakah za pomoč pri odpravljanju napak v tej napravi. Aplikacije in podatki so lahko deljeni z drugimi."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Upravitelj organizacije tega vozila je zahteval poročilo o napakah za pomoč pri odpravljanju napak v tej napravi. Aplikacije in podatki so lahko deljeni z drugimi in delovanje naprave bo morda začasno upočasnjeno."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"To poročilo o napakah je deljeno z upraviteljem organizacije tega vozila. Če želite več podrobnosti, se obrnite nanj."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Deli"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Zavrni"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Te nastavitve trenutno ni mogoče spremeniti"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Dostopnost"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Podnapisi"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Nastavitve podnapisov"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Izklopljeno"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Vklopljeno"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Bralnik zaslona"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Pokaži podnapise"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Velikost besedila"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Velikost in slog podnapisov"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Zelo majhni"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Majhni"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Privzeto"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Veliki"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Zelo veliki"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Slog podnapisov"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Nastavila aplikacija"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Belo na črnem"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Črno na belem"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Rumeno na črnem"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Rumeno na modrem"</string>
</resources>
diff --git a/res/values-sq/arrays.xml b/res/values-sq/arrays.xml
index 8762326..94289f7 100644
--- a/res/values-sq/arrays.xml
+++ b/res/values-sq/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Mos lejo asnjëherë"</item>
<item msgid="1154273129608299386">"Lejo gjithmonë"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index b30b9d7..f47169e 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Modaliteti i natës"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Rrjeti dhe interneti"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Rrjeti celular"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> karta SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> kartë SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# kartë SIM}other{# karta SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktiv / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Joaktiv / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktiv / karta SIM e shkarkuar"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Shto më shumë"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Të dhënat celulare"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Qasu te të dhënat duke përdorur rrjetin celular"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Rrjeti celular"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Përdor të dhënat celulare"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Të çaktivizohen të dhënat celulare?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Kërkohet përzgjedhja"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Të përdoret <xliff:g id="CARRIER">%1$s</xliff:g> për të dhënat celulare?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Paralajmërimi i të dhënave <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Kufiri i të dhënave <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Paralajmërimi i të dhënave <xliff:g id="ID_1">^1</xliff:g> / Kufiri i të dhënave <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d ditë të mbetura</item>
- <item quantity="one">%d ditë e mbetur</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# ditë e mbetur}other{# ditë të mbetura}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Nuk ka më kohë të mbetur"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Mbetet më pak se 1 ditë"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"U përditësua nga <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> më parë"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Cakto"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Paralajmërimi dhe kufiri i të dhënave"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cikli i përd. të të dhënave të apl."</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Përdorimi i të dhënave celulare"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Cakto paralajm. për të dhënat"</string>
<string name="data_warning" msgid="116776633806885370">"Paralajmërim për të dhënat"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Cakto kufirin e të dhënave"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Njësia kryesore e automjetit tënd do t\'i çaktivizojë të dhënat celulare kur të arrihet kufiri që cakton ti.\n\nMeqenëse përdorimi i të dhënave matet nga njësia kryesore dhe operatori celular mund ta llogarisë ndryshe përdorimin, ki parasysh të vendosësh një kufi të menduar mirë."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Cakto paralajmërimin për përdorimin e të dhënave"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Cakto kufirin e përdorimit të të dhënave"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Përdorimi i të dhënave matet nga pajisja jote. Ai mund të ndryshojë nga të dhënat e operatorit tënd celular."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Cakto"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Kurse"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Rrjeti OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Interneti i automjetit"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Çaktivizimi i internetit të automjetit mund të parandalojë funksionimin e disa veçorive ose aplikacioneve të automjetit.\n\nTë dhënat kritike që kërkohen për përdorimin e automjetit do të vazhdojnë të ndahen me prodhuesin e tij."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Çaktivizo gjithsesi"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Interneti i automjetit është çaktivizuar. Kjo mund të parandalojë funksionimin e disa veçorive ose aplikacioneve të automjetit. Të dhënat kritike që kërkohen për përdorimin e automjetit do të vazhdojnë të ndahen me prodhuesin e tij."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Të përdorura: %1$s në periudhën %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Bashkohu në një rrjet tjetër"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Preferencat e rrjetit"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Shto një rrjet"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Lidhu"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Po lidhet…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Nuk është e lidhur"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Rrjeti nuk është brenda rrezes"</string>
<string name="wifi_password" msgid="5565632142720292397">"Fjalëkalimi"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Shfaq fjalëkalimin"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Zgjidh të paktën një brez për zonën e qasjes për internet për Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Zona e qasjes dhe ndarja e internetit"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Zona e qasjes për internet"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Joaktiv"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Çaktivizo automatikisht zonën e qasjes për internet"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Zona e qasjes për internet e Wi‑Fi do të çaktivizohet nëse nuk është lidhur asnjë pajisje"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> kërkon të aktivizojë Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Ndalo me forcë"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Të ndalohet me forcë?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Nëse e ndalon me forcë një aplikacion, ai mund të përjetojë çrregullime në funksionim."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Të çaktivizohet mbrojtja e cilësisë së funksionimit?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Nëse e bën këtë, softueri dhe hardueri yt mund të mos funksionojnë aq mirë."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Lëre aktive"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Çaktivizo"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Aktivizo përparësinë e performancës?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Çaktivizimi i këtij cilësimi mund të shkaktojë paqëndrueshmëri të mundshme të sistemit ose ndikim afatgjatë në harduer. Dëshiron të vazhdosh?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Po"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Jo, faleminderit"</string>
<string name="disable_text" msgid="4358165448648990820">"Çaktivizo"</string>
<string name="enable_text" msgid="1794971777861881238">"Aktivizo"</string>
<string name="uninstall_text" msgid="277907956072833012">"Çinstalo"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Lejet"</string>
<string name="notifications_label" msgid="6586089149665170731">"Njoftime"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Hapësira ruajtëse dhe memoria specifike"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Siguro cilësi maksimale funksionimi"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Jepi përparësi performancës së aplikaconit"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versioni: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nuk është dhënë leje"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nuk është kërkuar leje"</string>
<string name="unused_apps" msgid="648471933781010395">"Aplikacionet e papërdorura"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikacione të papërdorura</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikacion i papërdorur</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# aplikacion i papërdorur}other{# aplikacione të papërdorura}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Hiq lejet dhe liro hapësirën"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s në hapësirën e brendshme të ruajtjes"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Kur është e nevojshme, mbylle aplikacionin për të shmangur përdorimin e tepërt të burimeve"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Përdor burimet e sistemit për t\'i dhënë përparësi performancës së aplikacionit"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Përdorimi i të dhënave"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Përdorimi i të dhënave"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historiku i përdorimit"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Të gjitha aplikacionet"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Të dhënat dhe Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historiku i përdorimit"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Përdorimi në total"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Në plan të parë"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Sfondi"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Lejo të dhënat"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Lejo që aplikacioni të përdorë të dhënat celulare"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Kufizo të dhënat"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Aplikacioni përdor të dhënat vetëm në plan të parë"</string>
<string name="computing_size" msgid="5791407621793083965">"Po llogarit…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorizime shtesë</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> autorizim shtesë</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# leje shtesë}other{# leje shtesë}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Shënim: Pas një rinisjeje, ky aplikacion nuk mund të niset derisa të shkyçësh automjetin."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistenti dhe hyrja zanore"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Aplikacioni i asistentit"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Kontrolli i lidhjes Wi-Fi lejon që një aplikacion të aktivizojë ose të çaktivizojë Wi-Fi, të skanojë dhe të lidhet me rrjetet Wi-Fi, të shtojë ose të heqë rrjetet ose të nisë një zonë qasjeje për internetin vetëm në nivel lokal."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Më shumë"</string>
<string name="location_settings_title" msgid="901334356682423679">"Vendndodhja"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Përdor vendndodhjen"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Aplikacionet që cakton kanë qasje te vendndodhja"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Nëse e çaktivizon këtë, kjo do të heqë qasjen te vendndodhja për të gjitha aplikacionet. Aplikacionet e \"Ndihmës për drejtuesin e makinës\" do të kenë ende qasje."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Vendndodhja për \"Ndihmën për drejtuesin\""</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Vendndodhja e automjetit është joaktive"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Aplikacionet e \"Ndihmës për drejtuesin e makinës\" nuk kanë qasje te vendndodhja"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Ndrysho"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Lejo aplikacionet për drejtimin të kenë qasje te vendndodhja"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Nëse e çaktivizon këtë, aplikacionet e \"Ndihmës për drejtuesin e makinës\" që mbështeten në informacionin e vendndodhjes do të çaktivizohen."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Çaktivizo gjithsesi"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Kërkesat e vendndodhjeve të fundit"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nuk ka kërkesa të vendndodhjeve të fundit"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Lejet në nivel aplikacioni"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Shërbimet e vendndodhjes"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Përdor vendndodhjen"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Vendndodhja mund të përdorë burime si GPS, Wi‑Fi, rrjetet celulare dhe sensorët për të ndihmuar me vlerësimin e vendndodhjes së pajisjes sate."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Ndihma për drejtuesin e makinës"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Informacioni i vendndodhjes që iu dërgua aplikacioneve të \"Ndihmës për drejtuesin e makinës\" nuk përmban informacione që të identifikojnë ty. Ai ruhet për maksimumi 2 ditë përpara se të fshihet."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofoni"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Përdor mikrofonin"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Lejo qasjen në mikrofonin tënd për të gjitha aplikacionet"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Menaxho lejet e mikrofonit"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Qasur së fundi"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Asnjë aplikacion i fundit"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 aplikacione kanë qasje"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# nga {total_count} aplikacione ka qasje}other{# nga {total_count} aplikacione kanë qasje}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Qasur së fundi"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Shiko të gjitha"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Po ngarkon…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistemi"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Përditësimet e sistemit"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Të përparuara"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licencat e palëve të treta"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ka një problem me ngarkimin e licencave."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Po ngarkohet…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Tani të duhen edhe <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> hapa për t\'u bërë zhvillues.</item>
- <item quantity="one">Tani të duhet edhe <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> hap për t\'u bërë zhvillues.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Tani të duhet edhe # hap që të bëhesh një zhvillues.}other{Tani të duhen edhe # hapa që të bëhesh një zhvillues.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Tani je një zhvillues!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Nuk ka nevojë, ti je tashmë një zhvillues."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Opsionet e zhvilluesit"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Pasi të krijosh një profil të ri, ai person duhet ta personalizojë vetë atë."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Aplikacionet mund të përditësohen nga çdo profil për t\'u përdorur nga të gjitha profilet e tjera."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Është arritur kufiri i profileve"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Mund të krijosh deri në <xliff:g id="COUNT">%d</xliff:g> profile.</item>
- <item quantity="one">Mund të krijohet vetëm një profil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Mund të krijohet vetëm një profil.}other{Mund të krijosh deri në # profile.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Nuk mund të krijohej një profil i ri"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Të fshihet ky profil?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Të gjitha aplikacionet dhe të dhënat për këtë profil do të fshihen"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profili nuk mund të fshihej."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profili nuk u fshi. Mund ta rinisësh pajisjen dhe të provosh sërish."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ky profil do të fshihet kur të ndërrosh profilet ose të ndezësh përsëri automjetin."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Hiq"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Riprovo"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Si të vizatosh një motiv shkyçjeje"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Gabim gjatë ruajtjes së motivit"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Shumë tentativa të pasakta. Provo sërish brenda <xliff:g id="NUMBER">%d</xliff:g> sekondash."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Motivi me rrotullim nuk mbështetet; përdor prekjen"</string>
<string name="okay" msgid="4589873324439764349">"Në rregull"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Të hiqet kyçja e ekranit?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Kjo do të lejojë këdo që të ketë qasje në llogarinë tënde"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Kodet e zakonshme PIN janë bllokuar nga administratori i teknologjisë së informacionit. Provo një kod tjetër PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Kjo nuk mund të përfshijë një karakter të pavlefshëm."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Fjalëkalimi i pavlefshëm. Duhet të jetë të paktën 4 karaktere."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Duhet të përmbajë të paktën <xliff:g id="COUNT">%d</xliff:g> shkronja</item>
- <item quantity="one">Duhet të përmbajë të paktën 1 shkronjë</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Duhet të përmbajë të paktën <xliff:g id="COUNT">%d</xliff:g> shkronja të vogla</item>
- <item quantity="one">Duhet të përmbajë të paktën 1 shkronjë të vogël</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Duhet të përmbajë të paktën <xliff:g id="COUNT">%d</xliff:g> shkronja të mëdha</item>
- <item quantity="one">Duhet të përmbajë të paktën 1 shkronjë të madhe</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Duhet të përmbajë të paktën <xliff:g id="COUNT">%d</xliff:g> shifra numerike</item>
- <item quantity="one">Duhet të përmbajë të paktën 1 shifër numerike</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Duhet të përmbajë të paktën <xliff:g id="COUNT">%d</xliff:g> simbole të veçanta</item>
- <item quantity="one">Duhet të përmbajë të paktën 1 simbol të veçantë</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Duhet të përmbajë të paktën <xliff:g id="COUNT">%d</xliff:g> karaktere që nuk janë shkronja</item>
- <item quantity="one">Duhet të përmbajë të paktën 1 karakter që nuk është shkronjë</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Administratori i pajisjes nuk e lejon përdorimin e një fjalëkalimi të përdorur së fundi"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Gabim gjatë ruajtjes së fjalëkalimit"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Fjalëkalimet e zakonshme janë bllokuar nga administratori i teknologjisë së informacionit. Provo një fjalëkalim tjetër."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Shto një profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Fshije këtë profil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Shto profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Ndriçimi i ekranit"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Për të parë pajisjet e tua, aktivizo Bluetooth-in"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Për të çiftuar një pajisje, hap cilësimet e Bluetooth-it"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Administratori i sistemit info-argëtues"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aplikacionet e aktivizuara"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Aplikacionet e çaktivizuara"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Aplikacionet me këtë leje kanë qasje në të dhënat e këtij automjeti"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Nuk ka aplikacione të administratorit të automjetit"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Ky aplikacion i sistemit info-argëtues i administratorit është aktiv dhe lejon që aplikacioni <xliff:g id="APP_NAME">%1$s</xliff:g> të kryejë funksionet e mëposhtme:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Aktivizimi i këtij aplikacioni të sistemit info-argëtues do të lejojë që aplikacioni <xliff:g id="APP_NAME">%1$s</xliff:g> të kryejë funksionet e mëposhtme:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Të aktivizohet ky aplikacion?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktivizo këtë aplikacion të sistemit info-argëtues"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Çaktivizo dhe çinstalo"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Çaktivizo këtë aplikacion të sistemit info-argëtues"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Më shumë detaje"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Menaxheri i organizatës mund të monitorojë dhe menaxhojë aplikacionet dhe të dhënat e lidhura me këtë profil, duke përfshirë cilësimet, lejet, qasjen e korporatës, aktivitetin në rrjet dhe informacionin e vendndodhjes së automjetit."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Menaxheri i organizatës mund të monitorojë dhe menaxhojë aplikacionet dhe të dhënat e lidhura me këtë profil, duke përfshirë cilësimet, lejet, qasjen e korporatës, aktivitetin në rrjet dhe informacionin e vendndodhjes së pajisjes."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Menaxheri i organizatës mund të monitorojë dhe menaxhojë aplikacionet dhe të dhënat e lidhura me këtë sistem info-argëtues, duke përfshirë cilësimet, lejet, qasjen e korporatës, aktivitetin në rrjet dhe informacionin e vendndodhjes së automjetit."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Menaxheri i organizatës mund të ketë qasje te të dhënat e lidhura me këtë sistem info-argëtues, të menaxhojë aplikacionet dhe të ndryshojë cilësimet e këtij automjeti."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Kjo nuk ofrohet"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Volumi në këtë automjet të menaxhuar nuk mund të ndryshohet"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Në këtë automjet të menaxhuar nuk mund të bësh telefonata"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Në këtë automjet të menaxhuar nuk lejohen mesazhet SMS"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera në këtë automjet të menaxhuar nuk ofrohet"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Në këtë automjet të menaxhuar nuk mund të nxjerrësh pamje ekrani"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Në këtë automjet të menaxhuar ky aplikacion nuk mund të hapet"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Bllokuar nga ofruesi i blerjes me këste"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Qasja në disa veçori është e kufizuar nga organizata.\n\nNëse ke pyetje, kontakto me menaxherin e organizatës."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Aplikacionet e administratorit të mjetit"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aplikacion i aktivizuar}other{# aplikacione të aktivizuara}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Nuk ka aplikacion të aktivizuar"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Politika e automjeteve e <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Cilësimet menaxhohen nga menaxheri i organizatës"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Mëso më shumë për \"<xliff:g id="SERVICE">%1$s</xliff:g>\""</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Të ndahet raporti i defektit në kod?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Menaxheri i organizatës i automjetit kërkoi një raport të defektit në kod për të ndihmuar në zgjidhjen e problemeve të kësaj pajisjeje. Aplikacionet dhe të dhënat mund të ndahen."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Menaxheri i organizatës i automjetit kërkoi një raport të defektit në kod për të ndihmuar në zgjidhjen e problemeve të kësaj pajisjeje. Aplikacionet dhe të dhënat mund të ndahen dhe pajisja jote mund të ngadalësohet përkohësisht."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Raporti i defektit në kod po ndahet me menaxherin e organizatës e automjetit. Kontaktoje atë për detaje."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Ndaj"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Refuzo"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Ky cilësim nuk mund të ndryshohet në këtë moment"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Qasshmëria"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Titrat"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Preferencat e titrave"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Joaktive"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Aktive"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Lexuesi i ekranit"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Shfaq titrat"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Madhësia e tekstit"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Madhësia dhe stili i titrave"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Shumë të vogla"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Të vogla"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Parazgjedhja"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Të mëdha"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Shumë të mëdha"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Stili i titrave"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Caktuar nga aplikacioni"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"E bardhë mbi të zezë"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"E zezë mbi të bardhë"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"E verdhë mbi të zezë"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"E verdhë në të kaltër"</string>
</resources>
diff --git a/res/values-sr/arrays.xml b/res/values-sr/arrays.xml
index 38562bc..d5b1d3e 100644
--- a/res/values-sr/arrays.xml
+++ b/res/values-sr/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Никада не дозволи"</item>
<item msgid="1154273129608299386">"Увек дозволи"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 2542bad..4a39e10 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -27,11 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Ноћни режим"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Мрежа и интернет"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Мобилна мрежа"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM картица</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM картице</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM картица</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM картица}one{# SIM картица}few{# SIM картице}other{# SIM картица}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Активно/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Неактивно/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Активно/преузети SIM"</string>
@@ -39,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Додајте још"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобилни подаци"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Користи податке преко мобилне мреже"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Мобилна мрежа"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Користи мобилне податке"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Желите ли да искључите мобилне податке?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Треба да изаберете нешто"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Користити <xliff:g id="CARRIER">%1$s</xliff:g> за моб. податке?"</string>
@@ -54,11 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Упозорење за потрошњу података: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Ограничење потрошње података: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Упозорење за потрошњу података: <xliff:g id="ID_1">^1</xliff:g>/Ограничење потрошње података: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Остао је још %d дан</item>
- <item quantity="few">Остала су још %d дана</item>
- <item quantity="other">Остало је још %d дана</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Преостао је # дан}one{Преостао је # дан}few{Преостала су # дана}other{Преостало је # дана}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Време је истекло"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Преостало је мање од једног дана"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Ажурирао оператер <xliff:g id="ID_1">^1</xliff:g> пре <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -73,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Подеси"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Упозорење и ограничења за податке"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Циклус потрошње података апликације"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Потрошња мобилних података"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Подесите упозорења о подацима"</string>
<string name="data_warning" msgid="116776633806885370">"Упозорење на потрошњу података"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Подесите ограничења за податке"</string>
@@ -81,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Главна јединица у возилу ће искључити мобилне податке чим достигне ограничење које сте подесили.\n\nПошто потрошњу података мери главна јединица, а мобилни оператер може другачије да рачуна потрошњу, размислите о томе да подесите неко уобичајено ограничење."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Подесите упозорење о потрошњи података"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Подесите ограничење потрошње података"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Потрошњу података мери уређај. Може да се разликује од података мобилног оператера."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Подеси"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Сачувај"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Мрежа произвођача оригиналне опреме"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Интернет у возилу"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Ако искључите интернет у возилу, неке функције или апликације возила можда неће радити.\n\nПодаци неопходни за рад возила и даље ће се делити са произвођачем возила."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Ипак искључи"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Интернет у возилу је искључен. То може да онемогући неке функције или апликације возила. Подаци неопходни за рад возила и даље ће се делити са произвођачем возила."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Искоришћено је %1$s у периоду %2$s–%3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Придружи ме другој мрежи"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Подешавања мреже"</string>
@@ -96,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Додај мрежу"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Повежи се"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Повезује се…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Није повезано"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Мрежа није у домету"</string>
<string name="wifi_password" msgid="5565632142720292397">"Лозинка"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Прикажи лозинку"</string>
@@ -157,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Одаберите бар један опсег за Wi‑Fi хотспот:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Хотспот и привезивање"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Хотспот"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Искључено"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Аутоматски искључи хотспот"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi хотспот ће се искључити ако ниједан уређај није повезан"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> жели да укључи WiFi"</string>
@@ -299,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Принудно заустави"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Желите ли да принудно зауставите?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ако принудно зауставите апликацију, можда ће се понашати неочекивано."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Желите да искључите заштиту учинка?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ако је искључите, софтвер и хардвер можда неће радити тако добро."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Остави укључено"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Искључи"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Укључите приоритет учинка апликације?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Укључивањем може да дође до потенцијалне нестабилности система или дуготрајног утицаја на хардвер Желите ли да наставите?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Да"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Не, хвала"</string>
<string name="disable_text" msgid="4358165448648990820">"Онемогући"</string>
<string name="enable_text" msgid="1794971777861881238">"Омогући"</string>
<string name="uninstall_text" msgid="277907956072833012">"Деинсталирај"</string>
@@ -312,27 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Дозволе"</string>
<string name="notifications_label" msgid="6586089149665170731">"Обавештења"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Меморијски простор и кеш"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Обезбеди најбољи учинак"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Дај приоритет учинку апликације"</string>
<string name="application_version_label" msgid="8556889839783311649">"Верзија: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ниједна дозвола није одобрена"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ниједна дозвола није захтевана"</string>
<string name="unused_apps" msgid="648471933781010395">"Апликације које се не користе"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> апликација која се не користи</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> апликације које се не користе</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> апликација које се не користе</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# апликација која се не користи}one{# апликација које се не користи}few{# апликације које се не користе}other{# апликација које се не користе}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Уклони дозволе и ослободи простор"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s у интерној меморији"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"По потреби затвара апликацију ради мањег коришћења ресурса"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Користи системске ресурсе за давање приоритета учинку апликације"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Потрошња података"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Потрошња података апл."</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Историја потрошње"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Све апликације"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Мобилни подаци и WiFi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Историја потрошње"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Укупна потрошња"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"У првом плану"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"У позадини"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Дозволи податке"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Дозволите апликацији да користи мобилне податке"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Ограничи податке"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Мобилни подаци само кад је аплик. у првом плану"</string>
<string name="computing_size" msgid="5791407621793083965">"Израчунава се..."</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> додатна дозвола</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> додатне дозволе</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> додатних дозвола</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# додатна дозвола}one{# додатна дозвола}few{# додатне дозволе}other{# додатних дозвола}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Напомена: После рестартовања ова апликација не може да се покрене док не откључате возило."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Помоћник и гласовни унос"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Апликација за помоћ"</string>
@@ -389,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Контрола WiFi мреже омогућава апликацији да укључи или искључи WiFi, тражи и повезује се на WiFi мреже, додаје или уклања мреже или покреће само локални хотспот."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Још"</string>
<string name="location_settings_title" msgid="901334356682423679">"Локација"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Користи локацију"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Дозвољава локацију за апликације које наведете"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Ако искључите ово, уклонићете приступ локацији за све апликације. Апликације помоћи за возаче ће и даље имати приступ."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Користи локацију за помоћ за возаче"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Локација возика је искључена"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Помоћ за возаче не приступа локацији"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Промени"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Дозвољава приступ локацији апликацијама за помоћ у вожњи"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ако искључите ово, апликације помоћи за возаче које се ослањају на информације о локацији ће се онемогућити."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Ипак искључи"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Недавни захтеви за локацију"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Нема недавних захтева за локацију"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Дозволе на нивоу апликација"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Услуге локације"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Користи локацију"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Локација може да користи изворе као што су GPS, WiFi, мобилне мреже и сензори да би се лакше одредила локација уређаја."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Помоћ за возаче"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Информације о локацији које се шаљу апликацијама помоћи за возаче не садрже информације које вас идентификују. Чувају се највише 2 дана пре него што се избришу."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Микрофон"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Користи микрофон"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Дозволите свим апликацијама да приступају микрофону"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Управљајте дозволама за микрофон"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Недавно приступано"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Нема недавних апликација"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 апликација има приступ"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# од укупно {total_count} апликације која има приступ}one{# од укупно {total_count} апликације која има приступ}few{# од укупно {total_count} апликације које имају приступ}other{# од укупно {total_count} апликација које имају приступ}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Недавно приступано"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Прикажи све"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Учитава се…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Систем"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Ажурирања система"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Напредно"</string>
@@ -433,11 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Лиценце трећих страна"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Дошло је до проблема при учитавању лиценци."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Учитава се…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Треба да обавите још <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> корак да бисте постали програмер.</item>
- <item quantity="few">Треба да обавите још <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> корака да бисте постали програмер.</item>
- <item quantity="other">Треба да обавите још <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> корака да бисте постали програмер.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Треба да обавите још # корак да бисте постали програмер.}one{Треба да обавите још # корак да бисте постали програмер.}few{Треба да обавите још # корака да бисте постали програмер.}other{Треба да обавите још # корака да бисте постали програмер.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Постали сте програмер!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Нема потребе, већ сте програмер."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Опције за програмере"</string>
@@ -506,15 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Када направите нов профил, та особа треба сама да га прилагоди."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Апликације могу да се ажурирају са било ког профила за све друге профиле."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Достигнут максималан број профила"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Можете да направите највише <xliff:g id="COUNT">%d</xliff:g> профил.</item>
- <item quantity="few">Можете да направите највише <xliff:g id="COUNT">%d</xliff:g> профила.</item>
- <item quantity="other">Можете да направите највише <xliff:g id="COUNT">%d</xliff:g> профила.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Можете да направите само један профил.}one{Можете да направите највише # профил.}few{Можете да направите највише # профила.}other{Можете да направите највише # профила.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Прављење новог профила није успело"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Желите да избришете овај профил?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Избрисаћете све апликације и податке за овај профил"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Брисање профила није успело."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Профил није избрисан. Рестартујте уређај и пробајте поново."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Овај профил се брише када пређете на други профил или рестартујете возило."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Одбаци"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Пробај поново"</string>
@@ -627,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Како нацртати шаблон за откључавање"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Грешка при чувању шаблона"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Превише нетачних покушаја. Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> сек."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Уместо ротирајућег уноса користите додир"</string>
<string name="okay" msgid="4589873324439764349">"Потврди"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Уклонићете закључавање екрана?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Тада ће свако моћи да приступи вашем налогу"</string>
@@ -658,36 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"ИТ администратор блокира честе PIN-ове. Изаберите други PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Не сме да обухвата неважећи знак."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Лозинка је неважећа, мора да садржи најмање 4 знака."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> слово</item>
- <item quantity="few">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> слова</item>
- <item quantity="other">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> слова</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> малo слово</item>
- <item quantity="few">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> мала слова</item>
- <item quantity="other">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> малих слова</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> велико слово</item>
- <item quantity="few">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> велика слова</item>
- <item quantity="other">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> великих слова</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> цифру</item>
- <item quantity="few">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> цифре</item>
- <item quantity="other">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> цифара</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> специјални симбол</item>
- <item quantity="few">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> специјална симбола</item>
- <item quantity="other">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> специјалних симбола</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> знак који није слово</item>
- <item quantity="few">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> знака који нису слова</item>
- <item quantity="other">Мора да садржи најмање <xliff:g id="COUNT">%d</xliff:g> знакова који нису слова</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Администратор уређаја не дозвољава употребу недавно коришћене лозинке"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Грешка при чувању лозинке"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ИТ администратор блокира честе лозинке. Изаберите другу лозинку."</string>
@@ -730,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Додај профил"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Избриши овај профил"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Додајте профил"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Осветљеност екрана"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Да бисте видели уређаје, укључите Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Да бисте упарили уређај, отворите Bluetooth подешавања"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Администратор система за инфо-забаву"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Активиране апликације"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Деактивиране апликације"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Апликације са овом дозволом имају приступ подацима о овом возилу"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Нема апликација за администратора аутомобила"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Ова апликација администратора система за инфо-забаву је активна и омогућава апликацији <xliff:g id="APP_NAME">%1$s</xliff:g> да обавља следеће операције:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Активирањем ове апликације система за инфо-забаву омогућава се апликацији <xliff:g id="APP_NAME">%1$s</xliff:g> да обавља следеће операције:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Активираћете апликацију за инфо-забаву?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Активирај ову апликацију система за инфо-забаву"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Деактивирај и деинсталирај"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Деактивирај ову апликацију система за инфо-забаву"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Још детаља"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Менаџер организације може да надгледа апликације и податке повезане са овим профилом, укључујући подешавања, дозволе, корпоративни приступ, мрежну активност и информације о локацији возила, као и да управља њима."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Менаџер организације може да надгледа апликације и податке повезане са овим профилом, укључујући подешавања, дозволе, корпоративни приступ, мрежну активност и информације о локацији уређаја, као и да управља њима."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Менаџер организације може да надгледа апликације и податке повезане са овим системом за инфо-забаву, укључујући подешавања, дозволе, корпоративни приступ, активности на мрежи и информације о локацији уређаја, као и да управља њима."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Менаџер организације ће можда моћи да приступа подацима повезаним са овим системом за инфо-забаву, да управља апликацијама и да мења подешавања овог возила."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"То је недоступно"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Не можете да промените јачину звука у овом возилу којим се управља"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Не можете да упућујете позиве у овом возилу којим се управља"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS није дозвољен у овом возилу којим се управља"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Камера није доступна у овом возилу којим се управља"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Снимање снимака екрана у овом возилу којим се управља није могуће"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Не можете да отворите ту апликацију у овом возилу којим се управља"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Блокира добављач кредита"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Организација је ограничила приступ неким функцијама.\n\nАко имате питања, обратите се менаџеру организације."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Апликације администратора возила"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# активирана апликација}one{# активирана апликација}few{# активиране апликације}other{# активираних апликација}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Нема активираних апликација"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Смернице за возила организације <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Подешавања којима управља менаџер организације"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Сазнајте више о: <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Желите ли да делите извештај о грешци?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Менаџер организације за ово возило је затражио извештај о грешци ради лакшег решавања проблема у вези са овим уређајем. Апликације и подаци могу да се деле."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Менаџер организације за ово возило је затражио извештај о грешци ради лакшег решавања проблема у вези са овим уређајем. Апликације и подаци могу да се деле, а уређај ће се привремено успорити."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Овај извештај о грешци се дели са менаџером организације за ово возило. Обратите му се за више детаља."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Дели"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Одбиј"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Тренутно не можете да промените ово подешавање"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Приступачност"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Титл"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Подешавања титла"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Искључено"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Укључено"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Читач екрана"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Прикажи титл"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Величина текста"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Величина и стил титла"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Веома мало"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Мало"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Подразумевано"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Велико"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Веома велико"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Стил титла"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Подешава апликација"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Бело на црно"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Црно на бело"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Жуто на црно"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Жуто на плаво"</string>
</resources>
diff --git a/res/values-sv/arrays.xml b/res/values-sv/arrays.xml
index 582a3eb..46d8295 100644
--- a/res/values-sv/arrays.xml
+++ b/res/values-sv/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Tillåt aldrig"</item>
<item msgid="1154273129608299386">"Tillåt alltid"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 64ffeba..7e3a971 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Nattläge"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Nätverk och internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobilnätverk"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-kort</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM-kort</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-kort}other{# SIM-kort}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktiv/SIM-kort"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Inaktiv/SIM-kort"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktiv/nedladdat SIM-kort"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Lägg till fler"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobildata"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Få åtkomst till data via mobilt nätverk"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobilnätverk"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Använd mobildata"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vill du inaktivera mobildata?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Du måste välja något"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Ska mobildata från <xliff:g id="CARRIER">%1$s</xliff:g> användas?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Datavarning vid <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Datagräns på <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Datavarning vid <xliff:g id="ID_1">^1</xliff:g>/datagräns på <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d dagar kvar</item>
- <item quantity="one">%d dag kvar</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# dag kvar}other{# dagar kvar}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Ingen tid återstår"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Mindre än 1 dag kvar"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Uppdaterades av <xliff:g id="ID_1">^1</xliff:g> för <xliff:g id="ID_2">^2</xliff:g> sedan"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Använd"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Varning och gräns för data"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cykel för appdataanvändning"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Användning av mobildata"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Ställ in en datavarning"</string>
<string name="data_warning" msgid="116776633806885370">"Datavarning"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Ange datagräns"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"När mobildatan når den gräns du har angett inaktiveras den av fordonets huvudenhet.\n\nVi föreslår att du anger en något lägre gräns eftersom dataanvändningen mäts med huvudenheten och din leverantör kan mäta användningen på ett annat sätt."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Ange varning för dataanvändning"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Ange gräns för dataanvändning"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Dataanvändning mäts av enheten. Mätningen kan skilja sig från mätningen av mobiloperatörens data."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Använd"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Spara"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM-nätverk"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet i bilen"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Om du stänger av internet i bilen kan vissa funktioner eller appar i bilen sluta fungera.\n\nViktig data som krävs för att hantera bilen fortsätter att delas med bilens tillverkare."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Inaktivera ändå"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet i bilen har inaktiverats. Detta kan få till följd att vissa funktioner eller appar i bilen slutar fungera. Viktig data som krävs för att hantera bilen fortsätter att delas med bilens tillverkare."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s användes %2$s–%3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Anslut till andra nätverk"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Nätverksinställningar"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Lägg till nätverk"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Anslut"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Ansluter …"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Ingen anslutning"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Nätverket är inte inom räckvidd"</string>
<string name="wifi_password" msgid="5565632142720292397">"Lösenord"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Visa lösenord"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Välj minst ett band för Wi‑Fi-surfzon:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Trådlös surfzon och internetdelning"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Surfzon"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Av"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Inaktivera surfzon automatiskt"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wifi-surfzonen inaktiveras om inga enheter är anslutna"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> vill aktivera wifi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Tvinga att avsluta"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Vill du tvinga appen att avsluta?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Om du tvingar appen att avsluta kanske den inte fungerar som den ska."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Vill du inaktivera prestandaskydd?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"I sådana fall programvaran och maskinvaran inte fungerar som de ska."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Låt vara aktiverad"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Stäng av"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Aktivera Prioritera appars prestanda?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Om du aktiverar detta kan systemet bli instabilt, och det kan påverka maskinvaran långsiktigt. Vill du fortsätta?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ja"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Nej tack"</string>
<string name="disable_text" msgid="4358165448648990820">"Inaktivera"</string>
<string name="enable_text" msgid="1794971777861881238">"Aktivera"</string>
<string name="uninstall_text" msgid="277907956072833012">"Avinstallera"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Behörigheter"</string>
<string name="notifications_label" msgid="6586089149665170731">"Aviseringar"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Lagringsutrymme och cacheminne"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Trygga topprestandan"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Prioritera appars prestanda"</string>
<string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Inga behörigheter har beviljats"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Inga behörigheter har begärts"</string>
<string name="unused_apps" msgid="648471933781010395">"Appar som inte används"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> appar som inte används</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app som inte används</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# app som inte används}other{# appar som inte används}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Ta bort behörigheter och frigör utrymme"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s i internt lagringsutrymme"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Stäng appen och undvik hög resursåtgång"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Systemresurser används för att prioritera appars prestanda"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Dataanvändning"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Appens dataanvändning"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Användningshistorik"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Alla appar"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Data- och wifi-användning"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Användningshistorik"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Total användning"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"I förgrunden"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"I bakgrunden"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Tillåt dataanvändning"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Tillåt att den här appen använder mobildata"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Begränsa dataanvändning"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Använd mobildata endast när appen körs i förgrunden"</string>
<string name="computing_size" msgid="5791407621793083965">"Beräknar …"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> behörigheter till</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> behörighet till</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# behörighet till}other{# behörigheter till}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Obs! När du har startat om enheten måste du låsa upp fordonet innan du kan starta den här appen."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistent och röstinmatning"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assistentapp"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Med wifi-styrning får den här appen behörighet att aktivera eller inaktivera wifi, söka efter och ansluta till wifi-nätverk, lägga till eller ta bort nätverk samt starta en lokal surfzon."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Mer"</string>
<string name="location_settings_title" msgid="901334356682423679">"Plats"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Använd plats"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Tillåt att specifika appar kommer åt din plats"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Om du stänger av detta tas platsåtkomst bort för alla appar. Förarassistansappar får fortsatt åtkomst."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Använd plats för förarassistans"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Fordonets plats är av"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Förarassistantsappar kommer inte åt din plats"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Ändra"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Tillåt att appar för förarassistans kommer åt din plats"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Om du stänger av detta inaktiveras funktioner för förarassistans som behöver platsinformation."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Inaktivera ändå"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nyligen gjorda platsförfrågningar"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Inga platsförfrågningar har gjorts nyligen"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Behörigheter på appnivå"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Platstjänster"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Använd plats"</string>
<string name="location_settings_footer" msgid="296892848338100051">"I Platstjänster används källor som GPS, wifi, mobilnätverk och sensorer för att beräkna enhetens plats."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Förarassistans"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Platsinformation som skickas till förarassistansappar innehåller inga uppgifter som identifierar dig. Informationen sparas i högst två dagar och tas sedan bort."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Använda mikrofonen"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Ge alla appar åtkomst till mikrofonen"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Hantera mikrofonbehörigheter"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Nyligen använt"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Inga appar har haft åtkomst nyligen"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 appar har åtkomst"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# av {total_count} appar har åtkomst}other{# av {total_count} appar har åtkomst}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Nyligen använt"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Visa alla"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Läser in …"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Systemuppdateringar"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Avancerat"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Licenser från tredje part"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ett problem inträffade när licenserna lästes in."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Läser in …"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Du är nu <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steg från att bli utvecklare.</item>
- <item quantity="one">Du är nu <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> steg från att bli utvecklare.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Nu är du # steg från att bli utvecklare.}other{Nu är du # steg från att bli utvecklare.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Nu är du en utvecklare!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Det behövs inte. Du är redan utvecklare."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Utvecklaralternativ"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"När du skapar en ny profil måste den personen anpassa den själv."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Alla profiler kan uppdatera appar för samtliga profilers räkning."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Maximalt antal profiler har nåtts"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Du kan skapa upp till <xliff:g id="COUNT">%d</xliff:g> profiler.</item>
- <item quantity="one">Det går bara att skapa en profil.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Det går bara att skapa en profil.}other{Du kan skapa upp till # profiler.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Det gick inte att skapa en ny profil"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Vill du radera den här profilen?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Alla appar och all data för den här profilen raderas"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Det gick inte att radera profilen."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profilen raderades inte. Starta om enheten och försök igen."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Den här profilen raderas när du byter till en annan profil eller startar fordonet igen."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Stäng"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Försök igen"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Så här ritar du ett grafiskt lösenord"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Grafiskt lösenord kunde inte sparas"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"För många felaktiga försök. Försök igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Vridreglage stöds inte. Du måste trycka lösenordet"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Vill du ta bort skärmlåset?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Om du tar bort skärmlåset kan alla få åtkomst till kontot"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"IT-adminstratören har blockerat de vanligaste pinkoderna. Testa en annan pinkod."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Får inte innehålla ogiltiga tecken."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Lösenordet är ogiltigt. Det måste innehålla minst fyra tecken."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Lösenordet måste innehålla minst <xliff:g id="COUNT">%d</xliff:g> bokstäver</item>
- <item quantity="one">Lösenordet måste innehålla minst en bokstav</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Lösenordet måste innehålla minst <xliff:g id="COUNT">%d</xliff:g> små bokstäver</item>
- <item quantity="one">Lösenordet måste innehålla minst en liten bokstav</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Lösenordet måste innehålla minst <xliff:g id="COUNT">%d</xliff:g> stora bokstäver</item>
- <item quantity="one">Lösenordet måste innehålla minst en stor bokstav</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Lösenordet måste innehålla minst <xliff:g id="COUNT">%d</xliff:g> siffror</item>
- <item quantity="one">Lösenordet måste innehålla minst en siffra</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Lösenordet måste innehålla minst <xliff:g id="COUNT">%d</xliff:g> specialsymboler</item>
- <item quantity="one">Lösenordet måste innehålla minst en specialsymbol</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Lösenordet måste innehålla minst <xliff:g id="COUNT">%d</xliff:g> tecken som inte är bokstäver</item>
- <item quantity="one">Lösenordet måste innehålla minst ett tecken som inte är en bokstav</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Enhetsadministratören tillåter inte att ett lösenord som använts nyligen används igen"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Lösenord kunde inte sparas"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"IT-adminstratören har blockerat de vanligaste lösenorden. Testa ett annat lösenord."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Lägg till en profil"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Radera den här profilen"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Lägg till profil"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Skärmens ljusstyrka"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Aktivera Bluetooth för att visa enheterna"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Öppna Bluetooth-inställningarna för att koppla en enhet"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Infotainmentsystemets administratör"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Aktiverade appar"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Inaktiverade appar"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Appar med den här behörigheten har åtkomst till det här fordonets data"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Inga administratörsappar för fordon"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Administratörsappen för infotainmentsystemet är aktiverad och tillåter att appen <xliff:g id="APP_NAME">%1$s</xliff:g> utför följande åtgärder:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Om du aktiverar den här administratörsappen för infotainmentsystemet kan appen <xliff:g id="APP_NAME">%1$s</xliff:g> utföra följande åtgärder:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Aktivera appen för infotainmentsystemet?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Aktivera den här appen för infotainmentsystemet"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Inaktivera och installera"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Inaktivera appen för infotainmentsystemet"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Mer information"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Organisationsansvarig kan övervaka och hantera appar och data som är kopplade till den här profilen, bland annat inställningar, behörigheter, företagsåtkomst, nätverksaktivitet och fordonets platsuppgifter."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Organisationsansvarig kan övervaka och hantera appar och data som är kopplade till den här profilen, bland annat inställningar, behörigheter, företagsåtkomst, nätverksaktivitet och enhetens platsuppgifter."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Organisationsansvarig kan övervaka och hantera appar och data som är kopplade till det här infotainmentsystemet, bland annat inställningar, behörigheter, företagsåtkomst, nätverksaktivitet och fordonets platsuppgifter."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Organisationsansvarig kanske kan komma åt data kopplad till det här infotainmentsystemet, hantera appar och ändra fordonets inställningar."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Inställningen är inte tillgänglig"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Det går inte att ändra volymen i detta hanterade fordon"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Det går inte att ringa i detta hanterade fordon"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Sms tillåts inte i detta hanterade fordon"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kameran är inte tillgänglig i detta hanterade fordon"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Det går inte att ta skärmbilder i detta hanterade fordon"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Det går inte att öppna appen i detta hanterade fordon"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Blockeras av långivaren"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Åtkomsten till vissa funktioner begränsas av organisationen.\n\nKontakta organisationsansvarig om du har frågor."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Administratörsappar för fordon"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# aktiverad app}other{# aktiverade appar}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Inga aktiverade appar"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Fordonspolicy för <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Inställningar som hanteras av organisationsansvarig"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Läs mer om <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Vill du dela felrapporten?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Organisationsansvarig för fordonet har bett om en felrapport som hjälp vid felsökningen av den här enheten. Appar och data kan komma att delas."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Organisationsansvarig för fordonet har bett om en felrapport som hjälp vid felsökningen av den här enheten. Appar och data kan komma att delas. Detta kan tillfälligt göra enheten långsammare."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Felrapporten delas med organisationsansvarig för fordonet. Kontakta hen om du vill veta mer."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Dela"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Avvisa"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Det går inte att ändra den här inställningen just nu"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Tillgänglighet"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Textning"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Inställningar för textning"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Av"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"På"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Skärmläsare"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Visa textning"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Textstorlek"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Textstorlek och format"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Mycket liten"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Liten"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Standard"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Stor"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Mycket stor"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Textformat"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Anpassa efter app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Vitt på svart"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Svart på vitt"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Gult på svart"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Gult på blått"</string>
</resources>
diff --git a/res/values-sw/arrays.xml b/res/values-sw/arrays.xml
index e0aca35..89b6b79 100644
--- a/res/values-sw/arrays.xml
+++ b/res/values-sw/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Usiruhusu kamwe"</item>
<item msgid="1154273129608299386">"Ruhusu kila wakati"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 40dd2a4..40dff11 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Hali ya usiku"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Mtandao na intaneti"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mtandao wa simu"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other">SIM <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">SIM <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{SIM #}other{SIM #}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Inatumika / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Haitumiki / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Inatumika / Imepakua SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Ongeza zaidi"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Data ya mtandao wa simu"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Tumia data ya mtandao wa simu"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mtandao wa simu"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Tumia data ya mtandao wa simu"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Ungependa kuzima data ya mtandao wa simu?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Unahitaji kuchagua"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Utatumia <xliff:g id="CARRIER">%1$s</xliff:g> kwa data ya mtandao wa simu?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Onyo la matumizi ya data: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Kikomo cha data: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Onyo la matumizi ya data: <xliff:g id="ID_1">^1</xliff:g> / Kikomo cha data: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Zimesalia siku %d</item>
- <item quantity="one">Imesalia siku %d</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Imebaki siku #}other{Zimebaki siku #}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Hakuna muda uliosalia"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Imesalia chini ya siku 1"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Imesasishwa na <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> zilizopita"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Weka"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Kikomo na onyo kuhusu matumizi ya data"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Awamu ya programu zinavyotumia data"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Matumizi ya data ya mtandao wa simu"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Weka onyo la matumizi ya data"</string>
<string name="data_warning" msgid="116776633806885370">"Onyo kuhusu matumizi ya data"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Weka kikomo cha data"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Stereo ya dashibodi ya gari lako itazima data ya mtandao wa simu pindi itakapofikia kikomo cha data ulichoweka.\n\nKwa kuwa stereo ya dashibodi ndiyo hupima matumizi ya data na huenda kampuni inayokupa huduma za mtandao ikahesabu matumizi hayo kwa njia tofauti, unashauriwa kuweka kikomo cha wastani."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Weka onyo kwa matumizi ya data"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Weka kikomo cha matumizi ya data"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Matumizi ya data yanapimwa na kifaa chako. Huenda yakatofautiana na data ya mtoa huduma za simu yako."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Weka"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Hifadhi"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Mtandao wa OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Intaneti ya gari"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Huenda kuzima intaneti ya gari kukazuia baadhi ya vipengele au programu za gari zisifanye kazi.\n\nData muhimu inayohitajika kuendesha gari lako itaendelea kushirikiwa na mtengenezaji wa gari."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Zima hata hivyo"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Intaneti ya gari imezimwa. Huenda hii ikazuia baadhi ya vipengele au programu za gari zisifanye kazi. Data muhimu inayohitajika kuendesha gari lako itaendelea kushirikiwa na mtengenezaji wa gari."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s zimetumika kuanzia %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Unganisha kwenye mtandao mwingine"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Mapendeleo ya mtandao"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Ongeza mtandao"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Unganisha"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Inaunganisha…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Haijaunganishwa"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Mtandao hauko karibu"</string>
<string name="wifi_password" msgid="5565632142720292397">"Nenosiri"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Onyesha nenosiri"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Chagua angalau bendi moja ya mtandaopepe wa Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Mtandaopepe na usambazaji wa mitandao"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Mtandaopepe"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Imezimwa"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Zima mtandaopepe kiotomatiki"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Mtandaopepe wa Wi-Fi utazimwa ikiwa hakuna vifaa vilivyounganishwa"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> inataka kuwasha Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Lazimisha kuzima"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Ungependa kuilazimisha izime?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ukilazimisha programu izime, huenda isifanye kazi vizuri."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Ungependa kuzima ulinzi wa utendaji?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Ukifanya hivyo, huenda maunzi na programu yako visifanye kazi pia."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Usizime"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Zima"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Utawasha kipaumbele cha utendaji wa programu?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Ukiiwasha, unaweza kusababisha matatizo ya mfumo au mandhara ya kudumu kwenye maunzi. Ungependa kuendelea?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ndiyo"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Hapana"</string>
<string name="disable_text" msgid="4358165448648990820">"Zima"</string>
<string name="enable_text" msgid="1794971777861881238">"Washa"</string>
<string name="uninstall_text" msgid="277907956072833012">"Ondoa"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Ruhusa"</string>
<string name="notifications_label" msgid="6586089149665170731">"Arifa"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Nafasi ya hifadhi na akiba"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Boresha utendaji"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Kipaumbele cha utendaji wa programu"</string>
<string name="application_version_label" msgid="8556889839783311649">"Toleo: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Hakuna ruhusa zilizotolewa"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Hakuna ruhusa zilizoombwa"</string>
<string name="unused_apps" msgid="648471933781010395">"Programu zisizotumika"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">Programu <xliff:g id="COUNT_1">%d</xliff:g> zisizotumika</item>
- <item quantity="one">Programu <xliff:g id="COUNT_0">%d</xliff:g> isiyotumika</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{Programu # isiyotumika}other{Programu # zisizotumika}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Ondoa ruhusa na upate nafasi"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s katika hifadhi ya mfumo"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Funga programu uzuie matumizi zaidi ya nyenzo, panapohitajika"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Hutumia nyenzo za mfumo kuweka kipaumbele cha utendaji wa programu"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Matumizi ya data"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Programu inavyotumia data"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Historia ya matumizi"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Programu zote"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Matumizi ya Wi-Fi na data"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Historia ya matumizi"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Jumla ya matumizi"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Kwenye skrini"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Chinichini"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Ruhusu data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Ruhusu programu hii itumie data ya mtandao wa simu"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Zuia data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Tumia tu data ya simu programu ikitumika kwenye skrini"</string>
<string name="computing_size" msgid="5791407621793083965">"Inahesabu…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other">Ruhusa <xliff:g id="COUNT_1">%d</xliff:g> za ziada</item>
- <item quantity="one">Ruhusa <xliff:g id="COUNT_0">%d</xliff:g> ya ziada</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{Ruhusa # ya ziada}other{Ruhusa # za ziada}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Kumbuka: Baada ya kuwasha tena programu hii, hutaweza kuitumia hadi utakapofungua gari lako."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Maagizo na kuweka data kwa kutamka"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Programu ya usaidizi"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Kidhibiti cha Wi-Fi huruhusu programu iwashe au izime Wi-Fi, itafute na iunganishe kwenye mitandao ya Wi-Fi, iongeze au iondoe mitandao au ianzishe mtandaopepe wa eneo mahususi."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Zaidi"</string>
<string name="location_settings_title" msgid="901334356682423679">"Mahali"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Tumia data ya mahali"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Ruhusu programu unazobainisha zifikie mahali ulipo"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Ukizima, itaondoa uwezo wa kufikia mahali kwenye programu zote. Programu za Usaidizi kwa Dereva bado zitakuwa na uwezo wa kufikia."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Tumia mahali katika Usaidizi kwa Dereva"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Kipengele cha mahali cha gari kimezimwa"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Programu za Usaidizi kwa Dereva hazifikii eneo uliko"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Badilisha"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Ruhusu programu zinazosaidia kuendesha zifikie mahali uliko"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Ukizima, programu za Usaidizi kwa Dereva zinazotegemea maelezo ya mahali zitazimwa."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Zima hata hivyo"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Maombi ya Hivi Karibuni ya Kutambua Eneo"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Hamna maombi ya hivi karibuni ya kutambua eneo"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Ruhusa za kiwango cha programu"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Huduma za Mahali"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Tumia data ya mahali"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Huenda huduma za mahali zikatumia vyanzo kama vile GPS, Wi‑Fi, mitandao ya simu na vitambuzi ili kubaini mahali kilipo kifaa chako."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Usaidizi kwa dereva"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Taarifa za mahali zinazotumwa kwenye programu za Usaidizi kwa Dereva hazina maelezo yanayokutambulisha. Huhifadhiwa kwa muda usiozidi siku mbili kabla ya kufutwa."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Maikrofoni"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Tumia maikrofoni"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Ruhusu programu zote zifikie maikrofoni yako"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Dhibiti ruhusa za maikrofoni"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Ilifikiwa hivi majuzi"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Hakuna programu za hivi karibuni"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Hakuna programu ambazo zinaweza kufikia"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Programu # kati ya {total_count} inaweza kufikia}other{Programu # kati ya {total_count} zinaweza kufikia}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Ilifikiwa hivi majuzi"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Angalia yote"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Inapakia…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Mfumo"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Masasisho ya mfumo"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Mipangilio ya kina"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Leseni za watu wengine"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Kuna shida ya kupakia leseni."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Inapakia…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Sasa umebakisha hatua <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kabla ya kuwa msanidi programu.</item>
- <item quantity="one">Sasa umebakisha hatua <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> kabla ya kuwa msanidi programu.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Sasa umebakisha hatua # ili uwe msanidi programu.}other{Sasa umebakisha hatua # ili uwe msanidi programu.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Sasa wewe ni msanidi programu!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Usijali, tayari wewe ni msanidi programu."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Chaguo za wasanidi programu"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Baada ya kutengeneza wasifu mpya, mtu huyo anapaswa kuuwekea mapendeleo ili uwe jinsi apendavyo."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Programu zinaweza kusasishwa kwenye wasifu wowote wa kutumiwa na wasifu nyingine zote."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Umefikisha kikomo cha wasifu"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Unaweza kuunda hadi wasifu <xliff:g id="COUNT">%d</xliff:g>.</item>
- <item quantity="one">Unaweza kuunda wasifu mmoja pekee.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Unaweza kuweka wasifu mmoja pekee.}other{Unaweza kuweka hadi wasifu #.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Imeshindwa kutengeneza wasifu mpya"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Ungependa kufuta wasifu huu?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Data na programu zote za wasifu huu zitafutwa"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Imeshindwa kufuta wasifu."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Haikufuta wasifu. Zima na uwashe kifaa ili ujaribu tena."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Wasifu huu utafutwa unapobadili wasifu au unapozima au kuwasha gari."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Ondoa"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Jaribu tena"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Jinsi ya kuchora mchoro wa kufungua"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Hitilafu ya kuhifadhi mchoro"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Majaribio mengi mno yasiyo sahihi. Jaribu tena baada ya sekunde <xliff:g id="NUMBER">%d</xliff:g>."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Mchoro hautumii zana ya kuzungusha, tafadhali tumia zana ya kugusa"</string>
<string name="okay" msgid="4589873324439764349">"Sawa"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Utaondoa mbinu ya kufunga skrini?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Hatua hii itamruhusu mtu yeyote afikie akaunti yako"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"PIN zinazotumika zaidi zimezuiwa na msimamizi wako wa Tehama. Jaribu PIN tofauti."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Hali hii haiwezi kujumuisha herufi isiyoruhusiwa."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Nenosiri si sahihi. Ni lazima liwe na angalau herufi 4"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Ni lazima liwe na angalau herufi <xliff:g id="COUNT">%d</xliff:g></item>
- <item quantity="one">Ni lazima liwe na angalau herufi 1</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Ni lazima liwe na angalau herufi <xliff:g id="COUNT">%d</xliff:g> ndogo</item>
- <item quantity="one">Ni lazima liwe na angalau herufi 1 ndogo</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Ni lazima liwe na herufi <xliff:g id="COUNT">%d</xliff:g> kubwa</item>
- <item quantity="one">Ni lazima liwe na angalau herufi 1 kubwa</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Ni lazima liwe na angalau tarakimu <xliff:g id="COUNT">%d</xliff:g></item>
- <item quantity="one">Ni lazima liwe na angalau tarakimu 1</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Ni lazima iwe na alama <xliff:g id="COUNT">%d</xliff:g> maalum</item>
- <item quantity="one">Ni lazima liwe na angalau alama 1 maalum</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Ni lazima liwe na angalau herufi <xliff:g id="COUNT">%d</xliff:g> ambazo si herufi za alfabeti</item>
- <item quantity="one">Ni lazima liwe na angalau herufi moja ambayo si ya alfabeti</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Msimamizi wa kifaa haruhusu kutumia nenosiri ulilotumia hivi majuzi"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Hitilafu ya kuhifadhi nenosiri"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Manenosiri yanayotumika sana yamezuiwa na msimamizi wako wa Tehama. Jaribu nenosiri tofauti."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Weka wasifu"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Futa wasifu huu"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Weka wasifu"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Ung\'aavu wa skrini"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Ili uone vifaa vyako, washa Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Ili uoanishe kifaa, fungua mipangilio ya Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Msimamizi wa mfumo wa burudani na habari"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Programu zilizowashwa"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Programu zilizozimwa"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Programu zenye ruhusa hii zinaweza kufikia data ya gari hili"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Hakuna programu za msimamizi wa gari"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Mfumo wa burudani na habari unatumika na unaruhusu programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> kutekeleza shughuli zifuatazo:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Hatua ya kuwasha programu hii ya mfumo wa burudani na habari itaruhusu programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> kutekeleza shughuli zifuatazo:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Utawasha programu ya mfumo wa burudani na habari?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Wesha programu hii ya mfumo wa burudani na habari"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Zima na uondoe"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Zima programu hii ya mfumo wa burudani na habari"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Maelezo zaidi"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Msimamizi wa shirika anaweza kufuatilia na kudhibiti programu na data zinazohusiana na wasifu huu, ikiwa ni pamoja na mipangilio, ruhusa, ufikiaji wa shirika, shughuli za mtandao na maelezo ya mahali lilipo gari."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Msimamizi wa shirika anaweza kufuatilia na kudhibiti programu na data zinazohusiana na wasifu huu, ikiwa ni pamoja na mipangilio, ruhusa, ufikiaji wa shirika, shughuli za mtandao na maelezo ya mahali kilipo kifaa."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Msimamizi wa shirika anaweza kufuatilia na kudhibiti programu na data zinazohusiana na mfumo huu wa burudani na habari, ikiwa ni pamoja na mipangilio, ruhusa, ufikiaji wa shirika, shughuli za mtandao na maelezo ya mahali lilipo gari."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Msimamizi wa shirika anaweza kufikia data inayohusiana na mfumo huu wa burudani na habari, kudhibiti programu na kubadilisha mipangilio ya gari hili."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Haipatikani"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Imeshindwa kubadilisha sauti katika gari hili linalodhibitiwa"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Huwezi kupiga simu katika gari hili linalodhibitiwa"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"SMS haziruhusiwi katika gari hili linalodhibitiwa"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Kamera haipatikani katika gari hili linalodhibitiwa"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Huwezi kupiga picha ya skrini katika gari hili linalodhibitiwa"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Huwezi kufungua programu hii katika gari hili linalodhibitiwa"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Imezuiwa na kampuni iliyokuuzia kifaa kwa mkopo"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Shirika haliruhusu ufikiaji wa baadhi ya vipengele.\n\nIkiwa una maswali, wasiliana na msimamizi wa shirika."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Programu za wasimamizi wa magari"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{Programu # imewashwa}other{Programu # zimewashwa}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Hamna programu zilizowashwa"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Sera ya magari ya <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Mipangilio inayodhibitiwa na msimamizi wa shirika"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Pata maelezo zaidi kuhusu <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Ungependa kushiriki ripoti ya hitilafu?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Msimamizi wa shirika wa gari hili ameomba ripoti ya hitilafu ili kusaidia katika utatuzi wa hitilafu kwenye kifaa hiki. Huenda programu na data zikashirikiwa."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Msimamizi wa shirika wa gari hili ameomba ripoti ya hitilafu ili kusaidia katika utatuzi wa hitilafu kwenye kifaa hiki. Huenda hatua hii ikashiriki programu na data na kupunguza kasi ya kifaa chako kwa muda."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Ripoti hii ya hitilafu inashirikiwa na msimamizi wa shirika wa gari hili. Wasiliana naye ili upate maelezo zaidi."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Shiriki"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Kataa"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Huwezi kubadilisha mipangilio hii sasa hivi"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Ufikivu"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Manukuu"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Mapendeleo ya manukuu"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Yamezimwa"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Yamewashwa"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Kisoma skrini"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Onyesha manukuu"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Ukubwa wa maandishi"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Muundo na ukubwa wa manukuu"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Madogo sana"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Madogo"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Chaguomsingi"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Makubwa"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Makubwa sana"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Mtindo wa manukuu"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Imewekwa na programu"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Maandishi meupe kwenye mandhari meusi"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Maandishi meusi kwenye mandhari meupe"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Maandishi manjano kwenye mandhari meusi"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Maandishi manjano kwa mandhari ya buluu"</string>
</resources>
diff --git a/res/values-ta/arrays.xml b/res/values-ta/arrays.xml
index f83ed2a..687047b 100644
--- a/res/values-ta/arrays.xml
+++ b/res/values-ta/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"ஒருபோதும் அனுமதிக்காதே"</item>
<item msgid="1154273129608299386">"எப்போதும் அனுமதி"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index e2cd0d6..e400c98 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"இரவுப் பயன்முறை"</string>
<string name="network_and_internet" msgid="4229023630498537530">"நெட்வொர்க் & இணையம்"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"மொபைல் நெட்வொர்க்"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> சிம்கள்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> சிம்</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# சிம்}other{# சிம்கள்}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"செயலில் உள்ளது / சிம்"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"செயலில் இல்லை / சிம்"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"செயலில் உள்ளது / பதிவிறக்கிய சிம்"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"மேலும் சேர்"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"மொபைல் டேட்டா"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"மொபைல் நெட்வொர்க் மூலம் டேட்டாவைப் பயன்படுத்து"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"மொபைல் நெட்வொர்க்"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"மொபைல் டேட்டாவைப் பயன்படுத்தும்"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"மொபைல் டேட்டாவை ஆஃப் செய்யவா?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"தேர்ந்தெடுக்க வேண்டும்"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"டேட்டாவிற்கு <xliff:g id="CARRIER">%1$s</xliff:g>ஐ உபயோகிக்கவா?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> டேட்டா எச்சரிக்கை"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> டேட்டா வரம்பு"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> டேட்டா எச்சரிக்கை / <xliff:g id="ID_2">^2</xliff:g> டேட்டா வரம்பு"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d நாட்கள் மீதமுள்ளன</item>
- <item quantity="one">%d நாள் மீதமுள்ளது</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# நாள் மீதமுள்ளது}other{# நாட்கள் மீதமுள்ளன}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"காலம் முடிந்துவிட்டது"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"24 மணிநேரத்திற்கும் குறைவாகவே உள்ளது"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"புதுப்பித்தது: <xliff:g id="ID_1">^1</xliff:g>, <xliff:g id="ID_2">^2</xliff:g> முன்பு"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"அமை"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"டேட்டா உபயோக எச்சரிக்கை & வரம்பு"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"ஆப்ஸ் டேட்டா உபயோக சுழற்சி"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"மொபைல் டேட்டா பயன்பாடு"</string>
<string name="set_data_warning" msgid="6628236612886588097">"டேட்டா உபயோக எச்சரிக்கையை அமை"</string>
<string name="data_warning" msgid="116776633806885370">"டேட்டா உபயோக எச்சரிக்கை"</string>
<string name="set_data_limit" msgid="7136539812414500084">"டேட்டா வரம்பை அமை"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"நீங்கள் அமைத்துள்ள வரம்பை அடைந்ததும் மொபைல் டேட்டாவைக் கார் சாதனத்தின் முதன்மை யூனிட் மொபைல் டேட்டாவை முடக்கும்.\n\nடேட்டா உபயோகத்தை முதன்மை யூனிட் அளவிட்டாலும் உங்கள் மொபைல் நிறுவனம் வேறுவிதமாக அளவிடலாம். எனவே பாதுகாப்பான அளவில் வரம்பை அமைக்கவும்."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"டேட்டா உபயோக எச்சரிக்கையை அமைத்தல்"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"டேட்டா உபயோக வரம்பை அமைத்தல்"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"டேட்டா பயன்பாடு உங்கள் சாதனத்தால் அளவிடப்படுகிறது. இது உங்கள் மொபைல் நிறுவனத்தின் டேட்டாவிலிருந்து மாறுபடக்கூடும்."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"அமை"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"சேமி"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM நெட்வொர்க்"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"வாகன இணையம்"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"வாகன இணையத்தை முடக்கினால் சில வாகன அம்சங்களோ ஆப்ஸோ இயங்காமல் போகலாம்.\n\nஉங்கள் வாகனத்தை இயக்கத் தேவையான முக்கியத் தரவு வாகன உற்பத்தியாளருடன் தொடர்ந்து பகிரப்படும்."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"பரவாயில்லை, முடக்கு"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"வாகன இணையம் முடக்கப்பட்டுள்ளது. இதனால் சில வாகன அம்சங்களோ ஆப்ஸோ இயங்காமல் போகலாம். உங்கள் வாகனத்தை இயக்கத் தேவையான முக்கியத் தரவு வாகன உற்பத்தியாளருடன் தொடர்ந்து பகிரப்படும்."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s முதல் %3$s வரை பயன்படுத்தப்பட்ட அளவு: %1$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"பிற நெட்வொர்க்கில் இணை"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"நெட்வொர்க் விருப்பத்தேர்வுகள்"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"நெட்வொர்க்கைச் சேர்"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"இணை"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"இணைக்கிறது…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"இணைக்கப்படவில்லை"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"தொடர்பு எல்லைக்குள் நெட்வொர்க் இல்லை"</string>
<string name="wifi_password" msgid="5565632142720292397">"கடவுச்சொல்"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"கடவுச்சொல்லைக் காட்டு"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"ஒன்றைத் தேர்வுசெய்யவும்:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ஹாட்ஸ்பாட்டும் இணைப்பு முறையும்"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ஹாட்ஸ்பாட்"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ஆஃப்"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"ஹாட்ஸ்பாட்டைத் தானாக ஆஃப் செய்"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"சாதனங்கள் எவையும் இணைக்கப்படவில்லை எனில் வைஃபை ஹாட்ஸ்பாட் ஆஃப் செய்யப்படும்"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"வைஃபையை ஆன் செய்ய <xliff:g id="REQUESTER">%s</xliff:g> ஆப்ஸ் விரும்புகிறது"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"உடனே நிறுத்து"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"உடனே நிறுத்தவா?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"ஆப்ஸை உடனே நிறுத்தினால் சரியாக இயங்காமல் போகக்கூடும்."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"செயல்திறன் பாதுகாப்பு அம்சத்தை முடக்கவா?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"இவ்வாறு செய்தால் மென்பொருளும் சாதன பாகங்களும் சரியாக வேலை செய்யாமல் போகலாம்."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"இயக்கத்திலேயே வை"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"முடக்கு"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"ஆப்ஸ் செயல்திறன் முன்னுரிமையை இயக்கவா?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"இதை இயக்குவதால் சிஸ்டம் நிலைத்தன்மையில் பாதிப்பு ஏற்படலாம் அல்லது வன்பொருளின் மீது நீண்டகாலப் பாதிப்பை ஏற்படுத்தலாம். தொடர விரும்புகிறீர்களா?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"ஆம்"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"வேண்டாம்"</string>
<string name="disable_text" msgid="4358165448648990820">"முடக்கு"</string>
<string name="enable_text" msgid="1794971777861881238">"இயக்கு"</string>
<string name="uninstall_text" msgid="277907956072833012">"நிறுவல் நீக்கு"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"அனுமதிகள்"</string>
<string name="notifications_label" msgid="6586089149665170731">"அறிவிப்புகள்"</string>
<string name="storage_application_label" msgid="5911779903670978586">"சேமிப்பகமும் தற்காலிக சேமிப்பும்"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"அதிக செயல்திறனை உறுதிசெய்தல்"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ஆப்ஸ் செயல்திறனுக்கு முன்னுரிமை அளித்தல்"</string>
<string name="application_version_label" msgid="8556889839783311649">"பதிப்பு: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"அனுமதிகள் எதுவும் வழங்கப்படவில்லை"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"அனுமதிகள் எதையும் கோரவில்லை"</string>
<string name="unused_apps" msgid="648471933781010395">"பயன்படுத்தாத ஆப்ஸ்"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> பயன்படுத்தாத ஆப்ஸ்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> பயன்படுத்தாத ஆப்ஸ்</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# பயன்படுத்தாத ஆப்ஸ்}other{# பயன்படுத்தாத ஆப்ஸ்}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"அனுமதிகளை அகற்றி இடத்தைக் காலியாக்குதல்"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"அகச் சேமிப்பகத்தில் %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"தேவைப்பட்டால் சாதன வளங்களின் அதிகப்படியான உபயோகத்தைத் தவிர்க்க ஆப்ஸை மூடும்"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ஆப்ஸின் செயல்திறனுக்கு முன்னுரிமையளிக்க சிஸ்டம் ஆதாரங்களைப் பயன்படுத்தும்"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"டேட்டா உபயோகம்"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ஆப்ஸ் டேட்டா உபயோகம்"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"இதுவரை உபயோகித்த டேட்டா"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"அனைத்து ஆப்ஸும்"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"டேட்டா & வைஃபை பயன்பாடு"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"இதுவரை உபயோகித்த டேட்டா"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"மொத்த டேட்டா பயன்பாடு"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"முன்புலம்"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"பின்புலம்"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"டேட்டாவை அனுமதித்தல்"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"மொபைல் டேட்டாவை உபயோகிக்க இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"டேட்டா கட்டுப்பாடு"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"முன்புலத்தில் மட்டுமே டேட்டாவை ஆப்ஸ் உபயோகிக்கும்"</string>
<string name="computing_size" msgid="5791407621793083965">"கணக்கிடுகிறது…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> கூடுதல் அனுமதிகள்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> கூடுதல் அனுமதி</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# கூடுதல் அனுமதி}other{# கூடுதல் அனுமதிகள்}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"கவனத்திற்கு: மறுபடி தொடங்கிய பிறகு நீங்கள் வாகனத்தை அன்லாக் செய்யும் வரை இந்த ஆப்ஸால் செயல்பட இயலாது."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"அசிஸ்டண்ட் & குரல் உள்ளீடு"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"அசிஸ்ட் ஆப்ஸ்"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"’வைஃபை கட்டுப்பாடு’ மூலம் ஆப்ஸிலிருந்து வைஃபையை ஆன் அல்லது ஆஃப் செய்யலாம், வைஃபை நெட்வொர்க்குகளை ஸ்கேன் செய்து இணைக்கலாம், நெட்வொர்க்குகளைச் சேர்க்ககலாம் அல்லது அகற்றலாம் அல்லது சாதனத்திற்குள் மட்டும் இயங்கும் ஹாட்ஸ்பாட்டைத் தொடங்கலாம்."</string>
<string name="more_special_access_title" msgid="166115485446645971">"மேலும்"</string>
<string name="location_settings_title" msgid="901334356682423679">"இடம்"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"இருப்பிடத்தைப் பயன்படுத்துதல்"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"இடத்தை அணுக நீங்கள் குறிப்பிடும் ஆப்ஸை அனுமதிக்கும்"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"இதை முடக்கினால் அனைத்து ஆப்ஸுக்கான இருப்பிட அணுகலும் அகற்றப்படும். ஓட்டுநர் உதவி ஆப்ஸுக்கு இன்னும் அணுகல் உள்ளது."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ஓட்டுநர் உதவிக்கு இடத்தைப் பயன்படுத்து"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"வாகன இருப்பிடத்தை முடக்குதல்"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ஓட்டுநர் உதவிக்கு இருப்பிட அணுகல் இல்லை"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"மாற்று"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"வாகனம் ஓட்ட உதவும் ஆப்ஸை இருப்பிடத்தை அணுக அனுமதிக்கவும்"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"இதை முடக்கினால் இருப்பிடத் தகவல்களைச் சார்ந்துள்ள ஓட்டுநர் உதவி ஆப்ஸ் முடக்கப்படும்."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"பரவாயில்லை, முடக்கு"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"இருப்பிடத் தகவல் குறித்த சமீபத்திய கோரிக்கைகள்"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"இருப்பிடத் தகவல் குறித்த சமீபத்திய கோரிக்கைகள் இல்லை"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ஆப்ஸ் நிலை அனுமதிகள்"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"இருப்பிடச் சேவைகள்"</string>
<string name="location_use_location_title" msgid="117735895374606680">"இருப்பிடத்தைப் பயன்படுத்து"</string>
<string name="location_settings_footer" msgid="296892848338100051">"உங்கள் சாதனத்தின் இருப்பிடத்தைக் கணிக்க உதவுவதற்கு GPS, வைஃபை, மொபைல் நெட்வொர்க்குகள், சென்சார்கள் போன்றவற்றை இருப்பிட அமைப்புகள் பயன்படுத்தக்கூடும்."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ஓட்டுநர் உதவி"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ஓட்டுநர் உதவி ஆப்ஸுக்கு அனுப்பப்படும் இருப்பிடம் குறித்த தகவல்களில் உங்களை அடையாளம் காணும் தகவல்கள் இருக்காது. நீக்கப்படுவதற்கு முன் அதிகபட்சமாக 2 நாட்கள் வரை இது சேமிக்கப்பட்டிருக்கும்."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"மைக்ரோஃபோன்"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"மைக்ரோஃபோனைப் பயன்படுத்துதல்"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"மைக்ரோஃபோனை அனைத்து ஆப்ஸும் அணுகுவதற்கு அனுமதிக்கும்"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"மைக்ரோஃபோன் அனுமதிகளை நிர்வகித்தல்"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"சமீபத்தில் அணுகியவை"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"சமீபத்திய ஆப்ஸ் எதுவுமில்லை"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"எந்த ஆப்ஸுக்கும் அணுகல் இல்லை"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{#/{total_count} ஆப்ஸுக்கு அணுகல் உள்ளது}other{#/{total_count} ஆப்ஸ் அணுகலைக் கொண்டுள்ளன}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"சமீபத்தில் அணுகியவை"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"அனைத்தையும் காட்டு"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"ஏற்றுகிறது…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"சிஸ்டம்"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"சிஸ்டம் புதுப்பிப்புகள்"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"மேம்பட்டவை"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"மூன்றாம் தரப்பு உரிமங்கள்"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"உரிமங்களை ஏற்றுவதில் சிக்கல்."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"ஏற்றுகிறது…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">நீங்கள் டெவெலப்பராக இன்னும் <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> படிகள் உள்ளன.</item>
- <item quantity="one">நீங்கள் டெவெலப்பராக இன்னும் <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> படி உள்ளது.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{நீங்கள் டெவெலப்பராக இன்னும் # படி உள்ளது.}other{நீங்கள் டெவெலப்பராக இன்னும் # படிகள் உள்ளன.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"நீங்கள் இப்போது டெவெலப்பராகிவிட்டீர்கள்!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"தேவையில்லை, நீங்கள் ஏற்கனவே ஒரு டெவெலப்பர்."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"டெவெலப்பர் விருப்பங்கள்"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"புதிய சுயவிவரத்தை நீங்கள் உருவாக்கிய பிறகு, சம்பந்தப்பட்ட நபரே அதைப் பிரத்தியேகமாக்க வேண்டும்."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"எல்லாச் சுயவிவரங்களும் பயன்படுத்துவதற்காக ஆப்ஸை எந்தச் சுயவிவரத்திலிருந்தும் புதுப்பிக்கலாம்."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"அனுமதிக்கப்பட்ட அதிகபட்சச் சுயவிவரங்களை உருவாக்கிவிட்டீர்கள்"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> சுயவிவரங்கள் வரை உருவாக்கலாம்.</item>
- <item quantity="one">ஒரு சுயவிவரத்தை மட்டுமே உருவாக்கலாம்.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{ஒரு சுயவிவரத்தை மட்டுமே உருவாக்க முடியும்.}other{# சுயவிவரங்கள் வரை உருவாக்க முடியும்.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"புதிய சுயவிவரத்தை உருவாக்க முடியவில்லை"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"இந்தச் சுயவிவரத்தை நீக்கவா?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"இந்தச் சுயவிவரத்திற்கான அனைத்து ஆப்ஸும் தரவும் நீக்கப்படும்"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"சுயவிவரத்தை நீக்க முடியவில்லை."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"சுயவிவரம் நீக்கப்படவில்லை. சாதனத்தை மீண்டும் தொடங்கி, முயலவும்."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"சுயவிவரங்களை மாற்றும்போதோ வாகனத்தை மீண்டும் தொடங்கும்போதோ இந்தச் சுயவிவரம் நீக்கப்படும்."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"நிராகரி"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"மீண்டும் முயலவும்"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"அன்லாக் பேட்டர்னை வரைவது எப்படி?"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"பேட்டர்னைச் சேமிப்பதில் பிழை"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"பலமுறை தவறாக முயன்றுவிட்டீர்கள். <xliff:g id="NUMBER">%d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"தொடுதல் முறையைப் பயன்படுத்தவும்"</string>
<string name="okay" msgid="4589873324439764349">"சரி"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"திரைப் பூட்டை அகற்றவா?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"திரைப் பூட்டை அகற்றினால், அனைவருக்கும் அணுகல் கிடைக்கும்"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"பொதுவான பின்கள் IT நிர்வாகியால் தடைசெய்யப்பட்டுள்ளன. வேறொரு பின்னை முயலவும்."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"இதில் தவறான எழுத்து இருக்கக்கூடாது."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"கடவுச்சொல் செல்லாது, குறைந்தது 4 எழுத்துகள் இருக்க வேண்டும்."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">குறைந்தது <xliff:g id="COUNT">%d</xliff:g> எழுத்துகள் இருக்க வேண்டும்</item>
- <item quantity="one">குறைந்தது 1 எழுத்து இருக்க வேண்டும்</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">குறைந்தது <xliff:g id="COUNT">%d</xliff:g> சிற்றெழுத்துகள் இருக்க வேண்டும்</item>
- <item quantity="one">குறைந்தது 1 சிற்றெழுத்து இருக்க வேண்டும்</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">குறைந்தது <xliff:g id="COUNT">%d</xliff:g> பேரெழுத்துகள் இருக்க வேண்டும்</item>
- <item quantity="one">குறைந்தது 1 பேரெழுத்து இருக்க வேண்டும்</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">குறைந்தது <xliff:g id="COUNT">%d</xliff:g> எண் இலக்கங்கள் இருக்க வேண்டும்</item>
- <item quantity="one">குறைந்தது 1 எண் இலக்கம் இருக்க வேண்டும்</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">குறைந்தது <xliff:g id="COUNT">%d</xliff:g> சிறப்புக் குறிகள் இருக்க வேண்டும்</item>
- <item quantity="one">குறைந்தது 1 சிறப்புக் குறி இருக்க வேண்டும்</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">குறைந்தது எழுத்து அல்லாத <xliff:g id="COUNT">%d</xliff:g> குறிகள் இருக்க வேண்டும்</item>
- <item quantity="one">குறைந்தது எழுத்து அல்லாத 1 குறி இருக்க வேண்டும்</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"சாதன நிர்வாகி சமீபத்திய கடவுச்சொல்லைப் பயன்படுத்துவதை அனுமதிக்கவில்லை"</string>
<string name="error_saving_password" msgid="8334882262622500658">"கடவுச்சொல்லைச் சேமிப்பதில் பிழை"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"பொதுவான கடவுச்சொற்கள் IT நிர்வாகியால் தடைசெய்யப்பட்டுள்ளன. வேறொரு கடவுச்சொல்லை முயலவும்."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"புதிய சுயவிவரத்தைச் சேர்"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"இந்தச் சுயவிவரத்தை நீக்கு"</string>
<string name="add_profile_text" msgid="9118410102199116969">"சுயவிவரத்தைச் சேர்"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"திரையின் ஒளிர்வு"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"உங்கள் சாதனங்களைக் காண புளூடூத்தை ஆன் செய்யுங்கள்"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"சாதனத்துடன் இணைக்க புளூடூத் அமைப்புகளைத் திறங்கள்"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"இன்ஃபோடெயின்மென்ட் சிஸ்டம் நிர்வாகி"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"செயல்படுத்தப்பட்ட ஆப்ஸ்"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"முடக்கப்பட்ட ஆப்ஸ்"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"இந்த அனுமதியைக் கொண்டுள்ள ஆப்ஸுக்கு இந்த வாகனத்தின் தரவுக்கான அணுகல் உள்ளது"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"வாகன நிர்வாகி ஆப்ஸ் எதுவுமில்லை"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"இந்த இன்ஃபோடெயின்மென்ட் சிஸ்டம் நிர்வாகி ஆப்ஸ் இயக்கப்பட்டுள்ளது, பின்வரும் செயல்பாடுகளைச் செய்ய <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அது அனுமதிக்கிறது:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"இந்த இன்ஃபோடெயின்மென்ட் சிஸ்டம் ஆப்ஸை இயக்கினால் பின்வரும் செயல்பாடுகளைச் செய்ய <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அது அனுமதிக்கும்:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"இன்ஃபோடெயின்மென்ட் சிஸ்டம் ஆப்ஸை இயக்கவா?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"இந்த இன்ஃபோடெயின்மென்ட் சிஸ்டம் ஆப்ஸை இயக்கு"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"முடக்கி, நிறுவல் நீக்கு"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"இந்த இன்ஃபோடெயின்மென்ட் சிஸ்டம் ஆப்ஸை முடக்கு"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"கூடுதல் விவரங்கள்"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"இந்தச் சுயவிவரத்துடன் தொடர்புடைய ஆப்ஸையும் தரவையும் (அமைப்புகள், அனுமதிகள், கார்ப்பரேட் அணுகல், நெட்வொர்க் செயல்பாடு, வாகனத்தின் இருப்பிடத் தகவல் போன்றவை உட்பட) நிறுவனத்தின் நிர்வாகியால் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"இந்தச் சுயவிவரத்துடன் தொடர்புடைய ஆப்ஸையும் தரவையும் (அமைப்புகள், அனுமதிகள், கார்ப்பரேட் அணுகல், நெட்வொர்க் செயல்பாடு, சாதனத்தின் இருப்பிடத் தகவல் போன்றவை உட்பட) நிறுவனத்தின் நிர்வாகியால் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"இந்த இன்ஃபோடெயின்மென்ட் சிஸ்டத்துடன் தொடர்புடைய ஆப்ஸையும் தரவையும் (அமைப்புகள், அனுமதிகள், கார்ப்பரேட் அணுகல், நெட்வொர்க் செயல்பாடு, வாகனத்தின் இருப்பிடத் தகவல் போன்றவை உட்பட) நிறுவனத்தின் நிர்வாகியால் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"நிறுவனத்தின் நிர்வாகியால் இந்த இன்ஃபோடெயின்மென்ட் சிஸ்டத்துடன் தொடர்புடைய தரவை அணுகவும் ஆப்ஸை நிர்வகிக்கவும் இந்த வாகனங்களின் அமைப்புகளை மாற்றவும் முடியும்."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"அணுக முடியவில்லை"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"நிர்வகிக்கப்படும் இந்த வாகனத்தில் ஒலியளவை மாற்ற முடியாது"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"நிர்வகிக்கப்படும் இந்த வாகனத்தில் அழைப்புகளைச் செய்ய முடியாது"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"நிர்வகிக்கப்படும் இந்த வாகனத்தில் மெசேஜ் அனுப்ப முடியாது"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"நிர்வகிக்கப்படும் இந்த வாகனத்தில் கேமரா முடக்கப்பட்டுள்ளது"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"நிர்வகிக்கப்படும் இந்த வாகனத்தில் ஸ்கிரீன்ஷாட்கள் எடுக்க முடியாது"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"நிர்வகிக்கப்படும் இந்த வாகனத்தில் இந்த ஆப்ஸைத் திறக்க முடியாது"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"கடன் வழங்குநரால் முடக்கப்பட்டுள்ளது"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"சில அம்சங்களுக்கான அணுகலானது நிறுவனத்தால் வரம்பிடப்பட்டுள்ளது.\n\nஉங்களுக்குக் கேள்விகள் இருந்தால் நிறுவனத்தின் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"வாகன நிர்வாகி ஆப்ஸ்"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# செயல்படுத்தப்பட்ட ஆப்ஸ்}other{# செயல்படுத்தப்பட்ட ஆப்ஸ்}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"செயல்படுத்தப்பட்ட ஆப்ஸ் எதுவுமில்லை"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> வாகனக் கொள்கை"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"உங்கள் நிறுவனத்தின் நிர்வாகி நிர்வகிக்கும் அமைப்புகள்"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> குறித்து மேலும் அறிக"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"பிழை அறிக்கையைப் பகிரவா?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"இந்தச் சாதனத்தைப் பிழையறிந்து திருத்துவதற்கு உதவ இந்த வாகன நிறுவனத்தின் நிர்வாகி, பிழை அறிக்கையைக் கோரியுள்ளார். ஆப்ஸும் தரவும் பகிரப்படக்கூடும்."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"இந்தச் சாதனத்தைப் பிழையறிந்து திருத்துவதற்கு உதவ இந்த வாகன நிறுவனத்தின் நிர்வாகி, பிழை அறிக்கையைக் கோரியுள்ளார். ஆப்ஸும் தரவும் பகிரப்படக்கூடும். மேலும் உங்கள் சாதனத்தின் வேகம் தற்காலிகமாகக் குறையக்கூடும்."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"இந்தப் பிழை அறிக்கை வாகன நிறுவனத்தின் நிர்வாகியுடன் பகிரப்படுகிறது. மேலும் விவரங்களுக்கு அவரைத் தொடர்புகொள்ளவும்."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"பகிர்"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"நிராகரி"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"இந்த அமைப்பை இப்போது மாற்ற முடியாது"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"அணுகல்தன்மை"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"வசனங்கள்"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"வசன விருப்பத்தேர்வுகள்"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ஆஃப்"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ஆன்"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"ஸ்கிரீன் ரீடர்"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"வசனங்களைக் காட்டு"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"உரையின் அளவு"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"வசனத்தின் அளவும் தோற்றமும்"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"மிகச் சிறியது"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"சிறியது"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"இயல்பு"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"பெரியது"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"மிகப் பெரியது"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"வசனத்தின் தோற்றம்"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ஆப்ஸின்படி அமை:"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"கருப்பில் வெண்மை"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"வெண்மையில் கருப்பு"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"கருப்பில் மஞ்சள்"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"நீலத்தில் மஞ்சள்"</string>
</resources>
diff --git a/res/values-te/arrays.xml b/res/values-te/arrays.xml
index e0b2986..7ab52c7 100644
--- a/res/values-te/arrays.xml
+++ b/res/values-te/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"ఎప్పటికీ అనుమతించవద్దు"</item>
<item msgid="1154273129608299386">"ఎల్లప్పుడూ అనుమతించు"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 30faaba..0ea69bd 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"రాత్రి మోడ్"</string>
<string name="network_and_internet" msgid="4229023630498537530">"నెట్వర్క్ & ఇంటర్నెట్"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"మొబైల్ నెట్వర్క్"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMలు</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIMలు}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"యాక్టివ్గా ఉంది / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"ఇన్యాక్టివ్గా ఉంది / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"యాక్టివ్ / డౌన్లోడ్ చేసిన SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"మరిన్నింటిని జోడించు"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"మొబైల్ డేటా"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"మొబైల్ నెట్వర్క్ను ఉపయోగించి డేటాను యాక్సెస్ చేయండి"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"మొబైల్ నెట్వర్క్"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"మొబైల్ డేటాను ఉపయోగించండి"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"మొబైల్ డేటాని ఆఫ్ చేయాలా?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"ఎంపిక అవసరం"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"మొబైల్ డేటా కోసం <xliff:g id="CARRIER">%1$s</xliff:g> ఉపయోగించాలా?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> డేటా హెచ్చరిక"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> డేటా పరిమితి"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> డేటా హెచ్చరిక / <xliff:g id="ID_2">^2</xliff:g> డేటా పరిమితి"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d రోజులు మిగిలి ఉన్నాయి</item>
- <item quantity="one">%d రోజు మిగిలి ఉంది</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# రోజు మిగిలి ఉంది}other{# రోజులు మిగిలి ఉన్నాయి}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"సమయం మిగిలి లేదు"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 రోజు కంటే తక్కువ సమయం మిగిలి ఉంది"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_2">^2</xliff:g> క్రితం <xliff:g id="ID_1">^1</xliff:g> అప్డేట్ చేసింది"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"సెట్ చేయి"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"డేటా వార్నింగ్ & పరిమితి"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"యాప్ డేటా వినియోగ సైకిల్"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"మొబైల్ డేటా వినియోగం"</string>
<string name="set_data_warning" msgid="6628236612886588097">"డేటా హెచ్చరికను సెట్ చేయండి"</string>
<string name="data_warning" msgid="116776633806885370">"డేటా హెచ్చరిక"</string>
<string name="set_data_limit" msgid="7136539812414500084">"డేటా పరిమితిని సెట్ చేయండి"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"మీరు సెట్ చేసిన పరిమితిని చేరుకున్న తర్వాత మీ వాహనం యొక్క మొబైల్ డేటా ఆఫ్ చేయబడుతుంది.\n\nడేటా వినియోగాన్ని మీ ఫోన్ ఒక పద్ధతిలో గణిస్తే, అదే వినియోగ పరిమాణాన్ని మీ క్యారియర్ వేరే పద్ధతిలో గణించవచ్చు, కనుక కనిష్ట పరిమితిని సెట్ చేయడం మంచిది."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"డేటా వినియోగ హెచ్చరికను సెట్ చేయండి"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"డేటా వినియోగ పరిమితిని సెట్ చేయండి"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"మీ పరికరం డేటా వినియోగాన్ని గణిస్తుంది. మీ మొబైల్ క్యారియర్ డేటాను బట్టి ఇది మారవచ్చు."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"సెట్ చేయి"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"సేవ్ చేయండి"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM నెట్వర్క్"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"వాహన ఇంటర్నెట్"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"వాహన ఇంటర్నెట్ను ఆపివేయడం వలన కొన్ని వాహన ఫీచర్లు లేదా యాప్లు పని చేయకపోవచ్చు.\n\nమీ వాహనాన్ని ఆపరేట్ చేయడానికి అవసరమైన ముఖ్యమైన డేటా వాహన తయారీదారుతో షేర్ చేయబడుతూనే ఉంటుంది."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"ఏదేమైనా ఆఫ్ చేయి"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"వాహన ఇంటర్నెట్ ఆఫ్ చేయబడింది. దీని వలన కొన్ని వాహన ఫీచర్లు లేదా యాప్లు పని చేయకపోవచ్చు. మీ వాహనాన్ని ఆపరేట్ చేయడానికి అవసరమైన ముఖ్యమైన డేటా వాహన తయారీదారుతో షేర్ చేయబడుతూనే ఉంటుంది."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$sనుండి - %3$sవరకు %1$sను ఉపయోగించారు"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"మరో నెట్వర్క్కు కనెక్ట్ చేయండి"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"నెట్వర్క్ ప్రాధాన్యతలు"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"నెట్వర్క్ను జోడించు"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"కనెక్ట్"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"కనెక్ట్ అవుతోంది…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"కనెక్ట్ చేయబడలేదు"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"నెట్వర్క్, పరిధిలో లేదు"</string>
<string name="wifi_password" msgid="5565632142720292397">"పాస్వర్డ్"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"పాస్వర్డ్ను చూపు"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"హాట్స్పాట్కు బ్యాండ్:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"హాట్స్పాట్ & టెథరింగ్"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"హాట్స్పాట్"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ఆఫ్లో ఉంది"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"హాట్స్పాట్ని ఆటోమేటిక్గా ఆఫ్ చేయండి"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"పరికరాలు ఏవీ కనెక్ట్ కాకపోతే Wi‑Fi హాట్స్పాట్ ఆఫ్ అవుతుంది"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> Wi-Fiని ఆన్ చేయాలనుకుంటుంది"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"ఫోర్స్ స్టాప్"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"ఫోర్స్ స్టాప్ చేయాలా?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"మీరు ఏదైనా యాప్ను ఫోర్స్ స్టాప్ చేస్తే, అది సరిగ్గా పని చేయకపోవచ్చు."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"పనితీరు రక్షణను ఆఫ్ చేయాలా?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"మీరు అలా చేస్తే, మీ సాఫ్ట్వేర్, ఇంకా హార్డ్వేర్ కూడా సరిగ్గా పని చేయకపోవచ్చు."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"ఆన్లోనే ఉంచండి"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"ఆఫ్ చేయండి"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"యాప్ పనితీరు ప్రాధాన్యతను ఆన్ చేయాలా?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"దీన్ని ఆన్ చేయడం వలన సిస్టమ్ స్థిరంగా పని చేయకపోవచ్చు లేదా హార్డ్వేర్పై దీర్ఘకాలిక ప్రభావం ఉండవచ్చు. మీరు కొనసాగాలనుకుంటున్నారా?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"అవును"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"వద్దు, ధన్యవాదాలు"</string>
<string name="disable_text" msgid="4358165448648990820">"డిజేబుల్ చేయి"</string>
<string name="enable_text" msgid="1794971777861881238">"ప్రారంభించు"</string>
<string name="uninstall_text" msgid="277907956072833012">"అన్ఇన్స్టాల్ చేయి"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"అనుమతులు"</string>
<string name="notifications_label" msgid="6586089149665170731">"నోటిఫికేషన్లు"</string>
<string name="storage_application_label" msgid="5911779903670978586">"స్టోరేజ్ & కాష్"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"టాప్ పనితీరు పొందండి"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"యాప్ పనితీరుకు ప్రాధాన్యత ఇవ్వండి"</string>
<string name="application_version_label" msgid="8556889839783311649">"వెర్షన్: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"అనుమతులు మంజూరు కాలేదు"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"అనుమతులను అభ్యర్థించలేదు"</string>
<string name="unused_apps" msgid="648471933781010395">"ఉపయోగించని యాప్లు"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ఉపయోగించని యాప్లు</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ఉపయోగించని యాప్</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ఉపయోగించని యాప్}other{# ఉపయోగించని యాప్లు}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"అనుమతులను తీసివేసి స్పేస్ను ఖాళీ చేయండి"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"అంతర్గత నిల్వలో %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"అవసరమైనప్పుడు, యాప్ను మూసి వనరుల వాడకం తగ్గించండి"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"యాప్ పనితీరుకు ప్రాధాన్యత ఇవ్వడానికి సిస్టమ్ రిసోర్స్లను ఉపయోగిస్తుంది"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"డేటా వినియోగం"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"యాప్ డేటా వినియోగం"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"వినియోగ హిస్టరీ"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"అన్ని యాప్లు"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"డేటా & Wi‑Fi వినియోగం"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"వినియోగ హిస్టరీ"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"మొత్తం వినియోగం"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"ఫోర్గ్రౌండ్"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"బ్యాక్గ్రౌండ్"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"డేటాను అనుమతించండి"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"మొబైల్ డేటా ఉపయోగించడానికి ఈ యాప్ను అనుమతించండి"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"డేటాను పరిమితం చేయండి"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"యాప్ స్క్రీన్పై ఉన్నప్పుడే మొబైల్ డేటాను వాడండి"</string>
<string name="computing_size" msgid="5791407621793083965">"గణిస్తోంది…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> అదనపు అనుమతులు</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> అదనపు అనుమతి</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# అదనపు అనుమతి}other{# అదనపు అనుమతులు}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"గమనిక: రీబూట్ చేసిన తర్వాత, మీరు మీ వాహనాన్ని అన్లాక్ చేసే వరకు ఈ యాప్ ప్రారంభం కాదు."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"అసిస్టెంట్ & వాయిస్ ఇన్పుట్"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"సహాయక యాప్"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"యాప్కు Wi-Fiను ఆన్ లేదా ఆఫ్ చేయడానికి, Wi-Fi నెట్వర్క్లను స్కాన్ చేసి, కనెక్ట్ చేయడానికి, నెట్వర్క్లను జోడించడానికి లేదా తీసివేయడానికి, స్థానికం-మాత్రమే హాట్స్పాట్ను ప్రారంభించడానికి ఈ Wi-Fi కంట్రోలర్ అనుమతిస్తుంది."</string>
<string name="more_special_access_title" msgid="166115485446645971">"మరిన్ని"</string>
<string name="location_settings_title" msgid="901334356682423679">"లొకేషన్"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"లొకేషన్ను ఉపయోగించండి"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"మీ లొకేషన్ను యాక్సెస్ చేయడానికి మీరు పేర్కొన్న యాప్లను అనుమతించండి"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"మీరు దీనిని ఆఫ్ చేస్తే, అది అన్ని యాప్ల కోసం లొకేషన్ యాక్సెస్ను తీసివేస్తుంది. \'డ్రైవర్ సహాయం\' యాప్లు ఇప్పటికీ యాక్సెస్ను కలిగి ఉంటాయి."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"డ్రైవర్ సహాయం కోసం లొకేషన్ ఉపయోగించండి"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"వాహన లొకేషన్ ఆఫ్ చేయబడింది"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"\'డ్రైవర్ సహాయం\'కు లొకేషన్ యాక్సెస్ లేదు"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"మార్చండి"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"డ్రైవింగ్లో సహాయపడే యాప్లను మీ లొకేషన్ను యాక్సెస్ చేయడానికి అనుమతించండి"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"మీరు దీనిని ఆఫ్ చేస్తే, లొకేషన్ సమాచారంపై ఆధారపడే \'డ్రైవర్ సహాయం\' యాప్లు డిజేబుల్ చేయబడతాయి."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"ఏదేమైనా ఆఫ్ చేయండి"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ఇటీవలి లొకేషన్ రిక్వెస్ట్లు"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ఇటీవలి లొకేషన్ రిక్వెస్ట్లు లేవు"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"యాప్-స్థాయి అనుమతులు"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"లొకేషన్ సర్వీస్లు"</string>
<string name="location_use_location_title" msgid="117735895374606680">"లొకేషన్ను ఉపయోగించండి"</string>
<string name="location_settings_footer" msgid="296892848338100051">"మీ పరికరం లొకేషన్ను అంచనా వేయడంలో సహాయపడటానికి GPS, Wi-Fi, మొబైల్ నెట్వర్క్లు, సెన్సార్ల వంటి సోర్సులను \'లొకేషన్\' ఉపయోగించవచ్చు."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"డ్రైవర్ సహాయం"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"\'డ్రైవర్ సహాయం\' యాప్లకు పంపిబడిన లొకేషన్ సమాచారంలో మీ గుర్తింపునకు సంబంధించిన సమాచారం ఉండదు. ఇది తొలగించబడటానికి ముందు గరిష్టంగా 2 రోజులు స్టోర్ చేయబడుతుంది."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"మైక్రోఫోన్"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"మైక్రోఫోన్ను ఉపయోగించండి"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"మీ మైక్రోఫోన్ను యాక్సెస్ చేయడానికి అన్ని యాప్లను అనుమతించండి"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"మైక్రోఫోన్ అనుమతులను మేనేజ్ చేయండి"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"ఇటీవల యాక్సెస్ చేసినవి"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"ఇటీవలి యాప్లు ఏవీ లేవు"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"ఏ యాప్లకు యాక్సెస్ లేదు"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count}లో # యాప్లు యాక్సెస్ను కలిగి ఉన్నాయి}other{{total_count}లో # యాప్లు యాక్సెస్ను కలిగి ఉన్నాయి}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"ఇటీవల యాక్సెస్ చేసినవి"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"అన్నింటినీ చూడండి"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"లోడ్ చేస్తోంది…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"సిస్టమ్"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"సిస్టమ్ అప్డేట్లు"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"అధునాతనం"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"మూడవ పక్షం లైసెన్స్లు"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"లైసెన్స్లను లోడ్ చేయడంలో సమస్య ఉంది."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"లోడ్ చేస్తోంది…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">మీరు ఇప్పుడు డెవలపర్ కావడానికి <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> అడుగుల దూరంలో ఉన్నారు.</item>
- <item quantity="one">మీరు ఇప్పుడు డెవలపర్ కావడానికి <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> అడుగు దూరంలో ఉన్నారు.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{మీరు ఇప్పుడు డెవలపర్ కావడానికి # అడుగు దూరంలో ఉన్నారు.}other{మీరు ఇప్పుడు డెవలపర్ కావడానికి # అడుగుల దూరంలో ఉన్నారు.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"మీరు ఇప్పుడు డెవలపర్!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"అవసరం లేదు, మీరు ఇప్పటికే డెవలపర్గా ఉన్నారు."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"డెవలపర్ ఎంపికలు"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"మీరు కొత్త ప్రొఫైల్ను క్రియేట్ చేసిన తర్వాత, ఆ వ్యక్తి దాన్ని వారి కోసం అనుకూలంగా మార్చుకోవాలి."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"అన్ని ఇతర ప్రొఫైల్ల ఉపయోగం కోసం యాప్లను ఏదైనా ఇతర ప్రొఫైల్ నుండి అప్డేట్ చేయవచ్చు."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"ప్రొఫైల్ పరిమితిని చేరుకున్నారు"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">మీరు <xliff:g id="COUNT">%d</xliff:g> ప్రొఫైల్ల వరకు క్రియేట్ చేయగలరు.</item>
- <item quantity="one">ఒక ప్రొఫైల్ను మాత్రమే క్రియేట్ చేయగలరు.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{ఒక ప్రొఫైల్ను మాత్రమే క్రియేట్ చేయగలరు.}other{మీరు గరిష్ఠంగా # ప్రొఫైల్లను క్రియేట్ చేయగలరు.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"కొత్త ప్రొఫైల్ను క్రియేట్ చేయలేకపోయాము"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ఈ ప్రొఫైల్ను తొలగించాలా?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ఈ ప్రొఫైల్లోని మొత్తం యాప్లు, డేటా తొలగించబడతాయి"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"ప్రొఫైల్ను తొలగించడం సాధ్యపడలేదు."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"ప్రొఫైల్ తొలగించబడలేదు. మీరు పరికరాన్ని రీస్టార్ట్ చేసి, మళ్లీ ట్రై చేయవచ్చు."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"మీరు ప్రొఫైల్లను మార్చినప్పుడు లేదా వాహనాన్ని రీస్టార్ట్ చేసినప్పుడు ఈ ప్రొఫైల్ తొలగించబడుతుంది."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"విస్మరించు"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"మళ్లీ ప్రయత్నించు"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"అన్లాక్ నమూనాను ఎలా గీయాలి"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"ఆకృతిని సేవ్ చేయడంలో ఎర్రర్ ఏర్పడింది"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"చాలా ఎక్కువ తప్పు ప్రయత్నాలు చేశారు. <xliff:g id="NUMBER">%d</xliff:g> సెకన్లలో మళ్లీ ట్రై చేయండి."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"ఆకృతి రోటరీకి సపోర్ట్ చేయదు, \'తాకండి\'"</string>
<string name="okay" msgid="4589873324439764349">"సరే"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"స్క్రీన్ లాక్ను తీసివేయాలా?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"ఎవరైనా మీ ఖాతాను యాక్సెస్ చేయడానికి ఇది అనుమతిస్తుంది"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"సాధారణ PINలను మీ IT అడ్మిన్ బ్లాక్ చేశారు. వేరే PINను ట్రై చేయండి."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"ఇందులో చెల్లని అక్షరం ఉండకూడదు."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"పాస్వర్డ్ చెల్లదు, తప్పనిసరిగా కనీసం 4 అక్షరాలు ఉండాలి."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">తప్పనిసరిగా కనీసం <xliff:g id="COUNT">%d</xliff:g> అక్షరాలను కలిగి ఉండాలి</item>
- <item quantity="one">తప్పనిసరిగా కనీసం 1 అక్షరాన్ని కలిగి ఉండాలి</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">తప్పనిసరిగా కనీసం <xliff:g id="COUNT">%d</xliff:g> చిన్న అక్షరాలను కలిగి ఉండాలి</item>
- <item quantity="one">తప్పనిసరిగా కనీసం 1 చిన్న అక్షరాన్ని కలిగి ఉండాలి</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">తప్పనిసరిగా కనీసం <xliff:g id="COUNT">%d</xliff:g> అప్పర్కేస్ అక్షరాలను కలిగి ఉండాలి</item>
- <item quantity="one">తప్పనిసరిగా కనీసం 1 అప్పర్కేస్ అక్షరాన్ని కలిగి ఉండాలి</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">తప్పనిసరిగా కనీసం <xliff:g id="COUNT">%d</xliff:g> సంఖ్యాత్మక అంకెలను కలిగి ఉండాలి</item>
- <item quantity="one">తప్పనిసరిగా కనీసం 1 సంఖ్యాత్మక అంకెను కలిగి ఉండాలి</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">తప్పనిసరిగా కనీసం <xliff:g id="COUNT">%d</xliff:g> ప్రత్యేక గుర్తులను కలిగి ఉండాలి</item>
- <item quantity="one">తప్పనిసరిగా కనీసం 1 ప్రత్యేక గుర్తును కలిగి ఉండాలి</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">తప్పనిసరిగా కనీసం <xliff:g id="COUNT">%d</xliff:g> వర్ణమాల యేతర అక్షరాలను కలిగి ఉండాలి</item>
- <item quantity="one">తప్పనిసరిగా కనీసం 1 వర్ణమాల యేతర అక్షరాన్ని కలిగి ఉండాలి</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ఇటీవలి పాస్వర్డ్ను ఉపయోగించడానికి పరికర నిర్వాహకులు అనుమతించరు"</string>
<string name="error_saving_password" msgid="8334882262622500658">"పాస్వర్డ్ని సేవ్ చేయడంలో ఎర్రర్"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"సాధారణ పాస్వర్డ్లను మీ IT అడ్మిన్ బ్లాక్ చేశారు. వేరే పాస్వర్డ్ను ట్రై చేయండి."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"ఒక ప్రొఫైల్ను జోడించు"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ఈ ప్రొఫైల్ను తొలగించు"</string>
<string name="add_profile_text" msgid="9118410102199116969">"ప్రొఫైల్ను జోడించండి"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"డిస్ప్లే బ్రైట్నెస్"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"మీ పరికరాలను చూడటానికి, బ్లూటూత్ను ఆన్ చేయండి"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"పరికరాన్ని పెయిర్ చేయడానికి, బ్లూటూత్ సెట్టింగ్లను తెరవండి"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"సమాచారంతో కూడిన వినోదం సిస్టమ్ అడ్మిన్"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"యాక్టివేట్ చేయబడిన యాప్లు"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"యాక్టివేట్ చేయబడని యాప్లు"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"ఈ అనుమతి ఉన్న యాప్లకు ఈ వాహన డేటాకు యాక్సెస్ ఉంది"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"వాహన అడ్మిన్ యాప్లు లేవు"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"ఈ సమాచారంతో కూడిన వినోదం సిస్టమ్ అడ్మిన్ యాప్ యాక్టివ్గా ఉంది, అలాగే ఇది ఈ చర్యలను అమలు చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> యాప్ను అనుమతిస్తుంది:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"ఈ సమాచారంతో కూడిన వినోదం సిస్టమ్ యాప్ను యాక్టివేట్ చేయడం వలన <xliff:g id="APP_NAME">%1$s</xliff:g> యాప్ ఈ కింది చర్యలను చేయగలుగుతుంది:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"ఈ సమాచారంతో కూడిన వినోదం సిస్టమ్ యాప్ను యాక్టివేట్ చేయాలా?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"ఈ సమాచారంతో కూడిన వినోదం సిస్టమ్ యాప్ను యాక్టివేట్ చేయండి"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"డీయాక్టివేట్ చేసి, అన్ఇన్స్టాల్ చేయండి"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"ఈ సమాచారంతో కూడిన వినోదం సిస్టమ్ యాప్ను డియాక్టివేట్ చేయండి"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"మరిన్ని వివరాలు"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"సెట్టింగ్లు, అనుమతులు, కార్పొరేట్ యాక్సెస్, నెట్వర్క్ యాక్టివిటీ, ఇంకా వాహన లొకేషన్కు సంబంధించిన సమాచారంతో పాటు ఈ ప్రొఫైల్తో అనుబంధించబడి ఉన్న యాప్లను, డేటాను సంస్థ మేనేజర్ మానిటర్ చేయగలరు, అలాగే మేనేజ్ చేయగలరు."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"సెట్టింగ్లు, అనుమతులు, కార్పొరేట్ యాక్సెస్, నెట్వర్క్ యాక్టివిటీ, ఇంకా పరికర లొకేషన్కు సంబంధించిన సమాచారంతో పాటు ఈ ప్రొఫైల్తో అనుబంధించబడి ఉన్న యాప్లను, డేటాను సంస్థ మేనేజర్ మానిటర్ చేయగలరు, అలాగే మేనేజ్ చేయగలరు."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"సెట్టింగ్లు, అనుమతులు, కార్పొరేట్ యాక్సెస్, నెట్వర్క్ యాక్టివిటీ, ఇంకా వాహన లొకేషన్కు సంబంధించిన సమాచారంతో పాటు ఈ సమాచారంతో కూడిన వినోదం సిస్టమ్తో అనుబంధించబడి ఉన్న యాప్లను, డేటాను సంస్థ మేనేజర్ మానిటర్ చేయగలరు, అలాగే మేనేజ్ చేయగలరు."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"సంస్థ మేనేజర్ ఈ సమాచారంతో కూడిన వినోదం సిస్టమ్తో అనుబంధించబడి ఉన్న డేటాను యాక్సెస్ చేయవచ్చు, యాప్లను మేనేజ్ చేయవచ్చు అలాగే ఈ వాహన సెట్టింగ్లను మార్చవచ్చు."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"అది అందుబాటులో లేదు"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"ఈ మేనేజ్ చేయబడే వాహనంలో వాల్యూమ్ను మార్చడం సాద్యపడదు"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"ఈ మేనేజ్ చేయబడే వాహనంలో కాల్స్ను చేయడం సాధ్యపడదు"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"ఈ మేనేజ్ చేయబడే వాహనంలో SMSను పంపడానికి అనుమతి లేదు"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"ఈ వెహికల్ మేనేజ్ చేయబడుతోంది, దీంట్లో కెమెరా అందుబాటులో లేదు"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"ఈ వాహనం మేనేజ్ చేయబడుతోంది, దీంట్లో స్క్రీన్షాట్లను తీయడం సాధ్యం కాదు"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"ఈ మేనేజ్ చేయబడే వాహనంలో ఈ యాప్ను తెరవడం సాధ్యపడదు"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"మీ క్రెడిట్ ప్రొవైడర్ ద్వారా బ్లాక్ చేయబడింది"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"కొన్ని ఫీచర్లకు యాక్సెస్ను సంస్థ పరిమితం చేసింది.\n\nమీకు సందేహాలు ఉంటే, సంస్థ మేనేజర్ను సంప్రదించండి."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"వాహన అడ్మిన్ యాప్లు"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# యాక్టివేట్ చేయబడిన యాప్}other{# యాక్టివేట్ చేయబడిన యాప్లు}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"యాక్టివేట్ చేయబడిన యాప్లు ఏవీ లేవు"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> వాహన పాలసీ"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"సంస్థ మేనేజర్ ద్వారా సెట్టింగ్లు మేనేజ్ చేయబడతాయి"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> గురించి మరింత తెలుసుకోండి"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"బగ్ రిపోర్ట్ను షేర్ చేయాలా?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"ఈ వాహన సంస్థ మేనేజర్, ఈ పరికర సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ రిపోర్ట్ను రిక్వెస్ట్ చేశారు. యాప్లు, ఇంకా డేటా షేర్ చేయబడవచ్చు."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"ఈ వాహన సంస్థ మేనేజర్, ఈ పరికర సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ రిపోర్ట్ను రిక్వెస్ట్ చేశారు. యాప్లు, ఇంకా డేటా షేర్ చేయబడవచ్చు, మీ పరికరం పనితీరు తాత్కాలికంగా నెమ్మదించవచ్చు."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"ఈ బగ్ రిపోర్ట్, ఈ వాహన సంస్థ మేనేజర్తో షేర్ చేయబడుతోంది. మరిన్ని వివరాల కోసం వారిని సంప్రదించండి."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"షేర్ చేయండి"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"తిరస్కరించండి"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"ఈ సెట్టింగ్ను ఇప్పుడే మార్చడం సాధ్యం కాదు"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"యాక్సెసిబిలిటీ"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"క్యాప్షన్లు"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"క్యాప్షన్ ప్రాధాన్యతలు"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ఆఫ్లో ఉంది"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"ఆన్లో ఉంది"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"స్క్రీన్ రీడర్"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"క్యాప్షన్లను చూడండి"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"టెక్స్ట్ సైజ్"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"క్యాప్షన్ సైజ్, స్టయిల్"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"చాలా చిన్నది"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"చిన్నది"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ఆటోమేటిక్ సెట్టింగ్"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"పెద్దది"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"చాలా పెద్దది"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"క్యాప్షన్ స్టయిల్"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"యాప్ ప్రకారం సెట్ చేయండి"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"నలుపు బ్యాక్గ్రౌండ్లో తెలుపు టెక్స్ట్"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"తెలుపు బ్యాక్గ్రౌండ్లో నలుపు టెక్స్ట్"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"నలుపు బ్యాక్గ్రౌండ్లో పసుపు టెక్స్ట్"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"నీలం బ్యాక్గ్రౌండ్లో పసుపు టెక్స్ట్"</string>
</resources>
diff --git a/res/values-th/arrays.xml b/res/values-th/arrays.xml
index bc1d926..f67d4db 100644
--- a/res/values-th/arrays.xml
+++ b/res/values-th/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"ไม่อนุญาตเลย"</item>
<item msgid="1154273129608299386">"อนุญาตเสมอ"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index c3ee612..f641e4c 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"โหมดกลางคืน"</string>
<string name="network_and_internet" msgid="4229023630498537530">"เครือข่ายและอินเทอร์เน็ต"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"เครือข่ายมือถือ"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ซิม</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ซิม</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# ซิม}other{# ซิม}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"ใช้งานอยู่/ซิม"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"ไม่ได้ใช้งาน/ซิม"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"ใช้งานอยู่/ซิมที่ดาวน์โหลด"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"เพิ่มอีก"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"เน็ตมือถือ"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"เข้าถึงอินเทอร์เน็ตโดยใช้เครือข่ายมือถือ"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"เครือข่ายมือถือ"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"ใช้อินเทอร์เน็ตมือถือ"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"ปิดเน็ตมือถือใช่ไหม"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"ต้องเลือก"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"ใช้อินเทอร์เน็ตมือถือของ <xliff:g id="CARRIER">%1$s</xliff:g> ไหม"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"คำเตือนปริมาณอินเทอร์เน็ต <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"ขีดจำกัดอินเทอร์เน็ต <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"คำเตือนปริมาณอินเทอร์เน็ต <xliff:g id="ID_1">^1</xliff:g>/ขีดจำกัดอินเทอร์เน็ต <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">เหลืออีก %d วัน</item>
- <item quantity="one">เหลืออีก %d วัน</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{เหลืออีก # วัน}other{เหลืออีก # วัน}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"ไม่มีเวลาเหลือ"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"เหลือไม่ถึง 1 วัน"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"อัปเดตโดย <xliff:g id="ID_1">^1</xliff:g> เมื่อ <xliff:g id="ID_2">^2</xliff:g>ที่ผ่านมา"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"ตั้งค่า"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"คำเตือนและขีดจำกัดอินเทอร์เน็ต"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"รอบปริมาณที่แอปใช้อินเทอร์เน็ต"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"ปริมาณการใช้อินเทอร์เน็ตมือถือ"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ตั้งค่าเตือนการใช้อินเทอร์เน็ต"</string>
<string name="data_warning" msgid="116776633806885370">"คำเตือนปริมาณอินเทอร์เน็ต"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ตั้งขีดจำกัดอินเทอร์เน็ต"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ระบบเครื่องเสียงของรถยนต์จะปิดอินเทอร์เน็ตมือถือเมื่อมีการใช้งานถึงขีดจำกัดที่คุณกำหนดไว้\n\nเนื่องจากนี่เป็นปริมาณการใช้อินเทอร์เน็ตที่วัดโดยระบบเครื่องเสียง ปริมาณการใช้งานที่ผู้ให้บริการวัดได้จึงอาจไม่เท่ากัน โปรดกำหนดขีดจำกัดอย่างระมัดระวัง"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ตั้งค่าเตือนปริมาณการใช้อินเทอร์เน็ต"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ตั้งค่าขีดจำกัดปริมาณการใช้อินเทอร์เน็ต"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"ปริมาณการใช้อินเทอร์เน็ตจะวัดโดยอุปกรณ์ ซึ่งอาจแตกต่างจากปริมาณอินเทอร์เน็ตของผู้ให้บริการเครือข่ายมือถือ"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"ตั้งค่า"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"บันทึก"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"เครือข่าย OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"อินเทอร์เน็ตของรถยนต์"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"การปิดอินเทอร์เน็ตของรถยนต์อาจทำให้ฟีเจอร์หรือแอปบางอย่างไม่ทำงาน\n\nระบบจะยังคงแชร์ข้อมูลสำคัญที่ต้องใช้เพื่อให้รถยนต์ทำงานได้กับผู้ผลิต"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"ปิดเลย"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"อินเทอร์เน็ตของรถยนต์ปิดอยู่ ซึ่งอาจทำให้ฟีเจอร์หรือแอปบางอย่างไม่ทำงาน ระบบจะยังคงแชร์ข้อมูลสำคัญที่ต้องใช้เพื่อให้รถยนต์ทำงานได้กับผู้ผลิต"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"ใช้ไป %1$s ตั้งแต่วันที่ %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"เข้าร่วมเครือข่ายอื่น"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"การตั้งค่าเครือข่าย"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"เพิ่มเครือข่าย"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"เชื่อมต่อ"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"กำลังเชื่อมต่อ…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"ไม่เชื่อมต่อ"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"เครือข่ายไม่อยู่ในพื้นที่ให้บริการ"</string>
<string name="wifi_password" msgid="5565632142720292397">"รหัสผ่าน"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"แสดงรหัสผ่าน"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"เลือกอย่างน้อย 1 ย่านความถี่สำหรับฮอตสปอต Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ฮอตสปอตและการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ฮอตสปอต"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"ปิด"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"ปิดฮอตสปอตโดยอัตโนมัติ"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"ฮอตสปอต Wi‑Fi จะปิดถ้าไม่มีอุปกรณ์ที่เชื่อมต่อ"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> ต้องการเปิด Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"บังคับให้หยุด"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"บังคับให้หยุดไหม"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"แอปอาจทำงานผิดพลาดหากบังคับให้หยุด"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"ปิดการปกป้องประสิทธิภาพไหม"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"หากปิด ซอฟต์แวร์และฮาร์ดแวร์อาจไม่ทำงานด้วยเช่นกัน"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"เปิดไว้"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"ปิด"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"เปิดประสิทธิภาพของแอปตามลำดับสำคัญใช่ไหม"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"หากเปิดอาจทำให้ระบบไม่เสถียรหรืออาจส่งผลกระทบต่อฮาร์ดแวร์ในระยะยาว ต้องการทำต่อไหม"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"ใช่"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"ไม่เป็นไร"</string>
<string name="disable_text" msgid="4358165448648990820">"ปิดใช้"</string>
<string name="enable_text" msgid="1794971777861881238">"เปิดใช้"</string>
<string name="uninstall_text" msgid="277907956072833012">"ถอนการติดตั้ง"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"สิทธิ์"</string>
<string name="notifications_label" msgid="6586089149665170731">"การแจ้งเตือน"</string>
<string name="storage_application_label" msgid="5911779903670978586">"พื้นที่เก็บข้อมูลและแคช"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"รับรองสมรรถภาพสูงสุด"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ประสิทธิภาพของแอปตามลำดับสำคัญ"</string>
<string name="application_version_label" msgid="8556889839783311649">"เวอร์ชัน: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ไม่มีการมอบสิทธิ์"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ไม่มีการขอสิทธิ์"</string>
<string name="unused_apps" msgid="648471933781010395">"แอปที่ไม่ได้ใช้"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other">แอปที่ไม่ได้ใช้ <xliff:g id="COUNT_1">%d</xliff:g> รายการ</item>
- <item quantity="one">แอปที่ไม่ได้ใช้ <xliff:g id="COUNT_0">%d</xliff:g> รายการ</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{แอปที่ไม่ได้ใช้ # รายการ}other{แอปที่ไม่ได้ใช้ # รายการ}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"นำสิทธิ์ออกและเพิ่มพื้นที่ว่าง"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s ในที่จัดเก็บข้อมูลภายใน"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"ปิดแอปเพื่อเลี่ยงการใช้ทรัพยากรมากเกินเมื่อจำเป็น"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ใช้ทรัพยากรระบบเพื่อจัดลำดับความสำคัญของประสิทธิภาพของแอป"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ปริมาณการใช้อินเทอร์เน็ต"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ปริมาณการใช้เน็ตของแอป"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"ประวัติการใช้งาน"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"แอปทั้งหมด"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"การใช้งานเน็ตและ Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"ประวัติการใช้งาน"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"การใช้งานทั้งหมด"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"เบื้องหน้า"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"เบื้องหลัง"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"อนุญาตอินเทอร์เน็ตมือถือ"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"อนุญาตให้แอปนี้ใช้อินเทอร์เน็ตมือถือ"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"จำกัดอินเทอร์เน็ตมือถือ"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ใช้อินเทอร์เน็ตมือถือเฉพาะเมื่อแอปอยู่เบื้องหน้า"</string>
<string name="computing_size" msgid="5791407621793083965">"กำลังคำนวณ…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other">สิทธิ์เพิ่มเติม <xliff:g id="COUNT_1">%d</xliff:g> รายการ</item>
- <item quantity="one">สิทธิ์เพิ่มเติม <xliff:g id="COUNT_0">%d</xliff:g> รายการ</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{สิทธิ์เพิ่มเติม # รายการ}other{สิทธิ์เพิ่มเติม # รายการ}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"หมายเหตุ: หลังจากรีบูต แอปนี้จะเริ่มทำงานไม่ได้จนกว่าคุณจะปลดล็อกยานพาหนะ"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ผู้ช่วยและป้อนข้อมูลด้วยเสียง"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"แอปผู้ช่วย"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"การควบคุม Wi-Fi จะอนุญาตให้แอปเปิดหรือปิด Wi-Fi, สแกนหาและเชื่อมต่อเครือข่าย Wi-Fi, เพิ่มหรือนำเครือข่ายออก หรือเริ่มฮอตสปอตในพื้นที่เท่านั้น"</string>
<string name="more_special_access_title" msgid="166115485446645971">"เพิ่มเติม"</string>
<string name="location_settings_title" msgid="901334356682423679">"ตำแหน่ง"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"ใช้ตำแหน่ง"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"อนุญาตให้แอปที่คุณระบุเข้าถึงตำแหน่งได้"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"หากคุณปิดการตั้งค่านี้ ระบบจะลบสิทธิ์เข้าถึงตำแหน่งของทุกแอป แต่แอปตัวช่วยของผู้ขับจะยังเข้าถึงตำแหน่งได้"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ใช้ตำแหน่งสำหรับตัวช่วยของผู้ขับ"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"ตำแหน่งของรถยนต์ปิดอยู่"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"แอปตัวช่วยของผู้ขับเข้าถึงตำแหน่งไม่ได้"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"เปลี่ยน"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"อนุญาตให้แอปตัวช่วยขับรถเข้าถึงตำแหน่ง"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"หากคุณปิดการตั้งค่านี้ ระบบจะปิดใช้แอปตัวช่วยของผู้ขับที่ใช้ข้อมูลตำแหน่ง"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"ปิดเลย"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"คำขอตำแหน่งล่าสุด"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ไม่มีคำขอตำแหน่งล่าสุด"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"สิทธิ์ระดับแอป"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"บริการตำแหน่ง"</string>
<string name="location_use_location_title" msgid="117735895374606680">"ใช้ตำแหน่ง"</string>
<string name="location_settings_footer" msgid="296892848338100051">"ตำแหน่งอาจใช้ข้อมูลจากแหล่งที่มาต่างๆ อย่างเช่น GPS, Wi‑Fi, เครือข่ายมือถือ และเซ็นเซอร์ เพื่อช่วยระบุตำแหน่งคร่าวๆ ของอุปกรณ์"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ตัวช่วยของผู้ขับ"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ข้อมูลตำแหน่งที่ส่งไปยังแอปตัวช่วยของผู้ขับไม่มีข้อมูลที่ระบุตัวคุณได้ ระบบจะเก็บข้อมูลดังกล่าวไว้นานสูงสุด 2 วันก่อนที่จะลบ"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"ไมโครโฟน"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"ใช้ไมโครโฟน"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"อนุญาตให้แอปทั้งหมดเข้าถึงไมโครโฟนของคุณ"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"จัดการสิทธิ์สำหรับไมโครโฟน"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"เข้าถึงล่าสุด"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"ไม่มีแอปล่าสุด"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"แอปที่มีสิทธิ์เข้าถึง 0 แอป"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{แอป # จาก {total_count} แอปมีสิทธิ์เข้าถึง}other{แอป # จาก {total_count} แอปมีสิทธิ์เข้าถึง}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"เข้าถึงล่าสุด"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"ดูทั้งหมด"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"กำลังโหลด…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"ระบบ"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"การอัปเดตระบบ"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"ขั้นสูง"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"ใบอนุญาตของบุคคลที่สาม"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"พบปัญหาในการโหลดใบอนุญาต"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"กำลังโหลด…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">ตอนนี้คุณเหลืออีกเพียง <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ขั้นตอนก็จะได้เป็นนักพัฒนาซอฟต์แวร์แล้ว</item>
- <item quantity="one">ตอนนี้คุณเหลืออีกเพียง <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ขั้นตอนก็จะได้เป็นนักพัฒนาซอฟต์แวร์แล้ว</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{ตอนนี้คุณเหลืออีกเพียง # ขั้นตอนก็จะได้เป็นนักพัฒนาซอฟต์แวร์แล้ว}other{ตอนนี้คุณเหลืออีกเพียง # ขั้นตอนก็จะได้เป็นนักพัฒนาซอฟต์แวร์แล้ว}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"ตอนนี้คุณเป็นนักพัฒนาซอฟต์แวร์แล้ว!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"ไม่จำเป็น คุณเป็นนักพัฒนาซอฟต์แวร์อยู่แล้ว"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ตัวเลือกสำหรับนักพัฒนาแอป"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"หลังจากที่คุณสร้างโปรไฟล์ใหม่ บุคคลดังกล่าวควรปรับแต่งโปรไฟล์เอง"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"แต่ละโปรไฟล์อัปเดตแอปให้โปรไฟล์อื่นๆ ใช้งานได้"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"มีโปรไฟล์ถึงขีดจำกัดแล้ว"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">คุณสร้างโปรไฟล์ได้สูงสุด <xliff:g id="COUNT">%d</xliff:g> รายการ</item>
- <item quantity="one">สร้างได้เพียงโปรไฟล์เดียวเท่านั้น</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{สร้างได้เพียงโปรไฟล์เดียวเท่านั้น}other{คุณสร้างโปรไฟล์ได้สูงสุด # รายการ}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"สร้างโปรไฟล์ใหม่ไม่ได้"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"ลบโปรไฟล์นี้ใช่ไหม"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"ระบบจะลบแอปและข้อมูลทั้งหมดในโปรไฟล์นี้"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"ลบโปรไฟล์ไม่ได้"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"ไม่มีการลบโปรไฟล์ คุณรีสตาร์ทอุปกรณ์และลองอีกครั้งได้"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"โปรไฟล์นี้จะถูกลบเมื่อคุณสลับโปรไฟล์หรือสตาร์ทรถอีกครั้ง"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"ปิด"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"ลองอีกครั้ง"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"วิธีวาดรูปแบบการปลดล็อก"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"เกิดข้อผิดพลาดในการบันทึกรูปแบบ"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"ดำเนินการไม่ถูกต้องหลายครั้งเกินไป ลองอีกครั้งใน <xliff:g id="NUMBER">%d</xliff:g> วินาที"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"รูปแบบไม่รองรับปุ่มหมุน โปรดใช้หน้าจอสัมผัส"</string>
<string name="okay" msgid="4589873324439764349">"ตกลง"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"นำการล็อกหน้าจอออกไหม"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"การดำเนินการนี้จะทำให้ทุกคนเข้าถึงบัญชีของคุณได้"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"ผู้ดูแลระบบไอทีบล็อก PIN ที่ไม่รัดกุม ลอง PIN อื่น"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"ต้องใช้อักขระที่ใช้ได้ทั้งหมด"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"รหัสผ่านไม่ถูกต้อง ต้องมีอักขระอย่างน้อย 4 ตัว"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">ต้องมีตัวอักษรอย่างน้อย <xliff:g id="COUNT">%d</xliff:g> ตัว</item>
- <item quantity="one">ต้องมีตัวอักษรอย่างน้อย 1 ตัว</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">ต้องมีตัวอักษรพิมพ์เล็กอย่างน้อย <xliff:g id="COUNT">%d</xliff:g> ตัว</item>
- <item quantity="one">ต้องมีตัวอักษรพิมพ์เล็กอย่างน้อย 1 ตัว</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">ต้องมีตัวอักษรพิมพ์ใหญ่อย่างน้อย <xliff:g id="COUNT">%d</xliff:g> ตัว</item>
- <item quantity="one">ต้องมีตัวอักษรพิมพ์ใหญ่อย่างน้อย 1 ตัว</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">ต้องมีตัวเลขอย่างน้อย <xliff:g id="COUNT">%d</xliff:g> ตัว</item>
- <item quantity="one">ต้องมีตัวเลขอย่างน้อย 1 ตัว</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">ต้องมีสัญลักษณ์พิเศษอย่างน้อย <xliff:g id="COUNT">%d</xliff:g> ตัว</item>
- <item quantity="one">ต้องมีสัญลักษณ์พิเศษอย่างน้อย 1 ตัว</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">ต้องมีอักขระที่ไม่ใช่ตัวอักษรอย่างน้อย <xliff:g id="COUNT">%d</xliff:g> ตัว</item>
- <item quantity="one">ต้องมีอักขระที่ไม่ใช่ตัวอักษรอย่างน้อย 1 ตัว</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ผู้ดูแลระบบอุปกรณ์ไม่อนุญาตให้ใช้รหัสผ่านที่เพิ่งใช้ไป"</string>
<string name="error_saving_password" msgid="8334882262622500658">"เกิดข้อผิดพลาดในการบันทึกรหัสผ่าน"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"ผู้ดูแลระบบไอทีบล็อกรหัสผ่านที่ไม่รัดกุม ลองรหัสผ่านอื่น"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"เพิ่มโปรไฟล์"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"ลบโปรไฟล์นี้"</string>
<string name="add_profile_text" msgid="9118410102199116969">"เพิ่มโปรไฟล์"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ความสว่างของหน้าจอ"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"เปิดบลูทูธเพื่อดูอุปกรณ์ของคุณ"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"เปิดการตั้งค่าบลูทูธเพื่อจับคู่อุปกรณ์"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"ผู้ดูแลระบบสาระบันเทิง"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"แอปที่เปิดใช้งาน"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"แอปที่ปิดใช้งาน"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"แอปที่มีสิทธิ์นี้จะเข้าถึงข้อมูลของรถยนต์คันนี้ได้"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"ไม่มีแอปผู้ดูแลระบบรถยนต์"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"แอปผู้ดูแลระบบสาระบันเทิงนี้ทำงานอยู่และอนุญาตให้แอป <xliff:g id="APP_NAME">%1$s</xliff:g> ดำเนินการต่อไปนี้"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"การเปิดใช้งานแอประบบสาระบันเทิงนี้จะอนุญาตให้แอป <xliff:g id="APP_NAME">%1$s</xliff:g> ดำเนินการต่อไปนี้"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"เปิดใช้งานแอประบบสาระบันเทิงนี้ใช่ไหม"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"เปิดใช้งานแอประบบสาระบันเทิงนี้"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"ปิดใช้งานและถอนการติดตั้ง"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"ปิดใช้งานแอประบบสาระบันเทิงนี้"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"รายละเอียดเพิ่มเติม"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"ผู้จัดการองค์กรสามารถตรวจสอบและจัดการแอปและข้อมูลที่เชื่อมโยงกับโปรไฟล์นี้ ซึ่งรวมถึงการตั้งค่า สิทธิ์ การเข้าถึงของบริษัท กิจกรรมในเครือข่าย และข้อมูลตำแหน่งของรถยนต์"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"ผู้จัดการองค์กรสามารถตรวจสอบและจัดการแอปและข้อมูลที่เชื่อมโยงกับโปรไฟล์นี้ ซึ่งรวมถึงการตั้งค่า สิทธิ์ การเข้าถึงของบริษัท กิจกรรมในเครือข่าย และข้อมูลตำแหน่งของอุปกรณ์"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"ผู้จัดการองค์กรสามารถตรวจสอบและจัดการแอปและข้อมูลที่เชื่อมโยงกับระบบสาระบันเทิงนี้ ซึ่งรวมถึงการตั้งค่า สิทธิ์ การเข้าถึงของบริษัท กิจกรรมในเครือข่าย และข้อมูลตำแหน่งของรถยนต์"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"ผู้จัดการองค์กรอาจสามารถเข้าถึงข้อมูลที่เชื่อมโยงกับระบบสาระบันเทิงนี้ จัดการแอป และเปลี่ยนการตั้งค่ารถยนต์ได้"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"ไม่พร้อมใช้งาน"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"เปลี่ยนระดับเสียงในรถยนต์ที่มีการจัดการคันนี้ไม่ได้"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"โทรออกในรถยนต์ที่มีการจัดการคันนี้ไม่ได้"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"ไม่อนุญาตให้ส่ง SMS ในรถยนต์ที่มีการจัดการคันนี้"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"กล้องไม่พร้อมใช้งานในรถยนต์ที่มีการจัดการคันนี้"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"จับภาพหน้าจอในรถยนต์ที่มีการจัดการคันนี้ไม่ได้"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"เปิดแอปในรถยนต์ที่มีการจัดการคันนี้ไม่ได้"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"ผู้ให้บริการเครดิตบล็อกไว้"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"องค์กรจำกัดการเข้าถึงฟีเจอร์บางอย่าง\n\nหากมีคําถาม โปรดติดต่อผู้จัดการองค์กร"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"แอปผู้ดูแลระบบรถยนต์"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{แอปที่เปิดใช้งาน # แอป}other{แอปที่ปิดใช้งาน # แอป}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"ไม่มีแอปที่เปิดใช้งาน"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"นโยบายเกี่ยวกับรถยนต์ของ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"การตั้งค่าที่ผู้จัดการองค์กรดูแล"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"ดูข้อมูลเพิ่มเติมเกี่ยวกับ<xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"แชร์รายงานข้อบกพร่องไหม"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"ผู้จัดการองค์กรของรถยนต์คันนี้ได้ขอรายงานข้อบกพร่องเพื่อช่วยแก้ปัญหาอุปกรณ์ อาจมีการแชร์แอปและข้อมูล"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"ผู้จัดการองค์กรของรถยนต์คันนี้ได้ขอรายงานข้อบกพร่องเพื่อช่วยแก้ปัญหาอุปกรณ์ อาจมีการแชร์แอปและข้อมูล ซึ่งอาจทำให้อุปกรณ์ทำงานช้าลงชั่วคราว"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"กำลังแชร์รายงานข้อบกพร่องกับผู้จัดการองค์กรของรถยนต์คันนี้ โปรดติดต่อสอบถามรายละเอียดเพิ่มเติม"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"แชร์"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"ปฏิเสธ"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"เปลี่ยนแปลงการตั้งค่านี้ไม่ได้ในตอนนี้"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"การช่วยเหลือพิเศษ"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"คำบรรยาย"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"ค่ากำหนดคำบรรยาย"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"ปิด"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"เปิด"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"โปรแกรมอ่านหน้าจอ"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"แสดงคำบรรยาย"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ขนาดข้อความ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"ขนาดและรูปแบบของคำบรรยาย"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"เล็กมาก"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"เล็ก"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ค่าเริ่มต้น"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"ใหญ่"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"ใหญ่มาก"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"รูปแบบคำบรรยาย"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ตั้งค่าตามแอป"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"สีขาวบนพื้นสีดำ"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"สีดำบนพื้นสีขาว"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"สีเหลืองบนพื้นสีดำ"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"สีเหลืองบนพื้นสีน้ำเงิน"</string>
</resources>
diff --git a/res/values-tl/arrays.xml b/res/values-tl/arrays.xml
index 701c61a..7f14d28 100644
--- a/res/values-tl/arrays.xml
+++ b/res/values-tl/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Huwag kailanman payagan"</item>
<item msgid="1154273129608299386">"Palaging payagan"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index df2f425..d439d21 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Network at internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> na SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}one{# SIM}other{# na SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Aktibo / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Hindi aktibo / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Aktibo / Na-download na SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Magdagdag pa"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"I-access ang data gamit ang mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobile network"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Gumamit ng mobile data"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"I-off ang mobile data?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Kinakailangang pumili"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Gamitin ang <xliff:g id="CARRIER">%1$s</xliff:g> sa mobile data?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Babala kapag umabot na sa <xliff:g id="ID_1">^1</xliff:g> ang data"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> na limitasyon sa data"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Babala kapag umabot na sa <xliff:g id="ID_1">^1</xliff:g> ang data / <xliff:g id="ID_2">^2</xliff:g> na limitasyon sa data"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d araw na lang ang natitira</item>
- <item quantity="other">%d na araw na lang ang natitira</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# araw ang natitira}one{# araw ang natitira}other{# na araw ang natitira}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Walang natitirang oras"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Wala pang 1 araw ang natitira"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Na-update ng <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ang nakalipas"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Itakda"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Babala at limitasyon sa data"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Cycle ng paggamit ng data ng app"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Paggamit ng mobile data"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Magtakda ng babala sa data"</string>
<string name="data_warning" msgid="116776633806885370">"Babala sa data"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Itakda ang limitasyon sa data"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Io-off ng head unit ng iyong sasakyan ang mobile data sa oras na maabot nito ang itinakda mong limitasyon.\n\nDahil sinusukat ng head unit ang paggamit ng data, at maaaring mag-iba ang pagkalkula ng carrier mo sa paggamit, pag-isipang magtakda ng mababang limitasyon."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Itakda ang babala sa paggamit ng data"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Itakda ang limitasyon sa paggamit ng data"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Sinusukat ng iyong device ang paggamit ng data. Posible itong mag-iba-iba sa data ng iyong mobile carrier."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Itakda"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"I-save"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM network"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet sa sasakyan"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Sa pag-off ng internet sa saksakyan, baka hindi gumana ang ilang feature o app ng sasakyan.\n\nIbabahagi pa rin sa manufacturer nito ang kritikal na data na kailangan para mapagana ang sasakyan."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"I-off pa rin"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Na-off ang internet sa sasakyan. Posibleng mapigilan nitong gumana ang ilang feature o app ng sasakyan. Patuloy na ibabahagi sa manufacturer ng sasakyan ang kritikal na data na kinakailangan para mapagana ang iyong sasakyan."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s ang nagamit %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Sumali sa ibang network"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Mga kagustuhan sa network"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Magdagdag ng network"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Kumonekta"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Kumokonekta…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Hindi nakakonekta"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Walang signal ang network"</string>
<string name="wifi_password" msgid="5565632142720292397">"Password"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Ipakita ang password"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Pumili ng kahit isang band para sa Wi‑Fi hotspot:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot at pag-tether"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Naka-off"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Awtomatikong i-off ang hotspot"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Mao-off ang Wi‑Fi hotspot kung walang nakakonektang device"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"Gustong i-on ng <xliff:g id="REQUESTER">%s</xliff:g> ang Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Sapilitang ihinto"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Sapilitang itigil?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Kung sapilitan mong ititigil ang isang app, maaari itong kumilos nang hindi tama."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"I-off ang proteksyon sa performance?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Kapag ginawa mo ito, posibleng hindi rin gumana ang iyong software at hardware."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Iwanang naka-on"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"I-off"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"I-on ang gawing priyoridad ang performance ng app?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Kapag na-on ito, puwede itong magdulot ng posibleng kawalan ng stability sa system o pangmatagalang epekto sa hardware. Gusto mo bang magpatuloy?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Oo"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Huwag na lang"</string>
<string name="disable_text" msgid="4358165448648990820">"I-disable"</string>
<string name="enable_text" msgid="1794971777861881238">"I-enable"</string>
<string name="uninstall_text" msgid="277907956072833012">"I-uninstall"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Mga Pahintulot"</string>
<string name="notifications_label" msgid="6586089149665170731">"Mga Notification"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Storage at cache"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Peak perf, tiyakin"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Gawing priyoridad ang performance ng app"</string>
<string name="application_version_label" msgid="8556889839783311649">"Bersyon: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Walang ibinigay na pahintulot"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Walang hiniling na pahintulot"</string>
<string name="unused_apps" msgid="648471933781010395">"Mga hindi ginagamit na app"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> hindi ginagamit na app</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na hindi ginagamit na app</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# hindi ginagamit na app}one{# hindi ginagamit na app}other{# na hindi ginagamit na app}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Alisin ang pahintulot, i-clear ang space"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s sa internal storage"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Isara para di magamit gaano ang resource"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Ginagamit ang mga resource ng system para gawing priyoridad ang performance ng app"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Paggamit ng data"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Paggamit ng data ng app"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"History ng paggamit"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Lahat ng app"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Paggamit ng data at Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"History ng paggamit"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Kabuuang paggamit"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Foreground"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Background"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Payagan ang data"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Hayaan ang app na ito na gumamit ng mobile data"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Paghigpitan ang data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Gumamit lang ng data kapag nasa foreground ang app"</string>
<string name="computing_size" msgid="5791407621793083965">"Kinakalkula…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> karagdagang pahintulot</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na karagdagang pahintulot</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# karagdagang pahintulot}one{# karagdagang pahintulot}other{# na karagdagang pahintulot}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Tandaan: Pagkatapos ng pag-reboot, hindi makakapagsimula ang app na ito hangga\'t hindi mo ina-unlock ang iyong sasakyan."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist at voice input"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Nagbibigay-daan ang kontrol sa Wi-Fi na i-on o i-off ng isang app ang Wi-Fi, mag-scan ng at kumonekta sa mga Wi-Fi network, magdagdag o mag-alis ng mga network, o magsimula ng panglokal lang na hotspot."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Higit pa"</string>
<string name="location_settings_title" msgid="901334356682423679">"Lokasyon"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Gumamit ng lokasyon"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Payagan ang tutukuyin mong app na i-access ang lokasyon mo"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Kung io-off mo ito, aalisin nito ang access sa lokasyon para sa lahat ng app. Magkakaroon pa rin ng access ang mga app na Tulong sa Driver."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Gamitin ang lokasyon para sa Tulong sa Driver"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Naka-off ang lokasyon ng sasakyan"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Hindi ma-access ng app na Tulong sa Driver ang lokasyon mo"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Baguhin"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Payagan ang mga app na tulong sa pagmamaneho na i-access ang lokasyon mo"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Kung io-off mo ito, madi-disable ang mga app na Tulong sa Driver na dumedepende sa impormasyon ng lokasyon."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"I-off pa rin"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Mga Kamakailang Kahilingan sa Lokasyon"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Walang kamakailang kahilingan sa lokasyon"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Mga pahintulot sa antas ng app"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Mga Serbisyo ng Lokasyon"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Gumamit ng lokasyon"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Posibleng gumamit ang mga lokasyon ng mga source na gaya ng GPS, Wi‑Fi, mga mobile network, at sensor para tumulong sa pagtantiya ng lokasyon ng iyong device."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Tulong sa driver"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Walang impormasyong makakapagtukoy sa iyo sa impormasyon ng lokasyon na ipinapadala sa mga app na Tulong sa Driver. Sino-store ito sa loob ng hindi hihigit sa 2 araw bago i-delete."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikropono"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Gamitin ang mikropono"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Payagan ang lahat ng app na i-access ang iyong mikropono"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Pamahalaan ang mga pahintulot sa mikropono"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Kamakailang na-access"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Walang kamakailang app"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 app ang may access"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# sa {total_count} app ang may access}one{# sa {total_count} app ang may access}other{# sa {total_count} na app ang may access}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Kamakailang na-access"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Tingnan lahat"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Naglo-load…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"System"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Mga pag-update ng system"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Advanced"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Mga lisensya ng third party"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"May problema sa pag-load ng mga lisensya."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Naglo-load…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> (na) hakbang na lang at magiging developer ka na.</item>
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> (na) hakbang na lang at magiging developer ka na.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{# hakbang na lang at magiging developer ka na.}one{# hakbang na lang at magiging developer ka na.}other{# na hakbang na lang at magiging developer ka na.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Isa ka nang developer!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Hindi na kailangan, isa ka nang developer."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Mga opsyon ng developer"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Kapag nakagawa ka na ng bagong profile, dapat itong i-customize ng taong iyon para sa sarili niya."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Puwedeng i-update ang mga app mula sa anumang profile para sa paggamit ng lahat ng iba pang profile."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Naabot na ang limitasyon ng profile"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Puwede kang gumawa ng hanggang <xliff:g id="COUNT">%d</xliff:g> profile.</item>
- <item quantity="other">Puwede kang gumawa ng hanggang <xliff:g id="COUNT">%d</xliff:g> na profile.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Isang profile lang ang puwedeng gawin.}one{Puwede kang gumawa ng hanggang # profile.}other{Puwede kang gumawa ng hanggang # na profile.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Hindi makagawa ng bagong profile"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"I-delete ang profile na ito?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Made-delete ang lahat ng app at data para sa profile na ito"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Hindi ma-delete ang profile."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Hindi na-delete ang profile. I-restart ang device at ulitin."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Ide-delete ang profile na ito kapag nagpalit ka ng profile o ni-restart mo ang sasakyan."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"I-dismiss"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Subukang muli"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Paano gumuhit ng pattern sa pag-unlock"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Nagka-error sa pag-save ng pattern"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Masyadong maraming maling pagsubok. Subukan ulit sa loob ng <xliff:g id="NUMBER">%d</xliff:g> (na) segundo."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Hindi suportado ng pattern ang rotary, pakigamit ang touch"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Alisin ang lock ng screen?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Papayagan nito ang sinuman na i-access ang iyong content"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Bina-block ng iyong IT admin ang mga pangkaraniwang PIN. Sumubok ng ibang PIN."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Hindi ito maaaring maglaman ng invalid na character."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Invalid ang password, dapat ay may hindi bababa sa 4 na character."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> titik</item>
- <item quantity="other">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> na titik</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> maliit na titik</item>
- <item quantity="other">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> na maliit na titik</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> malaking titik</item>
- <item quantity="other">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> na malaking titik</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> numero</item>
- <item quantity="other">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> na numero</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> espesyal na simbolo</item>
- <item quantity="other">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> na espesyal na simbolo</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> hindi titik na character</item>
- <item quantity="other">Dapat ay may kahit <xliff:g id="COUNT">%d</xliff:g> na hindi titik na character</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Hindi pinapayagan ng admin ng device ang paggamit ng kamakailang password"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Nagka-error sa pag-save ng password"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Bina-block ng iyong IT admin ang mga pangkaraniwang password. Sumubok ng ibang password."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Magdagdag ng profile"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"I-delete ang profile na ito"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Magdagdag ng profile"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Liwanag ng display"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Para makita ang iyong mga device, i-on ang Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Para magpares ng device, buksan ang mga setting ng Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Admin ng infotainment system"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Mga na-activate na app"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Mga na-deactivate na app"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Ang mga app na may ganitong pahintulot ay may access sa data ng sasakyang ito"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Walang app ng admin ng sasakyan"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Aktibo ang infotainment system admin app na ito at pinapayagan ang app na <xliff:g id="APP_NAME">%1$s</xliff:g> na gawin ang mga sumusunod na operation:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Kapag na-activate ang infotainment system app na ito, papayagan nito ang app na <xliff:g id="APP_NAME">%1$s</xliff:g> na gawin ang mga sumusunod na operation:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"I-activate ang infotainment system app na ito?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"I-activate ang infotainment system app na ito"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"I-deactivate at i-uninstall"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"I-deactivate ang infotainment system app na ito"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Higit pang detalye"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Masusubaybayan at mapapamahalaan ng manager ng organisasyon ang mga app at data na nauugnay sa profile na ito, kabilang ang mga setting, pahintulot, access ng kumpanya, aktibidad ng network, at impormasyon ng lokasyon ng sasakyan."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Masusubaybayan at mapapamahalaan ng manager ng organisasyon ang mga app at data na nauugnay sa profile na ito, kabilang ang mga setting, pahintulot, access ng kumpanya, aktibidad ng network, at impormasyon ng lokasyon ng device."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Masusubaybayan at mapapamahalaan ng manager ng organisasyon ang mga app at data na nauugnay sa infotainment system na ito, kabilang ang mga setting, pahintulot, access ng kumpanya, aktibidad ng network, at impormasyon ng lokasyon ng sasakyan."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Posibleng magawa ng manager ng organisasyon na i-access ang data na nauugnay sa infotainment system na ito, pamahalaan ang mga app, at baguhin ang mga setting ng sasakyang ito."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Hindi iyan available"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Hindi puwedeng baguhin ang volume sa pinapamahalaang sasakyang ito"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Hindi puwedeng tumawag sa pinapamahalaang sasakyang ito"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Hindi pinapayagan ang SMS sa pinapamahalaang sasakyang ito"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Hindi available ang camera sa pinapamahalaang sasakyang ito"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Hindi puwedeng kumuha ng mga screenshot sa pinapamahalaang sasakyang ito"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Hindi puwedeng buksan ang app na ito sa pinapamahalaang sasakyang ito"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Na-block ng iyong credit provider"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Nililimitahan ng organisasyon ang access sa ilang feature.\n\nKung mayroon kang mga tanong, makipag-ugnayan sa manager ng organisasyon."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Mga app ng admin ng sasakyan"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# na-activate na app}one{# na-activate na app}other{# na na-activate na app}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Walang na-activate na app"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Patakaran sa sasakyan ng <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Pinapamahalaan ng manager ng organisasyon ang mga setting"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Matuto pa tungkol sa <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Ibahagi ang ulat ng bug?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Humiling ang manager ng organisasyon ng sasakyang ito ng ulat ng bug para makatulong sa pag-troubleshoot sa device na ito. Posibleng ibahagi ang mga app at data."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Humiling ang manager ng organisasyon ng sasakyang ito ng ulat ng bug para makatulong sa pag-troubleshoot sa device na ito. Posibleng ibahagi ang mga app at data, at puwedeng pansamantalang bumagal ang device mo."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Ibinabahagi ang ulat ng bug na ito sa manager ng organisasyon ng sasakyang ito. Makipag-ugnayan sa kanya para sa higit pang detalye."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Ibahagi"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Tanggihan"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Hindi mababago ang setting na ito sa ngayon"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Accessibility"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Mga Caption"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Mga kagustuhan sa caption"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Naka-off"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Naka-on"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Screen reader"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Ipakita ang mga caption"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Laki ng text"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Laki at istilo ng caption"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Napakaliit"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Maliit"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Default"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Malaki"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Napakalaki"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Istilo ng caption"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Itinakda ng app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Puti sa itim"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Itim sa puti"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Dilaw sa itim"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Dilaw sa asul"</string>
</resources>
diff --git a/res/values-tr/arrays.xml b/res/values-tr/arrays.xml
index 9f1c8b2..2d6edf0 100644
--- a/res/values-tr/arrays.xml
+++ b/res/values-tr/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Asla izin verme"</item>
<item msgid="1154273129608299386">"Her zaman izin ver"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index b8340b4..c79e673 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Gece modu"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Ağ ve internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobil ağ"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Etkin/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Etkin değil/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Etkin/İndirilen SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Başka ekle"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobil veri"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Verilere mobil ağ üzerinden erişim"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobil ağ"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Mobil veri kullan"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobil veri kapatılsın mı?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Seçim yapmanız gerekiyor"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Mobil veride <xliff:g id="CARRIER">%1$s</xliff:g> kullanılsın mı?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> veri uyarısı"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> veri limiti"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> veri uyarısı/<xliff:g id="ID_2">^2</xliff:g> veri limiti"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d gün kaldı</item>
- <item quantity="one">%d gün kaldı</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# gün kaldı}other{# gün kaldı}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Zaman kalmadı"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 günden az kaldı"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> tarafından <xliff:g id="ID_2">^2</xliff:g> önce güncellendi"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Ayarla"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Veri uyarısı ve limiti"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Uygulama veri kullanımı döngüsü"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobil veri kullanımı"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Veri uyarısı oluştur"</string>
<string name="data_warning" msgid="116776633806885370">"Veri uyarısı"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Veri limiti ayarla"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Aracınızın ana birimi, belirlediğiniz mobil veri limitine ulaşıldığında mobil veriyi kapatır.\n\nVeri kullanımı ana birim tarafından ölçülür ve operatörünüz kullanımı farklı bir şekilde hesaplayabilir. Bu nedenle, risk almadan güvenli bir limit belirleyin."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Veri kullanımı uyarısı ayarla"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Veri kullanımı sınırı ayarla"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Veri kullanımı cihazınız tarafından ölçülür. Bu da mobil operatörünüzün verilerinden farklı olabilir."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Ayarla"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Kaydet"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM ağı"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Araç interneti"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Araç internetinin kapatılması bazı araç özelliklerinin ve uygulamaların çalışmasını engelleyebilir.\n\nAracınızın çalışması için gereken kritik veriler, araç üreticisiyle paylaşılmaya devam eder."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Yine de kapat"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Araç interneti kapalı. Bu durum bazı araç özelliklerinin ve uygulamaların çalışmasını engelleyebilir. Aracınızın çalışması için gereken kritik veriler, araç üreticisiyle paylaşılmaya devam eder."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%1$s kullanıldı %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Başka ağa katıl"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Ağ tercihleri"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Ağ ekle"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Bağlan"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Bağlanıyor…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Bağlı değil"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Ağ, kapsama alanında değil"</string>
<string name="wifi_password" msgid="5565632142720292397">"Şifre"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Şifreyi göster"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"WiFi hotspot bandı seçin:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot ve tethering"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Kapalı"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Hotspot\'u otomatik olarak kapat"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Herhangi bir cihaz bağlanmazsa Kablosuz hotspot kapatılır"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g>, Kablosuz özelliğini açmak istiyor"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Zorla durdur"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Zorla durdurulsun mu?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Uygulama zorla durdurulursa hatalı davranabilir."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Performans koruması kapatılsın mı?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Kapatırsanız yazılım ve donanımınız da çalışmayabilir."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Açık bırak"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Kapat"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Uygulama performansı öncelikli olsun mu?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Bu ayarın açılması, sistem kararsızlıklarına veya donanım üzerinde uzun süreli etkiye sebep olabilir. Devam etmek istiyor musunuz?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Evet"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Hayır, teşekkürler"</string>
<string name="disable_text" msgid="4358165448648990820">"Devre dışı bırak"</string>
<string name="enable_text" msgid="1794971777861881238">"Etkinleştir"</string>
<string name="uninstall_text" msgid="277907956072833012">"Kaldır"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"İzinler"</string>
<string name="notifications_label" msgid="6586089149665170731">"Bildirimler"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Depolama alanı ve önbellek"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"En iyi performans"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Uygulama performansı öncelikli"</string>
<string name="application_version_label" msgid="8556889839783311649">"Sürüm: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Hiçbir izin verilmedi"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Hiçbir izin istenmedi"</string>
<string name="unused_apps" msgid="648471933781010395">"Kullanılmayan uygulamalar"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kullanılmayan uygulama</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> kullanılmayan uygulama</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# kullanılmayan uygulama}other{# kullanılmayan uygulama}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"İzinleri kaldır ve yer aç"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"Dahili depolama alanında %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Kaynak tasarrufu için uygulamayı kapatın"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Uygulama performansına öncelik vermek için sistem kaynaklarını kullanır"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Veri kullanımı"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uygulama veri kullanımı"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Kullanım geçmişi"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Tüm uygulamalar"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Veri ve kablosuz kullanımı"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Kullanım geçmişi"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Toplam kullanım"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Ön plan"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Arka plan"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Veri kullanımına izin ver"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Bu uygulamanın mobil veri kullanmasına izin ver"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Veri kullanımını kısıtla"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Mobil veriyi yalnızca uygulama ön plandaysa kullan"</string>
<string name="computing_size" msgid="5791407621793083965">"Hesaplanıyor…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ek izin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ek izin</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# ek izin}other{# ek izin}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Not: Yeniden başlatma sonrasında, aracınızın kilidini açıncaya kadar bu uygulamayı başlatamazsınız."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistan ve ses girişi"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Asistan uygulaması"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Kablosuz bağlantı kontrolü, bir uygulamanın kablosuz bağlantıyı açmasına veya kapatmasına, kablosuz ağları taramasına, eklemesine ya da kaldırmasına, kablosuz ağlara bağlanmasına veya yalnızca yerel hotspot bağlantısı başlatmasına izin verir."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Daha fazla"</string>
<string name="location_settings_title" msgid="901334356682423679">"Konum"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Konumu kullan"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Belirttiğiniz uygulamaların konuma erişmesine izin verin"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Bu özelliği kapatırsanız tüm uygulamaların konum erişimi kaldırılır. Sürüş yardımı uygulamaları konuma erişmeye devam eder."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Sürüş yardımı için konum kullan"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Araç konumu kapalı"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Sürüş yardımı uygulamaları konumunuza erişemez"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Değiştir"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Sürüşe yardımcı uygulamaların konuma erişmesine izin verin"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Bu özelliği kapatırsanız konum bilgilerine dayanan sürüş yardımı uygulamaları devre dışı bırakılır."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Yine de kapat"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Yeni Konum İstekleri"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Yeni konum isteği yok"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Uygulama düzeyinde izinler"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Konum Hizmetleri"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Konumu kullan"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Konum hizmeti, cihazınızın konumunu tahmin etmesine yardımcı olması için GPS, kablosuz ve mobil ağlar ile sensörler gibi kaynakları kullanabilir."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Sürüş yardımı"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Sürüş yardımı uygulamalarına gönderilen konum bilgilerinde sizi tanımlayan bilgiler yer almaz. Bilgiler silinmeden önce en fazla 2 gün depolanır."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Mikrofonu kullan"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Tüm uygulamaların mikrofonunuza erişmesine izin verin"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Mikrofon izinlerini yönet"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Yakın zamanda erişildi"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Mikrofonu yakın zamanda kullanan uygulama yok"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 uygulamanın erişimi var"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{{total_count} uygulamadan # tanesinin erişimi var}other{{total_count} uygulamadan # tanesinin erişimi var}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Yakın zamanda erişildi"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Tümünü göster"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Yükleniyor…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Sistem güncellemeleri"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Gelişmiş"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Üçüncü taraf lisansları"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Lisansları yüklemeyle ilgili bir sorun var."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Yükleniyor…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Geliştirici olmanıza <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> adım kaldı.</item>
- <item quantity="one">Geliştirici olmanıza <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> adım kaldı.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Geliştirici olmanıza # adım kaldı.}other{Geliştirici olmanıza # adım kaldı.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Artık bir geliştiricisiniz!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Gerekli değil, siz zaten bir geliştiricisiniz."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Geliştirici seçenekleri"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Yeni profili oluşturmanızdan sonra bu kişi, profilini özelleştirmelidir."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Uygulamalar, diğer tüm profillerin kullanabilmesi için herhangi bir profilden güncellenebilir."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Profil sınırına ulaşıldı"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">En fazla <xliff:g id="COUNT">%d</xliff:g> profil oluşturabilirsiniz.</item>
- <item quantity="one">Yalnızca tek bir profil oluşturulabilir.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Yalnızca tek bir profil oluşturulabilir.}other{En fazla # profil oluşturabilirsiniz.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Yeni profil oluşturulamadı"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Bu profil silinsin mi?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Bu profildeki tüm uygulamalar ve veriler silinecek"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profil silinemedi."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil silinmedi. Cihazı başlatıp deneyebilirsiniz."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Profil değiştirdiğinizde veya aracı yeniden başlattığınızda bu profil silinecektir."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Kapat"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Tekrar dene"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Kilit açma deseni çizme"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Desen kaydedilirken hata oluştu"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Çok fazla yanlış giriş yapıldı. <xliff:g id="NUMBER">%d</xliff:g> saniye içinde tekrar deneyin."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Desende çevirme desteklenmiyor. Dokunmayı kullanın"</string>
<string name="okay" msgid="4589873324439764349">"Tamam"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Ekran kilidi kaldırılsın mı?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Bu durumda herkes hesabınıza erişebilecek"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Yaygın olarak kullanılan PIN\'ler, BT yöneticiniz tarafından engellenir. Farklı bir PIN deneyin."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Geçersiz karakter kullanılamaz."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Şifre geçersiz, en az 4 karakterli olmalıdır"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">En az <xliff:g id="COUNT">%d</xliff:g> harf içermelidir</item>
- <item quantity="one">En az 1 harf içermelidir</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">En az <xliff:g id="COUNT">%d</xliff:g> küçük harf içermelidir</item>
- <item quantity="one">En az 1 küçük harf içermelidir</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">En az <xliff:g id="COUNT">%d</xliff:g> büyük harf içermelidir</item>
- <item quantity="one">En az 1 büyük harf içermelidir</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">En az <xliff:g id="COUNT">%d</xliff:g> rakam içermelidir</item>
- <item quantity="one">En az 1 rakam içermelidir</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">En az <xliff:g id="COUNT">%d</xliff:g> özel simge içermelidir</item>
- <item quantity="one">En az 1 özel simge içermelidir</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Harf olmayan en az <xliff:g id="COUNT">%d</xliff:g> karakter içermelidir</item>
- <item quantity="one">Harf olmayan en az 1 karakter içermelidir</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Cihaz yöneticisi yakın zamanda kullanılan bir şifreye izin vermiyor"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Şifre kaydedilirken hata oluştu"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Yaygın olarak kullanılan şifreler, BT yöneticiniz tarafından engellenir. Farklı bir şifre deneyin."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Profil ekle"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Bu profili sil"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Profil ekle"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Ekran parlaklığı"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Cihazlarınızı görmek için Bluetooth\'u açın"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Cihaz eşlemek için Bluetooth ayarlarını açın"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Bilgi-eğlence sistemi yöneticisi"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Etkin uygulamalar"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Devre dışı uygulamalar"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Bu izne sahip uygulamalar bu aracın verilerine erişebilir"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Araç yönetici uygulaması yok"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Bu bilgi-eğlence sistemi yönetim uygulaması etkin durumda olup <xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının aşağıdaki işlemleri gerçekleştirmesine izin veriyor:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Bu bilgi-eğlence sistemi uygulamasının etkinleştirilmesi, <xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının şu işlemleri gerçekleştirmesine izin verir:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Bilgi-eğlence sistemi uygulaması etkinleştirilsin mi?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Bu bilgi-eğlence sistemi uygulamasını etkinleştir"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Devre dışı bırak ve yüklemesini kaldır"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Bu bilgi-eğlence sistemi uygulamasını devre dışı bırak"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Diğer ayrıntılar"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Kuruluş yöneticisi; ayarlar, izinler, kurumsal erişim, ağ etkinliği ve aracın konum bilgileri de dahil olmak üzere bu profille ilişkilendirilen uygulamaları ve verileri izleyip yönetebilir."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Kuruluş yöneticisi; ayarlar, izinler, kurumsal erişim, ağ etkinliği ve cihazın konum bilgileri de dahil olmak üzere bu profille ilişkilendirilen uygulamaları ve verileri izleyip yönetebilir."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Kuruluş yöneticisi; ayarlar, izinler, kurumsal erişim, ağ etkinliği ve aracın konum bilgileri de dahil olmak üzere bu bilgi-eğlence sistemiyle ilişkilendirilen uygulamaları ve verileri izleyip yönetebilir."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Kuruluş yöneticisi bu bilgi-eğlence sistemiyle ilişkilendirilmiş verilere erişebilir, uygulamaları yönetebilir ve bu aracın ayarlarını değiştirebilir."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Bu özellik kullanılamıyor"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Bu yönetilen araçta ses seviyesi değiştirilemiyor"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Bu yönetilen araçta arama yapılamıyor"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Bu yönetilen araçta SMS\'e izin verilmiyor"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Bu yönetilen araçta kamera kullanılamıyor"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Bu yönetilen araçta ekran görüntüsü alınamıyor"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Bu yönetilen araçta bu uygulama açılamıyor"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Sözleşmeli cihaz sağlayıcız tarafından engellendi"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Bazı özelliklere erişim kuruluş tarafından sınırlandırılmış.\n\nSorularınız olursa kuruluş yöneticisiyle iletişime geçin."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Araç yönetimi uygulamaları"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# etkin uygulama}other{# etkin uygulama}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Etkin uygulama yok"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> araç politikası"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Kuruluş yöneticisi tarafından yönetilen ayarlar"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> hakkında ek bilgi"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Hata raporu paylaşılsın mı?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Aracın kuruluş yöneticisi, bu cihazda sorun gidermeye yardımcı olması için hata raporu istedi. Uygulamalar ve veriler paylaşılabilir."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Aracın kuruluş yöneticisi, bu cihazda sorun gidermeye yardımcı olması için hata raporu istedi. Uygulamalar ve veriler paylaşılabilir. Bu durum, cihazınızı geçici olarak yavaşlatabilir."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Bu hata raporu, bu aracın kuruluş yöneticisiyle paylaşılıyor. Daha fazla bilgi için yöneticiyle iletişim kurun."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Paylaş"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Reddet"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Bu ayar şu anda değiştirilemiyor"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Erişilebilirlik"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Altyazılar"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Altyazı tercihleri"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Kapalı"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Açık"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Ekran okuyucu"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Altyazıları göster"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Metin boyutu"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Altyazı boyutu ve stili"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Çok küçük"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Küçük"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Varsayılan"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Büyük"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Çok büyük"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Altyazı stili"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Uygulama tarafından ayarlandı"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Siyah üzerine beyaz"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Beyaz üzerine siyah"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Siyah üzerine sarı"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Mavi üzerine sarı"</string>
</resources>
diff --git a/res/values-uk/arrays.xml b/res/values-uk/arrays.xml
index a2df917..1ebeef5 100644
--- a/res/values-uk/arrays.xml
+++ b/res/values-uk/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ніколи не дозволяти"</item>
<item msgid="1154273129608299386">"Завжди дозволяти"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 2aa06d6..d623cda 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -27,12 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Нічний режим"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Мережа й Інтернет"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Мобільна мережа"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карта</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карти</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карт</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM-карти</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM-карта}one{# SIM-карта}few{# SIM-карти}many{# SIM-карт}other{# SIM-карти}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Активовано/SIM-карта"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Не активовано/SIM-карта"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Активовано/завантажена SIM-карта"</string>
@@ -40,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Додати ще"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобільне передавання даних"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Доступ до даних через мобільну мережу"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Мобільна мережа"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Використовувати мобільний Інтернет"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Вимкнути мобільне передавання даних?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Виберіть варіант"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Використовувати оператора <xliff:g id="CARRIER">%1$s</xliff:g> для мобільного передавання даних?"</string>
@@ -55,12 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Застереження про <xliff:g id="ID_1">^1</xliff:g> даних"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Обмеження обсягу даних – <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Застереження про <xliff:g id="ID_1">^1</xliff:g> даних/Обмеження обсягу даних – <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">Залишився %d день</item>
- <item quantity="few">Залишилося %d дні</item>
- <item quantity="many">Залишилося %d днів</item>
- <item quantity="other">Залишилося %d дня</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Залишився # день}one{Залишився # день}few{Залишилося # дні}many{Залишилося # днів}other{Залишилося # дня}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Часу не залишилося"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Залишилося менше 1 дня"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Оновлено оператором <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> тому"</string>
@@ -75,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Налаштувати"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Застереження та ліміт"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Цикл використання трафіку додатків"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Використання мобільного Інтернету"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Увімкнути сповіщення про трафік"</string>
<string name="data_warning" msgid="116776633806885370">"Застереження про трафік"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Налаштуйте обмеження трафіку"</string>
@@ -83,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Головний пристрій автомобіля вимкне мобільне передавання даних, коли буде досягнуто вказаного обмеження.\n\nОскільки головний пристрій і оператор можуть вимірювати трафік по-різному, радимо встановити занижене обмеження."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Налаштуйте застереження про використання трафіку"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Налаштуйте ліміт використання трафіку"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Пристрій вимірює використання трафіку. Ці дані можуть відрізнятися від тих, що надає оператор мобільного зв’язку."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Налаштувати"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Зберегти"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Мережа OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Інтернет у транспортному засобі"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Деякі функції транспортного засобу або додатки можуть не працювати.\n\nНайважливіші дані, необхідні для його роботи, будуть й надалі передаватися виробнику."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Вимкнути"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Інтернет у транспортному засобі вимкнено. Деякі функції або додатки можуть не працювати. Найважливіші дані, необхідні для його роботи, будуть й надалі передаватися виробнику."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"З %2$s до %3$s було використано %1$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Під\'єднатися до іншої мережі"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Налаштування мережі"</string>
@@ -98,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Додати мережу"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Під’єднати"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Підключення…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Не підключено"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Авто поза зоною покриття мережі"</string>
<string name="wifi_password" msgid="5565632142720292397">"Пароль"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Показати пароль"</string>
@@ -159,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Виберіть принаймні один діапазон частот для точки доступу Wi-Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Точка доступу та модем"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Точка доступу"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Вимкнено"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Автоматично вимикати точку доступу"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Якщо немає під’єднаних пристроїв, точка доступу Wi-Fi вимикатиметься"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"Додаток <xliff:g id="REQUESTER">%s</xliff:g> хоче ввімкнути Wi-Fi"</string>
@@ -301,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Примусово припинити роботу"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Примусово припинити роботу?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Після примусового припинення роботи додаток може працювати неналежним чином."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Вимкнути захист продуктивності?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"У такому разі програмне й апаратне забезпечення також може не працюватиме."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Не вимикати"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Вимкнути"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Пріоритезувати продуктивність додатка?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Увімкнення налаштування може спричинити нестабільність системи або вплинути на роботу апаратного забезпечення в довгостроковій перспективі. Продовжити?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Так"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Ні, дякую"</string>
<string name="disable_text" msgid="4358165448648990820">"Вимкнути"</string>
<string name="enable_text" msgid="1794971777861881238">"Увімкнути"</string>
<string name="uninstall_text" msgid="277907956072833012">"Видалити"</string>
@@ -314,29 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Дозволи"</string>
<string name="notifications_label" msgid="6586089149665170731">"Сповіщення"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Пам\'ять і кеш"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Макс. продуктивність"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Пріоритезувати продуктивність додатка"</string>
<string name="application_version_label" msgid="8556889839783311649">"Версія: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Дозволи не надано"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Немає запитів на дозволи"</string>
<string name="unused_apps" msgid="648471933781010395">"Додатки, що не використовуються"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> додаток, що не використовується</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> додатки, що не використовуються</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> додатків, що не використовуються</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> додатка, що не використовується</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# додаток, що не використовується}one{# додаток, що не використовується}few{# додатки, що не використовуються}many{# додатків, що не використовуються}other{# додатка, що не використовується}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Скасувати дозволи й звільняти місце"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s у внутрішній пам\'яті"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Закривати додаток для економії ресурсів"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Використовує системні ресурси, щоб пріоритезувати продуктивність додатка"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Використання трафіку"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Використання трафіку"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Історія використання"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Усі додатки"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Викор. трафіку й Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Історія використання"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Усього"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Активний режим"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Фоновий режим"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Дозволити моб. Інтернет"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Дозволити додатку використовувати моб. Інтернет"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Обмежити дані"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Використовувати моб. Інтернет лише на фоні"</string>
<string name="computing_size" msgid="5791407621793083965">"Обчислення…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> додатковий дозвіл</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> додаткові дозволи</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> додаткових дозволів</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> додаткового дозволу</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# додатковий дозвіл}one{# додатковий дозвіл}few{# додаткові дозволи}many{# додаткових дозволів}other{# додаткового дозволу}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Примітка: щоб запустити цей додаток після перезавантаження, спершу потрібно буде розблокувати автомобіль."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Асистент і голосовий ввід"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Помічник"</string>
@@ -393,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Додаток із дозволом на керування Wi-Fi може вмикати й вимикати Wi-Fi, шукати, додавати й вилучати мережі, підключатися до них, а також запускати локальну точку доступу."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Більше"</string>
<string name="location_settings_title" msgid="901334356682423679">"Геодані"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Використовувати геодані"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Дати вибраним додаткам доступ до геоданих"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Якщо вимкнути цю опцію, доступ до геоданих буде скасовано для всіх додатків, окрім додатків для допомоги водію."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Викор. геодані для функцій допомоги водію"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Геодані транспортного засобу вимкнено"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Додатки для допомоги водію не мають доступу до геоданих"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Змінити"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Надати додаткам для допомоги водію доступ до геоданих"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Якщо вимкнути цю опцію, функції допомоги водію, які використовують геодані, будуть деактивовані."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Вимкнути"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Останні запити на геодані"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Немає останніх запитів на геодані"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Дозволи на рівні додатка"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Геолокація"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Використовувати геодані"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Для визначення місцезнаходження вашого пристрою можуть використовуватися дані GPS, Wi-Fi, мобільних мереж і датчиків."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Допомога водію"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Геодані, які отримують додатки для допомоги водію, не містять інформації, за якою вас можна ідентифікувати. Вони зберігаються щонайбільше 2 дні, а потім видаляються."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Мікрофон"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Використовувати мікрофон"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Надати всім додаткам доступ до мікрофона"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Керувати доступом до мікрофона"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Нещодавно використовувався"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Жодний додаток не використовував мікрофон нещодавно"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 додатків мають доступ"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# додаток із {total_count} має доступ}one{# додаток із {total_count} має доступ}few{# додатки з {total_count} мають доступ}many{# додатків із {total_count} мають доступ}other{# додатка з {total_count} має доступ}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Нещодавно використовувався"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Показати всі"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Завантаження…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Система"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Оновлення системи"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Додатково"</string>
@@ -437,12 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Ліцензії сторонніх розробників"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Не вдалося завантажити ліцензії."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Завантаження…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Залишився лише <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> крок, щоб стати розробником.</item>
- <item quantity="few">Залишилося лише <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроки, щоб стати розробником.</item>
- <item quantity="many">Залишилося лише <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроків, щоб стати розробником.</item>
- <item quantity="other">Залишилося лише <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроку, щоб стати розробником.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Залишився лише # крок, щоб стати розробником.}one{Залишився лише # крок, щоб стати розробником.}few{Залишилося лише # кроки, щоб стати розробником.}many{Залишилося лише # кроків, щоб стати розробником.}other{Залишилося лише # кроку, щоб стати розробником.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Тепер ви розробник."</string>
<string name="show_dev_already" msgid="1678087328973865736">"Непотрібно, ви вже розробник."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Параметри розробника"</string>
@@ -511,16 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Коли ви створите новий профіль, цій людині потрібно налаштувати його для себе."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Користувачі всіх профілів можуть оновлювати додатки для інших профілів."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Досягнуто ліміту профілів"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Можна створити до <xliff:g id="COUNT">%d</xliff:g> профілю.</item>
- <item quantity="few">Можна створити до <xliff:g id="COUNT">%d</xliff:g> профілів.</item>
- <item quantity="many">Можна створити до <xliff:g id="COUNT">%d</xliff:g> профілів.</item>
- <item quantity="other">Можна створити до <xliff:g id="COUNT">%d</xliff:g> профілю.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Можна створити лише один профіль.}one{Можна створити не більше ніж # профіль.}few{Можна створити не більше ніж # профілі.}many{Можна створити не більше ніж # профілів.}other{Можна створити не більше ніж # профілю.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Не вдалося створити новий профіль"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Видалити цей профіль?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Усі додатки та дані для цього профілю буде видалено"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Не вдалося видалити профіль."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Профіль не видалено. Перезапустіть пристрій і повторіть спробу."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Цей профіль видалиться, коли ви ввійдете в інший або перезапустите транспортний засіб."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Закрити"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Повторити"</string>
@@ -633,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Як намалювати ключ розблокування"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Не вдалося зберегти ключ"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Забагато невдалих спроб. Повторіть через <xliff:g id="NUMBER">%d</xliff:g> с."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Ключ вводиться лише на сенсорній панелі"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Вимкнути блокування екрана?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Будь-хто зможе ввійти у ваш обліковий запис"</string>
@@ -664,42 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Системний адміністратор заблокував загальні PIN-коди. Введіть інший PIN-код."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Не може містити недійсні символи."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Пароль недійсний. Потрібно ввести принаймні 4 символи."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> літеру</item>
- <item quantity="few">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> літери</item>
- <item quantity="many">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> літер</item>
- <item quantity="other">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> літери</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> малу літеру</item>
- <item quantity="few">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> малі літери</item>
- <item quantity="many">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> малих літер</item>
- <item quantity="other">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> малої літери</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> велику літеру</item>
- <item quantity="few">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> великі літери</item>
- <item quantity="many">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> великих літер</item>
- <item quantity="other">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> великої літери</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> цифру</item>
- <item quantity="few">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> цифри</item>
- <item quantity="many">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> цифр</item>
- <item quantity="other">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> цифри</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> спеціальний символ</item>
- <item quantity="few">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> спеціальні символи</item>
- <item quantity="many">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> спеціальних символів</item>
- <item quantity="other">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> спеціального символу</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> символ, який не є літерою</item>
- <item quantity="few">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> символи, які не є літерами</item>
- <item quantity="many">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> символів, які не є літерами</item>
- <item quantity="other">Має містити принаймні <xliff:g id="COUNT">%d</xliff:g> символу, які не є літерами</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Адміністратор пристрою не дозволяє використовувати останній пароль"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Не вдалося зберегти пароль"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Системний адміністратор заблокував загальні паролі. Введіть інший пароль."</string>
@@ -742,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Додати профіль"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Видалити цей профіль"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Додати профіль"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Яскравість дисплея"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Щоб переглянути свої пристрої, увімкніть Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Щоб створити пару з пристроєм, відкрийте налаштування Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Адміністратор інформаційно-розважальної системи"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Активовані додатки"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Деактивовані додатки"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Додатки з цим дозволом мають доступ до даних транспортного засобу"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Немає додатків адміністратора транспортного засобу"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Цей додаток адміністратора інформаційно-розважальної системи активний і дає змогу додатку <xliff:g id="APP_NAME">%1$s</xliff:g> виконувати вказані нижче операції."</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Якщо ви активуєте цей додаток інформаційно-розважальної системи, додаток <xliff:g id="APP_NAME">%1$s</xliff:g> зможе виконувати вказані нижче операції."</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Активувати цей додаток?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Активувати цей додаток інформаційно-розважальної системи"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Вимкнути й видалити"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Деактивувати цей додаток інформаційно-розважальної системи"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Докладніше"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Адміністратор організації може відстежувати додатки й дані, пов’язані з цим профілем, зокрема налаштування, дозволи, корпоративний доступ, дії в мережі й дані про місцезнаходження транспортного засобу, а також керувати ними."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Адміністратор організації може відстежувати додатки й дані, пов’язані з цим профілем, зокрема налаштування, дозволи, корпоративний доступ, дії в мережі й дані про місцезнаходження пристрою, а також керувати ними."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Адміністратор організації може відстежувати додатки й дані, пов’язані з цією інформаційно-розважальною системою, зокрема налаштування, дозволи, корпоративний доступ, дії в мережі й дані про місцезнаходження транспортного засобу, а також керувати ними."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Адміністратор організації може мати доступ до даних, пов’язаних з цією інформаційно-розважальною системою, керувати додатками й змінювати налаштування цього транспортного засобу."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Немає доступу"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Не вдається змінити гучність у цьому керованому транспортному засобі"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Не вдається здійснювати виклики в цьому керованому транспортному засобі"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Заборонено надсилати SMS у цьому керованому транспортному засобі"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Камера недоступна в цьому керованому транспортному засобі"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"У цьому керованому транспортному засобі не можна робити знімки екрана"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Не вдається відкрити додаток у цьому керованому транспортному засобі"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Заблоковано кредитором"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Доступ до деяких функцій обмежує організація.\n\nЯкщо у вас є запитання, зв’яжіться з її керівником."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Програми для адміністраторів авто"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# активований додаток}one{# активований додаток}few{# активовані додатки}many{# активованих додатків}other{# активованого додатка}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Немає активованих додатків"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Правила організації \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" щодо транспортних засобів"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Налаштування, якими керує адміністратор організації"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Докладніше про сервіс <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Надіслати звіт про помилку?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Адміністратор транспортного засобу просить надіслати звіт про помилку, щоб вирішити проблему з цим пристроєм. Він може отримати доступ до ваших додатків і даних."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Адміністратор транспортного засобу просить надіслати звіт про помилку, щоб вирішити проблему з цим пристроєм. Він може отримати доступ до ваших додатків і даних. Це також може тимчасово сповільнити роботу вашого пристрою."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Звіт про помилку надіслано адміністратору транспортного засобу. Щоб дізнатися більше, зв’яжіться з ним."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Поділитися"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Відхилити"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Наразі це налаштування змінити не можна"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Спеціальні можливості"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Субтитри"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Налаштування субтитрів"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Вимкнено"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Увімкнено"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Програма зчитування з екрана"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Показувати субтитри"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Розмір тексту"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Розмір і стиль субтитрів"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Дуже малий"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Малий"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"За умовчанням"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Великий"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Дуже великий"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Стиль субтитрів"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Як у додатку"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Білий на чорному"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Чорний на білому"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Жовтий на чорному"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Жовтий на синьому"</string>
</resources>
diff --git a/res/values-ur/arrays.xml b/res/values-ur/arrays.xml
index 7cdd01d..8681940 100644
--- a/res/values-ur/arrays.xml
+++ b/res/values-ur/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"کبھی اجازت نہ دیں"</item>
<item msgid="1154273129608299386">"ہمیشہ اجازت دیں"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index abb0183..72b9bbe 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"نائٹ موڈ"</string>
<string name="network_and_internet" msgid="4229023630498537530">"نیٹ ورک اور انٹرنیٹ"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"موبائل نیٹ ورک"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIMs}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"فعال / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"غیر فعال / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"فعال / ڈاؤن لوڈ کردہ SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"مزید شامل کریں"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"موبائل ڈیٹا"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"موبائل نیٹ ورک کے ذریعے ڈیٹا تک رسائی حاصل کریں"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"موبائل نیٹ ورک"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"موبائل ڈیٹا استعمال کریں"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"موبائل ڈیٹا آف کریں؟"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"انتخاب درکار ہے"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"موبائل ڈیٹا کیلئے <xliff:g id="CARRIER">%1$s</xliff:g> یوز کریں؟"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> ڈیٹا وارننگ"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> ڈیٹا کی حد"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> ڈیٹا وارننگ / <xliff:g id="ID_2">^2</xliff:g> ڈیٹا کی حد"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d دن باقی ہیں</item>
- <item quantity="one">%d دن باقی ہے</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# دن باقی ہے}other{# دن باقی ہیں}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"کوئی وقت باقی نہیں ہے"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 دن سے کم وقت باقی ہے"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> نے <xliff:g id="ID_2">^2</xliff:g> پہلے اپ ڈیٹ کیا"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"سیٹ کریں"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"ڈیٹا وارننگ اور حد"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"ایپ کے ڈیٹا کے استعمال کی سائیکل"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"موبائل ڈیٹا کا استعمال"</string>
<string name="set_data_warning" msgid="6628236612886588097">"ڈیٹا وارننگ سیٹ کریں"</string>
<string name="data_warning" msgid="116776633806885370">"ڈیٹا وارننگ"</string>
<string name="set_data_limit" msgid="7136539812414500084">"ڈیٹا کی حد سیٹ کریں"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"آپ کی گاڑی کی ہیڈ یونٹ آپ کی مقرر کردہ حد کو پہنچ جانے پر موبائل ڈیٹا کو آف کر دے گی۔\n\nچونکہ ڈیٹا کے استعمال کی پیمائش ہیڈ یونٹ کے ذریعے کی جاتی ہے اور آپ کا کیریئر استعمال کا حساب مختلف طریقے سے کر سکتا ہے لہذا ایک محتاط حد مقرر کرنے پر غور کریں۔"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"ڈیٹا کے استعمال کی وارننگ سیٹ کریں"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"ڈیٹا کے استعمال کی حد سیٹ کریں"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"ڈیٹا کے استعمال کی پیمائش آپ کے آلے سے کی جاتی ہے۔ یہ آپ کے موبائل کیریئر کے ڈیٹا سے مختلف ہو سکتی ہے۔"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"سیٹ کریں"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"محفوظ کریں"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM نیٹ ورک"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"گاڑی کا انٹرنیٹ"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"گاڑی کا انٹرنیٹ آف کرنا گاڑی کی کچھ خصوصیات یا ایپس کو کام کرنے سے روک سکتا ہے۔\n\nآپ کی گاڑی کو آپریٹ کرنے کیلئے درکار اہم ڈیٹا کا اشتراک گاڑی کے مینوفیکچرر کے ساتھ جاری رہے گا۔"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"بہر حال آف کریں"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"گاڑی کا انٹرنیٹ آف ہے۔ یہ گاڑی کی کچھ خصوصیات یا ایپس کو کام کرنے سے روک سکتا ہے۔ آپ کی گاڑی کو آپریٹ کرنے کے لیے درکار اہم ڈیٹا کا اشتراک گاڑی کے مینوفیکچرر کے ساتھ جاری رہے گا۔"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s تک %1$s استعمال کیا گیا"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"دیگر نیٹ ورک میں شامل ہوں"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"نیٹ ورک کی ترجیحات"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"نیٹ ورک شامل کریں"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"منسلک کریں"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"منسلک ہو رہا ہے…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"منسلک نہیں ہے"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"نیٹ ورک رینج میں نہیں ہے"</string>
<string name="wifi_password" msgid="5565632142720292397">"پاس ورڈ"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"پاس ورڈ دکھائیں"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi‑Fi ہاٹ اسپاٹ کیلئے کم از کم ایک بینڈ چنیں:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"ہاٹ اسپاٹ اور ٹیتھرنگ"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"ہاٹ اسپاٹ"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"آف ہے"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"خودکار طور پر ہاٹ اسپاٹ آف کریں"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"کوئی آلہ منسلک نہ ہونے پر Wi‑Fi ہاٹ اسپاٹ آف ہو جائے گا"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> Wi-Fi کو آن کرنا چاہتی ہے"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"زبردستی روکیں"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"زبردستی روکیں؟"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"اگر آپ کسی ایپ کو زبردستی روک دیتے ہیں تو یہ غلط برتاؤ کر سکتی ہے۔"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"کارکردگی کا تحفظ بند کریں؟"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"اگر آپ ایسا کرتے ہیں تو ہو سکتا ہے کہ سافٹ ویئر اور ہارڈویئر بھی کام نہ کرے۔"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"فعال رہنے دیں"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"آف کریں"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"ایپ کی کارکردگی کو ترجیح دیں کو آن کریں؟"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"اسے آن کرنا ممکنہ سسٹم کے عدم استحکام یا طویل مدتی ہارڈویئر کے اثر کا سبب بن سکتا ہے۔ کیا آپ جاری رکھنا چاہتے ہیں؟"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"ہاں"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"نہیں، شکریہ"</string>
<string name="disable_text" msgid="4358165448648990820">"غیر فعال کریں"</string>
<string name="enable_text" msgid="1794971777861881238">"فعال کریں"</string>
<string name="uninstall_text" msgid="277907956072833012">"اَن انسٹال کریں"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"اجازتیں"</string>
<string name="notifications_label" msgid="6586089149665170731">"اطلاعات"</string>
<string name="storage_application_label" msgid="5911779903670978586">"اسٹوریج اور کیش"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"کارکردگی یقینی بنائیں"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"ایپ کی کارکردگی کو ترجیح دیں"</string>
<string name="application_version_label" msgid="8556889839783311649">"ورژن: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"کوئی اجازت نہیں دی گئی"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"کسی اجازت کی درخواست نہیں کی گئی"</string>
<string name="unused_apps" msgid="648471933781010395">"غیر مستعمل ایپس"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> غیر مستعمل ایپس</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> غیر مستعمل ایپ</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# غیر مستعمل ایپ}other{# غیر مستعمل ایپس}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"اجازتوں کو ہٹائیں اور جگہ خالی کریں"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"داخلی اسٹوریج میں %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"ضرورت ہونے پر وسائل کے زیادہ استعمال سے بچنے کیلئے ایپ بند کریں"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"ایپ کی کارکردگی کو ترجیح دینے کے لیے سسٹم کے وسائل استعمال کرتا ہے"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"ڈیٹا کا استعمال"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"ایپ ڈیٹا کا استعمال"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"استعمال کی سرگزشت"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"سبھی ایپس"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"ڈیٹا اور Wi-Fi کا استعمال"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"استعمال کی سرگزشت"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"کُل استعمال"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"پیش منظر"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"پس منظر"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"ڈیٹا کی اجازت دیں"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"اس ایپ کو موبائل ڈیٹا استعمال کرنے دیں"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"ڈیٹا کو محدود کریں"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"ایپ صرف پیش منظر میں ڈیٹا استعمال کرتی ہے"</string>
<string name="computing_size" msgid="5791407621793083965">"حساب کتاب کیا جا رہا ہے…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> اضافی اجازتیں</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> اضافی اجازت</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# اضافی اجازت}other{# اضافی اجازتیں}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"نوٹ: ریبوٹ کرنے کے بعد یہ ایپ تب تک شروع نہیں ہو سکتی جب تک آپ اپنی گاڑی غیر مقفل نہ کر لیں۔"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"معاون اور صوتی ان پٹ"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"معاون ایپ"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi کنٹرول ایپ کو Wi-Fi آن یا آف کرنے، Wi-Fi نیٹ ورکس اسکین اور ان سے منسلک کرنے، نیٹ ورکس شامل کرنے یا ہٹانے یا صرف مقامی ہاٹ اسپاٹ شروع کرنے کی اجازت دیتا ہے۔"</string>
<string name="more_special_access_title" msgid="166115485446645971">"مزید"</string>
<string name="location_settings_title" msgid="901334356682423679">"مقام"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"مقام استعمال کریں"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"آپ کی متعین کردہ ایپس کو اپنے مقام تک رسائی کی اجازت دیں"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"اگر آپ اسے آف کرتے ہیں تو یہ تمام ایپس کیلئے مقام تک رسائی کو ہٹا دے گا۔ ڈرائیور کی مدد کی ایپس کو پھر بھی رسائی حاصل رہے گی۔"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"ڈرائیور کی مدد کیلئے مقام کا استعمال کریں"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"گاڑی کا مقام آف ہے"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"ڈرائیور کی مدد کی ایپس آپ کے مقام تک رسائی نہیں کر سکتیں"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"تبدیل کریں"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"ڈرائیونگ میں مدد کرنے والی ایپس کو اپنے مقام تک رسائی کی اجازت دیں"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"اگر آپ اسے آف کرتے ہیں تو مقام کی معلومات پر مبنی ڈرائیور کی مدد کی ایپس غیر فعال ہو جائیں گی۔"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"بہر حال آف کریں"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"مقام کی حالیہ درخواستیں"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"مقام کی کوئی حالیہ درخواست نہیں ہے"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ایپ کی سطح کی اجازتیں"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"مقام کی سروسز"</string>
<string name="location_use_location_title" msgid="117735895374606680">"مقام کا استعمال کریں"</string>
<string name="location_settings_footer" msgid="296892848338100051">"آپ کے آلہ کے مقام کا تعین کرنے میں مدد کرنے کے لیے، مقام GPS, Wi‑Fi، موبائل نیٹ ورکس اور سینسرز جیسے وسائل کا استعمال کر سکتا ہے۔"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"ڈرائیور کی مدد"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"ڈرائیور کی مدد کی ایپس کو بھیجی گئی مقام کی معلومات میں ایسی معلومات شامل نہیں ہوتی جو آپ کی شناخت کرتی ہو۔ حذف ہونے سے پہلے معلومات کو زیادہ سے زیادہ 2 دن کیلئے محفوظ کیا جاتا ہے۔"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"مائیکروفون"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"مائیکروفون کا استعمال کریں"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"سبھی ایپس کو اپنے مائیکروفون تک رسائی کی اجازت دیں"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"مائیکروفون کی اجازتوں کا نظم کریں"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"حال ہی میں رسائی حاصل کردہ"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"کوئی حالیہ ایپ نہیں ہے"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 ایپس کو رسائی حاصل ہے"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# میں سے {total_count} ایپس کو رسائی حاصل ہے}other{# میں سے {total_count} ایپس کو رسائی حاصل ہے}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"حال ہی میں رسائی حاصل کردہ"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"سبھی دیکھیں"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"لوڈ ہو رہی ہیں…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"سسٹم"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"سسٹم اپ ڈیٹس"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"جدید ترین"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"فریق ثالث کے لائسنسز"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"لائسنسز لوڈ کرنے میں ایک مسئلہ ہے۔"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"لوڈ ہو رہا ہے…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">اب آپ ڈویلپر بننے سے <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> قدم دور ہیں۔</item>
- <item quantity="one">اب آپ ڈویلپر بننے سے <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> قدم دور ہیں۔</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{اب آپ ڈویلپر بننے سے # قدم دور ہیں۔}other{اب آپ ڈیولپر بننے سے # قدم دور ہیں۔}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"اب آپ ایک ڈویلپر ہیں!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"کوئی ضرورت نہیں ہے، آپ پہلے سے ہی ایک ڈویلپر ہیں۔"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"ڈویلپر کے اختیارات"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"آپ کے ایک نئی پروفائل کو منتخب کرنے کے بعد، اس شخص کو اسے خود کے ليے حسب ضرورت بنانا چاہیے۔"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"کسی بھی پروفائل سے دیگر سبھی پروفائلز کے ذریعے استعمال کے لیے ایپس کو اپ ڈیٹ کیا جا سکتا ہے۔"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"پروفائل کی حد مکمل ہوگئی"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">آپ <xliff:g id="COUNT">%d</xliff:g> پروفائلز تک تخلیق کر سکتے ہیں۔</item>
- <item quantity="one">صرف ایک پروفائل تخلیق کی جا سکتی ہے۔</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{صرف ایک پروفائل تخلیق کی جا سکتی ہے۔}other{آپ # پروفائلز تک تخلیق کر سکتے ہیں۔}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"نئی پروفائل تخلیق نہیں کی جا سکی"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"اس پروفائل کو حذف کرنا چاہتے ہیں؟"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"اس پروفائل کے متعلق سبھی ایپس اور ڈیٹا کو حذف کردیا جائے گا"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"پروفائل حذف نہیں کی جا سکی۔"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"پروفائل حذف نہیں ہوئی۔ آپ آلے کو ری سٹارٹ کر کے پھر سے آزما سکتے ہیں۔"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"جب آپ پروفائلز سوئچ کرتے ہیں یا گاڑی ری سٹارٹ کرتے ہیں تو یہ پروفائل حذف ہو جائے گی۔"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"برخاست کریں"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"دوبارہ کوشش کریں"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"غیر مقفل کرنے کا پیٹرن ڈرا کرنے کا طریقہ"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"پیٹرن کو محفوظ کرنے میں خرابی"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"کافی زیادہ غلط کوششیں کی گئیں۔ <xliff:g id="NUMBER">%d</xliff:g> سیکنڈ بعد دوبارہ کوشش کریں۔"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"پیٹرن روٹری کو سپورٹ نہیں کرتا ہے، براہ کرم ٹچ کریں استعمال کریں"</string>
<string name="okay" msgid="4589873324439764349">"ٹھیک ہے"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"اسکرین لاک کو ہٹائیں؟"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"اس سے کسی کو بھی آپ کے اکاؤنٹ تک رسائی کی اجازت ہوگی"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"آپ کے IT منتظم نے عمومی PINs کو مسدود کر دیا ہے۔ کوئی دوسرا PIN آزمائیں۔"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"اس میں غلط کریکٹر شامل نہیں ہو سکتا۔"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"پاس ورڈ غلط ہے، کم از کم 4 حروف لمبا ہونا ضروری ہے۔"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">کم از کم <xliff:g id="COUNT">%d</xliff:g> حروف پر مشتمل ہونا چاہیے</item>
- <item quantity="one">کم از کم 1 حرف پر مشتمل ہونا چاہیئے</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">کم از کم <xliff:g id="COUNT">%d</xliff:g> چھوٹے حروف پر مشتمل ہونا چاہیے</item>
- <item quantity="one">کم از کم ایک چھوٹے حرف پر مشتمل ہونا چاہیئے</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">کم از کم <xliff:g id="COUNT">%d</xliff:g> بڑے حروف پر مشتمل ہونا چاہیے</item>
- <item quantity="one">کم از کم 1 بڑے حرف پر مشتمل ہونا چاہیئے</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">کم از کم <xliff:g id="COUNT">%d</xliff:g> عددی ہندسوں پر مشتمل ہونا چاہیے</item>
- <item quantity="one">کم از کم 1 عددی ہندسہ پر مشتمل ہونا چاہیئے</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">کم از کم <xliff:g id="COUNT">%d</xliff:g> خصوصی علامتوں پر مشتمل ہونا چاہیے</item>
- <item quantity="one">کم از کم ایک خصوصی علامت پر مشتمل ہونا چاہیئے</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">کم از کم <xliff:g id="COUNT">%d</xliff:g> ایسے کریکٹرز پر مشتمل ہونا چاہیئے جو حروف نہ ہوں</item>
- <item quantity="one">کم از کم ایک ایسے کریکٹر پر مشتمل ہونا چاہیئے جو حرف نہ ہو</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"آلے کا منتظم ایک حالیہ پاس ورڈ کا استعمال کرنے کی اجازت نہیں دیتا ہے"</string>
<string name="error_saving_password" msgid="8334882262622500658">"پاس ورڈ محفوظ کرنے میں خرابی"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"آپ کے IT منتظم نے عمومی پاس ورڈز کو مسدود کر دیا ہے۔ کوئی دوسرا پاس ورڈ آزمائیں۔"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"ایک پروفائل شامل کریں"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"اس پروفائل کو حذف کریں"</string>
<string name="add_profile_text" msgid="9118410102199116969">"پروفائل شامل کریں"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"ڈسپلے کی چمک"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"اپنے آلات دیکھنے کے لیے بلوٹوتھ آن کریں"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"آلے کا جوڑا بنانے کے لیے بلوٹوتھ کی ترتیبات کھولیں"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"معلوماتی انٹرٹینمنٹ سسٹم کا منتظم"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"فعال کردہ ایپس"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"غیر فعال کردہ ایپس"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"اس اجازت والی ایپس کو اس گاڑی کے ڈیٹا تک رسائی حاصل ہے"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"کوئی گاڑی کے منتظم کی ایپ نہیں"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"یہ معلوماتی انٹرٹینمنٹ سسٹم کا منتظم فعال ہے اور <xliff:g id="APP_NAME">%1$s</xliff:g> ایپ کو درج ذيل اعمال انجام دینے کی اجازت دیتا ہے:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"اس معلوماتی انٹرٹینمنٹ سسٹم کے منتظم کو فعال کرنے سے <xliff:g id="APP_NAME">%1$s</xliff:g> ایپ کو درج ذيل اعمال انجام دینے کی اجازت مل جائے گی:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"معلوماتی انٹرٹینمنٹ سسٹم ایپ فعال کریں؟"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"معلوماتی انٹرٹینمنٹ سسٹم ایپ فعال کریں"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"غیر فعال اور اَن انسٹال کریں"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"اس معلوماتی انٹرٹینمنٹ سسٹم ایپ کو غیر فعال کریں"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"مزید تفصیلات"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"تنظیم کا مینیجر اس پروفائل سے وابستہ ایپس اور ڈیٹا سمیت ترتیبات، اجازتیں، کارپوریٹ رسائی، نیٹ ورک کی سرگرمی اور گاڑی کے مقام کی معلومات کی نگرانی اور ان کا نظم کر سکتا ہے۔"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"تنظیم کا مینیجر اس پروفائل سے وابستہ ایپس اور ڈیٹا سمیت ترتیبات، اجازتیں، کارپوریٹ رسائی، نیٹ ورک کی سرگرمی اور آلہ کے مقام کی معلومات کی نگرانی اور ان کا نظم کر سکتا ہے۔"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"تنظیم کا مینیجر اس معلوماتی انٹرٹینمنٹ سسٹم سے وابستہ ایپس اور ڈیٹا سمیت ترتیبات، اجازتیں، کارپوریٹ رسائی، نیٹ ورک کی سرگرمی اور گاڑی کے مقام کی معلومات کی نگرانی اور ان کا نظم کر سکتا ہے۔"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"تنظیم کا مینیجر اس معلوماتی انٹرٹینمنٹ سسٹم کے ساتھ وابستہ ڈیٹا تک رسائی حاصل، ایپس کا نظم اور اس گاڑی کی ترتیبات کو تبدیل کر سکتا ہے۔"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"یہ دستیاب نہیں ہے"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"اس نظم کردہ گاڑی میں والیوم تبدیل نہیں کیا جا سکتا"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"اس نظم کردہ گاڑی میں کالز نہیں کر سکتے"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"اس نظم کردہ گاڑی میں SMS کی اجازت نہیں ہے"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"اس نظم کردہ گاڑی میں کیمرا دستیاب نہیں ہے"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"اس نظم کردہ گاڑی میں اسکرین شاٹس نہیں لے سکتے"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"اس نظم کردہ گاڑی میں اس ایپ کو نہیں کھولا جا سکتا"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"آپ کے کریڈٹ فراہم کنندہ نے مسدود کیا ہے"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"تنظیم نے کچھ خصوصیات تک رسائی کو محدود کر دیا ہے۔\n\nاگر آپ کے پاس سوالات ہیں تو تنظیم کے مینیجر سے رابطہ کریں۔"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"گاڑی کے منتظم کی ایپس"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# فعال کردہ ایپ}other{# فعال کردہ ایپس}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"کوئی فعال کردہ ایپ نہیں"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> گاڑی کی پالیسی"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"تنظیم کے مینیجر کے زیر انتظام ترتیبات"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> کے بارے میں مزید جانیں"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"بگ رپورٹ کا اشتراک کریں؟"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"اس گاڑی کی تنظیم کے مینیجر نے اس آلہ کا مسئلہ حل کرنے میں مدد کے لیے ایک بگ رپورٹ کی درخواست کی ہے۔ ایپس اور ڈیٹا کا اشتراک ہو سکتا ہے۔"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"اس گاڑی کی تنظیم کے مینیجر نے اس آلہ کا مسئلہ حل کرنے میں مدد کے لیے ایک بگ رپورٹ کی درخواست کی ہے۔ ایپس اور ڈیٹا کا اشتراک ہو سکتا ہے اور آپ کا آلہ عارضی طور پر سست ہو سکتا ہے۔"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"اس بگ رپورٹ کا اس گاڑی کے مینیجر کے ساتھ اشتراک کیا جا رہا ہے۔ مزید تفصیلات کے لیے ان سے رابطہ کریں۔"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"اشتراک کریں"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"مسترد کریں"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"اس ترتیب کو ابھی تبدیل نہیں کیا جا سکتا"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"ایکسیسبیلٹی"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"کیپشنز"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"کیپشن کی ترجیحات"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"آف"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"آن"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"اسکرین قاری"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"کیپشنز دکھائیں"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"ٹیکسٹ کا سائز"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"کیپشن کا سائز اور طرز"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"بہت چھوٹا"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"چھوٹا"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"ڈیفالٹ"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"بڑا"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"بہت بڑا"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"کیپشن کا طرز"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"ایپ کے لحاظ سے سیٹ کریں"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"سیاہ پر سفید"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"سفید پر سیاہ"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"سیاہ پر پیلا"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"نیلے پر پیلا"</string>
</resources>
diff --git a/res/values-uz/arrays.xml b/res/values-uz/arrays.xml
index febd8f3..cb24144 100644
--- a/res/values-uz/arrays.xml
+++ b/res/values-uz/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ruxsat berilmasin"</item>
<item msgid="1154273129608299386">"Har doim ruxsat berilsin"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 726607f..e1cb5fe 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Tungi rejim"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Tarmoq va Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mobil tarmoq"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta SIM karta</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta SIM karta</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# ta SIM karta}other{# ta SIM karta}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Faol / SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Nofaol / SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Faol / Yuklab olingan SIM"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Yana"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobil internet"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Mobil internet trafik sarfi"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mobil tarmoq"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Mobil internetdan foydalanish"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobil internet uzilsinmi?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Tanlash zarur"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Internet uchun <xliff:g id="CARRIER">%1$s</xliff:g> ishlatilsinmi?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Trafik sarfiga oid ogohlantirish: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Trafik limiti: <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Trafik sarfiga oid ogohlantirish: <xliff:g id="ID_1">^1</xliff:g> / trafik limiti: <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">%d kun qoldi</item>
- <item quantity="one">%d kun qoldi</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{# kun qoldi}other{# kun qoldi}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Hech qanday vaqt qolmadi"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"1 kundan kam vaqt qoldi"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> tomonidan <xliff:g id="ID_2">^2</xliff:g> oldin yangilangan"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Sozlash"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Ogohlantirish va limit"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Statistika davri"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Mobil internet sarfi"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Trafik sarfi ogohlantirishi"</string>
<string name="data_warning" msgid="116776633806885370">"Ogohlantirishlar"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Trafik cheklovini belgilash"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Siz belgilagan cheklovga yetib kelgach, avtomobilingizning bosh qurilmasidagi mobil internet oʻchadi.\n\nInternetdan foydalanish miqdori avtomobilingizning bosh qurilmasi tomonidan hisoblangani uchun aloqa operatoringizning hisob-kitoblari undan farq qilishi mumkin. Shuning uchun, cheklov kiritishda zaxira miqdorini ham inobatga oling."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Trafik sarfiga oid ogohlantirishni sozlash"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Trafik limitini sozlash"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Trafik sarfi qurilmangiz tomonidan hisoblanadi Bu mobil aloqa operatorining hisob-kitobi bilan farq qilishi mumkin."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Sozlash"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Saqlash"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"OEM tarmoq"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Transport vositasi interneti"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Transport vositasi interneti oʻchirilganda transport vositasining ayrim funksiyalari yoki ilovalari ishlamasligi mumkin.\n\nTransport vositasining ishlashi uchun zarur muhim maʼlumotlar transport ishlab chiquvchisiga yuborib turiladi."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Baribir oʻchirilsin"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Transport vositasi interneti yoqilmagan. Bunda transport vositasining ayrim funksiyalari yoki ilovalari ishlamasligi mumkin. Transport vositasining ishlashi uchun zarur muhim maʼlumotlar transport ishlab chiquvchisiga yuborib turiladi."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s orasida %1$s sarflandi"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Boshqa tarmoqqa ulanish"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Tarmoqqa ulanish sozlamalari"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Tarmoq kiritish"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Ulanish"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Ulanmoqda…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Ulanmagan"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Tarmoq xizmat doirasidan tashqarida"</string>
<string name="wifi_password" msgid="5565632142720292397">"Parol"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Parol berkitilmasin"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Wi‑Fi hotspot uchun kamida bitta chastota tanlang:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Hotspot va modem rejimi"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Oʻchiq"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Hotspotni avtomatik faolsizlantirish"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Hech qanday qurilma ulanmasa, Wi-Fi hotspot faolsizlantiriladi"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> Wi-Fi aloqasini yoqmoqchi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Majburan to‘xtatish"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Majburan toʻxtatilsinmi?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Ilovani majburan toʻxtatish uning ishlashiga taʼsir qilishi mumkin."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Samaradorlik himoyasi oʻchirilsinmi?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Buni amalga oshirsangiz, dastur yoki qurilma yaxshi ishlamasligi mumkin."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Yoniq qoldirish"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Oʻchirish"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Ilova unumdorligini oshirish yoqilsinmi?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Yoqilganda tizim nobarqaror ishlashiga yoki apparatga uzoq muddatli taʼsir qilishi mumkin. Davom etasizmi?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Ha"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Kerak emas"</string>
<string name="disable_text" msgid="4358165448648990820">"Faolsizlantirish"</string>
<string name="enable_text" msgid="1794971777861881238">"Yoqish"</string>
<string name="uninstall_text" msgid="277907956072833012">"Oʻchirib tashlash"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Ruxsatlar"</string>
<string name="notifications_label" msgid="6586089149665170731">"Bildirishnomalar"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Xotira va kesh"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Samaradorlikni taʼminlang"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Ilova unumdorligini oshirish"</string>
<string name="application_version_label" msgid="8556889839783311649">"Versiyasi: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Hech qanday ruxsat berilmagan"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Hech qanday ruxsat so‘ralmagan"</string>
<string name="unused_apps" msgid="648471933781010395">"Ishlatilmagan ilovalar"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ta ishlatilmagan ilova</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ta ishlatilmagan ilova</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ta ishlatilmagan ilova}other{# ta ishlatilmagan ilova}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Ruxsatlarni olib tashlash va joy tozalash"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s ichki xotirada"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Zoʻriqib ishlamasligi uchun ilovani yoping"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Ilova unumdorligini oshirish uchun tizim resurslaridan foydalanadi"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Trafik sarfi"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Ilova sarflagan trafik"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Foydalanish tarixi"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Barcha ilovalar"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Internet va Wi-Fi sarfi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Foydalanish tarixi"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Jami sarfi"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Faol rejim"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Orqa fon rejimi"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Ruxsat berish"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Bu ilovaga mobil internet ishlatishga ruxsat berish"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Trafikni cheklash"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Ilova faol rejimdaligida mobil internet ishlatish"</string>
<string name="computing_size" msgid="5791407621793083965">"Hisoblanmoqda…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ta qo‘shimcha ruxsat</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ta qo‘shimcha ruxsat</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# ta qoʻshimcha ruxsat}other{# ta qoʻshimcha ruxsat}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Eslatma: O\'chirib-yoqilgandan so\'ng, avtomobil qulfi ochilmaguncha bu ilova ishga tushmaydi."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Yordamchi va ovoz bilan yozish"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Yordamchi ilova"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi tarmoqlarni boshqarish ilovaga Wi-Fi aloqasini yoqish yoki faolsizlantirish, Wi-Fi tarmoqlarni aniqlash va ularga ulanish, tarmoqlar kiritish yoki ularni olib tashlash yoki faqat mahalliy hotspotni ishga tushirish imkoniyatini beradi."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Yana"</string>
<string name="location_settings_title" msgid="901334356682423679">"Joylashuv"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Geolokatsiyani yoqish"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Tanlangan ilovalarga ruxsat berish"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Bu parametrni faolsizlantirsangiz, barcha ilovalar uchun joylashuvdan foydalanish bekor qilinadi. Haydovchiga yordam funksiyalari foydalanishda davom etadi."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Haydovchiga yordam berish uchun joylashuvdan foydalaning"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Transport vositasi joylashuvi yoqilmagan"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Joylashuv axborotiga kirish imkonsiz"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Almashtirish"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Joylashuv axborotiga kirishga ruxsat berish"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Bu parametrni faolsizlantirsangiz, joylashuv axborotini talab qiladigan haydovchiga yordam funksiyalari oʻchiriladi."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Baribir oʻchirilsin"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Oxirgi joylashuv axboroti talablari"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Hech qanday joylashuvga oid talablar olinmagan"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Ilovalar uchun ruxsatlar"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Joylashuv axborotiga asoslangan xizmatlar"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Geolokatsiyani yoqish"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Joylashuvni aniqlash xizmati bu qurilmaning joylashuvini bilish uchun GPS, Wi-Fi, mobil tarmoqlar va sensorlar kabi manbalardan foydalanadi."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Haydovchiga yordam"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Joylashuv axboroti haydovchiga yordam ilovalariga yuboriladi, lekin tarkibida shaxsingizga oid axborot boʻlmaydi. Bu axborot oʻchib ketishidan oldin maksimum 2 kun saqlanadi."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Mikrofon"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Mikrofon ishlatish"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Barcha ilovalarga mikrofoningizdan foydalanishga ruxsat bering"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Mikrofonga ruxsatlarni boshqarish"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Yaqinda ishlatilgan"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Soʻnggi foydalanilgan ilovalar yoʻq"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 ta ilovaga ruxsat berilgan"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# / {total_count} ta ilovaga ruxsat berilgan}other{# / {total_count} ta ilovaga ruxsat berilgan}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Yaqinda ishlatilgan"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Hammasi"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Yuklanmoqda…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Tizim"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Tizimni yangilash"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Kengaytirilgan"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Uchinchi tomon litsenziyalari"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Litsenziyalarni yuklashda muammo yuz berdi."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Yuklanmoqda…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Dasturchi boʻlishingizga atigi <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> qadam qoldi.</item>
- <item quantity="one">Dasturchi boʻlishingizga atigi <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> qadam qoldi.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Atigi # qadam qoldi.}other{Atigi # qadam qoldi.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Siz endi dasturchisiz!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Shart emas, siz allaqachon dasturchi rejimidasiz."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Ishlab chiquvchi sozlamalari"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Yangi profil yaratilgandan keyin foydalanuvchi uni oʻzi uchun sozlab olishi kerak."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Har qanday foydalanuvchi ilovalarni barcha profillar uchun sozlay oladi."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Boshqa profil kiritish imkonsiz"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Faqat <xliff:g id="COUNT">%d</xliff:g> ta profil yaratish mumkin.</item>
- <item quantity="one">Faqat bitta profil yaratish mumkin.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Faqat bitta profil yaratish mumkin.}other{Faqat # ta profil yaratish mumkin.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Yangi profil yaratilmadi"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Bu profil oʻchirilsinmi?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Bu profildagi barcha ilova va maʼlumotlar oʻchib ketadi"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Profil oʻchirilmadi."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Profil oʻchmadi. Qurilmani oʻchirib yoqib, qaytadan urining."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Profillar almashtirilsa yoki transport vositasi qayta ishga tushirilsa bu profil oʻchirib tashlanadi."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Yopish"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Qayta urinish"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Grafik kalit qanday chiziladi"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Grafik kalit saqlanmadi"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Juda koʻp notoʻgʻri urinildi! <xliff:g id="NUMBER">%d</xliff:g> soniyadan keyin qayta urining."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Grafik kalit burilmaydi, telefonni buring"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Ekran qulfi olib tashlansinmi?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Bu hammaga hisobingizga kirish imkonini beradi"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Oddiy PIN kodlar AT admini tomonidan bloklangan. Murakkabroq PIN kod tanlang."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Parol yaroqsiz belgidan iborat bo‘lmasligi lozim."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Parol yaroqsiz, kamida 4 ta belgi kiriting"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Parol tarkibida kamida <xliff:g id="COUNT">%d</xliff:g> ta harf bo‘lishi lozim</item>
- <item quantity="one">Parol tarkibida kamida 1 ta harf bo‘lishi lozim</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Parol tarkibida kamida <xliff:g id="COUNT">%d</xliff:g> ta kichik harf bo‘lishi lozim</item>
- <item quantity="one">Parol tarkibida kamida 1 ta kichik harf bo‘lishi lozim</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Parol tarkibida kamida <xliff:g id="COUNT">%d</xliff:g> ta bosh harf bo‘lishi lozim</item>
- <item quantity="one">Parol tarkibida kamida 1 ta bosh harf bo‘lishi lozim</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Parol tarkibida kamida <xliff:g id="COUNT">%d</xliff:g> ta raqam bo‘lishi lozim</item>
- <item quantity="one">Parol tarkibida kamida 1 ta raqam bo‘lishi lozim</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Parol tarkibida kamida <xliff:g id="COUNT">%d</xliff:g> ta maxsus belgi bo‘lishi lozim</item>
- <item quantity="one">Parol tarkibida kamida 1 ta maxsus belgi bo‘lishi lozim</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Parol tarkibida kamida <xliff:g id="COUNT">%d</xliff:g> ta harf bo‘lmagan belgi bo‘lishi lozim</item>
- <item quantity="one">Parol tarkibida kamida 1 ta harf bo‘lmagan belgi bo‘lishi lozim</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Qurilma administratori yaqinda foydalanilgan paroldan yana foydalanishga ruxsat bermaydi"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Parol saqlanmadi"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Oddiy parollar AT admini tomonidan bloklangan. Murakkabroq parol tanlang."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Profil kiritish"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Bu profilni oʻchirish"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Profil kiritish"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Ekran yorqinligi"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Qurilmalaringizni koʻrish uchun Bluetoothni yoqing"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Qurilmani ulash uchun Bluetooth sozlamalarini oching"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Axborot-hordiq tizimi boshqaruvi"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Faol ilovalar"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Nofaol ilovalar"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Bunday ruxsatga ega ilovalar ushbu transport vositasining maʼlumotlaridan foydalana oladi"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Avtomobil administratori uchun ilovalar yoʻq."</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Bu axborot-hordiq tizimining boshqaruv ilovasi faol va <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga quyidagi amallarni bajarishga ruxsat beradi:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Bu axborot-hordiq tizimini ilovasi faollashtirilsa, <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga quyidagi amallarni bajarishga ruxsat beriladi:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Bu axborot-hordiq tizimi yoqilsinmi?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Bu axborot-hordiq tizimi ilovasini faollashtirish"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Faolsizlantirish va oʻchirib tashlash"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Bu axborot-hordiq tizimi ilovasini faolsizlantirish"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Batafsil"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Tashkilot menejeri bu profil bilan bogʻliq ilova va maʼlumotlarni, jumladan, sozlamalar, ruxsatnomalar, korporativ kirish huquqi, tarmoqdagi faollik va transportning joylashuvi haqidagi maʼlumotlarni kuzatishi va boshqarishi mumkin."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Tashkilot menejeri bu profil bilan bogʻliq ilova va maʼlumotlarni, jumladan, sozlamalar, ruxsatnomalar, korporativ kirish huquqi, tarmoqdagi faollik va qurilmaning joylashuvi haqidagi maʼlumotlarni kuzatishi va boshqarishi mumkin."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Tashkilot menejeri bu axborot-hordiq tizimi bilan bogʻliq ilova va maʼlumotlarni, jumladan, sozlamalar, ruxsatnomalar, korporativ kirish huquqi, tarmoqdagi faollik va transportning joylashuvi haqidagi maʼlumotlarni kuzatishi va boshqarishi mumkin."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Tashkilot menejeri bu axborot-hordiq tizimi bilan bogʻliq maʼlumotlarni koʻrishi, ilovalarni boshqarishi va bu transportning sozlamalarini oʻzgartirishi mumkin."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Mavjud emas"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Ushbu boshqariluvchi transport vositasida tovush balandligini oʻzgartirish imkonsiz"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Ushbu boshqariluvchi transport vositasida chaqiruvlar amalga oshirish imkonsiz"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Ushbu boshqariluvchi transport vositasida SMS uchun ruxsat berilmagan"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Ushbu boshqariluvchi transport vositasida kamera ishlamaydi"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Ushbu boshqariluvchi transport vositasida skrinshot olish imkonsiz"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Bu ilovani ushbu boshqariluvchi transport vositasida ochish imkonsiz"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Kredit idorangiz tomonidan bloklandi"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Ayrim funksiyalardan foydalanishni tashkilot taqiqlagan.\n\nSavollaringiz boʻlsa, tashkilot menejeriga murojaat qiling."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Transport boshqaruvi ilovalari"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# ta ilova faol}other{# ta ilova faol}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Faol ilovalar topilmadi"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> tashkilotining avtomobildan foydalanish qoidalari"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Sozlamalar tashkilot menejeri tomonidan boshqariladi"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"<xliff:g id="SERVICE">%1$s</xliff:g> haqida batafsil"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Xatoliklar hisoboti yuborilsinmi?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Transport vositasi tashkilot menejeri bu qurilma nosozliklarini tuzatish uchun xatoliklar hisobotini soʻramoqda. Ilova va maʼlumotlardan foydalanilishi mumkin."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Transport vositasi tashkilot menejeri bu qurilma nosozliklarini tuzatish uchun xatoliklar hisobotini soʻramoqda. Ilova va maʼlumotlardan foydalanilishi va bu vaqtincha qurilmangizni sekinlashtirishi ham mumkin."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Ushbu xatoliklar hisoboti bu transport vositasi tashkilot menejeri bilan ulashilmoqda. Batafsil tafsilotlar uchun ularga murojaat qiling."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Ulashish"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Rad etish"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Bu sozlamani hozirda oʻzgartirish imkonsiz"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Maxsus imkoniyatlar"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Taglavhalar"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Taglavha sozlamalari"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Oʻchiq"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Yoniq"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Skrin rider"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Taglavhalarni chiqarish"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Matn oʻlchami"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Taglavha hajmi va uslubi"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Juda kichik"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Kichik"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Standart"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Yirik"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Juda katta"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Taglavha uslubi"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Ilova tomonidan sozlangan"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Qora ustida oq"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Oq ustida qora"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Qora ustida sariq"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Koʻk ustida sariq"</string>
</resources>
diff --git a/res/values-vi/arrays.xml b/res/values-vi/arrays.xml
index 3fe8aa1..e05d0b5 100644
--- a/res/values-vi/arrays.xml
+++ b/res/values-vi/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Không bao giờ cho phép"</item>
<item msgid="1154273129608299386">"Luôn cho phép"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 70fdc82..4d647a5 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Chế độ ban đêm"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Mạng và Internet"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Mạng di động"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> SIM</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# SIM}other{# SIM}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Đang hoạt động/SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Không hoạt động/SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Đang hoạt động / Đã tải SIM xuống"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Thêm"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dữ liệu di động"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Sử dụng dữ liệu qua mạng di động"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Mạng di động"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Dùng dữ liệu di động"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Tắt dữ liệu di động?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Cần phải lựa chọn"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Sử dụng <xliff:g id="CARRIER">%1$s</xliff:g> cho dữ liệu di động?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"Cảnh báo dữ liệu khi dùng đến <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"Hạn mức dữ liệu <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"Cảnh báo dữ liệu khi dùng đến <xliff:g id="ID_1">^1</xliff:g>/Hạn mức dữ liệu là <xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">Còn %d ngày</item>
- <item quantity="one">Còn %d ngày</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{Còn # ngày}other{Còn # ngày}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Không còn thời gian"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Còn chưa đến 1 ngày"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Được <xliff:g id="ID_1">^1</xliff:g> cập nhật <xliff:g id="ID_2">^2</xliff:g> trước"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Đặt"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Hạn mức và cảnh báo dữ liệu"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Chu kỳ dùng dữ liệu ứng dụng"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Sử dụng dữ liệu di động"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Đặt cảnh báo dữ liệu"</string>
<string name="data_warning" msgid="116776633806885370">"Cảnh báo dữ liệu"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Đặt hạn mức dữ liệu"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Thiết bị đầu trên phương tiện của bạn sẽ tắt dữ liệu di động khi đạt đến hạn mức mà bạn đã đặt.\n\nVì mức sử dụng dữ liệu là do thiết bị đầu tính toán và nhà mạng có thể có cách tính khác, nên hãy cân nhắc đặt hạn mức vừa phải."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Đặt cảnh báo cho mức sử dụng dữ liệu"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Đặt giới hạn cho mức sử dụng dữ liệu"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Mức sử dụng dữ liệu là do thiết bị của bạn đo. Mức này có thể khác với mức dữ liệu của nhà mạng di động."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Đặt"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Lưu"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Mạng OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"Internet trên xe"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Việc tắt Internet trên xe có thể khiến một số tính năng hoặc ứng dụng trên xe không hoạt động được.\n\nDữ liệu quan trọng cần thiết để vận hành xe sẽ tiếp tục được chia sẻ với nhà sản xuất xe."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Vẫn tắt"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"Internet trên xe đã bị tắt. Việc này có thể khiến một số tính năng hoặc ứng dụng trên xe không hoạt động được. Dữ liệu quan trọng cần thiết để vận hành xe sẽ tiếp tục được chia sẻ với nhà sản xuất xe."</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"Đã dùng %1$s trong giai đoạn %2$s – %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Kết nối với mạng khác"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Lựa chọn ưu tiên về mạng"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Thêm mạng"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Kết nối"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Đang kết nối…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Chưa kết nối"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Không có mạng trong phạm vi"</string>
<string name="wifi_password" msgid="5565632142720292397">"Mật khẩu"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Hiện mật khẩu"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Chọn 1 băng tần cho điểm phát sóng Wi‑Fi:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"Điểm phát sóng và chia sẻ Internet"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"Điểm phát sóng"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Tắt"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Tự động tắt điểm phát sóng"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Điểm phát sóng Wi-Fi sẽ tắt nếu không có thiết bị nào kết nối"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> muốn bật Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Buộc dừng"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Buộc dừng?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Nếu bạn buộc dừng một ứng dụng, thì ứng dụng đó có thể hoạt động không đúng cách."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Tắt chế độ bảo vệ hiệu suất?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Nếu bạn chọn như vậy, phần mềm và phần cứng của bạn cũng có thể sẽ không hoạt động."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Để bật"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Tắt"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Bật chế độ ưu tiên hiệu suất ứng dụng?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Việc tắt chế độ này có thể khiến hệ thống có nguy cơ bị mất ổn định hoặc tác động lâu dài đến phần cứng. Bạn có muốn tiếp tục không?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Có"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Không, cảm ơn"</string>
<string name="disable_text" msgid="4358165448648990820">"Tắt"</string>
<string name="enable_text" msgid="1794971777861881238">"Bật"</string>
<string name="uninstall_text" msgid="277907956072833012">"Gỡ cài đặt"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Quyền"</string>
<string name="notifications_label" msgid="6586089149665170731">"Thông báo"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Bộ nhớ và bộ nhớ đệm"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Giữ hiệu suất cao nhất"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Ưu tiên hiệu suất của ứng dụng"</string>
<string name="application_version_label" msgid="8556889839783311649">"Phiên bản: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Chưa được cấp quyền nào"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Không yêu cầu quyền"</string>
<string name="unused_apps" msgid="648471933781010395">"Ứng dụng không dùng đến"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ứng dụng không dùng đến</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ứng dụng không dùng đến</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# ứng dụng không dùng đến}other{# ứng dụng không dùng đến}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Xóa quyền và giải phóng dung lượng"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s trong bộ nhớ trong"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Nếu cần, hãy đóng ứng dụng để tránh dùng quá nhiều tài nguyên"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Dùng tài nguyên của hệ thống để ưu tiên hiệu suất của ứng dụng"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Mức sử dụng dữ liệu"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Sử dụng dữ liệu ứng dụng"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Mức sử dụng qua thời gian"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Tất cả ứng dụng"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Sử dụng dữ liệu và Wi-Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Mức sử dụng qua thời gian"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Tổng mức sử dụng"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Ở chế độ nền trước"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Ở chế độ nền"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Cho phép dùng dữ liệu"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Cho phép ứng dụng này dùng dữ liệu di động"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Giới hạn dữ liệu"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Chỉ dùng dữ liệu di động khi ứng dụng đang ở nền trước"</string>
<string name="computing_size" msgid="5791407621793083965">"Đang tính toán…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> quyền bổ sung</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> quyền bổ sung</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# quyền bổ sung}other{# quyền bổ sung}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Lưu ý: Sau khi khởi động lại, ứng dụng này sẽ không hoạt động cho đến khi bạn mở khóa xe."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Trợ lý và nhập bằng giọng nói"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Ứng dụng trợ lý"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Tùy chọn kiểm soát Wi-Fi cho phép một ứng dụng bật/tắt Wi-Fi, quét và kết nối vào mạng Wi-Fi, thêm/xóa mạng hoặc bắt đầu một điểm phát sóng chỉ dành cho mạng cục bộ."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Xem thêm"</string>
<string name="location_settings_title" msgid="901334356682423679">"Vị trí"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Dùng thông tin vị trí"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Cho phép ứng dụng bạn chọn truy cập vị trí"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Thao tác tắt tính năng này sẽ xóa quyền truy cập thông tin vị trí của mọi ứng dụng. Ứng dụng sử dụng công nghệ hỗ trợ dành cho người lái xe sẽ vẫn có quyền truy cập."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Dùng vị trí để hỗ trợ người lái xe"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Thông tin vị trí của xe đang tắt"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Ứng dụng Hỗ trợ người lái xe không truy cập được vị trí của bạn"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Thay đổi"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Cho phép ứng dụng hỗ trợ lái xe truy cập vị trí"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Nếu bạn tắt chế độ này, những ứng dụng hỗ trợ dành cho người lái xe dựa vào thông tin vị trí sẽ bị tắt."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Vẫn tắt"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Các yêu cầu gần đây về vị trí"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Không có yêu cầu nào gần đây về vị trí"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Quyền cấp ứng dụng"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Dịch vụ vị trí"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Sử dụng vị trí"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Dịch vụ vị trí có thể sử dụng những nguồn như GPS, Wi‑Fi, mạng di động và cảm biến để giúp ước tính vị trí của thiết bị."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Công nghệ hỗ trợ dành cho người lái xe"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Thông tin vị trí gửi tới ứng dụng Hỗ trợ người lái xe là loại thông tin không nhận dạng được bạn. Thông tin này được lưu trữ trong tối đa 2 ngày trước khi bị xóa"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Micrô"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Sử dụng micrô"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Cho phép mọi ứng dụng truy cập vào micrô"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Quản lý quyền truy cập vào micrô"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Mới truy cập gần đây"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Không có ứng dụng nào mới truy cập"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"0 ứng dụng có quyền truy cập"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{#/{total_count} ứng dụng có quyền truy cập}other{#/{total_count} ứng dụng có quyền truy cập}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Mới truy cập gần đây"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Xem tất cả"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Đang tải…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Hệ thống"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Bản cập nhật hệ thống"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Nâng cao"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Giấy phép của bên thứ ba"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Đã xảy ra sự cố khi tải giấy phép."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Đang tải…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">Bây giờ, bạn chỉ cần thực hiện <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> bước nữa là sẽ trở thành nhà phát triển.</item>
- <item quantity="one">Bây giờ, bạn chỉ cần thực hiện <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> bước nữa là sẽ trở thành nhà phát triển.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Giờ đây, bạn chỉ còn # bước nữa là trở thành một nhà phát triển.}other{Giờ đây, bạn chỉ còn # bước nữa là trở thành một nhà phát triển.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Bạn đã là nhà phát triển!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Không cần, bạn đã là nhà phát triển."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Tùy chọn của nhà phát triển"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Sau khi bạn tạo hồ sơ cho một người mới, người đó phải tự tùy chỉnh hồ sơ của họ."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Mọi hồ sơ đều có thể cập nhật ứng dụng để các hồ sơ khác sử dụng."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Đã đạt số lượng hồ sơ tối đa"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">Bạn có thể tạo tối đa <xliff:g id="COUNT">%d</xliff:g> hồ sơ.</item>
- <item quantity="one">Chỉ có thể tạo một hồ sơ.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Chỉ có thể tạo một hồ sơ.}other{Bạn có thể tạo tối đa # hồ sơ.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Không thể tạo hồ sơ mới"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Xóa hồ sơ này?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Tất cả ứng dụng và dữ liệu của hồ sơ này sẽ bị xóa."</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Không thể xóa hồ sơ."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Chưa xóa hồ sơ. Bạn có thể khởi động lại thiết bị rồi thử lại."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Hồ sơ này sẽ bị xóa khi bạn chuyển sang hồ sơ khác hoặc khởi động lại xe."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Bỏ qua"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Thử lại"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Cách vẽ hình mở khóa"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Lỗi khi lưu mẫu"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Bạn đã nhập sai quá nhiều lần. Hãy thử lại sau <xliff:g id="NUMBER">%d</xliff:g> giây."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Không hỗ trợ xoay trong hình mở khoá, hãy chạm"</string>
<string name="okay" msgid="4589873324439764349">"OK"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Xóa phương thức khóa màn hình?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Thao tác này sẽ cho phép bất cứ ai cũng có thể truy cập vào tài khoản của bạn"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Quản vị viên CNTT đã chặn các mã PIN phổ biến. Hãy thử mã PIN khác."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Mật khẩu này không được bao gồm ký tự không hợp lệ."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Mật khẩu không hợp lệ, phải có ít nhất 4 ký tự."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">Phải chứa ít nhất <xliff:g id="COUNT">%d</xliff:g> chữ cái</item>
- <item quantity="one">Phải chứa ít nhất 1 chữ cái</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">Phải chứa ít nhất <xliff:g id="COUNT">%d</xliff:g> chữ thường</item>
- <item quantity="one">Phải chứa ít nhất 1 chữ thường</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">Phải chứa ít nhất <xliff:g id="COUNT">%d</xliff:g> chữ hoa</item>
- <item quantity="one">Phải chứa ít nhất 1 chữ hoa</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">Phải chứa ít nhất <xliff:g id="COUNT">%d</xliff:g> chữ số</item>
- <item quantity="one">Phải chứa ít nhất 1 chữ số</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">Phải chứa ít nhất <xliff:g id="COUNT">%d</xliff:g> ký hiệu đặc biệt</item>
- <item quantity="one">Phải chứa ít nhất 1 ký hiệu đặc biệt</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">Phải chứa ít nhất <xliff:g id="COUNT">%d</xliff:g> ký tự không phải chữ cái</item>
- <item quantity="one">Phải chứa ít nhất 1 ký tự không phải chữ cái</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Quản trị viên thiết bị không cho phép sử dụng mật khẩu gần đây"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Lỗi khi lưu mật khẩu"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Quản vị viên CNTT đã chặn các mật khẩu phổ biến. Hãy thử mật khẩu khác."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Thêm hồ sơ"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Xóa hồ sơ này"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Thêm hồ sơ"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Độ sáng của màn hình"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Để xem các thiết bị của bạn, hãy bật Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Để ghép nối thiết bị, hãy mở phần cài đặt Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Quản trị hệ thống thông tin giải trí"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Ứng dụng đã kích hoạt"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Ứng dụng đã hủy kích hoạt"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Ứng dụng có quyền này sẽ truy cập được vào dữ liệu của xe này"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Không có ứng dụng quản trị xe nào"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Ứng dụng quản trị hệ thống thông tin giải trí này đang hoạt động và cho phép ứng dụng <xliff:g id="APP_NAME">%1$s</xliff:g> thực hiện những thao tác sau:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Khi bạn kích hoạt ứng dụng hệ thống thông tin giải trí này, ứng dụng <xliff:g id="APP_NAME">%1$s</xliff:g> sẽ thực hiện được những thao tác sau:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Kích hoạt hệ thống thông tin giải trí này?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Kích hoạt ứng dụng hệ thống thông tin giải trí này"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Hủy kích hoạt và gỡ cài đặt"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Hủy kích hoạt ứng dụng hệ thống thông tin giải trí này"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Thông tin khác"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Người quản lý của tổ chức có thể giám sát và quản lý các ứng dụng cũng như dữ liệu liên kết với hồ sơ này, bao gồm cả các chế độ cài đặt, quyền, quyền truy cập vào dữ liệu của công ty, hoạt động trên mạng và thông tin vị trí của xe."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Người quản lý của tổ chức có thể giám sát và quản lý các ứng dụng cũng như dữ liệu liên kết với hồ sơ này, bao gồm cả các chế độ cài đặt, quyền, quyền truy cập vào dữ liệu của công ty, hoạt động trên mạng và thông tin vị trí của xe."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Người quản lý của tổ chức có thể giám sát và quản lý các ứng dụng cũng như dữ liệu liên kết với hệ thống thông tin giải trí này, bao gồm cả các chế độ cài đặt, quyền, quyền truy cập vào dữ liệu của công ty, hoạt động trên mạng và thông tin vị trí của xe."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Người quản lý của tổ chức có thể truy cập vào dữ liệu liên kết với hệ thống thông tin giải trí này, quản lý ứng dụng và thay đổi chế độ cài đặt của xe này."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Hiện không có"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Không thể thay đổi âm lượng trên xe được quản lý này"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Không thể gọi điện trên xe được quản lý này"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"Không được dùng SMS trên xe được quản lý này"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Không có máy ảnh trên xe được quản lý này"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Không thể chụp ảnh màn hình trên thiết bị được quản lý này"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Không thể mở ứng dụng này trên xe được quản lý"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Tổ chức tín dụng của bạn đã chặn"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Tổ chức của bạn đã giới hạn quyền truy cập vào một số tính năng.\n\nNếu bạn có thắc mắc, hãy liên hệ với người quản lý của tổ chức."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Ứng dụng quản trị xe"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# ứng dụng đã kích hoạt}other{# ứng dụng đã hủy kích hoạt}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Chưa kích hoạt ứng dụng nào"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"Chính sách đối với xe của <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Chế độ cài đặt này được quản lý bởi người quản lý của tổ chức"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Tìm hiểu thêm về <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Chia sẻ báo cáo lỗi?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Người quản lý của tổ chức của xe này đã yêu cầu cấp một báo cáo lỗi để giúp khắc phục sự cố trên thiết bị này. Ứng dụng và dữ liệu có thể sẽ được chia sẻ."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Người quản lý của tổ chức của xe này đã yêu cầu cấp một báo cáo lỗi để giúp khắc phục sự cố trên thiết bị này. Ứng dụng và dữ liệu có thể được chia sẻ và thiết bị của bạn có thể sẽ tạm thời bị chậm."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Báo cáo lỗi này đang được chia sẻ với người quản lý của tổ chức của xe này. Bạn có thể liên hệ với họ để biết thêm thông tin."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Chia sẻ"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Từ chối"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Không thể thay đổi chế độ cài đặt này ngay bây giờ"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Hỗ trợ tiếp cận"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Phụ đề"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Chế độ ưu tiên về phụ đề"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Đang tắt"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Đang bật"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Trình đọc màn hình"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Hiện phụ đề"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Cỡ chữ"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Cỡ chữ và kiểu phụ đề"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Rất nhỏ"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Nhỏ"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Mặc định"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Lớn"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Rất lớn"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Kiểu phụ đề"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Thiết lập theo ứng dụng"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Chữ trắng trên nền đen"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Chữ đen trên nền trắng"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Chữ vàng trên nền đen"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Chữ vàng trên nền xanh dương"</string>
</resources>
diff --git a/res/values-zh-rCN/arrays.xml b/res/values-zh-rCN/arrays.xml
index b6ec898..aa02f1b 100644
--- a/res/values-zh-rCN/arrays.xml
+++ b/res/values-zh-rCN/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"一律不允许"</item>
<item msgid="1154273129608299386">"一律允许"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index aebb5f8..1160760 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"夜间模式"</string>
<string name="network_and_internet" msgid="4229023630498537530">"网络和互联网"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"移动网络"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 个 SIM 卡</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 个 SIM 卡</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# 张 SIM 卡}other{# 张 SIM 卡}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"已启用/SIM 卡"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"未启用/SIM 卡"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"已启用/已下载的 SIM 卡"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"添加更多"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"移动数据"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"通过移动网络访问数据"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"移动网络"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"使用移动流量"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"要关闭移动数据网络吗?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"必须选择"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"要使用<xliff:g id="CARRIER">%1$s</xliff:g>的移动数据吗?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"数据流量警告:已使用 <xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"数据流量上限:<xliff:g id="ID_1">^1</xliff:g>"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"数据流量警告:已使用 <xliff:g id="ID_1">^1</xliff:g>/数据流量上限:<xliff:g id="ID_2">^2</xliff:g>"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">还剩 %d 天</item>
- <item quantity="one">还剩 %d 天</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{还剩 # 天}other{还剩 # 天}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"已没有剩余时间"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"还剩不到 1 天"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"已在 <xliff:g id="ID_2">^2</xliff:g>前由<xliff:g id="ID_1">^1</xliff:g>更新"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"设置"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"数据流量警告和上限"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"应用流量用量周期"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"移动流量消耗"</string>
<string name="set_data_warning" msgid="6628236612886588097">"设置数据流量警告"</string>
<string name="data_warning" msgid="116776633806885370">"数据流量警告"</string>
<string name="set_data_limit" msgid="7136539812414500084">"设置数据流量上限"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"当移动数据流量的用量达到您设置的上限时,您汽车的音响主机将关闭移动数据网络。\n\n由于流量用量是由音响主机计算的,而您的运营商对流量用量的计算方式可能有所不同,因此建议您设置一个保守的上限值。"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"设置流量用量警告"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"设置流量使用上限"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"流量消耗是由您的设备测得的,可能与移动运营商的数据不同。"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"设置"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"保存"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"原始设备制造商 (OEM) 网络"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"车辆互联网"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"关闭车辆互联网可能会导致部分车辆功能或应用无法使用。\n\n系统会继续与车辆制造商分享操作车辆所需的关键数据。"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"仍然关闭"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"车辆互联网已关闭。这可能会导致部分车辆功能或应用无法使用。系统会继续与车辆制造商分享操作车辆所需的关键数据。"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"已使用 %1$s(%2$s - %3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"加入其他网络"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"网络偏好设置"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"添加网络"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"连接"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"正在连接…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"未连接"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"网络不在范围内"</string>
<string name="wifi_password" msgid="5565632142720292397">"密码"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"显示密码"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"请为 WLAN 热点至少选择一个频段:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"热点和网络共享"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"热点"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"已关闭"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"自动关闭热点"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"如果未连接任何设备,WLAN 热点将关闭"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g>请求开启 WLAN"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"强行停止"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"要强行停止吗?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"如果您强行停止某个应用,可能会导致该应用无法正常运行。"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"要关闭性能保护功能吗?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"如果您停用了该功能,软件和硬件也可能无法正常运作。"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"保持开启状态"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"关闭"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"要开启“优先保证应用性能”设置吗?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"开启该设置可能会导致系统不稳定或对硬件产生长期影响。是否继续?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"是"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"不用了"</string>
<string name="disable_text" msgid="4358165448648990820">"停用"</string>
<string name="enable_text" msgid="1794971777861881238">"启用"</string>
<string name="uninstall_text" msgid="277907956072833012">"卸载"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"权限"</string>
<string name="notifications_label" msgid="6586089149665170731">"通知"</string>
<string name="storage_application_label" msgid="5911779903670978586">"存储空间和缓存"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"确保最佳性能"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"优先保证应用性能"</string>
<string name="application_version_label" msgid="8556889839783311649">"版本:%1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"未授予任何权限"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"未请求任何权限"</string>
<string name="unused_apps" msgid="648471933781010395">"未使用的应用"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 个未使用的应用</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 个未使用的应用</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# 个未使用的应用}other{# 个未使用的应用}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"撤消权限并释放空间"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"将使用%s的内部存储空间"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"必要时,关闭应用以避免过度使用资源"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"将系统资源用于优先保证应用性能"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"流量使用情况"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"应用的流量使用情况"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"流量消耗记录"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"所有应用"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"流量和 WLAN 的使用情况"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"流量消耗记录"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"流量消耗总量"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"前台"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"后台"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"允许使用流量"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"允许此应用使用移动流量"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"限制使用流量"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"仅当应用在前台时才使用移动流量"</string>
<string name="computing_size" msgid="5791407621793083965">"正在计算…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other">另外 <xliff:g id="COUNT_1">%d</xliff:g> 项权限</item>
- <item quantity="one">另外 <xliff:g id="COUNT_0">%d</xliff:g> 项权限</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{另外还有 # 项权限}other{另外还有 # 项权限}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"注意:重新启动后,您必须将车辆解锁,才能运行此应用。"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"助手和语音输入"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"辅助应用"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"向应用授予“WLAN 控制”权限后,应用就能开启或关闭 WLAN、扫描及连接到 WLAN 网络、添加或移除网络,或启动仅限本地的热点。"</string>
<string name="more_special_access_title" msgid="166115485446645971">"更多"</string>
<string name="location_settings_title" msgid="901334356682423679">"位置信息"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"使用位置信息"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"允许您指定的应用获取您的位置信息"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"如果您关闭了此设置,所有应用的位置信息获取权限都将被取消。驾驶辅助应用仍可以获取位置信息。"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"使用位置信息提供驾驶辅助功能"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"车辆位置信息服务已关闭"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"驾驶辅助应用无法获取您的位置信息"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"更改"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"允许驾驶辅助应用获取您的位置信息"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"如果您关闭了此设置,需要使用位置信息的驾驶辅助应用将被停用。"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"仍然关闭"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"最近的位置信息请求"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"最近没有任何位置信息请求"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"应用级权限"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"位置信息服务"</string>
<string name="location_use_location_title" msgid="117735895374606680">"使用位置信息"</string>
<string name="location_settings_footer" msgid="296892848338100051">"位置信息服务可能会使用 GPS、WLAN、移动网络和传感器等来源协助推测设备所在的位置。"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"驾驶辅助"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"发送到驾驶辅助应用的位置信息不包含可识别您身份的信息。这些信息最多存储 2 天,便会被删除。"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"麦克风"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"使用麦克风"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"允许所有应用使用麦克风"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"管理麦克风使用权限"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"近期使用过"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"最近没有应用使用过麦克风"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"任何应用都无法使用麦克风"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# 个应用(共 {total_count} 个)可以使用麦克风}other{# 个应用(共 {total_count} 个)可以使用麦克风}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"近期使用过"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"查看全部"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"正在加载…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"系统"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"系统更新"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"高级"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"第三方许可"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"加载许可时出现问题。"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"正在加载…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">现在只需再执行 <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> 步操作即可进入开发者模式。</item>
- <item quantity="one">现在只需再执行 <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> 步操作即可进入开发者模式。</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{现在只需再执行 # 步操作,即可进入开发者模式。}other{现在只需再执行 # 步操作,即可进入开发者模式。}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"您现在已处于开发者模式!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"您已处于开发者模式,无需进行此操作。"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"开发者选项"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"您创建新的个人资料后,相应用户应自己进行自定义。"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"任意个人资料都能更新所有其他个人资料使用的应用。"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"已达到个人资料数量上限"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">您最多可以创建 <xliff:g id="COUNT">%d</xliff:g> 份个人资料。</item>
- <item quantity="one">只能创建 1 份个人资料。</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{只能创建 1 份个人资料。}other{您最多可以创建 # 份个人资料。}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"无法创建新的个人资料"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"要删除此个人资料吗?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"此个人资料的所有应用和数据都将被删除"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"无法删除个人资料。"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"个人资料未删除。您可以重启设备,然后重试。"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"此个人资料将在您切换个人资料或重新发动汽车时删除。"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"关闭"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"重试"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"如何绘制解锁图案"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"保存图案时出错"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"错误次数过多。请在 <xliff:g id="NUMBER">%d</xliff:g> 秒后重试。"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"图案不支持旋转输入;请使用触控输入"</string>
<string name="okay" msgid="4589873324439764349">"确定"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"清除屏幕锁定设置"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"这样一来,任何人都能访问您的帐号"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"您的 IT 管理员已禁止使用常用 PIN 码。请尝试使用其他 PIN 码。"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"此密码不得包含无效字符。"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"密码无效,密码必须至少包含 4 个字符。"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">必须包含至少 <xliff:g id="COUNT">%d</xliff:g> 个字母</item>
- <item quantity="one">必须包含至少 1 个字母</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">必须包含至少 <xliff:g id="COUNT">%d</xliff:g> 个小写字母</item>
- <item quantity="one">必须包含至少 1 个小写字母</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">必须包含至少 <xliff:g id="COUNT">%d</xliff:g> 个大写字母</item>
- <item quantity="one">必须包含至少 1 个大写字母</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">必须包含至少 <xliff:g id="COUNT">%d</xliff:g> 个数字</item>
- <item quantity="one">必须包含至少 1 个数字</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">必须包含至少 <xliff:g id="COUNT">%d</xliff:g> 个特殊符号</item>
- <item quantity="one">必须包含至少 1 个特殊符号</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">必须包含至少 <xliff:g id="COUNT">%d</xliff:g> 个非字母字符</item>
- <item quantity="one">必须包含至少 1 个非字母字符</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"设备管理员不允许使用最近用过的密码"</string>
<string name="error_saving_password" msgid="8334882262622500658">"保存密码时出错"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"您的 IT 管理员已禁止使用常用密码。请尝试使用其他密码。"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"添加个人资料"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"删除此个人资料"</string>
<string name="add_profile_text" msgid="9118410102199116969">"添加个人资料"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"屏幕亮度"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"要想看到您的设备,请开启蓝牙"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"要想配对设备,请打开蓝牙设置"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"信息娱乐系统管理"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"已启用的应用"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"已停用的应用"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"具有此权限的应用可以获取该车辆的数据"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"没有车辆管理应用"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"此信息娱乐系统管理应用已启用,它允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”应用执行以下操作:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"启用此信息娱乐系统应用将允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”应用执行以下操作:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"要启用此信息娱乐系统应用吗?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"启用此信息娱乐系统应用"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"停用并卸载"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"停用此信息娱乐系统应用"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"更多详情"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"组织管理员可以监控和管理与此个人资料相关联的应用和数据,其中包括设置、权限、企业权限、网络活动以及车辆的位置信息。"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"组织管理员可以监控和管理与此个人资料相关联的应用和数据,其中包括设置、权限、企业权限、网络活动以及设备的位置信息。"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"组织管理员可以监控和管理与此信息娱乐系统相关联的应用和数据,其中包括设置、权限、企业权限、网络活动以及车辆的位置信息。"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"组织管理员或许能够访问与此信息娱乐系统相关联的数据、管理应用以及更改此车辆的设置。"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"该设置不可用"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"无法在此受管理车辆中更改音量"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"无法在此受管理车辆中进行通话"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"无法在此受管理车辆中收发短信"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"无法在此受管理车辆中使用摄像头"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"无法在此受管理车辆中截取屏幕截图"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"无法在此受管理车辆中打开这款应用"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"已被分期付款提供商屏蔽"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"组织已限制您对某些功能的使用权限。\n\n如有任何问题,请与组织管理人员联系。"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"车辆管理应用"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# 个已启用的应用}other{# 个已启用的应用}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"没有已启用的应用"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>的车辆政策"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"由组织管理员管理的设置"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"详细了解“<xliff:g id="SERVICE">%1$s</xliff:g>”"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"要分享错误报告吗?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"此车辆的组织管理员要求提供错误报告,以便对这台设备进行问题排查。报告中可能会包含应用信息和数据。"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"此车辆的组织管理员要求提供错误报告,以便对这台设备进行问题排查。报告中可能会包含应用信息和数据,并且您的设备可能会暂时变慢。"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"正在与此车辆的组织管理员分享该错误报告。如需更多详细信息,请联系组织管理员。"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"分享"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"拒绝"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"暂时无法更改此设置"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"无障碍功能"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"字幕"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"字幕偏好设置"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"已关闭"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"已开启"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"屏幕阅读器"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"显示字幕"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"文字大小"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"字幕文字大小和样式"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"超小"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"小"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"默认"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"大"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"超大"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"字幕样式"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"由应用设置"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"黑底白字"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"白底黑字"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"黑底黄字"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"蓝底黄字"</string>
</resources>
diff --git a/res/values-zh-rHK/arrays.xml b/res/values-zh-rHK/arrays.xml
index fd9b1b8..a3c4ea2 100644
--- a/res/values-zh-rHK/arrays.xml
+++ b/res/values-zh-rHK/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"永不允許"</item>
<item msgid="1154273129608299386">"永遠允許"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 905c6c2..87fb83a 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"夜間模式"</string>
<string name="network_and_internet" msgid="4229023630498537530">"網絡和互聯網"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"流動網絡"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 張 SIM 卡</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 張 SIM 卡</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# 張 SIM 卡}other{# 張 SIM 卡}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"已啟用/SIM 卡"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"已停用/SIM 卡"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"已啟用/已下載的 SIM 卡"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"新增更多"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"流動數據"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"使用流動網絡存取數據"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"流動網絡"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"使用流動數據"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"要關閉流動數據嗎?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"請選取偏好設定"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"是否使用<xliff:g id="CARRIER">%1$s</xliff:g>提供的流動數據服務?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> 數據用量警告"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> 數據用量上限"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> 數據用量警告/<xliff:g id="ID_2">^2</xliff:g> 數據用量上限"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">尚餘 %d 天</item>
- <item quantity="one">尚餘 %d 天</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{尚餘 # 天}other{尚餘 # 天}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"已沒有剩餘時間"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"剩餘不到 1 天"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"<xliff:g id="ID_1">^1</xliff:g> 於 <xliff:g id="ID_2">^2</xliff:g>前更新"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"設定"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"數據用量警告和上限"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"應用程式數據用量週期"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"流動數據用量"</string>
<string name="set_data_warning" msgid="6628236612886588097">"設定數據用量警告"</string>
<string name="data_warning" msgid="116776633806885370">"數據用量警告"</string>
<string name="set_data_limit" msgid="7136539812414500084">"設定數據上限"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"汽車音響主機在數據用量到達設定的上限後,便會關閉流動數據。\n\n由於數據用量由汽車音響主機計算,而流動網絡供應商的用量計算方式可能不同,因此建議您設定較保守的上限。"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"設定數據用量警告"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"設定數據用量上限"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"數據用量由您的裝置計算,可能與流動網絡供應商的數據有所不同。"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"設定"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"儲存"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"原始設備製造商 (OEM) 網絡"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"汽車互聯網"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"關閉汽車互聯網可能會令部分汽車功能或應用程式無法運作。\n\n系統會繼續與汽車製造商分享操作汽車所需的重要資料。"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"繼續停用"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"汽車互聯網已關閉。這可能會令部分汽車功能或應用程式無法運作。系統會繼續與汽車製造商分享操作汽車所需的重要資料。"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"%2$s - %3$s 已使用 %1$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"加入其他網絡"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"網絡偏好設定"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"新增網絡"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"連線"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"正在連接…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"未連線"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"網絡不在覆蓋範圍內"</string>
<string name="wifi_password" msgid="5565632142720292397">"密碼"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"顯示密碼"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"請為 Wi-Fi 熱點至少選擇一個頻段:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"熱點和網絡共享"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"熱點"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"關閉"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"自動關閉熱點"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"當沒有連接任何裝置時,Wi‑Fi 熱點就會關閉"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"「<xliff:g id="REQUESTER">%s</xliff:g>」要求開啟 Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"強制停止"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"要強制停止應用程式嗎?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"如果您強制停止應用程式,應用程式可能無法正常操作。"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"要關閉效能保護嗎?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"這樣您的軟件和硬件效能可能會受到影響。"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"繼續啟用"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"關閉"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"要開啟優先處理應用程式效能嗎?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"開啟此設定可能會導致系統不穩定或對硬件造成長期影響。您要繼續嗎?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"是"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"不用了,謝謝"</string>
<string name="disable_text" msgid="4358165448648990820">"停用"</string>
<string name="enable_text" msgid="1794971777861881238">"啟用"</string>
<string name="uninstall_text" msgid="277907956072833012">"解除安裝"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"權限"</string>
<string name="notifications_label" msgid="6586089149665170731">"通知"</string>
<string name="storage_application_label" msgid="5911779903670978586">"儲存空間與快取空間"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"確保最佳效能"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"優先處理應用程式效能"</string>
<string name="application_version_label" msgid="8556889839783311649">"版本:%1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"沒有授予權限"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"沒有要求權限"</string>
<string name="unused_apps" msgid="648471933781010395">"不使用的應用程式"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 個不使用的應用程式</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 個不使用的應用程式</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# 個不使用的應用程式}other{# 個不使用的應用程式}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"移除權限並騰出空間"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"佔了內部儲存空間 %s"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"如有需要,可關閉應用程式以避免使用過多資源"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"使用系統資源優先處理應用程式效能"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"數據用量"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"應用程式數據用量"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"用量記錄"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"所有應用程式"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"數據與 Wi-Fi 用量"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"用量記錄"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"總用量"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"前景"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"背景"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"允許使用數據"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"允許此應用程式使用流動數據"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"限制資料"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"只在應用程式在前景時使用流動數據"</string>
<string name="computing_size" msgid="5791407621793083965">"正在計算…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 個其他權限</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 個其他權限</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{# 個其他權限}other{# 個其他權限}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"請注意:重新開機後,您必須先將汽車解鎖,才可執行這個應用程式。"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"輔助及語音輸入"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"小幫手應用程式"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Wi-Fi 控制允許應用程式開啟或關閉 Wi-Fi,掃瞄和連線至 Wi-Fi 網絡、新增或移除網絡,或啟動僅限本機的熱點。"</string>
<string name="more_special_access_title" msgid="166115485446645971">"更多"</string>
<string name="location_settings_title" msgid="901334356682423679">"位置"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"使用位置資訊"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"允許您指定的應用程式存取您的位置"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"關閉此功能後,系統便會移除所有應用程式的位置權限,但「駕駛輔助」功能仍可存取您的位置。"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"允許「駕駛輔助」使用位置資料"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"車輛位置已關閉"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"「駕駛輔助」應用程式無法存取您的位置"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"變更"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"允許協助駕駛的應用程式存取您的位置"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"關閉此功能後,需要依賴位置資料的「駕駛輔助」應用程式將會停用。"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"繼續關閉"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"最近的位置資訊要求"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"最近沒有位置資訊要求"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"應用程式層級權限"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"定位服務"</string>
<string name="location_use_location_title" msgid="117735895374606680">"使用位置資訊"</string>
<string name="location_settings_footer" msgid="296892848338100051">"定位功能可能會使用 GPS、Wi-Fi、流動網絡和感應器等來源確定裝置的所在位置。"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"駕駛輔助"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"傳送到「駕駛輔助」應用程式的位置資料不包含可識別您身分的資料。資料會儲存最多 2 天,然後便會刪除。"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"麥克風"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"使用麥克風"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"允許所有應用程式存取您的麥克風"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"管理麥克風權限"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"最近存取"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"沒有最近存取過的應用程式"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"沒有應用程式擁有存取權"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# 個 (共 {total_count} 個) 應用程式擁有存取權}other{# 個 (共 {total_count} 個) 應用程式擁有存取權}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"最近存取"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"查看全部"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"載入中…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"系統"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"系統更新"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"進階"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"第三方授權"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"載入授權時發生問題。"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"正在載入…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">尚餘 <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> 個步驟,您就可以成為開發人員。</item>
- <item quantity="one">尚餘 <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> 個步驟,您就可以成為開發人員。</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{您只需完成剩餘的 # 個步驟,即可成為開發人員。}other{您只需完成剩餘的 # 個步驟,即可成為開發人員。}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"您現已成為開發人員!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"不需要了,您已經是開發人員。"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"開發人員選項"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"建立新設定檔後使用者需要自行自訂。"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"任何設定檔都可以為其他所有設定檔更新應用程式。"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"已達設定檔數量上限"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">您可建立最多 <xliff:g id="COUNT">%d</xliff:g> 個設定檔。</item>
- <item quantity="one">只可建立一個設定檔。</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{只可建立一個設定檔。}other{您可建立最多 # 個設定檔。}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"無法建立新設定檔"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"要刪除此設定檔嗎?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"這個設定檔的所有應用程式和資料都會被刪除"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"無法刪除設定檔。"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"無法刪除設定檔。您可以重新啟動裝置,然後再試一次。"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"系統將會在您切換設定檔或重新啟動車輛時刪除此設定檔。"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"關閉"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"重試"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"如何畫出解鎖圖案"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"儲存鎖定圖案時發生錯誤"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"錯誤次數太多,請於 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試。"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"圖案不支援旋轉輸入;請使用輕觸輸入"</string>
<string name="okay" msgid="4589873324439764349">"確定"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"要移除螢幕鎖定嗎?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"這樣,任何人都能存取您的帳戶"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"您的 IT 管理員已禁止使用常用的 PIN,請嘗試輸入另一個 PIN。"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"不可包含無效字元。"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"密碼無效,必須包含至少 4 個字元。"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個字母</item>
- <item quantity="one">必需包含至少 1 個字母</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個小寫字母</item>
- <item quantity="one">必需包含至少 1 個小寫字母</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個大寫字母</item>
- <item quantity="one">必需包含至少 1 個大寫字母</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個數字</item>
- <item quantity="one">必需包含至少 1 個數字</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個特別符號</item>
- <item quantity="one">必需包含至少 1 個特別符號</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個非字母字元</item>
- <item quantity="one">必需包含至少 1 個非字母字元</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"裝置管理員不允許使用最近用過的密碼"</string>
<string name="error_saving_password" msgid="8334882262622500658">"儲存密碼時發生錯誤"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"您的 IT 管理員已禁止使用常用的密碼,請嘗試輸入另一組密碼。"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"新增設定檔"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"刪除此設定檔"</string>
<string name="add_profile_text" msgid="9118410102199116969">"新增設定檔"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"顯示亮度"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"如要查看您的裝置,請開啟藍牙"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"如要配對裝置,請開啟藍牙設定"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"資訊娛樂系統管理員"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"已啟用的應用程式"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"已停用的應用程式"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"擁有此權限的應用程式可以存取此車輛的資料"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"沒有車輛管理員應用程式"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"此資訊娛樂系統管理應用程式已啟用,並允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」應用程式執行以下操作:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"啟動此資訊娛樂系統應用程式將允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」應用程式執行以下操作:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"要啟動此資訊娛樂系統應用程式嗎?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"啟動此資訊娛樂系統應用程式"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"停用並解除安裝"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"停用此資訊娛樂系統應用程式"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"更多詳情"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"機構管理員可以監控及管理與此設定檔相關的應用程式和資料,包括設定、權限、公司存取權、網絡活動,以及車輛的位置資料。"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"機構管理員可以監控及管理與此設定檔相關的應用程式和資料,包括設定、權限、公司存取權、網絡活動,以及裝置的位置資料。"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"機構管理員可以監控及管理與此資訊娛樂系統相關的應用程式和資料,包括設定、權限、公司存取權、網絡活動,以及車輛的位置資料。"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"機構管理員或可存取此資訊娛樂系統的相關資料、管理應用程式並變更車輛設定。"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"此設定無法使用"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"無法變更此受管理車輛的音量"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"無法在此受管理車輛撥打電話"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"無法從此受管理車輛傳送短訊"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"無法使用在此受管理車輛上使用相機"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"無法在此受管理車輛擷取螢幕截圖"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"無法在此受管理車輛開啟此應用程式"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"已被您的信貸提供者封鎖"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"機構已限制存取部分功能。\n\n如有任何問題,請聯絡機構管理員。"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"車輛管理員應用程式"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# 個已啟用的應用程式}other{# 已啟用的應用程式}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"沒有已啟用的應用程式"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> 車輛政策"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"由機構管理員管理的設定"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"進一步瞭解「<xliff:g id="SERVICE">%1$s</xliff:g>」"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"要分享錯誤報告嗎?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"此車輛的機構管理員要求您提供錯誤報告,以協助解決此裝置的問題。報告可能包含應用程式和相關資料。"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"此車輛的機構管理員要求您提供錯誤報告,以協助解決此裝置的問題。報告可能包含應用程式和相關資料,裝置的運作速度也可能暫時減慢。"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"您已向此車輛的機構管理員提供此錯誤報告。請聯絡他們以瞭解詳情。"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"分享"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"拒絕"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"目前無法更改此設定"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"無障礙功能"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"字幕"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"字幕偏好設定"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"關閉"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"開啟"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"螢幕閱讀器"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"顯示字幕"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"文字大小"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"字幕大小和樣式"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"非常小"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"小"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"預設"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"大"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"非常大"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"字幕樣式"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"由應用程式設定"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"黑底白字"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"白底黑字"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"黑底黃字"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"藍底黃字"</string>
</resources>
diff --git a/res/values-zh-rTW/arrays.xml b/res/values-zh-rTW/arrays.xml
index 5f0415e..1739662 100644
--- a/res/values-zh-rTW/arrays.xml
+++ b/res/values-zh-rTW/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"一律不允許"</item>
<item msgid="1154273129608299386">"一律允許"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index d81525a..ca83f80 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"夜間模式"</string>
<string name="network_and_internet" msgid="4229023630498537530">"網路和網際網路"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"行動網路"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 張 SIM 卡</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 張 SIM 卡</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{# 張 SIM 卡}other{# 張 SIM 卡}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"已啟用/SIM 卡"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"未啟用/SIM 卡"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"已啟用/已下載的 SIM 卡"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"新增更多"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"行動數據"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"使用行動網路存取數據"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"行動網路"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"使用行動數據"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"要關閉行動數據嗎?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"請選取要使用的 SIM 卡"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"要使用「<xliff:g id="CARRIER">%1$s</xliff:g>」的行動數據網路嗎?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> 數據用量警告"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> 數據用量上限"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> 數據用量警告/<xliff:g id="ID_2">^2</xliff:g> 數據用量上限"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="other">剩下 %d 天</item>
- <item quantity="one">剩下 %d 天</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{還剩 # 天}other{還剩 # 天}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"已沒有剩餘時間"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"剩下不到 1 天"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"「<xliff:g id="ID_1">^1</xliff:g>」在 <xliff:g id="ID_2">^2</xliff:g>前更新"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"設定"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"數據警告與限制"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"應用程式數據用量週期"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"行動數據用量"</string>
<string name="set_data_warning" msgid="6628236612886588097">"設定數據用量警告"</string>
<string name="data_warning" msgid="116776633806885370">"數據用量警告"</string>
<string name="set_data_limit" msgid="7136539812414500084">"設定數據用量上限"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"當行動數據用量達到你設定的上限時,車輛資訊娛樂主機將關閉行動數據功能。\n\n由於數據用量是由資訊娛樂主機自動計算,而電信業者對用量的計算方式可能有所不同,因此建議你設定保守的上限值。"</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"設定數據用量警告"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"設定數據用量上限"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"這裡的數據用量是由你的裝置估算,因此可能與行動電信業者提供的資料不同。"</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"設定"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"儲存"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"原始設備製造商 (OEM) 網路"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"車聯網"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"如果關閉車聯網,車上的部分功能可能會無法運作。\n\n車輛運作所需的重要資料會繼續提供給汽車製造商。"</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"仍要關閉"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"車聯網已關閉,車上的部分功能或應用程式可能會因此無法運作。請注意,車輛運作所需的重要資料會繼續提供給汽車製造商。"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"已使用 %1$s (%2$s - %3$s)"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"加入其他網路"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"網路偏好設定"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"新增網路"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"連線"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"連線中…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"未連線"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"不在網路有效範圍內"</string>
<string name="wifi_password" msgid="5565632142720292397">"密碼"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"顯示密碼"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"請至少為 Wi-Fi 無線基地台選擇一個頻帶:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"無線基地台與網路共用"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"無線基地台"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"關閉"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"自動關閉無線基地台"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"Wi‑Fi 無線基地台會在沒有任何裝置連線時關閉"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"「<xliff:g id="REQUESTER">%s</xliff:g>」要求開啟 Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"強制停止"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"要強制停止嗎?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"如果你強制停止應用程式,應用程式可能無法正常運作。"</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"要關閉效能保護功能嗎?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"如果這麼做,軟體和硬體也可能無法運作。"</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"保持開啟"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"關閉"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"要開啟應用程式效能優先的設定嗎?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"開啟這項設定可能會導致系統不穩定,長期下來可能會對硬體造成影響。要繼續嗎?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"是"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"不用了,謝謝"</string>
<string name="disable_text" msgid="4358165448648990820">"停用"</string>
<string name="enable_text" msgid="1794971777861881238">"啟用"</string>
<string name="uninstall_text" msgid="277907956072833012">"解除安裝"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"權限"</string>
<string name="notifications_label" msgid="6586089149665170731">"通知"</string>
<string name="storage_application_label" msgid="5911779903670978586">"儲存空間和快取"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"確保最佳效能"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"應用程式效能優先"</string>
<string name="application_version_label" msgid="8556889839783311649">"版本:%1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"未取得任何授權"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"未要求任何權限"</string>
<string name="unused_apps" msgid="648471933781010395">"未使用的應用程式"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 個未使用的應用程式</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 個未使用的應用程式</item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{# 個未使用的應用程式}other{# 個未使用的應用程式}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"移除權限並釋出空間"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s (內部儲存空間)"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"視需要關閉應用程式,避免資源過度使用"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"將系統資源用於優先提升應用程式效能"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"數據用量"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"應用程式數據用量"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"用量記錄"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"所有應用程式"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"數據和 Wi-Fi 用量"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"用量記錄"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"總用量"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"前景"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"背景"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"允許使用行動數據"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"允許這個應用程式使用行動數據"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"限制使用行動數據"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"僅允許應用程式在前景執行時使用行動數據"</string>
<string name="computing_size" msgid="5791407621793083965">"計算中…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="other">還有其他 <xliff:g id="COUNT_1">%d</xliff:g> 項權限</item>
- <item quantity="one">還有其他 <xliff:g id="COUNT_0">%d</xliff:g> 項權限</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{還有其他 # 項權限}other{還有其他 # 項權限}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"注意:重新啟動後,你必須將車輛解鎖,才能執行這個應用程式。"</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"小幫手和語音輸入"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"小幫手應用程式"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"取得「Wi-Fi 控制」權限後,應用程式就能開啟或關閉 Wi-Fi、掃描及連上 Wi-Fi 網路、新增或移除網路,或者啟動僅限本機的無線基地台。"</string>
<string name="more_special_access_title" msgid="166115485446645971">"更多"</string>
<string name="location_settings_title" msgid="901334356682423679">"定位"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"使用位置資訊"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"允許你指定的應用程式存取位置資訊"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"如果關閉這項功能,系統也會停用所有應用程式的位置存取權。不過,駕駛輔助應用程式還是可以存取位置資訊。"</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"開啟定位功能以便使用駕駛輔助功能"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"車輛定位功能目前為關閉狀態"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"駕駛輔助應用程式無法存取你的位置資訊"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"變更"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"允許駕駛輔助應用程式存取位置資訊"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"如果關閉這項功能,系統會停用必須用到位置資訊的駕駛輔助應用程式。"</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"仍要關閉"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"最近的定位要求"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"最近沒有任何定位要求"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"應用程式層級權限"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"定位服務"</string>
<string name="location_use_location_title" msgid="117735895374606680">"使用位置資訊"</string>
<string name="location_settings_footer" msgid="296892848338100051">"位置資訊設定可能會使用 GPS、Wi‑Fi、行動網路和感應器等來源,以便推測出裝置的所在位置。"</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"駕駛輔助"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"傳送給駕駛輔助應用程式的位置資訊中不會有你的個人身分識別資訊。這類位置資訊最多保留 2 天,期限一到就會刪除。"</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"麥克風"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"使用麥克風"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"允許所有應用程式存取麥克風"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"管理麥克風權限"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"最近的存取記錄"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"最近沒有存取麥克風的應用程式"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"所有應用程式都無法存取麥克風"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{# 個應用程式可存取麥克風 (共 {total_count} 個應用程式)}other{# 個應用程式可存取麥克風 (共 {total_count} 個應用程式)}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"最近的存取記錄"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"查看全部"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"載入中…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"系統"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"系統更新"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"進階"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"第三方授權"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"載入授權時發生問題。"</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"載入中…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="other">只要再 <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> 個步驟即可啟用開發人員設定。</item>
- <item quantity="one">只要再 <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> 個步驟即可啟用開發人員設定。</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{再 # 個步驟即可成為開發人員。}other{再 # 個步驟即可成為開發人員。}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"開發人員設定已啟用!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"你已啟用開發人員設定。"</string>
<string name="developer_options_settings" msgid="1530739225109118480">"開發人員選項"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"當你建立新設定檔後,該使用者必須自己進行個人化設定。"</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"任何設定檔都能更新所有其他設定檔使用的應用程式。"</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"設定檔數量已達上限"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="other">最多可以建立 <xliff:g id="COUNT">%d</xliff:g> 個設定檔。</item>
- <item quantity="one">只能建立 1 個設定檔。</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{只能建立 1 個設定檔。}other{最多可以建立 # 個設定檔。}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"無法建立新設定檔"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"要刪除這個設定檔嗎?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"這個設定檔的所有應用程式和資料都會遭到刪除"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"無法刪除設定檔。"</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"設定檔未刪除。你可以重新啟動裝置,然後再試一次。"</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"這個設定檔將在你切換設定檔或重新發動車輛時刪除。"</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"關閉"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"重試"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"如何畫出解鎖圖案"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"儲存圖案時發生錯誤"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"錯誤次數過多,請於 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試。"</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"無法旋轉輸入解鎖圖案,請用觸控的方式解鎖"</string>
<string name="okay" msgid="4589873324439764349">"確定"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"要移除螢幕鎖定嗎?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"這樣一來,任何人都能存取你的帳戶"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"你的 IT 管理員已封鎖常見 PIN 碼,請改用其他 PIN 碼。"</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"不得包含無效字元。"</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"密碼無效,至少要有 4 個字元。"</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個字母</item>
- <item quantity="one">至少必須包含 1 個字母</item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個小寫字母</item>
- <item quantity="one">至少必須包含 1 個小寫字母</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個大寫字母</item>
- <item quantity="one">至少必須包含 1 個大寫字母</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個數字</item>
- <item quantity="one">至少必須包含 1 個數字</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個特殊符號</item>
- <item quantity="one">至少必須包含 1 個特殊符號</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個非字母字元</item>
- <item quantity="one">至少必須包含 1 個非字母字元</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"裝置管理員不允許使用最近用過的密碼"</string>
<string name="error_saving_password" msgid="8334882262622500658">"儲存密碼時發生錯誤"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"你的 IT 管理員已封鎖常見密碼,請改用其他密碼。"</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"新增設定檔"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"刪除這個設定檔"</string>
<string name="add_profile_text" msgid="9118410102199116969">"新增設定檔"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"螢幕亮度"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"裝置必須開啟藍牙,才會顯示在畫面上"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"如要配對裝置,請開啟藍牙設定"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"資訊娛樂系統管理員"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"已啟用的應用程式"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"已停用的應用程式"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"具有這項權限的應用程式可存取這輛車的資料"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"沒有車輛管理應用程式"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"這個資訊娛樂系統管理員應用程式已啟用,且允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」應用程式執行以下作業:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"如果啟用這個資訊娛樂系統應用程式,將允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」應用程式執行以下作業:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"要啟用這個資訊娛樂系統應用程式嗎?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"啟用這個資訊娛樂系統應用程式"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"停用並解除安裝"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"停用這個資訊娛樂系統應用程式"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"更多詳細資料"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"機構管理員可以監控及管理與這個資料夾相關聯的應用程式和資料,包括設定、權限、公司資源存取權、網路活動,以及車輛的位置資訊。"</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"機構管理員可以監控及管理與這個資料夾相關聯的應用程式和資料,包括設定、權限、公司資源存取權、網路活動,以及裝置的位置資訊。"</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"機構管理員可以監控及管理與這個資訊娛樂系統相關聯的應用程式和資料,包括設定、權限、公司資源存取權、網路活動,以及車輛的位置資訊。"</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"機構管理員或許可以存取與這個資訊娛樂系統相關聯的資料、管理應用程式,以及變更這部車的設定。"</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"無法使用"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"無法變更這部受管理車輛的音量"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"無法使用這部受管理車輛的撥號功能"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"不允許使用這部受管理車輛的簡訊功能"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"無法使用這部受管理車輛的相機"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"無法使用這部受管理車輛的螢幕截圖功能"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"無法在這部受管理車輛上開啟這個應用程式"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"信貸提供者已封鎖這項設定"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"機構限制了部分功能的存取權。\n\n如有任何疑問,請與機構管理員聯絡。"</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"車輛管理員應用程式"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{# 個已啟用的應用程式}other{# 個已啟用的應用程式}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"未啟用任何應用程式"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」車輛政策"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"由機構管理員管理的設定"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"進一步瞭解<xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"要分享錯誤報告嗎?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"這部車的機構管理員要求你提供錯誤報告,協助排解這部裝置的問題。請注意,報告中可能會有應用程式和相關資料。"</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"這部車的機構管理員要求你提供錯誤報告,協助排解這部裝置的問題。請注意,報告中可能會有應用程式和相關資料,而且裝置的速度可能會暫時變慢。"</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"正在與這部車的機構管理員分享這份錯誤報告。詳情請洽機構管理員。"</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"分享"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"拒絕"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"目前無法變更這項設定"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"無障礙設定"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"字幕"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"字幕偏好設定"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"已關閉"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"已開啟"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"螢幕閱讀器"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"顯示字幕"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"文字大小"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"字幕大小和樣式"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"更小"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"小"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"預設"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"大"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"更大"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"字幕樣式"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"使用應用程式設定"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"黑底白字"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"白底黑字"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"黑底黃字"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"藍底黃字"</string>
</resources>
diff --git a/res/values-zu/arrays.xml b/res/values-zu/arrays.xml
index 8468802..df78c15 100644
--- a/res/values-zu/arrays.xml
+++ b/res/values-zu/arrays.xml
@@ -22,4 +22,7 @@
<item msgid="933409503308401889">"Ungavumeli"</item>
<item msgid="1154273129608299386">"Hlala uvumela"</item>
</string-array>
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item msgid="864784677969753628">"com.android.systemui"</item>
+ </string-array>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index cff642c..feb8e7e 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -27,10 +27,7 @@
<string name="night_mode_tile_label" msgid="6603597795502131664">"Imodi yasebusuku"</string>
<string name="network_and_internet" msgid="4229023630498537530">"Inethiwekhi ne-inthanethi"</string>
<string name="mobile_network_settings" msgid="1708621113321368597">"Inethiwekhi yeselula"</string>
- <plurals name="mobile_network_summary_count" formatted="false" msgid="6917348330386831454">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> Ama-SIM</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Ama-SIM</item>
- </plurals>
+ <string name="mobile_network_summary_count" msgid="760865625847664029">"{count,plural, =1{I-SIM #}one{Ama-SIM #}other{Ama-SIM #}}"</string>
<string name="mobile_network_active_sim" msgid="1901674954229832811">"Ukusebenza / i-SIM"</string>
<string name="mobile_network_inactive_sim" msgid="3644984830926224318">"Ukungasebenzi / i-SIM"</string>
<string name="mobile_network_active_esim" msgid="5864100786496761032">"Kuyasebenza / I-SIM elandiwe"</string>
@@ -38,6 +35,8 @@
<string name="mobile_network_list_add_more" msgid="6174294462747070655">"Engeza okuningi"</string>
<string name="mobile_network_toggle_title" msgid="3515647310810280063">"Idatha yeselula"</string>
<string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Finyelela kudatha usebenzisa inethiwekhi yeselula"</string>
+ <string name="mobile_network_mobile_network_toggle_title" msgid="3087288149339116597">"Inethiwekhi yeselula"</string>
+ <string name="mobile_network_mobile_network_toggle_summary" msgid="1679917666306941420">"Sebenzisa idatha yeselula"</string>
<string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vala idatha yeselula?"</string>
<string name="sim_selection_required_pref" msgid="6599562910262785784">"Ukukhetha kuyadingeka"</string>
<string name="sim_change_data_title" msgid="6677115745127365131">"Sebenzisa i-<xliff:g id="CARRIER">%1$s</xliff:g> yedatha yeselula?"</string>
@@ -53,10 +52,7 @@
<string name="cell_data_warning" msgid="8997739664336571149">"<xliff:g id="ID_1">^1</xliff:g> isexwayiso sedatha"</string>
<string name="cell_data_limit" msgid="6862164869877993009">"<xliff:g id="ID_1">^1</xliff:g> umkhawulo wedatha"</string>
<string name="cell_data_warning_and_limit" msgid="5003954080814312475">"<xliff:g id="ID_1">^1</xliff:g> isexwayiso sedatha / <xliff:g id="ID_2">^2</xliff:g> umkhawulo wedatha"</string>
- <plurals name="billing_cycle_days_left" formatted="false" msgid="9163059632851951402">
- <item quantity="one">%d izinsuku ezisele</item>
- <item quantity="other">%d izinsuku ezisele</item>
- </plurals>
+ <string name="billing_cycle_days_left" msgid="1810100330204239102">"{count,plural, =1{usuku olusele olungu-#}one{izinsuku ezisele ezingu-#}other{izinsuku ezisele ezingu-#}}"</string>
<string name="billing_cycle_none_left" msgid="3499893148398931302">"Asikho isikhathi esisele"</string>
<string name="billing_cycle_less_than_one_day_left" msgid="8121013296375203759">"Kusele ngaphansi kosuku olungu-1"</string>
<string name="carrier_and_update_text" msgid="4351043160977741244">"Kubuyekezwe i-<xliff:g id="ID_1">^1</xliff:g> nge-<xliff:g id="ID_2">^2</xliff:g> edlule"</string>
@@ -71,6 +67,7 @@
<string name="cycle_reset_day_of_month_picker_positive_button" msgid="6919858010423269305">"Setha"</string>
<string name="data_warning_limit_title" msgid="4950868241810828601">"Isexwayiso sedatha nomkhawulo"</string>
<string name="app_usage_cycle" msgid="8445927080245880296">"Umjikelezo wokusetshenziswa kwedatha yohlelo lokusebenza"</string>
+ <string name="mobile_data_usage" msgid="8171519864391091861">"Ukusetshenziswa kwedatha yeselula"</string>
<string name="set_data_warning" msgid="6628236612886588097">"Setha isexwayiso sedatha"</string>
<string name="data_warning" msgid="116776633806885370">"Isexwayiso sedatha"</string>
<string name="set_data_limit" msgid="7136539812414500084">"Setha umkhawulo wedatha"</string>
@@ -79,8 +76,14 @@
<string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Iyunithi enkulu yemoto yakho izovala idatha yeselula uma isifike kumkhawulo owusethile.\n\nNjengoba ukusetshenziswa kwedatha kulinganiselwa iyunithi eyinhloko, futhi inkampani yakho yenethiwekhi ingakhulumela ukusetshenziswa ngokuhlukile, cabanga ukusetha umkhawulo wakho wokugcinwa."</string>
<string name="data_usage_warning_editor_title" msgid="2041517150169038813">"Setha isexwayiso sokusebenziseka kwedatha"</string>
<string name="data_usage_limit_editor_title" msgid="133468242379286689">"Setha umkhawulo wokusetshenziswa kwedatha"</string>
+ <string name="data_usage_settings_footer" msgid="681881387909678237">"Ukusetshenziswa kwedatha kulinganiswa ngedivayisi yakho. Kungahluka kusukela kudatha yenkampani yenethiwekhi yakho."</string>
<string name="usage_bytes_threshold_picker_positive_button" msgid="4625479840977965519">"Setha"</string>
+ <string name="data_usage_warning_save_title" msgid="2900544287239037695">"Londoloza"</string>
<string name="network_and_internet_oem_network_title" msgid="6436902713696212250">"Inethiwekhi ye-OEM"</string>
+ <string name="network_and_internet_vehicle_internet_title" msgid="2518848595673002736">"I-inthanethi yemoto"</string>
+ <string name="network_and_internet_oem_network_dialog_description" msgid="4469178879867702066">"Ukuvala i-inthanethi yemoto kungavimbela ezinye izici zemoto noma ama-app ukuthi asebenze.\n\nIdatha ebucayi edingekayo ukusebenzisa imoto yakho izoqhubeka yabelanwe nomkhiqizi wemoto."</string>
+ <string name="network_and_internet_oem_network_dialog_confirm_label" msgid="2630033932472996255">"Vala noma kunjalo"</string>
+ <string name="network_and_internet_oem_network_disabled_footer" msgid="3529208167627034245">"I-inthanethi yemoto ivaliwe. Lokhu kungavimbela ezinye izici zemoto noma ama-app ukuthi asebenze. Idatha ebucayi edingekayo ukusebenzisa imoto yakho izoqhubeka yabelanwe nomkhiqizi wemoto"</string>
<string name="network_and_internet_data_usage_time_range_summary" msgid="1792995626433410056">"kusetshenziswe okungu-%1$s %2$s - %3$s"</string>
<string name="network_and_internet_join_other_network_title" msgid="7126831320010062712">"Joyina enye inethiwekhi"</string>
<string name="network_and_internet_network_preferences_title" msgid="2983548049081168876">"Okuncamelayo kwenethiwekhi"</string>
@@ -94,6 +97,7 @@
<string name="wifi_setup_add_network" msgid="3660498520389954620">"Yengeza inethiwekhi"</string>
<string name="wifi_setup_connect" msgid="3512399573397979101">"Xhuma"</string>
<string name="wifi_connecting" msgid="1930665730621677960">"Iyaxhuma…"</string>
+ <string name="wifi_disconnected" msgid="4485699234859368137">"Akuxhunyiwe"</string>
<string name="wifi_not_in_range_message" msgid="2617126307140203787">"Inethiwekhi ayikho kubanga"</string>
<string name="wifi_password" msgid="5565632142720292397">"Iphasiwedi"</string>
<string name="wifi_show_password" msgid="8423293211933521097">"Bonisa iphasiwedi"</string>
@@ -155,6 +159,7 @@
<string name="wifi_ap_band_select_one" msgid="615578175244067396">"Khetha okungenani ibhendi eyodwa ye-Wi‑Fi hotspot:"</string>
<string name="tether_settings_title_all" msgid="4663704772599383169">"I-hotspot nokusebenzisa ifoni njengemodemu"</string>
<string name="hotspot_settings_title" msgid="8220814387592756713">"I-Hotspot"</string>
+ <string name="wifi_hotspot_state_off" msgid="6096709579204322798">"Valiwe"</string>
<string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Vala ama-hotspot ngokuzenzakalela"</string>
<string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"I-Wi-Fi hotspot izovaleka uma kungekho amadivayisi axhunyiwe"</string>
<string name="wifi_ask_enable" msgid="4452418245680754578">"I-<xliff:g id="REQUESTER">%s</xliff:g> ifuna ukuvula i-Wi-Fi"</string>
@@ -297,10 +302,10 @@
<string name="force_stop" msgid="2153183697014720520">"Phoqelela ukuma"</string>
<string name="force_stop_dialog_title" msgid="3342850939200388694">"Phoqelela ukumisa?"</string>
<string name="force_stop_dialog_text" msgid="4354954014318432599">"Uma uphoqa ukumisa uhlelo lokusebenza, kungenzeka ukuthi lungasebenzi."</string>
- <string name="peak_performance_dialog_title" msgid="5970933611683430870">"Vala isivikelo sokusebenza?"</string>
- <string name="peak_performance_dialog_text" msgid="7648337738884134499">"Uma wenza, isofthiwe yakho nezingxenyekazi zekhompyutha nakho kungahle kungasebenzi."</string>
- <string name="peak_performance_dialog_action_on" msgid="2139033153500237350">"Shiya kuvuliwe"</string>
- <string name="peak_performance_dialog_action_off" msgid="1019653666533456482">"Vala"</string>
+ <string name="prioritize_app_performance_dialog_title" msgid="2561577032540073080">"Vula ukukhuthalela ukusebenza kwe-app?"</string>
+ <string name="prioritize_app_performance_dialog_text" msgid="572525689800110355">"Ukuyivula kungabangela ukungazinzi kwesistimu noma umthelela wesikhathi eside wengxenyekazi yekhompyutha. Ingabe ufuna ukuqhubeka?"</string>
+ <string name="prioritize_app_performance_dialog_action_on" msgid="3556735049873419163">"Yebo"</string>
+ <string name="prioritize_app_performance_dialog_action_off" msgid="2813324718753199319">"Cha, ngiyabonga"</string>
<string name="disable_text" msgid="4358165448648990820">"Khubaza"</string>
<string name="enable_text" msgid="1794971777861881238">"Nika amandla"</string>
<string name="uninstall_text" msgid="277907956072833012">"Khipha"</string>
@@ -310,25 +315,30 @@
<string name="permissions_label" msgid="2701446753515612685">"Izimvume"</string>
<string name="notifications_label" msgid="6586089149665170731">"Izaziso"</string>
<string name="storage_application_label" msgid="5911779903670978586">"Isitoreji nenqolobane"</string>
- <string name="peak_performance_label" msgid="1592816366516845648">"Qinisekisa ukusebenza okuphezulu"</string>
+ <string name="prioritize_app_performance_label" msgid="7264505023347026606">"Khuthalela ukusebenza kwe-app"</string>
<string name="application_version_label" msgid="8556889839783311649">"Inguqulo: %1$s"</string>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Azikho izimvume ezinikiwe"</string>
<string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Azikho izimvume eziceliwe"</string>
<string name="unused_apps" msgid="648471933781010395">"Ama-unused app"</string>
- <plurals name="unused_apps_summary" formatted="false" msgid="6410080383909014362">
- <item quantity="one">ama-unused app <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">ama-unused app <xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="unused_apps_summary" msgid="8257304516038923072">"{count,plural, =1{i-app engasetshenzisiwe engu-#}one{Ama-app angasetshenzisiwe angu-#}other{Ama-app angasetshenzisiwe angu-#}}"</string>
<string name="unused_apps_switch" msgid="4433958286200341563">"Susa izimvume uphinde ukhulule isikhala"</string>
<string name="storage_type_internal" msgid="8918688427078709570">"%s kusitoreji sangaphakathi"</string>
- <string name="peak_performance_summary" msgid="2450911487290019786">"Uma kunesidingo, vala i-app yakho ukugwema ukusetshenziswa okweqile kwezinsiza"</string>
+ <string name="prioritize_app_performance_summary" msgid="1081874788185691418">"Isebenzisa izinsiza zesistimu ukukhuthalela i-app"</string>
<string name="data_usage_summary_title" msgid="4368024763485916986">"Ukusebenzisa idatha"</string>
<string name="data_usage_app_summary_title" msgid="5012851696585421420">"Ukusetshenziswa kwedatha yohlelo lokusebenza"</string>
+ <string name="data_usage_usage_history_title" msgid="2386346082501471648">"Umlando wokusetshenziswa"</string>
+ <string name="data_usage_all_apps_title" msgid="5956991037518761599">"Zonke izinhlelo zokusebenza"</string>
+ <string name="app_data_usage_title" msgid="6991057296054761322">"Ukusetshenziswa kwedatha ne-Wi‑Fi"</string>
+ <string name="app_data_usage_usage_history_title" msgid="5861801915345874959">"Umlando wokusetshenziswa"</string>
+ <string name="app_data_usage_total_usage" msgid="6166480544992906281">"Ingqikithi yokusetshenziswa"</string>
+ <string name="app_data_usage_foreground" msgid="76513424438149709">"Okuphambili"</string>
+ <string name="app_data_usage_background" msgid="6972054078770685280">"Ingemuva"</string>
+ <string name="app_data_usage_allow_data_title" msgid="2713343973040466293">"Vumela idatha"</string>
+ <string name="app_data_usage_allow_data_summary" msgid="7431118326573403774">"Vumela le app isebenzise idatha yeselula"</string>
+ <string name="app_data_usage_restrict_data_title" msgid="7080736007645963633">"Nqanda i-data"</string>
+ <string name="app_data_usage_background_data_summary" msgid="4445472217737386826">"Sebenzisa idatha yeselula kuphela lapho i-app iphambili"</string>
<string name="computing_size" msgid="5791407621793083965">"Iyakhompyutha…"</string>
- <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> izimvume ezingeziwe</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> izimvume ezingeziwe</item>
- </plurals>
+ <string name="runtime_permissions_additional_count" msgid="3920383880473283764">"{count,plural, =1{imvume engeziwe engu-#}one{izimvume ezingeziwe ezingu-#}other{izimvume ezingeziwe ezingu-#}}"</string>
<string name="direct_boot_unaware_dialog_message_car" msgid="2857599310518724080">"Qaphela: Ngemuva kokuqalisa kabusha, lolu hlelo lokusebenza alukwazi ukuqalisa uze uvule imoto yakho."</string>
<string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Umsizi nokokufaka kwezwi"</string>
<string name="assist_app_settings" msgid="9085261410166776497">"Uhlelo lokusebenza lokusiza"</string>
@@ -385,12 +395,35 @@
<string name="wifi_control_description" msgid="6021926850423169261">"Isilawuli se-Wi-Fi sivumela uhlelo lokusebenza ukuthi luvule noma luvale i-Wi-Fi, luskene futhi luxhumeke kumanethiwekhi e-Wi-Fi, lungeze noma lususe amanethiwekhi, noma luqale i-hotspot yasendaweni kuphela."</string>
<string name="more_special_access_title" msgid="166115485446645971">"Okuningi"</string>
<string name="location_settings_title" msgid="901334356682423679">"Indawo"</string>
+ <string name="location_toggle_title" msgid="836779750812064601">"Sebenzisa indawo"</string>
+ <string name="location_toggle_summary" msgid="7977868708102299495">"Vumela ama-app owacacisayo afinyelele indawo yakho"</string>
+ <string name="location_toggle_off_warning" msgid="8396854289251143748">"Uma uvala lokhu, kuzosusa ukufinyelela kwendawo yakho kuwo wonke ama-app. Ama-app we-Driver Assistance asazoba nokufinyelela."</string>
+ <string name="location_driver_assistance_toggle_title" msgid="9201622805420459957">"Sebenzisa indawo mayelana ne-Driver Assistance"</string>
+ <string name="location_driver_assistance_toggle_off_title" msgid="2218532550578204718">"Indawo yemoto ivaliwe"</string>
+ <string name="location_driver_assistance_toggle_off_summary" msgid="1516786816178866919">"Ama-app we-Driver Assistance awakwazi ukufinyelela indawo yakho"</string>
+ <string name="location_driver_assistance_action_text" msgid="1887309495010247883">"Shintsha"</string>
+ <string name="location_driver_assistance_toggle_summary" msgid="2732591196508054649">"Vumela ama-app asiza ngokushayela ukuba afinyelele indawo yakho"</string>
+ <string name="location_driver_assistance_toggle_off_warning" msgid="8097738968253492982">"Uma uvala lokhu, ama-app we-Driver Assistance ancike kulwazi lendawo azokhutshazwa."</string>
+ <string name="driver_assistance_warning_confirm_label" msgid="2873799611160864931">"Vala noma kunjalo"</string>
<string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Izicelo zakamuva zendawo"</string>
<string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Azikho izicelo zakamuva zendawo"</string>
<string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Izimvume zeleveli yohlelo lokusebenza"</string>
<string name="location_settings_services_title" msgid="1186133632690970468">"Amasevisi endawo"</string>
<string name="location_use_location_title" msgid="117735895374606680">"Sebenzisa indawo"</string>
<string name="location_settings_footer" msgid="296892848338100051">"Indawo ingasebenzisa imithombo enjenge-GPS, i-Wi-Fi, inethiwekhi yeselula, nezinzwa ukusiza ekulinganiseleni indawo yedivaysi yakho."</string>
+ <string name="driver_assistance_settings_title" msgid="4915804073177128915">"Umsizi womshayeli"</string>
+ <string name="adas_settings_footer" msgid="5128483877858058534">"Ulwazi lendawo oluthunyelwe kuma-app we-Driver Assistant alinalo ulwazi olukukhombayo. Kugcinwa izinsuku ezingeqi kwezi-2 ngaphambi kokuthi kusulwe."</string>
+ <string name="microphone_settings_title" msgid="7125554350537136922">"Imakrofoni"</string>
+ <string name="microphone_toggle_title" msgid="911586035332827275">"Sebenzisa imakrofoni"</string>
+ <string name="microphone_toggle_summary" msgid="2682653449849128626">"Vumela wonke ama-app ukuthi afinyelele kumakrofoni yakho"</string>
+ <string name="microphone_manage_permissions" msgid="7280905792151988183">"Phatha izimvume zemakrofoni"</string>
+ <string name="microphone_recently_accessed" msgid="2084292372486026607">"Okufinyelelwe muva nje"</string>
+ <string name="microphone_no_recent_access" msgid="6412908936060990649">"Azikho izinhlelo zokusebenza zakamuva"</string>
+ <string name="microphone_app_permission_summary_microphone_off" msgid="6139321726246115550">"Ama-app ayi-0 anokufinyelela"</string>
+ <string name="microphone_app_permission_summary_microphone_on" msgid="7870834777359783838">"{count,plural, =1{Ama-app angu-{total_count} kwangu-# anokufinyelela}one{Ama-app angu-{total_count} kwangu-# anokufinyelela}other{Ama-app angu-{total_count} kwangu-# anokufinyelela}}"</string>
+ <string name="microphone_settings_recent_requests_title" msgid="8154796551134761329">"Okufinyelelwe muva nje"</string>
+ <string name="microphone_settings_recent_requests_view_all_title" msgid="4339820818072842872">"Buka konke"</string>
+ <string name="microphone_settings_loading_app_permission_stats" msgid="4357161201098081615">"Iyalayisha…"</string>
<string name="system_setting_title" msgid="6864599341809463440">"Isistimu"</string>
<string name="system_update_settings_title" msgid="8448588267784138855">"Izibuyekezo zesistimu"</string>
<string name="system_advanced_title" msgid="6303355131691523362">"Okuthuthukisiwe"</string>
@@ -429,10 +462,7 @@
<string name="settings_license_activity_title" msgid="8499293744313077709">"Amalayisense enkampani yangaphandle"</string>
<string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Kunenkinga yokulayisha amalayisensi."</string>
<string name="settings_license_activity_loading" msgid="6163263123009681841">"Iyalayisha…"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
- <item quantity="one">Manje usalelwe yizinyathelo ezingu-<xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ukuthi ube ngunjiniyela.</item>
- <item quantity="other">Manje usalelwe yizinyathelo ezingu-<xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ukuthi ube ngunjiniyela.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="7416958516942072383">"{count,plural, =1{Manje usalelwe yisinyathelo esingu-# ukuthi ube ngunjiniyela.}one{Manje usalelwe yizinyathelo ezingu-# ukuthi ube ngunjiniyela.}other{Manje usalelwe yizinyathelo ezingu-# ukuthi ube ngunjiniyela.}}"</string>
<string name="show_dev_on" msgid="5339077400040834808">"Manje ungunjiniyela!"</string>
<string name="show_dev_already" msgid="1678087328973865736">"Asikho isidingo, usuvele ungunjiniyela."</string>
<string name="developer_options_settings" msgid="1530739225109118480">"Izinketho zonjiniyela"</string>
@@ -501,14 +531,11 @@
<string name="user_add_user_message_setup" msgid="812616230454605159">"Ngemva kokuthi udale iphrofayela entsha, loyo muntu kumele azenzele ngendlela ayifisayo yena."</string>
<string name="user_add_user_message_update" msgid="3836353291078729240">"Ama-app angabuyekezwa kunoma iyiphi iphrofayela ukuze asetshenziswe yiwo wonke amanye amaphrofayela."</string>
<string name="user_limit_reached_title" msgid="5677729355746623293">"Umkhawulo wephrofayela ufinyelelwe"</string>
- <plurals name="user_limit_reached_message" formatted="false" msgid="3310152546154693349">
- <item quantity="one">Ungadala amaphrofayela afika kwangu-<xliff:g id="COUNT">%d</xliff:g> kuphela.</item>
- <item quantity="other">Ungadala amaphrofayela afika kwangu-<xliff:g id="COUNT">%d</xliff:g> kuphela.</item>
- </plurals>
+ <string name="user_limit_reached_message" msgid="2773441357248819721">"{count,plural, =1{Yiphrofayela eyodwa kuphela engadalwa.}one{Ungadala amaphrofayela afika kwangu-# kuphela.}other{Ungadala amaphrofayela afika kwangu-# kuphela.}}"</string>
<string name="add_user_error_title" msgid="7589792057846396341">"Ayikwazanga ukudala iphrofayela entsha"</string>
<string name="delete_user_dialog_title" msgid="575517556232943687">"Sula le phrofayela?"</string>
<string name="delete_user_dialog_message" msgid="3916865958419051299">"Wonke ama-app nedatha yale phrofayela kuzosulwa"</string>
- <string name="delete_user_error_title" msgid="6422249596301690254">"Ayikwazanga ukusula iphrofayela."</string>
+ <string name="delete_user_error_title" msgid="287249031795906102">"Iphrofayela ayisulwanga. Ungaqala kabusha idivayisi bese uzama futhi."</string>
<string name="delete_user_error_set_ephemeral_title" msgid="9062453678745644817">"Le phrofayela izosuswa lapho ushintsha amaphrofayela noma uqala kabusha imoto."</string>
<string name="delete_user_error_dismiss" msgid="429156446763738273">"Chitha"</string>
<string name="delete_user_error_retry" msgid="5116434895572670563">"Zama futhi"</string>
@@ -621,6 +648,7 @@
<string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"Udweba kanjani phathini yokuvula"</string>
<string name="error_saving_lockpattern" msgid="2933512812768570130">"Iphutha ukulondoloza iphethini"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts" msgid="4636307830951251013">"Imizamo eminingi engalungile. Zama futhi kumasekhondi angu-<xliff:g id="NUMBER">%d</xliff:g>."</string>
+ <string name="lockpattern_does_not_support_rotary" msgid="7356367113555659428">"Iphethini ayisekeli i-rotary, sicela usebenzise ukuthinta"</string>
<string name="okay" msgid="4589873324439764349">"KULUNGILE"</string>
<string name="remove_screen_lock_title" msgid="1234382338764193387">"Susa isikrini sokukhiya?"</string>
<string name="remove_screen_lock_message" msgid="6675850371585564965">"Lokhu kuzovumela wonke umuntu ukufinyelela i-akhawunti yakho"</string>
@@ -652,30 +680,6 @@
<string name="lockpassword_pin_denylisted_by_admin" msgid="3752574009492336468">"Ama-PIN avamile avinjelwe umlawuli wakho we-IT. Zama i-PIN ehlukile."</string>
<string name="lockpassword_illegal_character" msgid="1984970060523635618">"Lokhu akukwazi ukufaka uhlamvu olungavumelekile."</string>
<string name="lockpassword_invalid_password" msgid="1690956113717418430">"Iphasiwedi ayivumelekile, kumele okungenani ibe izinhlamvu ezingu-4."</string>
- <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
- <item quantity="one">Kumele okungenani iqukathe amagama angu-<xliff:g id="COUNT">%d</xliff:g></item>
- <item quantity="other">Kumele okungenani iqukathe amagama angu-<xliff:g id="COUNT">%d</xliff:g></item>
- </plurals>
- <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
- <item quantity="one">Kumele iqukathe okungenani amagama angu-<xliff:g id="COUNT">%d</xliff:g> eliyizinhlamvu ezincane</item>
- <item quantity="other">Kumele iqukathe okungenani amagama angu-<xliff:g id="COUNT">%d</xliff:g> eliyizinhlamvu ezincane</item>
- </plurals>
- <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
- <item quantity="one">Kumele iqukathe okungenani izinhlamvu ezingu-<xliff:g id="COUNT">%d</xliff:g> ezingofeleba</item>
- <item quantity="other">Kumele iqukathe okungenani izinhlamvu ezingu-<xliff:g id="COUNT">%d</xliff:g> ezingofeleba</item>
- </plurals>
- <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
- <item quantity="one">Kumele iqukathe okungenani amadijithi angu-<xliff:g id="COUNT">%d</xliff:g> ayizinombolo</item>
- <item quantity="other">Kumele iqukathe okungenani amadijithi angu-<xliff:g id="COUNT">%d</xliff:g> ayizinombolo</item>
- </plurals>
- <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
- <item quantity="one">Kumele iqukathe okungenani amasimbuli angu-<xliff:g id="COUNT">%d</xliff:g> abalulekile</item>
- <item quantity="other">Kumele iqukathe okungenani amasimbuli angu-<xliff:g id="COUNT">%d</xliff:g> abalulekile</item>
- </plurals>
- <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
- <item quantity="one">Kumele iqukathe okungenani okungu-<xliff:g id="COUNT">%d</xliff:g> okungezona izinhlamvu</item>
- <item quantity="other">Kumele iqukathe okungenani okungu-<xliff:g id="COUNT">%d</xliff:g> okungezona izinhlamvu</item>
- </plurals>
<string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Umlawuli wedivayisi akavumeli ukusebenzisa iphasiwedi yakamuva"</string>
<string name="error_saving_password" msgid="8334882262622500658">"Iphutha ukulondoloza iphasiwedi"</string>
<string name="lockpassword_password_denylisted_by_admin" msgid="8611831198794524730">"Amaphasiwedi avamile avinjelwe umlawuli wakho we-IT. Zama iphasiwedi ehlukile."</string>
@@ -718,5 +722,66 @@
<string name="add_a_profile_button_text" msgid="8027395095117925114">"Engeza iphrofayela"</string>
<string name="delete_this_profile_text" msgid="6035404714526922665">"Susa le phrofayela"</string>
<string name="add_profile_text" msgid="9118410102199116969">"Engeza iphrofayela"</string>
+ <string name="qc_display_brightness" msgid="2939655289816201170">"Bonisa ukukhanya"</string>
+ <string name="qc_bluetooth_off_devices_info" msgid="8420985279976892700">"Ukuze ubone amadivayisi akho, vula i-Bluetooth"</string>
+ <string name="qc_bluetooth_on_no_devices_info" msgid="7573736950041887300">"Ukuze ubhanqe idivayisi, vula amasethingi e-Bluetooth"</string>
+ <string name="device_admin_add_title" msgid="1294399588284546811">"Umphathi wesistimu ye-infotainment"</string>
+ <string name="device_admin_activated_apps" msgid="568075063362271751">"Ama-app enziwe asebenza"</string>
+ <string name="device_admin_deactivated_apps" msgid="3797263682500122872">"Ama-app ayekiswe ukusebenza"</string>
+ <string name="device_admin_apps_description" msgid="1371935499168453457">"Ama-app anale mvume anokufinyelela kwidatha yale moto"</string>
+ <string name="device_admin_apps_list_empty" msgid="7634804595645191123">"Awekho ama-app omphathi wemoto"</string>
+ <string name="device_admin_status" msgid="4041772636856135168">"Le app yomphathi wesistimu ye-infotainment iyasebenza futhi uvumela i-app ye-<xliff:g id="APP_NAME">%1$s</xliff:g> ukwenza imisebenzi elandelayo:"</string>
+ <string name="device_admin_warning" msgid="8997805999333600901">"Ukwenza le app yesistimu ye-infotainment ukuthi isebenze kuzovumela i-app ye-<xliff:g id="APP_NAME">%1$s</xliff:g> ukwenza imisebenzi elandelayo:"</string>
+ <string name="add_device_admin_msg" msgid="8188888666879499482">"Yenza le app yesistimu ye-infotainement isebenze?"</string>
+ <string name="add_device_admin" msgid="7674707256074840333">"Yenza le app yesistimu ye-infotainement isebenze"</string>
+ <string name="deactivate_and_uninstall_device_admin" msgid="596399938769951696">"Yekisa futhi ukhiphe"</string>
+ <string name="remove_device_admin" msgid="3595343390502030723">"Yenza le app yesistimu ye-infotainment ukuthi ingasebenzi"</string>
+ <string name="admin_support_more_info" msgid="380785608579390750">"Eminye imininingwane"</string>
+ <string name="admin_profile_owner_message" msgid="8361351256802954556">"Umphathi wenhlangano angakwazi ukuphatha ama-app nedatha ehlobene nale phrofayela, okufaka phakathi amasethingi, izimvume, ukufinyelela kwebhizinisi, umsebenzi wenethiwekhi, nolwazi lwendawo yemoto."</string>
+ <string name="admin_profile_owner_user_message" msgid="366072696508275753">"Umphathi wenhlangano angakwazi ukugada nokuphatha ama-app nedatha ehlobene nale phrofayela, okufaka phakathi amasethingi, izimvume, ukufinyelela kwebhizinisi, umsebenzi wenethiwekhi, nolwazi lwendawo yedivayisi."</string>
+ <string name="admin_device_owner_message" msgid="896530502350904835">"Umphathi wenhlangano angakwazi ukugada nokuphatha ama-app nedatha ehlobene nale sistimu ye-infotainment, okufaka phakathi amasethingi, izimvume, ukufinyelela kwebhizinisi, umsebenzi wenethiwekhi nolwazi lwendawo yemoto."</string>
+ <string name="admin_financed_message" msgid="7357397436233684082">"Umphathi wenhlangano angase akwazi ukufinyelela idatha ehlobene nale sistimu ye-infotainment, aphathe ama-app, futhi ashintshe amasethingi walezi zimoto."</string>
+ <string name="disabled_by_policy_title" msgid="1121694702115232518">"Akutholakali lokho"</string>
+ <string name="disabled_by_policy_title_adjust_volume" msgid="7002865820552702232">"Awukwazi ukushintsha ivolumu kule moto ephethwe"</string>
+ <string name="disabled_by_policy_title_outgoing_calls" msgid="158752542663419500">"Awukwazi ukwenza amakholi kule moto ephethwe"</string>
+ <string name="disabled_by_policy_title_sms" msgid="3044491214572494290">"I-SMS ayivunyelwe kule moto ephethwe"</string>
+ <string name="disabled_by_policy_title_camera" msgid="8929782627587059121">"Ikhamera ayitholakali kule moto ephethwe"</string>
+ <string name="disabled_by_policy_title_screen_capture" msgid="4059715943558852466">"Ayikwazi ukuthatha izithombe-skrini kule moto ephethwe"</string>
+ <string name="disabled_by_policy_title_suspend_packages" msgid="7505332012990359725">"Awukwazi ukuvula le app kule moto ephethwe"</string>
+ <string name="disabled_by_policy_title_financed_device" msgid="6005343494788285981">"Kuvinjwe umhlinzeki wakho wekhredithi"</string>
+ <string name="default_admin_support_msg" msgid="2986598061733013282">"Ukufinyelela kwezinye izakhi kukhawulelwe yinhlangano.\n\nUma unemibuzo, xhumana nomphathi wenhlangano."</string>
+ <string name="help_url_action_disabled_by_it_admin" msgid="1479392394986580260"></string>
+ <string name="manage_device_admin" msgid="7087659697154317316">"Ama-app womphathi wezimoto"</string>
+ <string name="number_of_device_admins" msgid="7508826094096451485">"{count,plural, =1{I-app eyenziwe yasebenza engu-#}one{Ama-app enziwe asebenza angu-#}other{Ama-app enziwe asebenza angu-#}}"</string>
+ <string name="number_of_device_admins_none" msgid="5547493703413973954">"Awekho ama-app enziwe asebenza"</string>
+ <string name="work_policy_privacy_settings" msgid="5263835989260149968">"inqubomgomo yemoto ye-<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>"</string>
+ <string name="work_policy_privacy_settings_summary" msgid="5321618399949880194">"Amasethingi aphethwe ngumphathi wale nhlangano"</string>
+ <string name="footer_learn_more_content_description" msgid="7749452309729272078">"Funda kabanzi nge-<xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="share_remote_bugreport_dialog_title" msgid="7268540014481283490">"Yabelana ngombiko wesiphazamisi?"</string>
+ <string name="share_remote_bugreport_dialog_message_finished" msgid="2976131666427197841">"Umphathi wenhlangano yale moto ucele umbiko wesiphazamisi ukusiza ukuxazulula inkinga kule divayisi. Ama-app nedatha kungabelwana."</string>
+ <string name="share_remote_bugreport_dialog_message" msgid="7884771062689597395">"Umphathi wenhlangano yale moto ucele umbiko wesiphazamisi ukusiza ukuxazulula inkinga kule divayisi. Ama-app nedatha kungabelwana, futhi idivayisi yakho ingahle yehle kancane."</string>
+ <string name="sharing_remote_bugreport_dialog_message" msgid="7018120538510110940">"Lo mbiko wesiphazamisi wabiwa nomphathi wenhlangano yale moto. Xhumana naye mayelana nemininingwane engeziwe."</string>
+ <string name="share_remote_bugreport_action" msgid="5364819432179581532">"Yabelana"</string>
+ <string name="decline_remote_bugreport_action" msgid="7287544934032744334">"Yenqaba"</string>
<string name="power_component_disabled" msgid="7084144472096800457">"Leli sethingi alikwazi ukushintshwa khona manje"</string>
+ <string name="accessibility_settings_title" msgid="2615042088419230347">"Ukufinyeleleka"</string>
+ <string name="accessibility_settings_captions_title" msgid="4635141293524800795">"Amagama-ncazo"</string>
+ <string name="captions_settings_title" msgid="5738067618097295831">"Okuncanyelwayo kwamagama-ngcazo"</string>
+ <string name="captions_settings_off" msgid="7568096968016015626">"Valiwe"</string>
+ <string name="captions_settings_on" msgid="5374984113566914978">"Vuliwe"</string>
+ <string name="screen_reader_settings_title" msgid="4012734340987826872">"Isifundi sesikrini"</string>
+ <string name="show_captions_toggle_title" msgid="710582308974826311">"Bonisa amagama-ncazo"</string>
+ <string name="captions_text_size_title" msgid="1960814652560877963">"Usayizi wombhalo"</string>
+ <string name="captions_settings_style_header" msgid="944591388386054372">"Usayizi wegama-ngcazo nesitayela"</string>
+ <string name="captions_settings_text_size_very_small" msgid="7476485317028306502">"Kuncane kakhulu"</string>
+ <string name="captions_settings_text_size_small" msgid="1481895299805450566">"Omncane"</string>
+ <string name="captions_settings_text_size_default" msgid="2227802573224038267">"Okuzenzakalelayo"</string>
+ <string name="captions_settings_text_size_large" msgid="5198207220911360512">"Omkhulu"</string>
+ <string name="captions_settings_text_size_very_large" msgid="949511539689307969">"Kukhulu kakhulu"</string>
+ <string name="captions_text_style_title" msgid="8547777957403577760">"Isitayela segama-ncazo"</string>
+ <string name="captions_settings_text_style_by_app" msgid="7014882290456996444">"Setha nge-app"</string>
+ <string name="captions_settings_text_style_white_on_black" msgid="5758084000323596070">"Okumhlophe kokumnyama"</string>
+ <string name="captions_settings_text_style_black_on_white" msgid="3906140601916221220">"Okumnyama kokumhlophe"</string>
+ <string name="captions_settings_text_style_yellow_on_black" msgid="4681565950104511943">"Okuliphuzi kokumnyama"</string>
+ <string name="captions_settings_text_style_yellow_on_blue" msgid="5072521958156112239">"Okuliphuzi kokuluhlaza okwesibhakabhaka"</string>
</resources>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 62cb3be..8494071 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -27,4 +27,9 @@
<item>Always allow</item>
</string-array>
+ <!-- Packages allowed to retrieve Quick Controls from CarSettings -->
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item>com.android.systemui</item>
+ </string-array>
+
</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 0ffaf1b..6f94c9c 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -52,6 +52,7 @@
<!-- Title and icon resource ids to render on UI -->
<attr name="titleText" format="reference"/>
<attr name="icon" format="reference"/>
+ <attr name="mute_icon" format="reference"/>
</declare-styleable>
<declare-styleable name="PinPadView">
@@ -115,7 +116,6 @@
</declare-styleable>
<attr name="wifiSignalColor" format="color"/>
- <attr name="iconColor" format="color"/>
<attr name="dividerColor" format="color"/>
<attr name="profileSwitcherBackground" format="reference"/>
<attr name="profileSwitcherCurrentProfileColor" format="color"/>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 01351bd..43d6892 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -16,6 +16,13 @@
-->
<resources>
+ <!--
+ Default CarSettings icon color.
+ A color resource is used instead of an attribute since certain CarSettings drawables may be
+ used by other applications, which won't load colors specified in theme attributes.
+ -->
+ <color name="icon_color_default">@color/car_ui_text_color_primary</color>
+
<!-- Top-level icon colors -->
<color name="top_level_icon_default">@android:color/black</color>
<color name="top_level_display_icon">@color/top_level_icon_default</color>
@@ -31,6 +38,7 @@
<color name="top_level_storage_icon">@color/top_level_icon_default</color>
<color name="top_level_security_icon">@color/top_level_icon_default</color>
<color name="top_level_system_icon">@color/top_level_icon_default</color>
+ <color name="top_level_accessibility_icon">@color/top_level_icon_default</color>
<color name="top_level_assistant_and_voice_icon">@color/top_level_icon_default</color>
<!-- Default foreground color for injected top-level icons -->
<color name="top_level_injected_icon_default">@color/top_level_icon_default</color>
@@ -45,4 +53,11 @@
<color name="bluetooth_disabled_device_background_color">@android:color/black</color>
<color name="bluetooth_disabled_device_icon_color">#75FFFFFF</color>
<color name="bluetooth_device_icon_color">@android:color/white</color>
+
+ <!-- Quick Controls -->
+ <!--
+ By default, the Quick Controls view will tint the provided icon to the configured value.
+ Therefore, the color specified here is more of a placeholder to create the initial fill.
+ -->
+ <color name="qc_default_icon_color">@android:color/white</color>
</resources>
\ No newline at end of file
diff --git a/res/values/config.xml b/res/values/config.xml
index 76d3620..efba7cb 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -134,4 +134,10 @@
<string name="config_settingsintelligence_package_name" translatable="false">
com.android.settings.intelligence
</string>
+
+ <!--
+ Maximum number of devices to show for paired bluetooth device quick control.
+ Set to -1 for unlimited.
+ -->
+ <integer name="config_qc_bluetooth_device_limit">3</integer>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 5993a07..83fc956 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -73,9 +73,9 @@
<dimen name="bluetooth_pin_dialog_text_margin_start">@*android:dimen/car_keyline_3</dimen>
<dimen name="bluetooth_pin_dialog_text_margin_end">@*android:dimen/car_keyline_3</dimen>
<dimen name="bluetooth_pin_dialog_subtext_margin_top">@*android:dimen/car_padding_1</dimen>
- <dimen name="bluetooth_bonded_device_button_size">80dp</dimen>
+ <dimen name="bluetooth_bonded_device_button_size">72dp</dimen>
<dimen name="bluetooth_bonded_device_button_radius">16dp</dimen>
- <dimen name="bluetooth_bonded_device_foreground_icon_inset">18dp</dimen>
+ <dimen name="bluetooth_bonded_device_foreground_icon_inset">14dp</dimen>
<dimen name="bluetooth_bonded_device_border_width">2dp</dimen>
<dimen name="bluetooth_device_icon_size">44dp</dimen>
<dimen name="bluetooth_device_foreground_icon_inset">8dp</dimen>
@@ -104,11 +104,11 @@
<dimen name="profile_switcher_vertical_spacing_between_name_and_avatar">
@*android:dimen/car_padding_4
</dimen>
- <dimen name="profile_switcher_current_profile_circle_width">126dp</dimen>
+ <dimen name="profile_switcher_current_profile_circle_width">150dp</dimen>
<dimen name="profile_switcher_current_profile_circle_stroke_width">7dp</dimen>
<dimen name="profile_switcher_margin_bottom">@*android:dimen/car_padding_4</dimen>
<dimen name="profile_switcher_managed_badge_size">@*android:dimen/car_large_avatar_badge_size</dimen>
- <dimen name="profile_switcher_managed_badge_margin">1dp</dimen>
+ <dimen name="profile_switcher_managed_badge_margin">3dp</dimen>
<!-- Preferences -->
<dimen name="two_action_preference_divider_width">1dp</dimen>
@@ -142,7 +142,7 @@
<dimen name="progress_bar_preference_padding_bottom">@*android:dimen/car_padding_1</dimen>
<dimen name="multi_action_preference_item_divider_margin_end">12dp</dimen>
<dimen name="multi_action_preference_item_container_padding">@dimen/car_ui_padding_2</dimen>
- <dimen name="multi_action_preference_toggle_button_size">80dp</dimen>
+ <dimen name="multi_action_preference_toggle_button_size">72dp</dimen>
<dimen name="multi_action_preference_toggle_button_radius">11dp</dimen>
<dimen name="multi_action_preference_toggle_button_margin">12dp</dimen>
diff --git a/res/values/header_keys.xml b/res/values/header_keys.xml
index 4763d29..fb15c53 100644
--- a/res/values/header_keys.xml
+++ b/res/values/header_keys.xml
@@ -41,7 +41,6 @@
<string name="hk_WifiTetherActivity">@string/pk_network_and_internet_entry</string>
<string name="hk_MobileNetworkActivity">@string/pk_network_and_internet_entry</string>
<string name="hk_MobileNetworkListActivity">@string/pk_network_and_internet_entry</string>
- <string name="hk_DataUsageActivity">@string/pk_network_and_internet_entry</string>
<string name="hk_ApplicationsSettingsActivity">@string/pk_apps_settings_entry</string>
<string name="hk_SpecialAccessSettingsActivity">@string/pk_apps_settings_entry</string>
<string name="hk_LanguagesAndInputActivity">@string/pk_system_settings_entry</string>
@@ -63,4 +62,6 @@
<string name="hk_TextToSpeechOutputActivity">@string/pk_system_settings_entry</string>
<string name="hk_BluetoothDevicePickerActivity">@string/pk_bluetooth_settings_entry</string>
<string name="hk_DataWarningAndLimitActivity">pk_network_and_internet_entry</string>
+ <string name="hk_AccessibilitySettingsActivity">@string/pk_accessibility_settings_entry</string>
+ <string name="hk_CaptionsSettingsActivity">@string/pk_accessibility_settings_entry</string>
</resources>
\ No newline at end of file
diff --git a/res/values/integers.xml b/res/values/integers.xml
index fef060a..aad0f56 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -55,9 +55,12 @@
<!-- Maximum number of networks to be shown in LimitedWifiEntryListPreferenceController -->
<integer name="limited_wifi_entry_list_count">3</integer>
- <!-- Maximum number of networks to be shown in RecentNotificationsAppsPreferenceController -->
+ <!-- Maximum number of apps to be shown in RecentNotificationsAppsPreferenceController -->
<integer name="recent_notifications_apps_list_count">3</integer>
+ <!-- Maximum number of apps to be shown in MicrophoneRecentAccessesPreferenceController -->
+ <integer name="recent_microphone_access_apps_list_count">2</integer>
+
<!-- Maximum number of days old for a notification to be shown in
RecentNotificationsAppsPreferenceController -->
<integer name="recent_notifications_days_threshold">3</integer>
diff --git a/res/values/internal_resources.xml b/res/values/internal_resources.xml
index 73286d4..ea89dd5 100644
--- a/res/values/internal_resources.xml
+++ b/res/values/internal_resources.xml
@@ -21,5 +21,4 @@
<!-- Progress bar preference resources -->
<color name="config_progress_background_tint">@*android:color/config_progress_background_tint</color>
- <color name="white_disabled_material">@*android:color/white_disabled_material</color>
</resources>
diff --git a/res/values/overlayable.xml b/res/values/overlayable.xml
index 5746ecc..3eef05a 100644
--- a/res/values/overlayable.xml
+++ b/res/values/overlayable.xml
@@ -30,6 +30,7 @@
<item type="array" name="config_unbonded_device_filter_allowlist"/>
<item type="array" name="premium_sms_access_values"/>
<item type="array" name="recent_apps_ignored_packages"/>
+ <item type="array" name="settings_qc_provider_package_allowlist"/>
<item type="array" name="wifi_ap_band"/>
<item type="array" name="wifi_ap_band_config_2G_only"/>
<item type="array" name="wifi_ap_band_config_full"/>
@@ -58,6 +59,7 @@
<item type="attr" name="maxLabel"/>
<item type="attr" name="min"/>
<item type="attr" name="minLabel"/>
+ <item type="attr" name="mute_icon"/>
<item type="attr" name="profileSwitcherAddIconBackgroundColor"/>
<item type="attr" name="profileSwitcherAddIconColor"/>
<item type="attr" name="profileSwitcherBackground"/>
@@ -102,9 +104,13 @@
<item type="color" name="brightness_thumb_outer_ring_color"/>
<item type="color" name="car_grey_400_with_disable"/>
<item type="color" name="config_progress_background_tint"/>
+ <item type="color" name="icon_color_default"/>
+ <item type="color" name="qc_default_icon_color"/>
<item type="color" name="text_color_accent_with_disable"/>
<item type="color" name="toggle_bg"/>
<item type="color" name="toggle_icon_tint"/>
+ <item type="color" name="top_level_accessibility_background"/>
+ <item type="color" name="top_level_accessibility_icon"/>
<item type="color" name="top_level_applications_background"/>
<item type="color" name="top_level_applications_icon"/>
<item type="color" name="top_level_assistant_and_voice_background"/>
@@ -135,7 +141,7 @@
<item type="color" name="top_level_system_background"/>
<item type="color" name="top_level_system_icon"/>
<item type="color" name="top_level_units_icon"/>
- <item type="color" name="white_disabled_material"/>
+ <item type="color" name="white_disabled"/>
<item type="dimen" name="action_bar_height"/>
<item type="dimen" name="action_bar_no_icon_start_margin"/>
<item type="dimen" name="action_buttons_divider_height"/>
@@ -263,10 +269,14 @@
<item type="drawable" name="brightness_seekbar_track"/>
<item type="drawable" name="button_ripple_bg"/>
<item type="drawable" name="car_ic_navigation"/>
+ <item type="drawable" name="car_ic_navigation_mute"/>
+ <item type="drawable" name="car_ic_phone_volume"/>
+ <item type="drawable" name="car_ic_phone_volume_mute"/>
<item type="drawable" name="circle_bg"/>
<item type="drawable" name="circle_ripple_bg"/>
<item type="drawable" name="color_progress_bar"/>
<item type="drawable" name="ic_add"/>
+ <item type="drawable" name="ic_apps"/>
<item type="drawable" name="ic_arrow_back"/>
<item type="drawable" name="ic_arrow_drop_down"/>
<item type="drawable" name="ic_arrow_forward"/>
@@ -291,6 +301,7 @@
<item type="drawable" name="ic_check_circle"/>
<item type="drawable" name="ic_chevron_right"/>
<item type="drawable" name="ic_close"/>
+ <item type="drawable" name="ic_corp_icon"/>
<item type="drawable" name="ic_date_time"/>
<item type="drawable" name="ic_delete"/>
<item type="drawable" name="ic_edit"/>
@@ -313,6 +324,21 @@
<item type="drawable" name="ic_placeholder"/>
<item type="drawable" name="ic_profile"/>
<item type="drawable" name="ic_profile_add"/>
+ <item type="drawable" name="ic_qc_bluetooth"/>
+ <item type="drawable" name="ic_qc_bluetooth_media"/>
+ <item type="drawable" name="ic_qc_bluetooth_media_unavailable"/>
+ <item type="drawable" name="ic_qc_bluetooth_phone"/>
+ <item type="drawable" name="ic_qc_bluetooth_phone_unavailable"/>
+ <item type="drawable" name="ic_qc_brightness"/>
+ <item type="drawable" name="ic_qc_hotspot"/>
+ <item type="drawable" name="ic_qc_mobile_data"/>
+ <item type="drawable" name="ic_qc_wifi_disabled"/>
+ <item type="drawable" name="ic_qc_wifi_disconnected"/>
+ <item type="drawable" name="ic_qc_wifi_level_0"/>
+ <item type="drawable" name="ic_qc_wifi_level_1"/>
+ <item type="drawable" name="ic_qc_wifi_level_2"/>
+ <item type="drawable" name="ic_qc_wifi_level_3"/>
+ <item type="drawable" name="ic_qc_wifi_level_4"/>
<item type="drawable" name="ic_remove_circle"/>
<item type="drawable" name="ic_restore"/>
<item type="drawable" name="ic_settings_about"/>
@@ -324,6 +350,7 @@
<item type="drawable" name="ic_settings_data_usage"/>
<item type="drawable" name="ic_settings_development"/>
<item type="drawable" name="ic_settings_gear"/>
+ <item type="drawable" name="ic_settings_location_off"/>
<item type="drawable" name="ic_settings_night_display"/>
<item type="drawable" name="ic_settings_wifi"/>
<item type="drawable" name="ic_settings_wifi_disabled"/>
@@ -334,6 +361,7 @@
<item type="drawable" name="ic_sync_cancel"/>
<item type="drawable" name="ic_sync_problem"/>
<item type="drawable" name="ic_system_update"/>
+ <item type="drawable" name="ic_top_level_accessibility"/>
<item type="drawable" name="ic_top_level_applications"/>
<item type="drawable" name="ic_top_level_assistant_and_voice"/>
<item type="drawable" name="ic_top_level_bluetooth"/>
@@ -348,6 +376,7 @@
<item type="drawable" name="ic_top_level_system"/>
<item type="drawable" name="ic_translate"/>
<item type="drawable" name="ic_units"/>
+ <item type="drawable" name="ic_video_settings"/>
<item type="drawable" name="ic_warning"/>
<item type="drawable" name="ic_wifi_signal_0"/>
<item type="drawable" name="ic_wifi_signal_1"/>
@@ -390,7 +419,7 @@
<item type="id" name="checkbox"/>
<item type="id" name="current_profile_frame"/>
<item type="id" name="cycle_reset_day_of_month"/>
- <item type="id" name="data_limit_text"/>
+ <item type="id" name="data_usage_edit_text"/>
<item type="id" name="date_picker"/>
<item type="id" name="dismiss_button"/>
<item type="id" name="down_arrow_container"/>
@@ -451,7 +480,6 @@
<item type="id" name="quick_settings_brightness_seekbar"/>
<item type="id" name="quick_settings_list"/>
<item type="id" name="regulatory_info"/>
- <item type="id" name="remaining_billing_cycle_time_text"/>
<item type="id" name="restricted_message"/>
<item type="id" name="ringtone_picker_selected_id"/>
<item type="id" name="settings_car_ui_focus_area"/>
@@ -459,11 +487,13 @@
<item type="id" name="settings_focus_parking_view"/>
<item type="id" name="settings_recycler_view"/>
<item type="id" name="subtitle_text"/>
+ <item type="id" name="summary"/>
<item type="id" name="switch_widget"/>
<item type="id" name="text"/>
<item type="id" name="tile_icon"/>
<item type="id" name="tile_text"/>
<item type="id" name="time_picker"/>
+ <item type="id" name="title"/>
<item type="id" name="title_text"/>
<item type="id" name="toolbar_menu_item_0"/>
<item type="id" name="toolbar_menu_item_1"/>
@@ -477,6 +507,7 @@
<item type="integer" name="button_max_ems"/>
<item type="integer" name="clear_content_timeout_ms"/>
<item type="integer" name="config_networkAvoidBadWifi"/>
+ <item type="integer" name="config_qc_bluetooth_device_limit"/>
<item type="integer" name="config_top_level_icon_shape"/>
<item type="integer" name="content_weight"/>
<item type="integer" name="data_usage_bytes_threshold_ems"/>
@@ -491,6 +522,7 @@
<item type="integer" name="quick_setting_column_count"/>
<item type="integer" name="recent_apps_days_threshold"/>
<item type="integer" name="recent_apps_max_count"/>
+ <item type="integer" name="recent_microphone_access_apps_list_count"/>
<item type="integer" name="recent_notifications_apps_list_count"/>
<item type="integer" name="recent_notifications_days_threshold"/>
<item type="integer" name="user_switcher_num_col"/>
@@ -505,6 +537,7 @@
<item type="layout" name="confirm_lock_password"/>
<item type="layout" name="confirm_lock_pattern"/>
<item type="layout" name="confirm_lock_pin"/>
+ <item type="layout" name="data_usage_edit_text_preference"/>
<item type="layout" name="data_usage_summary_preference"/>
<item type="layout" name="date_picker"/>
<item type="layout" name="delete_preference_widget"/>
@@ -528,6 +561,7 @@
<item type="layout" name="settings_preference_fragment"/>
<item type="layout" name="settings_recyclerview_default"/>
<item type="layout" name="suggestion_preference"/>
+ <item type="layout" name="summary_preference"/>
<item type="layout" name="summary_preference_widget"/>
<item type="layout" name="switch_widget"/>
<item type="layout" name="tile"/>
@@ -537,22 +571,12 @@
<item type="layout" name="usage_bytes_threshold_picker"/>
<item type="layout" name="usage_cycle_reset_day_of_month_picker"/>
<item type="layout" name="usage_indicator_preference"/>
- <item type="plurals" name="billing_cycle_days_left"/>
- <item type="plurals" name="lockpassword_password_requires_letters"/>
- <item type="plurals" name="lockpassword_password_requires_lowercase"/>
- <item type="plurals" name="lockpassword_password_requires_nonletter"/>
- <item type="plurals" name="lockpassword_password_requires_numeric"/>
- <item type="plurals" name="lockpassword_password_requires_symbols"/>
- <item type="plurals" name="lockpassword_password_requires_uppercase"/>
- <item type="plurals" name="mobile_network_summary_count"/>
- <item type="plurals" name="runtime_permissions_additional_count"/>
- <item type="plurals" name="show_dev_countdown"/>
- <item type="plurals" name="unused_apps_summary"/>
- <item type="plurals" name="user_limit_reached_message"/>
<item type="string" name="about_settings"/>
<item type="string" name="about_settings_summary"/>
<item type="string" name="about_summary"/>
<item type="string" name="access_point_tag_key"/>
+ <item type="string" name="accessibility_settings_captions_title"/>
+ <item type="string" name="accessibility_settings_title"/>
<item type="string" name="account_auto_sync_summary"/>
<item type="string" name="account_auto_sync_title"/>
<item type="string" name="account_details_title"/>
@@ -564,6 +588,7 @@
<item type="string" name="accounts_settings_title"/>
<item type="string" name="action_not_reversible_message"/>
<item type="string" name="action_unavailable"/>
+ <item type="string" name="adas_settings_footer"/>
<item type="string" name="add_a_profile_button_text"/>
<item type="string" name="add_account_title"/>
<item type="string" name="add_an_account"/>
@@ -582,6 +607,15 @@
<item type="string" name="all_applications"/>
<item type="string" name="allow"/>
<item type="string" name="app_data_usage"/>
+ <item type="string" name="app_data_usage_allow_data_summary"/>
+ <item type="string" name="app_data_usage_allow_data_title"/>
+ <item type="string" name="app_data_usage_background"/>
+ <item type="string" name="app_data_usage_background_data_summary"/>
+ <item type="string" name="app_data_usage_foreground"/>
+ <item type="string" name="app_data_usage_restrict_data_title"/>
+ <item type="string" name="app_data_usage_title"/>
+ <item type="string" name="app_data_usage_total_usage"/>
+ <item type="string" name="app_data_usage_usage_history_title"/>
<item type="string" name="app_disable_dialog_positive"/>
<item type="string" name="app_disable_dialog_text"/>
<item type="string" name="app_launch_domain_links_title"/>
@@ -629,6 +663,7 @@
<item type="string" name="autofill_settings_title"/>
<item type="string" name="backspace_key"/>
<item type="string" name="baseband_version"/>
+ <item type="string" name="billing_cycle_days_left"/>
<item type="string" name="billing_cycle_less_than_one_day_left"/>
<item type="string" name="billing_cycle_none_left"/>
<item type="string" name="bluetooth_ask_disablement"/>
@@ -682,6 +717,22 @@
<item type="string" name="build_info_fmt"/>
<item type="string" name="build_number"/>
<item type="string" name="cancel"/>
+ <item type="string" name="captions_settings_off"/>
+ <item type="string" name="captions_settings_on"/>
+ <item type="string" name="captions_settings_style_header"/>
+ <item type="string" name="captions_settings_text_size_default"/>
+ <item type="string" name="captions_settings_text_size_large"/>
+ <item type="string" name="captions_settings_text_size_small"/>
+ <item type="string" name="captions_settings_text_size_very_large"/>
+ <item type="string" name="captions_settings_text_size_very_small"/>
+ <item type="string" name="captions_settings_text_style_black_on_white"/>
+ <item type="string" name="captions_settings_text_style_by_app"/>
+ <item type="string" name="captions_settings_text_style_white_on_black"/>
+ <item type="string" name="captions_settings_text_style_yellow_on_black"/>
+ <item type="string" name="captions_settings_text_style_yellow_on_blue"/>
+ <item type="string" name="captions_settings_title"/>
+ <item type="string" name="captions_text_size_title"/>
+ <item type="string" name="captions_text_style_title"/>
<item type="string" name="carrier_and_update_now_text"/>
<item type="string" name="carrier_and_update_text"/>
<item type="string" name="cell_data_limit"/>
@@ -722,6 +773,7 @@
<item type="string" name="cycle_reset_day_of_month_picker_subtitle"/>
<item type="string" name="cycle_reset_day_of_month_picker_title"/>
<item type="string" name="data_limit"/>
+ <item type="string" name="data_usage_all_apps_title"/>
<item type="string" name="data_usage_app_restricted"/>
<item type="string" name="data_usage_app_summary_title"/>
<item type="string" name="data_usage_auto_sync_off_dialog"/>
@@ -732,9 +784,12 @@
<item type="string" name="data_usage_limit_dialog_title"/>
<item type="string" name="data_usage_limit_editor_title"/>
<item type="string" name="data_usage_settings"/>
+ <item type="string" name="data_usage_settings_footer"/>
<item type="string" name="data_usage_summary_title"/>
<item type="string" name="data_usage_title"/>
+ <item type="string" name="data_usage_usage_history_title"/>
<item type="string" name="data_usage_warning_editor_title"/>
+ <item type="string" name="data_usage_warning_save_title"/>
<item type="string" name="data_used_formatted"/>
<item type="string" name="data_warning"/>
<item type="string" name="data_warning_limit_title"/>
@@ -750,6 +805,7 @@
<item type="string" name="date_time_set_time_title"/>
<item type="string" name="date_time_set_timezone"/>
<item type="string" name="date_time_set_timezone_title"/>
+ <item type="string" name="deactivate_and_uninstall_device_admin"/>
<item type="string" name="decline_remote_bugreport_action"/>
<item type="string" name="default_admin_support_msg"/>
<item type="string" name="default_app_selected_app"/>
@@ -770,7 +826,11 @@
<item type="string" name="delete_user_error_title"/>
<item type="string" name="deny"/>
<item type="string" name="developer_options_settings"/>
+ <item type="string" name="device_admin_activated_apps"/>
<item type="string" name="device_admin_add_title"/>
+ <item type="string" name="device_admin_apps_description"/>
+ <item type="string" name="device_admin_apps_list_empty"/>
+ <item type="string" name="device_admin_deactivated_apps"/>
<item type="string" name="device_admin_status"/>
<item type="string" name="device_admin_warning"/>
<item type="string" name="device_info_not_available"/>
@@ -779,10 +839,8 @@
<item type="string" name="device_status_summary"/>
<item type="string" name="direct_boot_unaware_dialog_message_car"/>
<item type="string" name="disable_text"/>
- <item type="string" name="disabled_by_policy_content_biometric_parental_consent"/>
<item type="string" name="disabled_by_policy_title"/>
<item type="string" name="disabled_by_policy_title_adjust_volume"/>
- <item type="string" name="disabled_by_policy_title_biometric_parental_consent"/>
<item type="string" name="disabled_by_policy_title_camera"/>
<item type="string" name="disabled_by_policy_title_financed_device"/>
<item type="string" name="disabled_by_policy_title_outgoing_calls"/>
@@ -797,11 +855,40 @@
<item type="string" name="domain_urls_summary_none"/>
<item type="string" name="domain_urls_summary_one"/>
<item type="string" name="domain_urls_summary_some"/>
+ <item type="string" name="driver_assistance_settings_title"/>
+ <item type="string" name="driver_assistance_warning_confirm_label"/>
<item type="string" name="edit_user_name_title"/>
<item type="string" name="eight"/>
<item type="string" name="empty_placeholder"/>
<item type="string" name="enable_text"/>
<item type="string" name="enter_key"/>
+ <item type="string" name="enterprise_privacy_always_on_vpn_device"/>
+ <item type="string" name="enterprise_privacy_bug_reports"/>
+ <item type="string" name="enterprise_privacy_ca_certs_personal"/>
+ <item type="string" name="enterprise_privacy_camera_access"/>
+ <item type="string" name="enterprise_privacy_device_access_category"/>
+ <item type="string" name="enterprise_privacy_enterprise_data"/>
+ <item type="string" name="enterprise_privacy_enterprise_installed_packages"/>
+ <item type="string" name="enterprise_privacy_enterprise_set_default_apps"/>
+ <item type="string" name="enterprise_privacy_exposure_category"/>
+ <item type="string" name="enterprise_privacy_exposure_changes_category"/>
+ <item type="string" name="enterprise_privacy_failed_password_wipe_current_user"/>
+ <item type="string" name="enterprise_privacy_failed_password_wipe_device"/>
+ <item type="string" name="enterprise_privacy_global_http_proxy"/>
+ <item type="string" name="enterprise_privacy_header"/>
+ <item type="string" name="enterprise_privacy_input_method"/>
+ <item type="string" name="enterprise_privacy_input_method_name"/>
+ <item type="string" name="enterprise_privacy_installed_packages"/>
+ <item type="string" name="enterprise_privacy_location_access"/>
+ <item type="string" name="enterprise_privacy_lock_device"/>
+ <item type="string" name="enterprise_privacy_microphone_access"/>
+ <item type="string" name="enterprise_privacy_network_logs"/>
+ <item type="string" name="enterprise_privacy_none"/>
+ <item type="string" name="enterprise_privacy_security_logs"/>
+ <item type="string" name="enterprise_privacy_settings"/>
+ <item type="string" name="enterprise_privacy_settings_summary_generic"/>
+ <item type="string" name="enterprise_privacy_usage_stats"/>
+ <item type="string" name="enterprise_privacy_wipe_device"/>
<item type="string" name="error_saving_lockpattern"/>
<item type="string" name="error_saving_lockpin"/>
<item type="string" name="error_saving_password"/>
@@ -822,6 +909,7 @@
<item type="string" name="factory_reset_title"/>
<item type="string" name="firmware_version"/>
<item type="string" name="five"/>
+ <item type="string" name="footer_learn_more_content_description"/>
<item type="string" name="force_stop"/>
<item type="string" name="force_stop_dialog_text"/>
<item type="string" name="force_stop_dialog_title"/>
@@ -838,6 +926,7 @@
<item type="string" name="hide_system"/>
<item type="string" name="hide_system_apps"/>
<item type="string" name="hk_AboutSettingsActivity"/>
+ <item type="string" name="hk_AccessibilitySettingsActivity"/>
<item type="string" name="hk_AddWifiActivity"/>
<item type="string" name="hk_ApplicationsDetailsActivity"/>
<item type="string" name="hk_ApplicationsSettingsActivity"/>
@@ -845,8 +934,8 @@
<item type="string" name="hk_AssistantAndVoiceSettingsActivity"/>
<item type="string" name="hk_BluetoothDevicePickerActivity"/>
<item type="string" name="hk_BluetoothSettingsActivity"/>
+ <item type="string" name="hk_CaptionsSettingsActivity"/>
<item type="string" name="hk_ChooseAccountActivity"/>
- <item type="string" name="hk_DataUsageActivity"/>
<item type="string" name="hk_DataWarningAndLimitActivity"/>
<item type="string" name="hk_DatetimeSettingsActivity"/>
<item type="string" name="hk_DefaultAutofillPickerActivity"/>
@@ -901,6 +990,12 @@
<item type="string" name="license_title"/>
<item type="string" name="link_speed"/>
<item type="string" name="loading_wifi_list"/>
+ <item type="string" name="location_driver_assistance_action_text"/>
+ <item type="string" name="location_driver_assistance_toggle_off_summary"/>
+ <item type="string" name="location_driver_assistance_toggle_off_title"/>
+ <item type="string" name="location_driver_assistance_toggle_off_warning"/>
+ <item type="string" name="location_driver_assistance_toggle_summary"/>
+ <item type="string" name="location_driver_assistance_toggle_title"/>
<item type="string" name="location_settings_app_permissions_title"/>
<item type="string" name="location_settings_footer"/>
<item type="string" name="location_settings_recent_requests_empty_message"/>
@@ -908,6 +1003,9 @@
<item type="string" name="location_settings_services_title"/>
<item type="string" name="location_settings_title"/>
<item type="string" name="location_state_switch_content_description"/>
+ <item type="string" name="location_toggle_off_warning"/>
+ <item type="string" name="location_toggle_summary"/>
+ <item type="string" name="location_toggle_title"/>
<item type="string" name="location_use_location_title"/>
<item type="string" name="lock_settings_enter_password"/>
<item type="string" name="lock_settings_enter_pattern"/>
@@ -930,6 +1028,7 @@
<item type="string" name="lockpassword_pin_too_short"/>
<item type="string" name="lockpattern_cancel_button_text"/>
<item type="string" name="lockpattern_confirm_button_text"/>
+ <item type="string" name="lockpattern_does_not_support_rotary"/>
<item type="string" name="lockpattern_need_to_confirm"/>
<item type="string" name="lockpattern_pattern_confirmed"/>
<item type="string" name="lockpattern_pattern_entered"/>
@@ -948,18 +1047,34 @@
<item type="string" name="lockscreen_skip_button_text"/>
<item type="string" name="lockscreen_wrong_password"/>
<item type="string" name="lockscreen_wrong_pin"/>
+ <item type="string" name="manage_device_admin"/>
<item type="string" name="manage_keyboard"/>
<item type="string" name="manage_other_profiles_button_text"/>
<item type="string" name="manual"/>
<item type="string" name="media_volume_summary"/>
<item type="string" name="media_volume_title"/>
<item type="string" name="memory_calculating_size"/>
+ <item type="string" name="microphone_app_permission_summary_microphone_off"/>
+ <item type="string" name="microphone_app_permission_summary_microphone_on"/>
+ <item type="string" name="microphone_manage_permissions"/>
+ <item type="string" name="microphone_no_recent_access"/>
+ <item type="string" name="microphone_recently_accessed"/>
+ <item type="string" name="microphone_settings_loading_app_permission_stats"/>
+ <item type="string" name="microphone_settings_recent_requests_title"/>
+ <item type="string" name="microphone_settings_recent_requests_view_all_title"/>
+ <item type="string" name="microphone_settings_title"/>
+ <item type="string" name="microphone_toggle_summary"/>
+ <item type="string" name="microphone_toggle_title"/>
+ <item type="string" name="mobile_data_usage"/>
<item type="string" name="mobile_network_active_esim"/>
<item type="string" name="mobile_network_active_sim"/>
<item type="string" name="mobile_network_inactive_esim"/>
<item type="string" name="mobile_network_inactive_sim"/>
<item type="string" name="mobile_network_list_add_more"/>
+ <item type="string" name="mobile_network_mobile_network_toggle_summary"/>
+ <item type="string" name="mobile_network_mobile_network_toggle_title"/>
<item type="string" name="mobile_network_settings"/>
+ <item type="string" name="mobile_network_summary_count"/>
<item type="string" name="mobile_network_toggle_summary"/>
<item type="string" name="mobile_network_toggle_title"/>
<item type="string" name="model_info"/>
@@ -976,7 +1091,11 @@
<item type="string" name="network_and_internet_data_usage_time_range_summary"/>
<item type="string" name="network_and_internet_join_other_network_title"/>
<item type="string" name="network_and_internet_network_preferences_title"/>
+ <item type="string" name="network_and_internet_oem_network_dialog_confirm_label"/>
+ <item type="string" name="network_and_internet_oem_network_dialog_description"/>
+ <item type="string" name="network_and_internet_oem_network_disabled_footer"/>
<item type="string" name="network_and_internet_oem_network_title"/>
+ <item type="string" name="network_and_internet_vehicle_internet_title"/>
<item type="string" name="network_connection_connect_successful"/>
<item type="string" name="network_connection_errorstate_dialog_message"/>
<item type="string" name="network_connection_request_dialog_showall"/>
@@ -1000,25 +1119,30 @@
<item type="string" name="notifications_all_apps"/>
<item type="string" name="notifications_label"/>
<item type="string" name="notifications_recently_sent"/>
+ <item type="string" name="number_of_device_admins"/>
+ <item type="string" name="number_of_device_admins_none"/>
<item type="string" name="okay"/>
<item type="string" name="one"/>
<item type="string" name="outgoing_calls_permission_title"/>
- <item type="string" name="peak_performance_dialog_action_off"/>
- <item type="string" name="peak_performance_dialog_action_on"/>
- <item type="string" name="peak_performance_dialog_text"/>
- <item type="string" name="peak_performance_dialog_title"/>
- <item type="string" name="peak_performance_label"/>
- <item type="string" name="peak_performance_summary"/>
<item type="string" name="permissions_label"/>
<item type="string" name="power_component_disabled"/>
<item type="string" name="premium_sms_access_description"/>
<item type="string" name="premium_sms_access_title"/>
+ <item type="string" name="prioritize_app_performance_dialog_action_off"/>
+ <item type="string" name="prioritize_app_performance_dialog_action_on"/>
+ <item type="string" name="prioritize_app_performance_dialog_text"/>
+ <item type="string" name="prioritize_app_performance_dialog_title"/>
+ <item type="string" name="prioritize_app_performance_label"/>
+ <item type="string" name="prioritize_app_performance_summary"/>
<item type="string" name="privacy_location_summary"/>
<item type="string" name="privacy_settings_title"/>
<item type="string" name="privacy_vehicle_data_title"/>
<item type="string" name="profiles_and_accounts_settings_title"/>
<item type="string" name="profiles_list_title"/>
<item type="string" name="progress_scanning"/>
+ <item type="string" name="qc_bluetooth_off_devices_info"/>
+ <item type="string" name="qc_bluetooth_on_no_devices_info"/>
+ <item type="string" name="qc_display_brightness"/>
<item type="string" name="really_remove_account_message"/>
<item type="string" name="really_remove_account_title"/>
<item type="string" name="regulatory_info_text"/>
@@ -1058,10 +1182,12 @@
<item type="string" name="roaming_summary"/>
<item type="string" name="roaming_title"/>
<item type="string" name="roaming_warning"/>
+ <item type="string" name="runtime_permissions_additional_count"/>
<item type="string" name="runtime_permissions_summary_no_permissions_granted"/>
<item type="string" name="runtime_permissions_summary_no_permissions_requested"/>
<item type="string" name="safety_and_regulatory_info"/>
<item type="string" name="screen_lock_options"/>
+ <item type="string" name="screen_reader_settings_title"/>
<item type="string" name="security_lock_none"/>
<item type="string" name="security_lock_password"/>
<item type="string" name="security_lock_pattern"/>
@@ -1085,7 +1211,9 @@
<item type="string" name="share_remote_bugreport_dialog_message_finished"/>
<item type="string" name="share_remote_bugreport_dialog_title"/>
<item type="string" name="sharing_remote_bugreport_dialog_message"/>
+ <item type="string" name="show_captions_toggle_title"/>
<item type="string" name="show_dev_already"/>
+ <item type="string" name="show_dev_countdown"/>
<item type="string" name="show_dev_on"/>
<item type="string" name="show_password"/>
<item type="string" name="show_system"/>
@@ -1230,6 +1358,7 @@
<item type="string" name="units_unit_name_year"/>
<item type="string" name="units_volume_title"/>
<item type="string" name="unused_apps"/>
+ <item type="string" name="unused_apps_summary"/>
<item type="string" name="unused_apps_switch"/>
<item type="string" name="usage_access_description"/>
<item type="string" name="usage_access_title"/>
@@ -1243,6 +1372,7 @@
<item type="string" name="user_cannot_add_accounts_message"/>
<item type="string" name="user_details_admin_title"/>
<item type="string" name="user_guest"/>
+ <item type="string" name="user_limit_reached_message"/>
<item type="string" name="user_limit_reached_title"/>
<item type="string" name="user_name_label"/>
<item type="string" name="user_new_user_name"/>
@@ -1276,6 +1406,7 @@
<item type="string" name="wifi_control_title"/>
<item type="string" name="wifi_details_ipv6_address_header"/>
<item type="string" name="wifi_disabled"/>
+ <item type="string" name="wifi_disconnected"/>
<item type="string" name="wifi_dns"/>
<item type="string" name="wifi_error"/>
<item type="string" name="wifi_failed_connect_message"/>
@@ -1291,6 +1422,7 @@
<item type="string" name="wifi_hotspot_password_title"/>
<item type="string" name="wifi_hotspot_security_none"/>
<item type="string" name="wifi_hotspot_security_title"/>
+ <item type="string" name="wifi_hotspot_state_off"/>
<item type="string" name="wifi_hotspot_state_switch_content_description"/>
<item type="string" name="wifi_hotspot_wpa2_personal"/>
<item type="string" name="wifi_ip_address"/>
@@ -1343,10 +1475,13 @@
<item type="style" name="PreferenceButtonIconAppearance"/>
<item type="style" name="PreferenceButtonTextAppearance"/>
<item type="xml" name="about_settings_fragment"/>
+ <item type="xml" name="accessibility_settings_fragment"/>
<item type="xml" name="account_details_fragment"/>
<item type="xml" name="account_sync_details_fragment"/>
+ <item type="xml" name="adas_location_fragment"/>
<item type="xml" name="add_wifi_fragment"/>
<item type="xml" name="app_data_usage_fragment"/>
+ <item type="xml" name="app_specific_data_usage_fragment"/>
<item type="xml" name="app_storage_settings_details_fragment"/>
<item type="xml" name="application_details_fragment"/>
<item type="xml" name="application_launch_settings_fragment"/>
@@ -1357,19 +1492,22 @@
<item type="xml" name="bluetooth_device_picker_fragment"/>
<item type="xml" name="bluetooth_pairing_selection_fragment"/>
<item type="xml" name="bluetooth_settings_fragment"/>
+ <item type="xml" name="captions_settings_fragment"/>
<item type="xml" name="car_volume_items"/>
<item type="xml" name="child_locale_picker_fragment"/>
<item type="xml" name="choose_account_fragment"/>
<item type="xml" name="choose_lock_type_fragment"/>
<item type="xml" name="choose_new_admin_fragment"/>
- <item type="xml" name="data_usage_fragment"/>
+ <item type="xml" name="data_usage_set_threshold_fragment"/>
<item type="xml" name="data_warning_and_limit_fragment"/>
<item type="xml" name="datetime_settings_fragment"/>
<item type="xml" name="default_autofill_picker_fragment"/>
<item type="xml" name="default_voice_input_picker_fragment"/>
<item type="xml" name="developer_options_fragment"/>
<item type="xml" name="device_admin_add"/>
+ <item type="xml" name="device_admin_apps_fragment"/>
<item type="xml" name="display_settings_fragment"/>
+ <item type="xml" name="enterprise_privacy_settings_fragment"/>
<item type="xml" name="factory_reset_confirm_fragment"/>
<item type="xml" name="factory_reset_fragment"/>
<item type="xml" name="file_paths"/>
@@ -1383,6 +1521,7 @@
<item type="xml" name="location_recent_requests_fragment"/>
<item type="xml" name="location_settings_fragment"/>
<item type="xml" name="manage_domain_urls_fragment"/>
+ <item type="xml" name="microphone_recent_requests_view_all_fragment"/>
<item type="xml" name="mobile_network_fragment"/>
<item type="xml" name="mobile_network_list_fragment"/>
<item type="xml" name="modify_system_settings_fragment"/>
@@ -1391,6 +1530,7 @@
<item type="xml" name="notifications_fragment"/>
<item type="xml" name="preferred_engine_fragment"/>
<item type="xml" name="premium_sms_access_fragment"/>
+ <item type="xml" name="privacy_microphone_settings_fragment"/>
<item type="xml" name="privacy_settings_fragment"/>
<item type="xml" name="profile_details_fragment"/>
<item type="xml" name="profile_details_permissions_fragment"/>
diff --git a/res/values/preference_keys.xml b/res/values/preference_keys.xml
index e808d19..cc65199 100644
--- a/res/values/preference_keys.xml
+++ b/res/values/preference_keys.xml
@@ -69,6 +69,13 @@
<string name="pk_data_usage_summary" translatable="false">data_usage_summary</string>
<string name="pk_data_warning_and_limit" translatable="false">data_warning_and_limit</string>
<string name="pk_data_usage_cycle" translatable="false">data_usage_cycle</string>
+ <string name="pk_data_usage_footer" translatable="false">data_usage_footer</string>
+ <string name="pk_data_usage_edit_text" translatable="false">data_usage_edit_text</string>
+ <string name="pk_data_usage_radio_group" translatable="false">
+ data_usage_radio_group
+ </string>
+ <string name="pk_data_usage_radio_gb" translatable="false">data_usage_radio_gb</string>
+ <string name="pk_data_usage_radio_mb" translatable="false">data_usage_radio_mb</string>
<string name="pk_data_warning_group" translatable="false">data_warning_group</string>
<string name="pk_data_set_warning" translatable="false">data_set_warning</string>
<string name="pk_data_warning" translatable="false">data_warning</string>
@@ -77,6 +84,15 @@
<string name="pk_data_limit" translatable="false">data_limit</string>
<string name="pk_app_data_usage" translatable="false">app_data_usage</string>
<string name="pk_app_data_usage_detail" translatable="false">app_data_usage_detail</string>
+ <string name="pk_data_usage_usage_history" translatable="false">data_usage_usage_history</string>
+ <string name="pk_data_usage_all_apps" translatable="false">data_usage_all_apps</string>
+ <string name="pk_app_specific_usage_title" translatable="false">app_specific_usage_title</string>
+ <string name="pk_app_specific_usage_cycle" translatable="false">app_specific_usage_cycle</string>
+ <string name="pk_app_specific_usage_total" translatable="false">app_specific_usage_total</string>
+ <string name="pk_app_specific_usage_foreground" translatable="false">app_specific_usage_foreground</string>
+ <string name="pk_app_specific_usage_background" translatable="false">app_specific_usage_background</string>
+ <string name="pk_app_specific_allow_data" translatable="false">app_specific_allow_data</string>
+ <string name="pk_app_specific_allow_background_data" translatable="false">app_specific_allow_background_data</string>
<string name="pk_wifi_tether_settings_entry" translatable="false">wifi_tether_settings_entry
</string>
<string name="pk_wifi_tether_security" translatable="false">wifi_tether_security</string>
@@ -183,8 +199,8 @@
<string name="pk_application_details_storage" translatable="false">
application_details_storage
</string>
- <string name="pk_application_details_peak_performance" translatable="false">
- pk_application_details_peak_performance
+ <string name="pk_application_details_prioritize_app_performance" translatable="false">
+ pk_application_details_prioritize_app_performance
</string>
<string name="pk_hibernation_switch" translatable="false">
hibernation_switch
@@ -267,6 +283,7 @@
<string name="pk_accounts_extra_settings" translatable="false">accounts_extra_settings</string>
<string name="pk_account_auto_sync" translatable="false">account_auto_sync</string>
<string name="pk_add_account" translatable="false">add_account</string>
+ <string name="pk_add_account_enterprise_disclosure_footer" translatable="false">add_account_enterprise_disclosure_footer</string>
<string name="pk_account_details" translatable="false">account_details</string>
<string name="pk_account_sync" translatable="false">account_sync</string>
<string name="pk_account_details_with_sync" translatable="false">account_details_with_sync
@@ -363,13 +380,35 @@
<string name="pk_location_services" translatable="false">location_services</string>
<string name="pk_location_footer" translatable="false">location_footer</string>
<string name="pk_location_state_switch" translatable="false">location_state_switch</string>
+ <string name="pk_location_driver_assistance_state_switch" translatable="false">
+ driver_assistance_state_switch
+ </string>
+ <string name="pk_location_driver_assistance_preference_group" translatable="false">
+ driver_assistance_preference_group
+ </string>
+
+ <!-- Microphone Settings -->
+ <string name="pk_microphone_state_switch" translatable="false">microphone_state_switch</string>
+ <string name="pk_microphone_manage_permissions" translatable="false">
+ microphone_manage_permissions
+ </string>
+ <string name="pk_microphone_recent_accesses_category" translatable="false">
+ microphone_recent_accesses_category
+ </string>
+ <string name="pk_microphone_recent_accesses_view_all_entry" translatable="false">
+ microphone_recent_accesses_view_all_entry
+ </string>
+ <string name="pk_microphone_recent_requests" translatable="false">
+ microphone_recent_requests
+ </string>
<!-- Profiles and Accounts Settings -->
<string name="pk_profiles_list" translatable="false">profiles_list</string>
<string name="pk_add_profile" translatable="false">add_profile</string>
<string name="pk_choose_new_admin" translatable="false">choose_new_admin</string>
<string name="pk_profile_details_header" translatable="false">profile_details_header</string>
- <string name="pk_profile_details_action_buttons" translatable="false">profile_details_action_buttons
+ <string name="pk_profile_details_action_buttons" translatable="false">
+ profile_details_action_buttons
</string>
<string name="pk_profile_details_permissions_header" translatable="false">
profile_details_permissions_header
@@ -378,6 +417,7 @@
profile_details_permissions_action_buttons
</string>
<string name="pk_profile_details_delete" translatable="false">profile_details_delete</string>
+ <string name="pk_profile_details_end_session" translatable="false">profile_details_end_session</string>
<string name="pk_profile_permissions" translatable="false">profile_permissions</string>
<!-- Security Settings -->
@@ -478,6 +518,10 @@
<!-- Developer Options -->
<string name="pk_usb_debugging_toggle" translatable="false">usb_debugging_toggle</string>
+ <!-- Security -->
+ <string name="pk_enterprise_privacy_settings" translatable="false">enterprise_privacy_settings</string>
+ <string name="pk_manage_device_admin_settings" translatable="false">manage_device_admin_settings</string>
+
<!-- Device Admin -->
<string name="pk_device_admin_add_header" translatable="false">device_admin_add_header</string>
<string name="pk_device_admin_add_explanation" translatable="false">device_admin_add_explanation</string>
@@ -486,4 +530,38 @@
<string name="pk_device_admin_add_support" translatable="false">device_admin_add_support</string>
<string name="pk_device_admin_add_action" translatable="false">device_admin_add_action</string>
<string name="pk_device_admin_add_cancel" translatable="false">device_admin_add_cancel</string>
+ <string name="pk_device_admin_activated_apps" translatable="false">device_admin_activated_apps</string>
+ <string name="pk_device_admin_deactivated_apps" translatable="false">device_admin_deactivated_apps</string>
+ <string name="pk_device_admin_apps_description" translatable="false">device_admin_apps_description</string>
+
+ <!-- Enterprise Privacy -->
+ <string name="pk_enterprise_privacy_always_on_vpn_primary_user" translatable="false">enterprise_privacy_always_on_vpn_primary_user</string>
+ <string name="pk_enterprise_privacy_bug_reports" translatable="false">enterprise_privacy_bug_reports</string>
+ <string name="pk_enterprise_privacy_ca_certs_current_user" translatable="false">enterprise_privacy_ca_certs_current_user</string>
+ <string name="pk_enterprise_privacy_enterprise_data" translatable="false">enterprise_privacy_enterprise_data</string>
+ <string name="pk_enterprise_privacy_exposure_category" translatable="false">enterprise_privacy_exposure_category</string>
+ <string name="pk_enterprise_privacy_exposure_changes_category" translatable="false">enterprise_privacy_exposure_changes_category</string>
+ <string name="pk_enterprise_privacy_failed_password_wipe_current_user" translatable="false">enterprise_privacy_failed_password_wipe_current_user</string>
+ <string name="pk_enterprise_privacy_global_http_proxy" translatable="false">enterprise_privacy_global_http_proxy</string>
+ <string name="pk_enterprise_privacy_header" translatable="false">enterprise_privacy_header</string>
+ <string name="pk_enterprise_privacy_input_method" translatable="false">enterprise_privacy_input_method</string>
+ <string name="pk_enterprise_privacy_installed_packages" translatable="false">enterprise_privacy_installed_packages</string>
+ <string name="pk_enterprise_privacy_lock_device" translatable="false">enterprise_privacy_lock_device</string>
+ <string name="pk_enterprise_privacy_network_logs" translatable="false">enterprise_privacy_network_logs</string>
+ <string name="pk_enterprise_privacy_number_camera_access_packages" translatable="false">enterprise_privacy_number_camera_access_packages</string>
+ <string name="pk_enterprise_privacy_number_enterprise_installed_packages" translatable="false">enterprise_privacy_number_enterprise_installed_packages</string>
+ <string name="pk_enterprise_privacy_number_enterprise_set_default_apps" translatable="false">enterprise_privacy_number_enterprise_set_default_apps</string>
+ <string name="pk_enterprise_privacy_number_location_access_packages" translatable="false">enterprise_privacy_number_location_access_packages</string>
+ <string name="pk_enterprise_privacy_number_microphone_access_packages" translatable="false">enterprise_privacy_number_microphone_access_packages</string>
+ <string name="pk_enterprise_privacy_security_logs" translatable="false">enterprise_privacy_security_logs</string>
+ <string name="pk_enterprise_privacy_usage_stats" translatable="false">enterprise_privacy_usage_stats</string>
+ <string name="pk_enterprise_privacy_wipe_device" translatable="false">enterprise_privacy_wipe_device</string>
+
+ <!-- Accessibility -->
+ <string name="pk_accessibility_settings_entry" translatable="false">accessibility_settings_entry</string>
+ <string name="pk_captions_settings_header" translatable="false">captions_settings_header</string>
+ <string name="pk_show_captions_switch" translatable="false">show_captions_switch</string>
+ <string name="pk_captions_settings_style_subheader" translatable="false">captions_settings_style_subheader</string>
+ <string name="pk_captions_size_settings_entry" translatable="false">captions_size_settings_entry</string>
+ <string name="pk_captions_style_settings_entry" translatable="false">captions_style_settings_entry</string>
</resources>
diff --git a/res/values/preference_screen_keys.xml b/res/values/preference_screen_keys.xml
index a9536df..2ce8595 100644
--- a/res/values/preference_screen_keys.xml
+++ b/res/values/preference_screen_keys.xml
@@ -38,13 +38,18 @@
<string name="psk_choose_account" translatable="false">choose_account_screen</string>
<string name="psk_choose_lock_type" translatable="false">choose_lock_type_screen</string>
<string name="psk_choose_new_admin" translatable="false">choose_new_admin_screen</string>
- <string name="psk_data_usage" translatable="false">data_usage_screen</string>
+ <string name="psk_data_usage_set_threshold" translatable="false">data_usage_set_threshold_screen</string>
<string name="psk_data_warning_and_limit" translatable="false">data_warning_and_limit_screen</string>
<string name="psk_datetime_settings" translatable="false">datetime_settings_screen</string>
<string name="psk_default_autofill_picker" translatable="false">default_autofill_picker_screen</string>
<string name="psk_default_voice_input_picker" translatable="false">default_voice_input_picker_screen</string>
<string name="psk_developer_options" translatable="false">developer_options_screen</string>
<string name="psk_device_admin_add" translatable="false">device_admin_add_screen</string>
+ <string name="psk_device_admin_apps" translatable="false">device_admin_apps_screen</string>
+ <string name="psk_enterprise_privacy_device_access_category" translatable="false">enterprise_privacy_device_access_category</string>
+ <string name="psk_enterprise_privacy_exposure_category" translatable="false">enterprise_privacy_exposure_category</string>
+ <string name="psk_enterprise_privacy_exposure_changes_category" translatable="false">enterprise_privacy_exposure_changes_category</string>
+ <string name="psk_enterprise_privacy_settings" translatable="false">enterprise_privacy_settings</string>
<string name="psk_display_settings" translatable="false">display_settings_screen</string>
<string name="psk_hardware_info" translatable="false">hardware_info_screen</string>
<string name="psk_homepage" translatable="false">homepage_screen</string>
@@ -55,6 +60,9 @@
<string name="psk_legal_information" translatable="false">legal_information_screen</string>
<string name="psk_location_recent_requests" translatable="false">location_recent_requests_screen</string>
<string name="psk_location_settings" translatable="false">location_settings_screen</string>
+ <string name="psk_adas_settings" translatable="false">adas_settings_screen</string>
+ <string name="psk_microphone_recent_requests" translatable="false">microphone_recent_requests_screen</string>
+ <string name="psk_microphone_settings" translatable="false">microphone_settings_screen</string>
<string name="psk_assistant_and_voice_settings" translatable="false">assistant_and_voice_settings</string>
<string name="psk_manage_domain_urls" translatable="false">manage_domain_urls_screen</string>
<string name="psk_factory_reset_confirm" translatable="false">factory_reset_confirm_screen</string>
@@ -73,6 +81,7 @@
<string name="psk_reset_network_confirm" translatable="false">reset_network_confirm_screen</string>
<string name="psk_reset_network" translatable="false">reset_network_screen</string>
<string name="psk_reset_options" translatable="false">reset_options_screen</string>
+ <string name="psk_app_specific_data_usage" translatable="false">app_specific_data_usage</string>
<string name="psk_security_settings" translatable="false">security_settings_screen</string>
<string name="psk_sound_ringtone_picker" translatable="false">sound_ringtone_picker_screen</string>
<string name="psk_sound_settings" translatable="false">sound_settings_screen</string>
@@ -93,4 +102,6 @@
<string name="psk_wifi_list" translatable="false">wifi_list_screen</string>
<string name="psk_wifi_preferences" translatable="false">wifi_preferences_screen</string>
<string name="psk_wifi_tether" translatable="false">wifi_tether_screen</string>
+ <string name="psk_accessibility_settings" translatable="false">accessibility_settings_screen</string>
+ <string name="psk_captions_settings" translatable="false">captions_settings_screen</string>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 833ac08..21e93ad 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -43,11 +43,14 @@
<string name="mobile_network_settings">Mobile network</string>
<!-- Summary of the 'Mobile network' item on the Network & internet page when there is more than
one mobile service configured (aka "dual SIM") - it shows a count of SIM/eSIM and tapping
- it leads to a page showing a list of the mobile service subscriptions. [CHAR LIMIT=40] -->
- <plurals name="mobile_network_summary_count">
- <item quantity="one"><xliff:g id="count" example="1">%1$d</xliff:g> SIM</item>
- <item quantity="other"><xliff:g id="count" example="2">%1$d</xliff:g> SIMs</item>
- </plurals>
+ it leads to a page showing a list of the mobile service subscriptions. (ICU syntax)
+ [CHAR LIMIT=40] -->
+ <string name="mobile_network_summary_count">
+ {count, plural,
+ =1 {# SIM}
+ other {# SIMs}
+ }
+ </string>
<!-- Summary for an item in the page listing multiple mobile service subscriptions, indicating
that service is active and is tied to a physical SIM card [CHAR LIMIT=40] -->
<string name="mobile_network_active_sim">Active / SIM</string>
@@ -67,6 +70,10 @@
<string name="mobile_network_toggle_title">Mobile data</string>
<!-- Mobile network screen, toggle mobile data summary [CHAR LIMIT=50] -->
<string name="mobile_network_toggle_summary">Access data using mobile network</string>
+ <!-- Mobile network screen, mobile network toggle title [CHAR LIMIT=30] -->
+ <string name="mobile_network_mobile_network_toggle_title">Mobile network</string>
+ <!-- Mobile network screen, toggle mobile network summary [CHAR LIMIT=50] -->
+ <string name="mobile_network_mobile_network_toggle_summary">Use mobile data</string>
<!-- Mobile network screen, confirmation dialog to turn off mobile data [CHAR LIMIT=50] -->
<string name="confirm_mobile_data_disable">Turn off mobile data?</string>
<!-- When a SIM preference hasn't been selected yet, this string is displayed as the pref summary until the user chooses a SIM subscription from the preference list. [CHAR LIMIT=50] -->
@@ -106,11 +113,13 @@
<string name="cell_data_limit"><xliff:g name="amount" example="1 GB">^1</xliff:g> data limit</string>
<!-- Format for a summary describing the amount of data before the user is warned or limited [CHAR LIMIT=80] -->
<string name="cell_data_warning_and_limit"><xliff:g name="amount" example="1 GB">^1</xliff:g> data warning / <xliff:g name="amount" example="2 GB">^2</xliff:g> data limit</string>
- <!-- Informational text about time left in billing cycle [CHAR LIMIT=40] -->
- <plurals name="billing_cycle_days_left">
- <item quantity="one">%d day left</item>
- <item quantity="other">%d days left</item>
- </plurals>
+ <!-- Informational text about time left in billing cycle (ICU syntax) [CHAR LIMIT=40] -->
+ <string name="billing_cycle_days_left">
+ {count, plural,
+ =1 {# day left}
+ other {# days left}
+ }
+ </string>
<!-- Informational text about time left in billing cycle [CHAR LIMIT=40] -->
<string name="billing_cycle_none_left">No time remaining</string>
<!-- Informational text about time left in billing cycle [CHAR LIMIT=40] -->
@@ -140,6 +149,8 @@
<string name="data_warning_limit_title">Data warning & limit</string>
<!-- Title of button for application usage cycle preferences [CHAR LIMIT=40] -->
<string name="app_usage_cycle">App data usage cycle</string>
+ <!-- Title of button for mobile usage cycle preferences [CHAR LIMIT=40] -->
+ <string name="mobile_data_usage">Mobile data usage</string>
<!-- Label for switch about whether to warn user about usage [CHAR LIMIT=40] -->
<string name="set_data_warning">Set data warning</string>
<!-- Label for button to set the amount of data before user is warned about usage [CHAR LIMIT=30] -->
@@ -156,14 +167,26 @@
<string name="data_usage_warning_editor_title">Set data usage warning</string>
<!-- Title of dialog for editing data usage limit in bytes. [CHAR LIMIT=48] -->
<string name="data_usage_limit_editor_title">Set data usage limit</string>
+ <!-- Data warning screen footer describing how data usage is measured. [CHAR LIMIT=NONE] -->
+ <string name="data_usage_settings_footer">Data usage is measured by your device. It may vary from your mobile carrier\u2019s data.</string>
<!-- Positive button title for data usage bytes threshold picker, confirming that changes should be saved. [CHAR LIMIT=32] -->
<string name="usage_bytes_threshold_picker_positive_button">Set</string>
<string-array name="bytes_picker_sizes" translatable="false">
<item>@*android:string/megabyteShort</item>
<item>@*android:string/gigabyteShort</item>
</string-array>
+ <!-- Data warning threshold save button [CHAR LIMIT=48] -->
+ <string name="data_usage_warning_save_title">Save</string>
<!-- Network & internet settings screen, setting option name to enable OEM network connectivity [CHAR LIMIT=60] -->
<string name="network_and_internet_oem_network_title">OEM network</string>
+ <!-- Network & internet settings screen, setting option name to enable vehicle internet connectivity [CHAR LIMIT=60] -->
+ <string name="network_and_internet_vehicle_internet_title">Vehicle internet</string>
+ <!-- Warning pop up when disabling OEM network connectivity [CHAR LIMIT=NONE] -->
+ <string name="network_and_internet_oem_network_dialog_description">Turning off the vehicle internet may prevent some vehicle features or apps from working.\n\nCritical data required to operate your vehicle will continue to be shared with the vehicle manufacturer.</string>
+ <!-- Confirm button label for disabling OEM network connectivity [CHAR LIMIT=40]-->
+ <string name="network_and_internet_oem_network_dialog_confirm_label">Turn off anyway</string>
+ <!-- Network & internet settings screen footer warning text when OEM network is turned of [CHAR LIMIT=NONE] -->
+ <string name="network_and_internet_oem_network_disabled_footer">Vehicle internet is turned off. This may prevent some vehicle features or apps from working. Critical data required to operate your vehicle will continue to be shared with the vehicle manufacturer.</string>
<!-- Network & internet settings screen, setting option description of how much data has been used from a start date to end date ex. 80MB used Oct 3 - Nov 2 [CHAR LIMIT=100] -->
<string name="network_and_internet_data_usage_time_range_summary">%1$s used %2$s - %3$s</string>
<!-- Network & internet settings screen, setting option name to view other wifi networks to connect to [CHAR LIMIT=60] -->
@@ -192,6 +215,8 @@
<string name="wifi_setup_connect">Connect</string>
<!-- Label for button when the car is connecting to a Wi-Fi network. [CHAR LIMIT=20] -->
<string name="wifi_connecting">Connecting\u2026</string>
+ <!-- Wi-Fi state - Disconnected [CHAR LIMIT=NONE] -->
+ <string name="wifi_disconnected">Not connected</string>
<!-- Toast message shown when a network connection failed because it's not in range. [CHAR LIMIT=40] -->
<string name="wifi_not_in_range_message">Network not in range</string>
<!-- Label for the password of the secured network -->
@@ -314,6 +339,8 @@
<string name="tether_settings_title_all">Hotspot & tethering</string>
<!-- Settings title to go into the hotspot settings when USB, Bluetooth and Wifi tethering are available [CHAR LIMIT=60]-->
<string name="hotspot_settings_title">Hotspot</string>
+ <!-- Subtitle for when Wi-Fi hotspot is toggled off [CHAR LIMIT=45] -->
+ <string name="wifi_hotspot_state_off">Off</string>
<!-- Title for the toggle to turn off hotspot automatically [CHAR LIMIT=50]-->
<string name="wifi_hotspot_auto_off_title">Turn off hotspot automatically</string>
<!-- Summary for the toggle to turn off hotspot automatically [CHAR LIMIT=100]-->
@@ -645,14 +672,14 @@
<string name="force_stop_dialog_title">Force stop?</string>
<!-- Manage applications, text for dialog when killing persistent apps. [CHAR LIMIT=200] -->
<string name="force_stop_dialog_text">If you force stop an app, it may misbehave.</string>
- <!-- Manage applications, title for dialog when disabling I/O overuse killing for apps. [CHAR LIMIT=40] -->
- <string name="peak_performance_dialog_title">Turn off performance protection?</string>
- <!-- Manage applications, text for dialog when disabling I/O overuse killing for apps. [CHAR LIMIT=200] -->
- <string name="peak_performance_dialog_text">If you do, your software and hardware may not work as well.</string>
- <!-- Manage applications, text for dialog button when disabling I/O overuse killing for apps. [CHAR LIMIT=200] -->
- <string name="peak_performance_dialog_action_on">Leave on</string>
- <!-- Manage applications, text for dialog button when disabling I/O overuse killing for apps. [CHAR LIMIT=200] -->
- <string name="peak_performance_dialog_action_off">Turn off</string>
+ <!-- Manage applications, title for dialog when turning on prioritize app performance setting. [CHAR LIMIT=40] -->
+ <string name="prioritize_app_performance_dialog_title">Turn on prioritize app performance?</string>
+ <!-- Manage applications, text for dialog when turning on prioritize app performance setting. [CHAR LIMIT=200] -->
+ <string name="prioritize_app_performance_dialog_text">Turning it on can cause potential system instability or long-term hardware impact. Do you want to continue?</string>
+ <!-- Manage applications, text for dialog button when turning on prioritize app performance setting. [CHAR LIMIT=200] -->
+ <string name="prioritize_app_performance_dialog_action_on">Yes</string>
+ <!-- Manage applications, text for dialog button when turning on prioritize app performance setting. [CHAR LIMIT=200] -->
+ <string name="prioritize_app_performance_dialog_action_off">No, thanks</string>
<!-- Manage applications, individual application info screen. Button to disable an existing application. [CHAR LIMIT=25] -->
<string name="disable_text">Disable</string>
<!-- Manage applications, individual application info screen. Button to re-enable an existing application. [CHAR LIMIT=25] -->
@@ -671,8 +698,8 @@
<string name="notifications_label">Notifications</string>
<!-- Label that lead into individual application storage info screen -->
<string name="storage_application_label">Storage & cache</string>
- <!-- Label for the toggle that enables/disables car watchdog's I/O overuse killing feature for the app. [CHAR LIMIT=20] -->
- <string name="peak_performance_label">Ensure peak performance</string>
+ <!-- Label for the toggle that enables/disables prioritize app performance setting. [CHAR LIMIT=50] -->
+ <string name="prioritize_app_performance_label">Prioritize app performance</string>
<!-- Label for displaying application version. -->
<string name="application_version_label">Version: %1$s</string>
<!-- Runtime permissions preference summary, shown when the app has no permissions granted. [CHAR LIMIT=40] -->
@@ -681,27 +708,53 @@
<string name="runtime_permissions_summary_no_permissions_requested">No permissions requested</string>
<!-- Label for showing apps that have not been used for months. [CHAR LIMIT=40]-->
<string name="unused_apps">Unused apps</string>
- <!-- Summary of number of apps that have not been used for months. [CHAR LIMIT=40]-->
- <plurals name="unused_apps_summary">
- <item quantity="one"><xliff:g id="count" example="1">%d</xliff:g> unused app</item>
- <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> unused apps</item>
- </plurals>
+ <!-- Summary of number of apps that have not been used for months. (ICU syntax) [CHAR LIMIT=40]-->
+ <string name="unused_apps_summary">
+ {count, plural,
+ =1 {# unused app}
+ other {# unused apps}
+ }
+ </string>
<!-- Label of a switch preference that controls whether the system will remove the permissions and free up space when the app has not been used for months [CHAR LIMIT=40]-->
<string name="unused_apps_switch">Remove permissions and free up space</string>
<!-- Application's internal storage size preference summary. [CHAR LIMIT=40] -->
<string name="storage_type_internal">%s in internal storage</string>
- <!-- Application's peak performance preference summary. [CHAR LIMIT=40] -->
- <string name="peak_performance_summary">When necessary, close app to avoid excessive use of resources</string>
+ <!-- Application's prioritize app performance setting summary. [CHAR LIMIT=100] -->
+ <string name="prioritize_app_performance_summary">Uses system resources to prioritize app performance</string>
<!-- Activity title for network data usage summary. [CHAR LIMIT=25] -->
<string name="data_usage_summary_title">Data usage</string>
<!-- Activity title for Appk data usage summary. [CHAR LIMIT=25] -->
<string name="data_usage_app_summary_title">App data usage</string>
+ <!-- Title for preference that selects data usage date range. [CHAR LIMIT=25] -->
+ <string name="data_usage_usage_history_title">Usage history</string>
+ <!-- Title for preference that lists all apps. [CHAR LIMIT=25] -->
+ <string name="data_usage_all_apps_title">All apps</string>
+ <!-- Activity title for individual App data usage summary. [CHAR LIMIT=25] -->
+ <string name="app_data_usage_title">Data & Wi\u2011Fi usage</string>
+ <!-- Title for preference that selects app data usage date range. [CHAR LIMIT=25] -->
+ <string name="app_data_usage_usage_history_title">Usage history</string>
+ <!-- Title that describes the total amount of data used by an app. [CHAR LIMIT=25] -->
+ <string name="app_data_usage_total_usage">Total usage</string>
+ <!-- Title that describes the amount of data used by an app while in the foreground. [CHAR LIMIT=25] -->
+ <string name="app_data_usage_foreground">Foreground</string>
+ <!-- Title that describes the amount of data used by an app while in the background. [CHAR LIMIT=25] -->
+ <string name="app_data_usage_background">Background</string>
+ <!-- Title of preference toggle that lets the app use mobile data. [CHAR LIMIT=25] -->
+ <string name="app_data_usage_allow_data_title">Allow data</string>
+ <!-- Summary of preference toggle that lets the app use mobile data. [CHAR LIMIT=50] -->
+ <string name="app_data_usage_allow_data_summary">Let this app use mobile data</string>
+ <!-- Title of preference toggle that lets the app use mobile data in the background. [CHAR LIMIT=25] -->
+ <string name="app_data_usage_restrict_data_title">Restrict data</string>
+ <!-- Summary of preference toggle that lets the app use mobile data in the background. [CHAR LIMIT=50] -->
+ <string name="app_data_usage_background_data_summary">Use mobile data only when app is in the foreground</string>
<string name="computing_size">Computing\u2026</string>
- <!-- Runtime permissions preference summary. Number of additional permissions granted. [CHAR LIMIT=40] -->
- <plurals name="runtime_permissions_additional_count">
- <item quantity="one"><xliff:g example="1" id="count">%d</xliff:g> additional permission</item>
- <item quantity="other"><xliff:g example="10" id="count">%d</xliff:g> additional permissions</item>
- </plurals>
+ <!-- Runtime permissions preference summary. Number of additional permissions granted. (ICU syntax) [CHAR LIMIT=40] -->
+ <string name="runtime_permissions_additional_count">
+ {count, plural,
+ =1 {# additional permission}
+ other {# additional permissions}
+ }
+ </string>
<!-- Dialog body explaining that the app just selected by the user will not work after a reboot until after the user enters their credentials, such as a PIN or password. [CHAR LIMIT=NONE] -->
<string name="direct_boot_unaware_dialog_message_car">Note: After a reboot, this app can\'t start until you unlock your vehicle.</string>
<!-- Assistant and voice input settings title. This setting goes into the manage assistant settings page. [CHAR LIMIT=40] -->
@@ -825,6 +878,42 @@
<!-- Location --><skip/>
<!-- Main setting menu item to go into location settings [CHAR LIMIT=40] -->
<string name="location_settings_title">Location</string>
+ <!-- Title of location toggle setting [CHAR LIMIT=40] -->
+ <string name="location_toggle_title">Use location</string>
+ <!-- Summary of location toggle setting [CHAR LIMIT=40] -->
+ <string name="location_toggle_summary">Allow apps you specify to access your location</string>
+ <!-- Warning message when users try to toggle location off [CHAR LIMIT=NONE] -->
+ <string name="location_toggle_off_warning">
+ If you turn this off, it will remove location access for all apps. Driver Assistance apps
+ will still have access.
+ </string>
+ <!-- Title of driver assistance toggle setting [CHAR LIMIT=40] -->
+ <string name="location_driver_assistance_toggle_title">
+ Use location for Driver Assistance
+ </string>
+ <!-- Title of driver assistance text toggle [CHAR LIMIT=40] -->
+ <string name="location_driver_assistance_toggle_off_title">Vehicle location is off</string>
+ <!-- Summary of driver assistance text toggle [CHAR LIMIT=40] -->
+ <string name="location_driver_assistance_toggle_off_summary">
+ Driver Assistance apps cannot access your location
+ </string>
+ <!-- -Text of driver assistance text toggle [CHAR LIMIT=40] -->
+ <string name="location_driver_assistance_action_text">
+ Change
+ </string>
+ <!-- Summary of driver assistance toggle setting [CHAR LIMIT=40]-->
+ <string name="location_driver_assistance_toggle_summary">
+ Allow apps that help with driving to access your location
+ </string>
+ <!-- Warning message when users try to toggle driver assistance off [CHAR LIMIT=NONE] -->
+ <string name="location_driver_assistance_toggle_off_warning">
+ If you turn this off, Driver Assistance apps that rely on location information will be
+ disabled.
+ </string>
+ <!-- Confirm button label for confirmation dialog [CHAR LIMIT=40]-->
+ <string name="driver_assistance_warning_confirm_label">
+ Turn off anyway
+ </string>
<!-- Title of Recent Location Requests setting [CHAR LIMIT=60] -->
<string name="location_settings_recent_requests_title">Recent Location Requests</string>
<!-- Message indicating that no apps have requested location recently [CHAR LIMIT=60] -->
@@ -842,6 +931,49 @@
Location may use sources like GPS, Wi\u2011Fi, mobile networks, and sensors to help estimate
your device\u2019s location.
</string>
+ <!-- Title of Driver assistance page [CHAR LIMIT=40]-->
+ <string name="driver_assistance_settings_title">Driver assistance</string>
+ <!--Driver assistance settings footer warning text [CHAR LIMIT=NONE] -->
+ <string name="adas_settings_footer">
+ Location information sent to Driver Assistance apps doesn’t contain information that
+ identifies you. It’s stored for a maximum of 2 days before being deleted.
+ </string>
+
+ <!-- Microphone --><skip/>
+ <!-- Title of microphone settings screen [CHAR LIMIT=40] -->
+ <string name="microphone_settings_title">Microphone</string>
+ <!-- Title of setting to toggle microphone [CHAR LIMIT=40] -->
+ <string name="microphone_toggle_title">Use microphone</string>
+ <!-- Summary of setting to toggle microphone [CHAR LIMIT=100] -->
+ <string name="microphone_toggle_summary">Allow all apps to access your microphone</string>
+ <!-- Title of setting linking to microphone permission management screen [CHAR LIMIT=60] -->
+ <string name="microphone_manage_permissions">Manage microphone permissions</string>
+ <!-- Title of Recent Microphone Accesses category [CHAR LIMIT=60] -->
+ <string name="microphone_recently_accessed">Recently accessed</string>
+ <!-- Description when no apps have accessed microphone recently [CHAR LIMIT=60] -->
+ <string name="microphone_no_recent_access">No recent apps</string>
+ <!-- Summary for number of apps that have access when microphone is off. [CHAR LIMIT=100] -->
+ <string name="microphone_app_permission_summary_microphone_off">0 apps have access</string>
+ <!--
+ Summary for Microphone settings when microphone is on, explaining how many apps have microphone
+ permission.
+
+ Please note that the distinction between singular and plural of this sentence only depends on
+ the quantity of "permitted_location_app_count" ("has" vs "have"). The quantity of
+ "total_location_app_count" is almost always greater than 1, so "apps" is always in plural form.
+ (ICU syntax) [CHAR LIMIT=100]-->
+ <string name="microphone_app_permission_summary_microphone_on">
+ {count, plural,
+ =1 {# of {total_count} apps has access}
+ other {# of {total_count} apps have access}
+ }
+ </string>
+ <!-- Title of Recent Microphone Requests setting [CHAR LIMIT=60] -->
+ <string name="microphone_settings_recent_requests_title">Recently accessed</string>
+ <!-- Title of Recent Microphone Requests setting [CHAR LIMIT=60] -->
+ <string name="microphone_settings_recent_requests_view_all_title">View all</string>
+ <!-- Microphone settings, loading the number of apps which have microphone permission [CHAR LIMIT=30] -->
+ <string name="microphone_settings_loading_app_permission_stats">Loading\u2026</string>
<!-- System --><skip/>
<!-- Main setting menu item to go into system settings -->
@@ -933,11 +1065,13 @@
<string name="settings_license_activity_loading">Loading\u2026</string>
<!-- Developer Settings -->
- <!-- Device Info screen. Countdown for user taps to enable development settings. [CHAR LIMIT=NONE] -->
- <plurals name="show_dev_countdown">
- <item quantity="one">You are now <xliff:g id="step_count">%1$d</xliff:g> step away from being a developer.</item>
- <item quantity="other">You are now <xliff:g id="step_count">%1$d</xliff:g> steps away from being a developer.</item>
- </plurals>
+ <!-- Device Info screen. Countdown for user taps to enable development settings. (ICU syntax) [CHAR LIMIT=NONE] -->
+ <string name="show_dev_countdown">
+ {count, plural,
+ =1 {You are now # step away from being a developer.}
+ other {You are now # steps away from being a developer.}
+ }
+ </string>
<!-- Device Info screen. Confirmation that developer settings are enabled. [CHAR LIMIT=NONE] -->
<string name="show_dev_on">You are now a developer!</string>
<!-- Device Info screen. Okay we get it, stop pressing, you already have it on. [CHAR LIMIT=NONE] -->
@@ -1099,11 +1233,13 @@
<string name="user_add_user_message_update">Apps can be updated from any profile for use by all other profiles.</string>
<!-- Title for the dialog that lets users know that the maximum allowed number of profiles on the device has been reached. [CHAR LIMIT=35]-->
<string name="user_limit_reached_title">Profile limit reached</string>
- <!-- Message that tells people what's the maximum number of profiles allowed on the device. [CHAR_LIMIT=NONE]-->
- <plurals name="user_limit_reached_message">
- <item quantity="one">Only one profile can be created.</item>
- <item quantity="other">You can create up to <xliff:g example="3" id="count">%d</xliff:g> profiles.</item>
- </plurals>
+ <!-- Message that tells people what's the maximum number of profiles allowed on the device. (ICU syntax) [CHAR_LIMIT=NONE]-->
+ <string name="user_limit_reached_message">
+ {count, plural,
+ =1 {Only one profile can be created.}
+ other {You can create up to # profiles.}
+ }
+ </string>
<!-- Title of the alert dialog to notify that the creation of new profile has failed. [CHAR LIMIT=40] -->
<string name="add_user_error_title">Couldn\'t create new profile</string>
@@ -1113,7 +1249,7 @@
<!-- Message to inform user that all of user's data will be deleted if confirmed [CHAR LIMIT=NONE] -->
<string name="delete_user_dialog_message">"All apps and data for this profile will be deleted"</string>
<!-- Title of the alert dialog to notify that user deletion has failed. [CHAR LIMIT=40] -->
- <string name="delete_user_error_title">Couldn\'t delete profile.</string>
+ <string name="delete_user_error_title">Profile wasn\'t deleted. You can restart the device and try again.</string>
<!-- Title of the alert dialog to notify that user deletion has failed. [CHAR LIMIT=100] -->
<string name="delete_user_error_set_ephemeral_title">This profile will be deleted when you switch profiles or restart the vehicle.</string>
<!-- Button label to dismiss user deletion error [CHAR LIMIT=25] -->
@@ -1175,7 +1311,7 @@
<!-- Car storage settings summary. Displayed when the total memory usage is being calculated. Will be replaced with a number like "12.3 GB" when finished calculating. [CHAR LIMIT=30] -->
<!-- Title for preference on storage usage page that opens audio file browsing. [CHAR LIMIT=50] -->
<string name="storage_audio_files_title">Audio files</string>
- <!-- Car storage settings summary. Displayed when the total memory usage is being calculated. Will be replaced with a number like "12.3 GB" when finished calculating. [CHAR LIMIT=30] -->
+ <!-- Car storage settings summary. Displayed when the total memory usage is being calculated. Will be replaced with a number like "12.3 GB" when finished calculating. [CHAR LIMIT=30] -->
<string name="memory_calculating_size">Calculating\u2026</string>
<!-- Individual application info screen, label under Storage heading. The amount of space taken up by the application itself (for example, the java compiled files) [CHAR LIMIT=35] -->
<string name="storage_application_size_label">App size</string>
@@ -1349,6 +1485,8 @@
<string name="error_saving_lockpattern">Error saving pattern</string>
<!-- Message shown when in pattern unlock screen after too many incorrect attempts [CHAR LIMIT=120]-->
<string name="lockpattern_too_many_failed_confirmation_attempts">Too many incorrect attempts. Try again in <xliff:g id="number">%d</xliff:g> seconds.</string>
+ <!-- Message shown when the lock pattern is focused [CHAR LIMIT=40] -->
+ <string name="lockpattern_does_not_support_rotary">Pattern does not support rotary, please use touch</string>
<!-- Label for button to confirm picker selection [CHAR_LIMIT=20] -->
<string name="okay">OK</string>
<!-- Title of dialog asking the user if they really want to remove the screen lock [CHAR LIMIT=30]-->
@@ -1419,42 +1557,6 @@
<!-- Error shown when in PASSWORD doesn't meet requirement. Because this may be concatenated with other messages, please make sure there's a period at the end of the sentence. [CHAR LIMIT=NONE] -->
<string name="lockpassword_invalid_password">Password invalid, must be at least 4 characters.</string>
- <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of letters [CHAR LIMIT=NONE] -->
- <plurals name="lockpassword_password_requires_letters">
- <item quantity="one">Must contain at least 1 letter</item>
- <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> letters</item>
- </plurals>
-
- <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of lowercase letters [CHAR LIMIT=NONE] -->
- <plurals name="lockpassword_password_requires_lowercase">
- <item quantity="one">Must contain at least 1 lowercase letter</item>
- <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> lowercase letters</item>
- </plurals>
-
- <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of uppercase letters [CHAR LIMIT=NONE] -->
- <plurals name="lockpassword_password_requires_uppercase">
- <item quantity="one">Must contain at least 1 uppercase letter</item>
- <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> uppercase letters</item>
- </plurals>
-
- <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of numerical digits [CHAR LIMIT=NONE] -->
- <plurals name="lockpassword_password_requires_numeric">
- <item quantity="one">Must contain at least 1 numerical digit</item>
- <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> numerical digits</item>
- </plurals>
-
- <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of special symbols [CHAR LIMIT=NONE] -->
- <plurals name="lockpassword_password_requires_symbols">
- <item quantity="one">Must contain at least 1 special symbol</item>
- <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> special symbols</item>
- </plurals>
-
- <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of non-letter characters [CHAR LIMIT=NONE] -->
- <plurals name="lockpassword_password_requires_nonletter">
- <item quantity="one">Must contain at least 1 non-letter character</item>
- <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> non-letter characters</item>
- </plurals>
-
<!-- Error shown when in PASSWORD mode and password has been used recently. Please keep this string short! [CHAR LIMIT=NONE] -->
<string name="lockpassword_password_recently_used">Device admin doesn\'t allow using a recent password</string>
@@ -1575,88 +1677,210 @@
<!-- Profile settings add profile menu [CHAR LIMIT=35] -->
<string name="add_profile_text">Add profile</string>
+ <!-- Quick Controls --><skip/>
+ <!-- Brightness quick control, control name to change display brightness [CHAR LIMIT=40] -->
+ <string name="qc_display_brightness">Display brightness</string>
+ <!-- Informational text to be shown when bluetooth devices can't be shown in quick controls because bluetooth is off [CHAR LIMIT=75] -->
+ <string name="qc_bluetooth_off_devices_info">To see your devices, turn on Bluetooth</string>
+ <!-- Informational text to be shown when bluetooth devices can't be shown in quick controls because no devices are paired [CHAR LIMIT=75] -->
+ <string name="qc_bluetooth_on_no_devices_info">To pair a device, open Bluetooth settings</string>
- <!-- TODO(b/186253868): remove translatable="false" once the real strings have been defined -->
<!-- Device Policy Management --><skip/>
<!-- Device admin add activity title -->
- <string name="device_admin_add_title" translatable="false">Device admin</string>
+ <string name="device_admin_add_title">Infotainment system admin</string>
+ <!-- Device admin activated apps -->
+ <string name="device_admin_activated_apps">Activated apps</string>
+ <!-- Device admin deactivated apps -->
+ <string name="device_admin_deactivated_apps">Deactivated apps</string>
+ <!-- Device admin apps description -->
+ <string name="device_admin_apps_description">Apps with this permission have access to this vehicle\'s data</string>
+ <!-- Device admin apps list is empty -->
+ <string name="device_admin_apps_list_empty">No vehicle admin apps</string>
<!-- Device admin warning message about policies an admin can use -->
- <string name="device_admin_status" translatable="false">This admin app is active and allows
+ <string name="device_admin_status">This infotainment system admin app is active and allows
the app <xliff:g id="app_name">%1$s</xliff:g> to perform the
following operations:</string>
<!-- Device admin warning message about policies an admin can use -->
- <string name="device_admin_warning" translatable="false">Activating this admin app will allow
+ <string name="device_admin_warning">Activating this infotainment system app will allow
the app <xliff:g id="app_name">%1$s</xliff:g> to perform the
following operations:</string>
- <!-- Title for screen to add a device admin app [CHAR LIMIT=40] -->
- <string name="add_device_admin_msg" translatable="false">Activate device admin app?</string>
- <!-- Label for button to set the active device admin [CHAR_LIMIT=80] -->
- <string name="add_device_admin" translatable="false">Activate this device admin app</string>
- <!-- Label for button to remove the active device admin app [CHAR LIMIT=80] -->
- <string name="remove_device_admin" translatable="false">Deactivate this device admin app</string>
- <!-- Shown in dialog to allow user to see more information about the device admin [CHAR LIMIT=30] -->
- <string name="admin_support_more_info" translatable="false">More details</string>
+ <!-- Title for screen to add a device admin app [CHAR LIMIT=NONE] -->
+ <string name="add_device_admin_msg">Activate this infotainment system app?</string>
+ <!-- Label for button to set the active device admin [CHAR_LIMIT=NONE] -->
+ <string name="add_device_admin">Activate this infotainment system app</string>
+ <!-- Label for button to deactivate and uninstall the active device admin app [CHAR LIMIT=NONE] -->
+ <string name="deactivate_and_uninstall_device_admin">Deactivate & uninstall</string>
+ <!-- Label for button to remove the active device admin app [CHAR LIMIT=NONE] -->
+ <string name="remove_device_admin">Deactivate this infotainment system app</string>
+<!-- Shown in dialog to allow user to see more information about the device admin [CHAR LIMIT=NONE] -->
+ <string name="admin_support_more_info">More details</string>
<!-- Shown in admin details page to warn user about policies the admin can set in a work profile. [CHAR LIMIT=NONE] -->
- <string name="admin_profile_owner_message" translatable="false">Your admin can monitor and manage apps and data
- associated with your work profile, including settings, permissions, corporate access,
- network activity, and the device\'s location information.</string>
+ <string name="admin_profile_owner_message">The organization manager can monitor and manage apps and data
+ associated with this profile, including settings, permissions, corporate access,
+ network activity, and the vehicle\'s location information.</string>
<!-- Shown in admin details page to warn user about policies the admin can set on a user. [CHAR LIMIT=NONE] -->
- <string name="admin_profile_owner_user_message" translatable="false">Your admin can monitor and manage apps and data
- associated with this user, including settings, permissions, corporate access,
+ <string name="admin_profile_owner_user_message">The organization manager can monitor and manage apps and data
+ associated with this profile, including settings, permissions, corporate access,
network activity, and the device\'s location information.</string>
<!-- Shown in admin details page to warn user about policies the admin can set on a device. [CHAR LIMIT=NONE] -->
- <string name="admin_device_owner_message" translatable="false">Your admin can monitor and manage apps and data
- associated with this device, including settings, permissions, corporate access,
- network activity, and the device\'s location information.</string>
+ <string name="admin_device_owner_message">The organization manager can monitor and manage apps and data
+ associated with this infotainment system, including settings, permissions, corporate access,
+ network activity, and the vehicle\'s location information.</string>
<!-- Shown in admin details page to warn user about policies the admin can set on a financed device. [CHAR LIMIT=NONE] -->
- <string name="admin_financed_message" translatable="false">Your device administrator may be able to access data
- associated with this device, manage apps, and change this device\’s settings.</string>
- <!-- Title for dialog displayed when user selects on a setting locked by an admin [CHAR LIMIT=30] -->
- <string name="disabled_by_policy_title" translatable="false">Blocked by your IT admin</string>
- <!-- Title for dialog displayed to tell user that changing volume was disallowed by an admin [CHAR LIMIT=50] -->
- <string name="disabled_by_policy_title_adjust_volume" translatable="false">Can’t change volume</string>
- <!-- Title for dialog displayed to tell user that outgoing calls were disabled by an admin [CHAR LIMIT=50] -->
- <string name="disabled_by_policy_title_outgoing_calls" translatable="false">Can’t make calls</string>
- <!-- Title for dialog displayed to tell user that sending SMS were disabled by an admin [CHAR LIMIT=50] -->
- <string name="disabled_by_policy_title_sms" translatable="false">SMS not allowed</string>
- <!-- Title for dialog displayed to tell user that the camera was disabled by an admin [CHAR LIMIT=50] -->
- <string name="disabled_by_policy_title_camera" translatable="false">Can’t use camera</string>
- <!-- Title for dialog displayed to tell user that screenshots are disabled by an admin [CHAR LIMIT=50] -->
- <string name="disabled_by_policy_title_screen_capture" translatable="false">Can’t take screenshots</string>
- <!-- Title for dialog displayed to tell user that the app was suspended by an admin [CHAR LIMIT=50] -->
- <string name="disabled_by_policy_title_suspend_packages" translatable="false">Can’t open this app</string>
+ <string name="admin_financed_message">The organization manager may be able to access data
+ associated with this infotainment system, manage apps, and change this vehicle\’s settings.</string>
+ <!-- Title for dialog displayed when user selects on a setting locked by an admin [CHAR LIMIT=NONE] -->
+ <string name="disabled_by_policy_title">That’s unavailable</string>
+ <!-- Title for dialog displayed to tell user that changing volume was disallowed by an admin [CHAR LIMIT=NONE] -->
+ <string name="disabled_by_policy_title_adjust_volume">Can’t change volume in this managed vehicle</string>
+ <!-- Title for dialog displayed to tell user that outgoing calls were disabled by an admin [CHAR LIMIT=NONE] -->
+ <string name="disabled_by_policy_title_outgoing_calls">Can’t make calls in this managed vehicle</string>
+ <!-- Title for dialog displayed to tell user that sending SMS were disabled by an admin [CHAR LIMIT=NONE] -->
+ <string name="disabled_by_policy_title_sms">SMS not allowed in this managed vehicle</string>
+ <!-- Title for dialog displayed to tell user that the camera was disabled by an admin [CHAR LIMIT=NONE] -->
+ <string name="disabled_by_policy_title_camera">Camera is unavailable in this managed vehicle</string>
+ <!-- Title for dialog displayed to tell user that screenshots are disabled by an admin [CHAR LIMIT=NONE] -->
+ <string name="disabled_by_policy_title_screen_capture">Can’t take screenshots in this managed vehicle</string>
+ <!-- Title for dialog displayed to tell user that the app was suspended by an admin [CHAR LIMIT=NONE] -->
+ <string name="disabled_by_policy_title_suspend_packages">Can’t open this app in this managed vehicle</string>
<!-- Dialog title. This dialog lets a user know that a specific setting is blocked by their credit provider. Since the user purchased the device from the credit provider, the credit provider controls what they can access. [CHAR LIMIT=50] -->
- <string name="disabled_by_policy_title_financed_device" translatable="false">Blocked by your credit provider</string>
- <!-- Dialog title shown when parental consent is required for the child to set up biometric authentication. [CHAR LIMIT=30] -->
- <string name="disabled_by_policy_title_biometric_parental_consent" translatable="false">Parent needed</string>
- <!-- Dialog content shown when parental consent is required for the child to set up biometric authentication. [CHAR LIMIT=NONE] -->
- <string name="disabled_by_policy_content_biometric_parental_consent" translatable="false">Hand the phone to your parent to start setting this up</string>
- <!-- Shown when the user tries to change a settings locked by an admin [CHAR LIMIT=200] -->
- <string name="default_admin_support_msg" translatable="false">If you have questions, contact your IT admin</string>
+ <string name="disabled_by_policy_title_financed_device">Blocked by your credit provider</string>
+ <!-- Shown when the user tries to change a settings locked by an admin [CHAR LIMIT=NONE] -->
+ <string name="default_admin_support_msg">Access to some features is limited by the organization.\n\nIf you have questions, contact the organization manager.</string>
<!-- url for learning more about IT admin policy disabling -->
- <string name="help_url_action_disabled_by_it_admin" translatable="false"></string>
- <!-- Title of setting on privacy settings screen that will show work policy info. [CHAR LIMIT=NONE] -->
- <string name="work_policy_privacy_settings" translatable="false">Your work policy info</string>
+ <string name="help_url_action_disabled_by_it_admin"></string>
+ <!-- Title of preference to manage device admin apps, which are used by IT admins to manage devices. [CHAR LIMIT=40] -->
+ <string name="manage_device_admin">Vehicle admin apps</string>
+ <!-- Summary of preference to manage device admin apps, informing the user how many device admin apps are installed and active -->
+ <string name="number_of_device_admins">
+ {count, plural,
+ =1 {# activated app}
+ other {# activated apps}
+ }
+ </string>
+ <!-- Summary of preference to manage device admin apps, informing the user that currently no device admin apps are installed and active -->
+ <string name="number_of_device_admins_none">No activated apps</string>
+ <!-- Title of setting on privacy settings screen that will show vehicle policy info. [CHAR LIMIT=NONE] -->
+ <string name="work_policy_privacy_settings"><xliff:g id="organization_name">%1$s</xliff:g> vehicle policy</string>
<!-- Summary for Enterprise Privacy settings, explaining what the user can expect to find under it [CHAR LIMIT=NONE]-->
- <string name="work_policy_privacy_settings_summary" translatable="false">Settings managed by your IT admin</string>
+ <string name="work_policy_privacy_settings_summary">Settings managed by the organization manager</string>
+ <!-- Footer to show help link content description. [CHAR LIMIT=NONE] -->
+ <string name="footer_learn_more_content_description">Learn more about <xliff:g id="service" example="Select to Speak">%1$s</xliff:g></string>
+
+ <!-- Enterprise Privacy --> <skip />
+ <!-- TODO(b/206022572, b/203004258): remove translatable="false" once the proper strings have been defined -->
+ <!-- Title of setting on security settings screen. This will take the user to a screen with information about admin powers and their impact on the user's privacy on a managed device. Shown on enterprise-managed devices only. Note: "Device" is singular and refers to the device (e.g. phone or tablet) that the user is holding in their hand. -->
+ <string name="enterprise_privacy_settings" translatable="false">Managed device info</string>
+ <!-- Summary for Enterprise Privacy settings, explaining what the user can expect to find under it [CHAR LIMIT=NONE]-->
+ <string name="enterprise_privacy_settings_summary_generic" translatable="false">Changes & settings managed by your organization</string>
+ <!-- Enterprise Privacy settings activity header, summarizing the powers that the admin has. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_header" translatable="false">To provide access to your work data, your organization may change settings and install software on your device.\n\nFor more details, contact your organization\'s admin.</string>
+ <!-- Title for the 'Types of information your organization can see' preference category. [CHAR LIMIT=60] -->
+ <string name="enterprise_privacy_exposure_category" translatable="false">Types of information your organization can see</string>
+ <!-- Title for the 'Changes made by your organization’s admin' preference category. [CHAR LIMIT=60] -->
+ <string name="enterprise_privacy_exposure_changes_category" translatable="false">Changes made by your organization\'s admin</string>
+ <!-- Title for the 'Your access to this device' preference category. [CHAR LIMIT=60] -->
+ <string name="enterprise_privacy_device_access_category" translatable="false">Your access to this device</string>
+ <!-- Label explaining that the admin can see data associated with their work account. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_enterprise_data" translatable="false">Data associated with your work account, such as email and calendar</string>
+ <!-- Label explaining that the admin can see apps installed on the device. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_installed_packages" translatable="false">List of apps on your device</string>
+ <!-- Label explaining that the admin can see app usage statistics. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_usage_stats" translatable="false">Amount of time and data spent in each app</string>
+ <!-- Label explaining that the admin can retrieve network logs on the device. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_network_logs" translatable="false">Most recent network traffic log</string>
+ <!-- Label explaining that the admin can request bug reports on the device. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_bug_reports" translatable="false">Most recent bug report</string>
+ <!-- Label explaining that the admin can retrieve security on from the device. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_security_logs" translatable="false">Most recent security log</string>
+ <!-- Label indicating that the admin never took a given action so far (e.g. did not retrieve security logs or request bug reports). -->
+ <string name="enterprise_privacy_none" translatable="false">None</string>
+ <!-- Label indicating that the admin installed one or more apps on the device. -->
+ <string name="enterprise_privacy_enterprise_installed_packages" translatable="false">Apps installed</string>
+ <!-- Label indicating that the admin granted one or more apps access to the device's location. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_location_access" translatable="false">Location permissions</string>
+ <!-- Label indicating that the admin granted one or more apps access to the microphone. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_microphone_access" translatable="false">Microphone permissions</string>
+ <!-- Label indicating that the admin granted one or more apps access to the camera. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_camera_access" translatable="false">Camera permissions</string>
+ <!-- Label indicating that the admin set one or more apps as defaults for common actions (e.g. open browser, send e-mail). [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_enterprise_set_default_apps" translatable="false">Default apps</string>
+ <!-- Label explaining that the current input method was set by the admin. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_input_method" translatable="false">Default keyboard</string>
+ <!-- Summary indicating the input method set by the admin. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_input_method_name" translatable="false">Set to <xliff:g id="app_label" example="Example Keyboard">%s</xliff:g></string>
+ <!-- Label explaining that an always-on VPN was set by the admin for the entire device. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_always_on_vpn_device" translatable="false">Always-on VPN turned on</string>
+ <!-- Label explaining that a global HTTP proxy was set by the admin. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_global_http_proxy" translatable="false">Global HTTP proxy set</string>
+ <!-- Label explaining that the admin installed trusted CA certificates in personal profile. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_ca_certs_personal" translatable="false">Trusted credentials in your personal profile</string>
+ <!-- Label explaining that the admin can lock the device and change the user's password. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_lock_device" translatable="false">Admin can lock the device and reset password</string>
+ <!-- Label explaining that the admin can wipe the device remotely. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_wipe_device" translatable="false">Admin can delete all device data</string>
+ <!-- Label explaining that the admin configured the device to wipe itself when the password is mistyped too many times. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_failed_password_wipe_device" translatable="false">Failed password attempts before deleting all device data</string>
+ <!-- Label explaining that the admin configured the current user to wipe itself when the password is mistyped too many times. [CHAR LIMIT=NONE] -->
+ <string name="enterprise_privacy_failed_password_wipe_current_user" translatable="false">Failed password attempts before deleting profile data</string>
+
+ <!-- Remote request bugreport --><skip/>
+ <!-- Title of dialog shown to ask for user consent for sharing a bugreport that was requested remotely by the vehicle's organization manager. [CHAR LIMIT=50] -->
+ <string name="share_remote_bugreport_dialog_title">Share bug report?</string>
+ <!-- Message of a dialog shown to ask for user consent for sharing a bugreport that was requested remotely by the vehicle's organization manager. [CHAR LIMIT=NONE] -->
+ <string name="share_remote_bugreport_dialog_message_finished">This vehicle\'s organization manager requested a bug report to help troubleshoot this device. Apps and data may be shared.</string>
+ <!-- Message of a dialog shown to ask for user consent for sharing a bugreport that was requested remotely by the vehicle's organization manager and it's still being taken. [CHAR LIMIT=NONE] -->
+ <string name="share_remote_bugreport_dialog_message">This vehicle\'s organization manager requested a bug report to help troubleshoot this device. Apps and data may be shared, and your device may temporarily slow down.</string>
+ <!-- Message of a dialog shown to inform that the remote bugreport that was requested remotely by the vehicle\'s organization manager is still being taken and will be shared when finished. [CHAR LIMIT=NONE] -->
+ <string name="sharing_remote_bugreport_dialog_message">This bug report is being shared with this vehicle\'s organization manager. Contact them for more details.</string>
+ <!-- Acceptance label of dialog shown to ask for user consent for sharing the remote bugreport. [CHAR LIMIT=20] -->
+ <string name="share_remote_bugreport_action">Share</string>
+ <!-- Decline label of dialog shown to ask for user consent for sharing the remote bugreport. [CHAR LIMIT=20] -->
+ <string name="decline_remote_bugreport_action">Decline</string>
<!-- Power policy --><skip/>
<!-- Power components which are disabled by the current power policy cannot be toggled in Setting. [CHAR LIMIT=80] -->
<string name="power_component_disabled">This setting can\'t be changed right now</string>
-
- <!-- TODO(b/186566325): remove translatable="false" once the string is finalized -->
- <!-- Remote rquest bugreport --><skip/>
- <!-- Title of dialog shown to ask for user consent for sharing a bugreport that was requested remotely by the vehicle's fleet manager. [CHAR LIMIT=50] -->
- <string name="share_remote_bugreport_dialog_title" translatable="false">Share bug report?</string>
- <!-- Message of a dialog shown to ask for user consent for sharing a bugreport that was requested remotely by the vehicle's fleet manager. [CHAR LIMIT=NONE] -->
- <string name="share_remote_bugreport_dialog_message_finished" translatable="false">This vehicle\'s fleet manager requested a bug report to help troubleshoot this device. Apps and data may be shared.</string>
- <!-- Message of a dialog shown to ask for user consent for sharing a bugreport that was requested remotely by the vehicle's fleet manager and it's still being taken. [CHAR LIMIT=NONE] -->
- <string name="share_remote_bugreport_dialog_message" translatable="false">This vehicle\'s fleet manager requested a bug report to help troubleshoot this device. Apps and data may be shared, and your device may temporarily slow down.</string>
- <!-- Message of a dialog shown to inform that the remote bugreport that was requested remotely by the vehicle\'s fleet manager is still being taken and will be shared when finished. [CHAR LIMIT=NONE] -->
- <string name="sharing_remote_bugreport_dialog_message" translatable="false">This bug report is being shared with this vehicle\'s fleet manager. Contact them for more details.</string>
- <!-- Acceptance label of dialog shown to ask for user consent for sharing the remote bugreport. [CHAR LIMIT=20] -->
- <string name="share_remote_bugreport_action" translatable="false">Share</string>
- <!-- Decline label of dialog shown to ask for user consent for sharing the remote bugreport. [CHAR LIMIT=20] -->
- <string name="decline_remote_bugreport_action" translatable="false">Decline</string>
+ <!-- Accessibility --><skip/>
+ <!-- Settings title to go into the accessibility section of car settings. [CHAR LIMIT=30] -->
+ <string name="accessibility_settings_title">Accessibility</string>
+ <!-- Header for the section of the accessibility settings that lets the user customize their closed captions settings. [CHAR LIMIT=30] -->
+ <string name="accessibility_settings_captions_title">Captions</string>
+ <!-- Settings title for the closed captions section of car settings. [CHAR LIMIT=40] -->
+ <string name="captions_settings_title">Caption preferences</string>
+ <!-- Subtitle for the closed caption settings item when closed captions are turned off [CHAR LIMIT=30] -->
+ <string name="captions_settings_off">Off</string>
+ <!-- Subtitle for the closed caption settings item when closed captions are turned on [CHAR LIMIT=30] -->
+ <string name="captions_settings_on">On</string>
+ <!-- Settings title to go into the screen reader settings section of car settings. [CHAR LIMIT=30] -->
+ <string name="screen_reader_settings_title">Screen reader</string>
+ <!-- Title for toggle to enable closed captions by default. [CHAR LIMIT=30] -->
+ <string name="show_captions_toggle_title">Show captions</string>
+ <!-- Settings title to select what the closed captions text size is. [CHAR LIMIT=30] -->
+ <string name="captions_text_size_title">Text size</string>
+ <!-- Header for the section of the caption settings that lets the user customize the size and style of their closed captions. [CHAR LIMIT=40] -->
+ <string name="captions_settings_style_header">Caption size and style</string>
+ <!-- Settings option for very small closed captions text size. [CHAR LIMIT=30] -->
+ <string name="captions_settings_text_size_very_small">Very small</string>
+ <!-- Settings option for small closed captions text size. [CHAR LIMIT=30] -->
+ <string name="captions_settings_text_size_small">Small</string>
+ <!-- Settings option for default closed captions text size. [CHAR LIMIT=30] -->
+ <string name="captions_settings_text_size_default">Default</string>
+ <!-- Settings option for large closed captions text size. [CHAR LIMIT=30] -->
+ <string name="captions_settings_text_size_large">Large</string>
+ <!-- Settings option for very large closed captions text size. [CHAR LIMIT=30] -->
+ <string name="captions_settings_text_size_very_large">Very large</string>
+ <!-- Settings title to select the closed captions text styling (text color, background color, etc). [CHAR LIMIT=30] -->
+ <string name="captions_text_style_title">Caption style</string>
+ <!-- Settings option for closed captions text style to default to styling of the app playing the video. [CHAR LIMIT=40] -->
+ <string name="captions_settings_text_style_by_app">Set by app</string>
+ <!-- Settings option for closed captions text style to be white text on black background [CHAR LIMIT=40] -->
+ <string name="captions_settings_text_style_white_on_black">White on black</string>
+ <!-- Settings option for closed captions text style to be black text on white background [CHAR LIMIT=40] -->
+ <string name="captions_settings_text_style_black_on_white">Black on white</string>
+ <!-- Settings option for closed captions text style to be yellow text on black background [CHAR LIMIT=40] -->
+ <string name="captions_settings_text_style_yellow_on_black">Yellow on black</string>
+ <!-- Settings option for closed captions text style to be yellow text on blue background [CHAR LIMIT=40] -->
+ <string name="captions_settings_text_style_yellow_on_blue">Yellow on blue</string>
</resources>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index f1067b0..bca4ecf 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -19,7 +19,6 @@
<style name="CarSettingTheme" parent="@style/Theme.CarUi.NoToolbar">
<item name="wifi_signal">@drawable/wifi_signal</item>
<item name="wifiSignalColor">?android:attr/textColorPrimary</item>
- <item name="iconColor">@color/car_ui_text_color_primary</item>
<item name="dividerColor">@*android:color/car_list_divider</item>
<item name="preferenceTheme">@style/CarSettingsPreferenceTheme</item>
<item name="profileSwitcherBackground">@android:color/transparent</item>
diff --git a/res/xml/accessibility_settings_fragment.xml b/res/xml/accessibility_settings_fragment.xml
new file mode 100644
index 0000000..52673f2
--- /dev/null
+++ b/res/xml/accessibility_settings_fragment.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/accessibility_settings_title"
+ android:key="@string/psk_accessibility_settings">
+ <PreferenceCategory
+ android:key="@string/pk_captions_settings_header"
+ android:title="@string/accessibility_settings_captions_title">
+ <Preference
+ android:fragment="com.android.car.settings.accessibility.CaptionsSettingsFragment"
+ android:key="@string/psk_captions_settings"
+ android:title="@string/captions_settings_title"
+ android:icon="@drawable/ic_video_settings"
+ settings:controller="com.android.car.settings.accessibility.CaptionSettingsPreferenceController"/>
+ </PreferenceCategory>
+</PreferenceScreen>
diff --git a/res/xml/adas_location_fragment.xml b/res/xml/adas_location_fragment.xml
new file mode 100644
index 0000000..adf65f0
--- /dev/null
+++ b/res/xml/adas_location_fragment.xml
@@ -0,0 +1,39 @@
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="@string/psk_adas_settings"
+ android:title="@string/driver_assistance_settings_title">
+ <com.android.car.settings.common.LogicalPreferenceGroup
+ android:key="@string/pk_location_driver_assistance_preference_group"
+ settings:controller="com.android.car.settings.location.AdasGroupPreferenceController">
+ <com.android.car.ui.preference.CarUiTwoActionTextPreference
+ android:key="@string/pk_location_driver_assistance_state_switch"
+ android:title="@string/location_driver_assistance_toggle_off_title"
+ android:summary="@string/location_driver_assistance_toggle_off_summary"
+ android:icon="@drawable/ic_settings_location_off"
+ settings:secondaryActionStyle="borderless"
+ settings:secondaryActionText="@string/location_driver_assistance_action_text"
+ settings:controller="com.android.car.settings.location.AdasLocationSwitchSubMenuPreferenceController"/>
+ <com.android.car.settings.common.DividerPreference/>
+ </com.android.car.settings.common.LogicalPreferenceGroup>
+ <Preference
+ android:key="@string/pk_location_footer"
+ android:summary="@string/adas_settings_footer"
+ android:icon="@drawable/ic_settings_about"
+ android:selectable="false"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/app_data_usage_fragment.xml b/res/xml/app_data_usage_fragment.xml
index 40fbd13..1648127 100644
--- a/res/xml/app_data_usage_fragment.xml
+++ b/res/xml/app_data_usage_fragment.xml
@@ -20,6 +20,16 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/app_data_usage"
android:key="@string/psk_app_data_usage">
+ <ListPreference
+ android:key="@string/pk_data_usage_usage_history"
+ android:title="@string/data_usage_usage_history_title"
+ android:dialogTitle="@string/data_usage_usage_history_title"
+ settings:controller="com.android.car.settings.datausage.DataUsageCyclePreferenceController"/>
+ <com.android.car.settings.common.DividerPreference/>
+ <com.android.car.ui.preference.CarUiPreference
+ android:key="@string/pk_data_usage_all_apps"
+ android:selectable="false"
+ settings:controller="com.android.car.settings.datausage.AppDataUsageTotalPreferenceController"/>
<com.android.car.settings.common.LogicalPreferenceGroup
android:key="@string/pk_app_data_usage_detail"
settings:controller="com.android.car.settings.datausage.AppDataUsagePreferenceController"/>
diff --git a/res/xml/app_specific_data_usage_fragment.xml b/res/xml/app_specific_data_usage_fragment.xml
new file mode 100644
index 0000000..6ca28d7
--- /dev/null
+++ b/res/xml/app_specific_data_usage_fragment.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/app_data_usage_title"
+ android:key="@string/psk_app_specific_data_usage">
+ <com.android.car.settings.common.EntityHeaderPreference
+ android:key="@string/pk_app_specific_usage_title"
+ settings:controller="com.android.car.settings.datausage.AppSpecificDataUsageHeaderPreferenceController"
+ settings:searchable="false"/>
+ <com.android.car.settings.common.DividerPreference/>
+ <ListPreference
+ android:key="@string/pk_app_specific_usage_cycle"
+ android:title="@string/app_data_usage_usage_history_title"
+ android:dialogTitle="@string/app_data_usage_usage_history_title"
+ settings:controller="com.android.car.settings.datausage.AppSpecificDataUsageCyclePreferenceController"/>
+ <com.android.car.settings.common.SummaryPreference
+ android:key="@string/pk_app_specific_usage_total"
+ android:title="@string/app_data_usage_total_usage"
+ android:selectable="false"
+ settings:controller="com.android.car.settings.common.UpdateSummaryPreferenceController"/>
+ <com.android.car.settings.common.SummaryPreference
+ android:key="@string/pk_app_specific_usage_foreground"
+ android:title="@string/app_data_usage_foreground"
+ android:selectable="false"
+ settings:controller="com.android.car.settings.common.UpdateSummaryPreferenceController"/>
+ <com.android.car.settings.common.SummaryPreference
+ android:key="@string/pk_app_specific_usage_background"
+ android:title="@string/app_data_usage_background"
+ android:selectable="false"
+ settings:controller="com.android.car.settings.common.UpdateSummaryPreferenceController"/>
+ <com.android.car.settings.common.DividerPreference/>
+</PreferenceScreen>
diff --git a/res/xml/application_details_fragment.xml b/res/xml/application_details_fragment.xml
index 832488c..8e2b6fd 100644
--- a/res/xml/application_details_fragment.xml
+++ b/res/xml/application_details_fragment.xml
@@ -41,10 +41,11 @@
android:title="@string/storage_application_label"
settings:controller="com.android.car.settings.applications.StoragePreferenceController"/>
<SwitchPreference
- android:key="@string/pk_application_details_peak_performance"
- android:title="@string/peak_performance_label"
+ android:key="@string/pk_application_details_prioritize_app_performance"
+ android:title="@string/prioritize_app_performance_label"
+ android:summary="@string/prioritize_app_performance_summary"
settings:controller=
- "com.android.car.settings.applications.PeakPerformancePreferenceController"/>
+ "com.android.car.settings.applications.PrioritizeAppPerformancePreferenceController"/>
<SwitchPreference
android:key="@string/pk_hibernation_switch"
android:title="@string/unused_apps_switch"
diff --git a/res/xml/apps_fragment.xml b/res/xml/apps_fragment.xml
index f2e9d1e..f945d8b 100644
--- a/res/xml/apps_fragment.xml
+++ b/res/xml/apps_fragment.xml
@@ -36,6 +36,7 @@
<Preference
android:fragment="com.android.car.settings.applications.ApplicationsSettingsFragment"
android:key="@string/pk_recent_apps_view_all"
+ android:icon="@drawable/ic_apps"
settings:controller="com.android.car.settings.applications.RecentAppsViewAllPreferenceController"/>
<com.android.car.settings.common.DividerPreference/>
</com.android.car.settings.common.LogicalPreferenceGroup>
diff --git a/res/xml/bluetooth_settings_fragment.xml b/res/xml/bluetooth_settings_fragment.xml
index 55c831e..c766234 100644
--- a/res/xml/bluetooth_settings_fragment.xml
+++ b/res/xml/bluetooth_settings_fragment.xml
@@ -20,7 +20,7 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/bluetooth_settings_title"
android:key="@string/psk_bluetooth_settings">
- <com.android.car.settings.common.ClickableWhileDisabledSwitchPreference
+ <com.android.car.settings.common.ColoredSwitchPreference
android:key="@string/pk_bluetooth_state_switch"
android:title="@string/bluetooth_settings_title"
style="@style/ColoredSwitchPreferenceStyle"
diff --git a/res/xml/captions_settings_fragment.xml b/res/xml/captions_settings_fragment.xml
new file mode 100644
index 0000000..0d291cb
--- /dev/null
+++ b/res/xml/captions_settings_fragment.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/captions_settings_title"
+ android:key="@string/psk_captions_settings">
+ <com.android.car.settings.common.ColoredSwitchPreference
+ android:key="@string/pk_show_captions_switch"
+ android:title="@string/show_captions_toggle_title"
+ style="@style/ColoredSwitchPreferenceStyle"
+ settings:controller="com.android.car.settings.accessibility.ShowCaptionsSwitchPreferenceController"
+ settings:searchable="false"/>
+ <com.android.car.settings.common.DividerPreference/>
+ <PreferenceCategory
+ android:key="@string/pk_captions_settings_style_subheader"
+ android:title="@string/captions_settings_style_header">
+ <ListPreference
+ android:key="@string/pk_captions_size_settings_entry"
+ android:title="@string/captions_text_size_title"
+ settings:controller="com.android.car.settings.accessibility.CaptionsTextSizeListPreferenceController"/>
+ <ListPreference
+ android:key="@string/pk_captions_style_settings_entry"
+ android:title="@string/captions_text_style_title"
+ settings:controller="com.android.car.settings.accessibility.CaptionsTextStyleListPreferenceController"/>
+ </PreferenceCategory>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/car_volume_items.xml b/res/xml/car_volume_items.xml
index 546cb7b..dd15633 100644
--- a/res/xml/car_volume_items.xml
+++ b/res/xml/car_volume_items.xml
@@ -31,87 +31,108 @@
-->
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
<item
- car:icon="@*android:drawable/ic_audio_ring_notif"
+ car:icon="@drawable/car_ic_phone_volume"
+ car:mute_icon="@drawable/car_ic_phone_volume_mute"
car:titleText="@*android:string/volume_call"
car:usage="voice_communication"/>
<item
- car:icon="@*android:drawable/ic_audio_ring_notif"
+ car:icon="@drawable/car_ic_phone_volume"
+ car:mute_icon="@drawable/car_ic_phone_volume_mute"
car:titleText="@*android:string/volume_call"
car:usage="voice_communication_signalling"/>
<item
car:icon="@*android:drawable/ic_audio_media"
+ car:mute_icon="@*android:drawable/ic_audio_media_mute"
car:titleText="@*android:string/volume_music"
car:usage="media"/>
<item
car:icon="@*android:drawable/ic_audio_media"
+ car:mute_icon="@*android:drawable/ic_audio_media_mute"
car:titleText="@*android:string/volume_music"
car:usage="game"/>
<item
car:icon="@*android:drawable/ic_audio_alarm"
+ car:mute_icon="@*android:drawable/ic_audio_alarm_mute"
car:titleText="@*android:string/volume_alarm"
car:usage="alarm"/>
<item
car:icon="@drawable/car_ic_navigation"
+ car:mute_icon="@drawable/car_ic_navigation_mute"
car:titleText="@string/navi_volume_title"
car:usage="assistance_navigation_guidance"/>
<item
car:icon="@*android:drawable/ic_audio_ring_notif"
+ car:mute_icon="@*android:drawable/ic_audio_ring_notif_mute"
car:titleText="@*android:string/volume_ringtone"
car:usage="notification_ringtone"/>
<item
car:icon="@*android:drawable/ic_audio_vol"
+ car:mute_icon="@*android:drawable/ic_audio_vol_mute"
car:titleText="@*android:string/volume_unknown"
car:usage="assistant"/>
<item
car:icon="@*android:drawable/ic_audio_ring_notif"
+ car:mute_icon="@*android:drawable/ic_audio_ring_notif_mute"
car:titleText="@*android:string/volume_notification"
car:usage="notification"/>
<item
car:icon="@*android:drawable/ic_audio_ring_notif"
+ car:mute_icon="@*android:drawable/ic_audio_ring_notif_mute"
car:titleText="@*android:string/volume_notification"
car:usage="notification_communication_request"/>
<item
car:icon="@*android:drawable/ic_audio_ring_notif"
+ car:mute_icon="@*android:drawable/ic_audio_ring_notif_mute"
car:titleText="@*android:string/volume_notification"
car:usage="notification_communication_instant"/>
<item
car:icon="@*android:drawable/ic_audio_ring_notif"
+ car:mute_icon="@*android:drawable/ic_audio_ring_notif_mute"
car:titleText="@*android:string/volume_notification"
car:usage="notification_communication_delayed"/>
<item
car:icon="@*android:drawable/ic_audio_ring_notif"
+ car:mute_icon="@*android:drawable/ic_audio_ring_notif_mute"
car:titleText="@*android:string/volume_notification"
car:usage="notification_event"/>
<item
car:icon="@*android:drawable/ic_audio_ring_notif"
+ car:mute_icon="@*android:drawable/ic_audio_ring_notif_mute"
car:titleText="@*android:string/volume_notification"
car:usage="assistance_accessibility"/>
<item
car:icon="@*android:drawable/ic_audio_vol"
+ car:mute_icon="@*android:drawable/ic_audio_vol_mute"
car:titleText="@*android:string/volume_unknown"
car:usage="assistance_sonification"/>
<item
car:icon="@*android:drawable/ic_audio_vol"
+ car:mute_icon="@*android:drawable/ic_audio_vol_mute"
car:titleText="@*android:string/volume_unknown"
car:usage="unknown"/>
<item
car:icon="@*android:drawable/ic_audio_vol"
+ car:mute_icon="@*android:drawable/ic_audio_vol_mute"
car:titleText="@*android:string/volume_unknown"
car:usage="call_assistant"/>
<item
car:icon="@*android:drawable/ic_audio_vol"
+ car:mute_icon="@*android:drawable/ic_audio_vol_mute"
car:titleText="@*android:string/volume_unknown"
car:usage="emergency"/>
<item
car:icon="@*android:drawable/ic_audio_vol"
+ car:mute_icon="@*android:drawable/ic_audio_vol_mute"
car:titleText="@*android:string/volume_unknown"
car:usage="safety"/>
<item
car:icon="@*android:drawable/ic_audio_vol"
+ car:mute_icon="@*android:drawable/ic_audio_vol_mute"
car:titleText="@*android:string/volume_unknown"
car:usage="vehicle_status"/>
<item
car:icon="@*android:drawable/ic_audio_vol"
+ car:mute_icon="@*android:drawable/ic_audio_vol_mute"
car:titleText="@*android:string/volume_unknown"
car:usage="announcement"/>
</carVolumeItems>
diff --git a/res/xml/choose_account_fragment.xml b/res/xml/choose_account_fragment.xml
index db6edf7..23f2244 100644
--- a/res/xml/choose_account_fragment.xml
+++ b/res/xml/choose_account_fragment.xml
@@ -21,4 +21,10 @@
<com.android.car.settings.common.LogicalPreferenceGroup
android:key="@string/pk_add_account"
settings:controller="com.android.car.settings.accounts.ChooseAccountPreferenceController"/>
+
+ <com.android.settingslib.widget.FooterPreference
+ android:key="@string/pk_add_account_enterprise_disclosure_footer"
+ android:selectable="false"
+ settings:searchable="false"
+ settings:controller="com.android.car.settings.enterprise.EnterpriseDisclosurePreferenceController"/>
</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/data_usage_fragment.xml b/res/xml/data_usage_fragment.xml
deleted file mode 100644
index c0f6d27..0000000
--- a/res/xml/data_usage_fragment.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2019 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res-auto"
- android:title="@string/data_usage_settings"
- android:key="@string/psk_data_usage">
- <com.android.car.settings.datausage.DataUsageSummaryPreference
- android:key="@string/pk_data_usage_summary"
- settings:controller="com.android.car.settings.datausage.DataUsageSummaryPreferenceController"
- settings:singleLineTitle="false"/>
- <Preference
- android:key="@string/pk_app_data_usage"
- android:title="@string/app_data_usage"
- settings:controller="com.android.car.settings.datausage.DataUsagePreferenceController"/>
- <Preference
- android:fragment="com.android.car.settings.datausage.DataWarningAndLimitFragment"
- android:key="@string/pk_data_warning_and_limit"
- android:title="@string/data_warning_limit_title"
- settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"
- settings:searchable="false"/>
-</PreferenceScreen>
diff --git a/res/xml/data_usage_set_threshold_fragment.xml b/res/xml/data_usage_set_threshold_fragment.xml
new file mode 100644
index 0000000..702dda7
--- /dev/null
+++ b/res/xml/data_usage_set_threshold_fragment.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="@string/psk_data_usage_set_threshold">
+ <com.android.car.settings.datausage.DataUsageEditTextPreference
+ android:key="@string/pk_data_usage_edit_text"
+ settings:controller="com.android.car.settings.datausage.DataUsageEditTextPreferenceController"/>
+ <com.android.car.settings.common.LogicalPreferenceGroup
+ android:key="@string/pk_data_usage_radio_group"
+ settings:controller="com.android.car.settings.datausage.DataUsageUnitPreferenceController">
+ </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/data_warning_and_limit_fragment.xml b/res/xml/data_warning_and_limit_fragment.xml
index d6d4a84..f0dffef 100644
--- a/res/xml/data_warning_and_limit_fragment.xml
+++ b/res/xml/data_warning_and_limit_fragment.xml
@@ -20,10 +20,11 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/data_warning_limit_title"
android:key="@string/psk_data_warning_and_limit">
- <Preference
+ <ListPreference
android:key="@string/pk_data_usage_cycle"
- android:title="@string/app_usage_cycle"
+ android:title="@string/mobile_data_usage"
settings:controller="com.android.car.settings.datausage.CycleResetDayOfMonthPickerPreferenceController"/>
+ <com.android.car.settings.common.DividerPreference/>
<com.android.car.settings.common.LogicalPreferenceGroup
android:key="@string/pk_data_warning_group"
settings:controller="com.android.car.settings.datausage.DataWarningPreferenceController">
@@ -34,6 +35,7 @@
android:key="@string/pk_data_warning"
android:title="@string/data_warning"/>
</com.android.car.settings.common.LogicalPreferenceGroup>
+ <com.android.car.settings.common.DividerPreference/>
<com.android.car.settings.common.LogicalPreferenceGroup
android:key="@string/pk_data_limit_group"
settings:controller="com.android.car.settings.datausage.DataLimitPreferenceController">
@@ -44,4 +46,10 @@
android:key="@string/pk_data_limit"
android:title="@string/data_limit"/>
</com.android.car.settings.common.LogicalPreferenceGroup>
+ <com.android.car.settings.common.DividerPreference/>
+ <Preference
+ android:key="@string/pk_data_usage_footer"
+ android:summary="@string/data_usage_settings_footer"
+ android:icon="@drawable/ic_settings_about"
+ android:selectable="false"/>
</PreferenceScreen>
diff --git a/res/xml/device_admin_add.xml b/res/xml/device_admin_add.xml
index 1fce5ab..27b422b 100644
--- a/res/xml/device_admin_add.xml
+++ b/res/xml/device_admin_add.xml
@@ -20,11 +20,11 @@
android:title="@string/device_admin_add_title"
android:key="@string/psk_device_admin_add">
- <com.android.car.ui.preference.CarUiPreference
+ <SwitchPreference
android:key="@string/pk_device_admin_add_header"
- android:selectable="false"
settings:controller="com.android.car.settings.enterprise.DeviceAdminAddHeaderPreferenceController"
settings:searchable="false"/>
+ <com.android.car.settings.common.DividerPreference/>
<com.android.car.ui.preference.CarUiPreference
android:key="@string/pk_device_admin_add_explanation"
android:selectable="false"
@@ -37,7 +37,7 @@
settings:singleLineTitle="false"
settings:controller="com.android.car.settings.enterprise.DeviceAdminAddWarningPreferenceController"
settings:showChevron="false"/>
- <com.android.car.settings.common.LogicalPreferenceGroup
+ <com.android.car.ui.preference.CarUiPreference
android:key="@string/pk_device_admin_add_policies"
android:selectable="false"
settings:singleLineTitle="false"
@@ -49,13 +49,5 @@
settings:singleLineTitle="false"
settings:controller="com.android.car.settings.enterprise.DeviceAdminAddSupportPreferenceController"
settings:showChevron="false"/>
- <com.android.car.ui.preference.CarUiPreference
- android:key="@string/pk_device_admin_add_action"
- settings:controller="com.android.car.settings.enterprise.DeviceAdminAddActionPreferenceController"
- settings:showChevron="false"/>
- <com.android.car.ui.preference.CarUiPreference
- android:key="@string/pk_device_admin_add_cancel"
- settings:controller="com.android.car.settings.enterprise.DeviceAdminAddCancelPreferenceController"
- settings:showChevron="false"/>
</PreferenceScreen>
diff --git a/res/xml/device_admin_apps_fragment.xml b/res/xml/device_admin_apps_fragment.xml
new file mode 100644
index 0000000..72f0812
--- /dev/null
+++ b/res/xml/device_admin_apps_fragment.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/manage_device_admin"
+ android:key="@string/psk_device_admin_apps">
+ <Preference
+ android:key="@string/pk_device_admin_apps_description"
+ android:summary="@string/device_admin_apps_description"
+ android:selectable="false"/>
+ <com.android.car.settings.common.DividerPreference/>
+ <PreferenceCategory
+ android:key="@string/pk_device_admin_activated_apps"
+ android:title="@string/device_admin_activated_apps"
+ settings:controller="com.android.car.settings.enterprise.DeviceAdminActivatedAppsPreferenceController"/>
+ <com.android.car.settings.common.DividerPreference/>
+ <PreferenceCategory
+ android:key="@string/pk_device_admin_deactivated_apps"
+ android:title="@string/device_admin_deactivated_apps"
+ settings:controller="com.android.car.settings.enterprise.DeviceAdminDeactivatedAppsPreferenceController"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/enterprise_privacy_settings_fragment.xml b/res/xml/enterprise_privacy_settings_fragment.xml
new file mode 100644
index 0000000..5241fa4
--- /dev/null
+++ b/res/xml/enterprise_privacy_settings_fragment.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/enterprise_privacy_settings"
+ android:key="@string/psk_enterprise_privacy_settings">
+
+<!-- TODO(b/206022572): preferences below were copied mostly "as-is" from phone, they need to be
+ polished for automotive (for example, adding dividers, removing order, etc...) -->
+
+ <PreferenceCategory android:key="@string/psk_enterprise_privacy_exposure_category"
+ android:order="200"
+ android:title="@string/enterprise_privacy_exposure_category"
+ android:contentDescription="@string/enterprise_privacy_exposure_category">
+ <Preference android:key="@string/pk_enterprise_privacy_enterprise_data"
+ android:order="210"
+ android:layout_height="wrap_content"
+ android:title="@string/enterprise_privacy_enterprise_data"
+ android:selectable="false"/>
+ <Preference android:key="@string/pk_enterprise_privacy_installed_packages"
+ android:order="220"
+ android:title="@string/enterprise_privacy_installed_packages"
+ android:selectable="false"/>
+ <Preference android:key="@string/pk_enterprise_privacy_usage_stats"
+ android:order="230"
+ android:title="@string/enterprise_privacy_usage_stats"
+ android:selectable="false"/>
+ <!-- TODO(b/206155858): figure out why it doesn't have a title -->
+ <Preference android:key="@string/pk_enterprise_privacy_network_logs"
+ settings:controller="com.android.car.settings.enterprise.NetworkLogsPreferenceController"
+ android:order="240"
+ android:title="@string/enterprise_privacy_network_logs"
+ android:selectable="false"/>
+ <Preference android:key="@string/pk_enterprise_privacy_bug_reports"
+ settings:controller="com.android.car.settings.enterprise.BugReportsPreferenceController"
+ android:order="250"
+ android:title="@string/enterprise_privacy_bug_reports"
+ android:selectable="false"/>
+ <Preference android:key="@string/pk_enterprise_privacy_security_logs"
+ settings:controller="com.android.car.settings.enterprise.SecurityLogsPreferenceController"
+ android:order="260"
+ android:title="@string/enterprise_privacy_security_logs"
+ android:selectable="false"/>
+ </PreferenceCategory>
+
+ <PreferenceCategory android:title="@string/enterprise_privacy_exposure_changes_category"
+ android:order="300"
+ android:key="@string/psk_enterprise_privacy_exposure_changes_category">
+ <Preference
+ settings:controller="com.android.car.settings.enterprise.EnterpriseInstalledPackagesPreferenceController"
+ android:order="310"
+ android:key="@string/pk_enterprise_privacy_number_enterprise_installed_packages"
+ android:title="@string/enterprise_privacy_enterprise_installed_packages"/>
+ <Preference
+ settings:controller="com.android.car.settings.enterprise.AdminGrantedLocationPermissionsPreferenceController"
+ android:order="320"
+ android:key="@string/pk_enterprise_privacy_number_location_access_packages"
+ android:title="@string/enterprise_privacy_location_access"/>
+ <Preference
+ settings:controller="com.android.car.settings.enterprise.AdminGrantedMicrophonePermissionPreferenceController"
+ android:order="330"
+ android:key="@string/pk_enterprise_privacy_number_microphone_access_packages"
+ android:title="@string/enterprise_privacy_microphone_access"/>
+ <Preference
+ settings:controller="com.android.car.settings.enterprise.AdminGrantedCameraPermissionPreferenceController"
+ android:order="340"
+ android:key="@string/pk_enterprise_privacy_number_camera_access_packages"
+ android:title="@string/enterprise_privacy_camera_access"/>
+ <Preference
+ settings:controller="com.android.car.settings.enterprise.EnterpriseSetDefaultAppsPreferenceController"
+ android:order="350"
+ android:key="@string/pk_enterprise_privacy_number_enterprise_set_default_apps"
+ android:title="@string/enterprise_privacy_enterprise_set_default_apps"/>
+
+ <!-- TODO(b/206155695): figure out why it doesn't have a title -->
+ <Preference android:key="@string/pk_enterprise_privacy_always_on_vpn_primary_user"
+ settings:controller="com.android.car.settings.enterprise.AlwaysOnCurrentUserPreferenceController"
+ android:order="360"
+ android:selectable="false"/>
+
+ <Preference android:key="@string/pk_enterprise_privacy_input_method"
+ settings:controller="com.android.car.settings.enterprise.ImePreferenceController"
+ android:order="380"
+ android:title="@string/enterprise_privacy_input_method"
+ android:selectable="false"/>
+ <Preference android:key="@string/pk_enterprise_privacy_global_http_proxy"
+ settings:controller="com.android.car.settings.enterprise.GlobalHttpProxyPreferenceController"
+ android:order="390"
+ android:title="@string/enterprise_privacy_global_http_proxy"
+ android:selectable="false"/>
+ <Preference android:key="@string/pk_enterprise_privacy_ca_certs_current_user"
+ settings:controller="com.android.car.settings.enterprise.CaCertsCurrentUserPreferenceController"
+ android:order="400"
+ android:title="@string/enterprise_privacy_ca_certs_personal"
+ android:selectable="false"/>
+ </PreferenceCategory>
+
+ <PreferenceCategory android:key="@string/psk_enterprise_privacy_device_access_category"
+ android:order="500"
+ android:title="@string/enterprise_privacy_device_access_category">
+ <Preference android:key="@string/pk_enterprise_privacy_lock_device"
+ android:order="510"
+ android:title="@string/enterprise_privacy_lock_device"
+ android:selectable="false"/>
+ <Preference android:key="@string/pk_enterprise_privacy_wipe_device"
+ settings:controller="com.android.car.settings.enterprise.WipeDevicePreferenceController"
+ android:order="520"
+ android:title="@string/enterprise_privacy_wipe_device"
+ android:selectable="false"/>
+ <Preference android:key="@string/pk_enterprise_privacy_failed_password_wipe_current_user"
+ settings:controller="com.android.car.settings.enterprise.FailedPasswordWipeCurrentUserPreferenceController"
+ android:order="530"
+ android:title="@string/enterprise_privacy_failed_password_wipe_device"
+ android:selectable="false"/>
+ </PreferenceCategory>
+
+ <com.android.settingslib.widget.FooterPreference
+ android:key="@string/pk_enterprise_privacy_header"
+ android:title="@string/enterprise_privacy_header"
+ android:selectable="false"
+ settings:searchable="false"/>
+</PreferenceScreen>
diff --git a/res/xml/homepage_fragment.xml b/res/xml/homepage_fragment.xml
index f75401d..ce21df9 100644
--- a/res/xml/homepage_fragment.xml
+++ b/res/xml/homepage_fragment.xml
@@ -81,6 +81,12 @@
android:title="@string/privacy_settings_title"
settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
<com.android.car.settings.common.TopLevelPreference
+ android:fragment="com.android.car.settings.accessibility.AccessibilitySettingsFragment"
+ android:icon="@drawable/ic_top_level_accessibility"
+ android:key="@string/pk_accessibility_settings_entry"
+ android:title="@string/accessibility_settings_title"
+ settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+ <com.android.car.settings.common.TopLevelPreference
android:fragment="com.android.car.settings.security.SecuritySettingsFragment"
android:icon="@drawable/ic_top_level_security"
android:key="@string/pk_security_settings_entry"
diff --git a/res/xml/location_settings_fragment.xml b/res/xml/location_settings_fragment.xml
index 721729e..2dd4bb1 100644
--- a/res/xml/location_settings_fragment.xml
+++ b/res/xml/location_settings_fragment.xml
@@ -20,11 +20,20 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/location_settings_title"
android:key="@string/psk_location_settings">
- <com.android.car.settings.common.ClickableWhileDisabledSwitchPreference
+ <com.android.car.settings.common.ColoredSwitchPreference
android:key="@string/pk_location_state_switch"
+ android:title="@string/location_toggle_title"
+ android:summary="@string/location_toggle_summary"
style="@style/ColoredSwitchPreferenceStyle"
settings:controller="com.android.car.settings.location.LocationStateSwitchPreferenceController"
settings:searchable="false"/>
+ <com.android.car.ui.preference.CarUiTwoActionSwitchPreference
+ android:fragment="com.android.car.settings.location.AdasLocationFragment"
+ android:key="@string/pk_location_driver_assistance_state_switch"
+ android:title="@string/location_driver_assistance_toggle_title"
+ android:summary="@string/location_driver_assistance_toggle_summary"
+ settings:controller="com.android.car.settings.location.AdasLocationSwitchPreferenceController"
+ settings:searchable="true"/>
<com.android.car.settings.common.DividerPreference/>
<Preference
android:fragment="com.android.car.settings.location.RecentLocationRequestsFragment"
diff --git a/res/xml/microphone_recent_requests_view_all_fragment.xml b/res/xml/microphone_recent_requests_view_all_fragment.xml
new file mode 100644
index 0000000..ed90cd5
--- /dev/null
+++ b/res/xml/microphone_recent_requests_view_all_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="@string/psk_microphone_recent_requests"
+ android:title="@string/microphone_settings_recent_requests_title">
+ <com.android.car.settings.common.LogicalPreferenceGroup
+ android:key="@string/pk_microphone_recent_requests"
+ settings:controller="com.android.car.settings.privacy.MicrophoneRecentAccessViewAllPreferenceController"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/mobile_network_fragment.xml b/res/xml/mobile_network_fragment.xml
index 87b6d7b..9ed0cea 100644
--- a/res/xml/mobile_network_fragment.xml
+++ b/res/xml/mobile_network_fragment.xml
@@ -20,6 +20,12 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/mobile_network_settings"
android:key="@string/psk_mobile_network">
+ <com.android.car.settings.datausage.DataUsageSummaryPreference
+ android:key="@string/pk_data_usage_summary"
+ settings:controller="com.android.car.settings.datausage.DataUsageSummaryPreferenceController"
+ android:selectable="false"
+ settings:singleLineTitle="false"/>
+ <com.android.car.settings.common.DividerPreference/>
<SwitchPreference
android:key="@string/pk_mobile_data_toggle"
android:summary="@string/mobile_network_toggle_summary"
@@ -30,4 +36,14 @@
android:summary="@string/roaming_summary"
android:title="@string/roaming_title"
settings:controller="com.android.car.settings.network.RoamingPreferenceController"/>
+ <Preference
+ android:key="@string/pk_app_data_usage"
+ android:title="@string/app_data_usage"
+ settings:controller="com.android.car.settings.datausage.DataUsagePreferenceController"/>
+ <Preference
+ android:fragment="com.android.car.settings.datausage.DataWarningAndLimitFragment"
+ android:key="@string/pk_data_warning_and_limit"
+ android:title="@string/data_warning_limit_title"
+ settings:controller="com.android.car.settings.datausage.DataWarningAndLimitPreferenceController"
+ settings:searchable="false"/>
</PreferenceScreen>
diff --git a/res/xml/network_and_internet_fragment.xml b/res/xml/network_and_internet_fragment.xml
index f43b420..72df5fe 100644
--- a/res/xml/network_and_internet_fragment.xml
+++ b/res/xml/network_and_internet_fragment.xml
@@ -27,26 +27,18 @@
android:icon="@drawable/ic_wifi_tethering"
settings:controller="com.android.car.settings.wifi.WifiTetherPreferenceController"
settings:searchable="false"/>
- <Preference
+ <com.android.car.ui.preference.CarUiTwoActionSwitchPreference
android:icon="@drawable/ic_settings_cellular"
android:key="@string/pk_mobile_network_settings_entry"
android:title="@string/mobile_network_settings"
settings:controller="com.android.car.settings.network.MobileNetworkEntryPreferenceController"
settings:searchable="false"/>
- <Preference
- android:fragment="com.android.car.settings.datausage.DataUsageFragment"
- android:icon="@drawable/ic_settings_data_usage"
- android:key="@string/pk_data_usage_settings_entry"
- android:title="@string/data_usage_settings"
- settings:controller="com.android.car.settings.datausage.DataUsageEntryPreferenceController"
- settings:searchable="false"/>
<com.android.car.settings.common.LogicalPreferenceGroup
android:key="@string/pk_wifi_entry_group"
settings:controller="com.android.car.settings.wifi.WifiEntryGroupPreferenceController">
<com.android.car.settings.common.DividerPreference/>
- <com.android.car.settings.common.ClickableWhileDisabledSwitchPreference
+ <com.android.car.settings.common.ColoredSwitchPreference
android:key="@string/pk_wifi_entry_state_switch"
- style="@style/ColoredSwitchPreferenceStyle"
android:title="@string/wifi_settings"
settings:controller="com.android.car.settings.wifi.WifiStateSwitchPreferenceController"
settings:searchable="false"/>
diff --git a/res/xml/privacy_microphone_settings_fragment.xml b/res/xml/privacy_microphone_settings_fragment.xml
new file mode 100644
index 0000000..13a302e
--- /dev/null
+++ b/res/xml/privacy_microphone_settings_fragment.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/microphone_settings_title"
+ android:key="@string/psk_microphone_settings">
+ <com.android.car.settings.common.ColoredSwitchPreference
+ android:key="@string/pk_microphone_state_switch"
+ android:title="@string/microphone_toggle_title"
+ android:summary="@string/microphone_toggle_summary"
+ style="@style/ColoredSwitchPreferenceStyle"
+ settings:controller="com.android.car.settings.privacy.MicTogglePreferenceController"
+ settings:searchable="false"/>
+ <com.android.car.settings.common.DividerPreference/>
+ <PreferenceCategory
+ android:key="@string/pk_microphone_recent_accesses_category"
+ android:title="@string/microphone_recently_accessed"
+ settings:controller="com.android.car.settings.privacy.MicrophoneRecentAccessesPreferenceController">
+ <com.android.car.settings.common.DividerPreference
+ android:order="999"/>
+ </PreferenceCategory>
+ <Preference
+ android:key="@string/pk_microphone_manage_permissions"
+ android:title="@string/microphone_manage_permissions"
+ settings:controller="com.android.car.settings.privacy.ManageMicPermissionsPreferenceController">
+ <intent android:action="android.intent.action.MANAGE_PERMISSION_APPS">
+ <extra android:name="android.intent.extra.PERMISSION_NAME"
+ android:value="android.permission-group.MICROPHONE"/>
+ </intent>
+ </Preference>
+</PreferenceScreen>
diff --git a/res/xml/privacy_settings_fragment.xml b/res/xml/privacy_settings_fragment.xml
index 3cb8848..e5cb690 100644
--- a/res/xml/privacy_settings_fragment.xml
+++ b/res/xml/privacy_settings_fragment.xml
@@ -21,34 +21,21 @@
android:title="@string/privacy_settings_title"
android:key="@string/psk_privacy_settings">
- <!-- TODO(b/182409057): proper icon -->
<Preference
- android:key="@string/pk_privacy_work_policy"
- android:title="@string/work_policy_privacy_settings"
- android:summary="@string/work_policy_privacy_settings_summary"
- android:icon="@drawable/privacy_app_permissions"
- settings:controller="com.android.car.settings.enterprise.WorkPolicyInfoPreferenceController">
- </Preference>
-
- <com.android.car.ui.preference.CarUiTwoActionSwitchPreference
+ android:fragment="com.android.car.settings.privacy.MicrophoneSettingsFragment"
android:key="@string/pk_mute_mic_switch"
android:title="@string/mute_mic_title"
android:summary="@string/mute_mic_summary"
android:icon="@drawable/privacy_mic"
- settings:controller="com.android.car.settings.privacy.MuteMicTogglePreferenceController">
- <intent android:action="android.intent.action.MANAGE_PERMISSION_APPS">
- <extra android:name="android.intent.extra.PERMISSION_NAME"
- android:value="android.permission-group.MICROPHONE"/>
- </intent>
- </com.android.car.ui.preference.CarUiTwoActionSwitchPreference>
+ settings:controller="com.android.car.settings.privacy.MicPreferenceController"/>
- <com.android.car.ui.preference.CarUiTwoActionSwitchPreference
+ <Preference
android:fragment="com.android.car.settings.location.LocationSettingsFragment"
android:key="@string/pk_location_settings_entry"
android:title="@string/location_settings_title"
android:summary="@string/privacy_location_summary"
android:icon="@drawable/privacy_location"
- settings:controller="com.android.car.settings.privacy.LocationTogglePreferenceController"/>
+ settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
<Preference
android:key="@string/pk_privacy_manage_perms"
@@ -76,4 +63,14 @@
</intent>
</com.android.car.settings.common.LogicalPreferenceGroup>
+ <!-- NOTE: must be multi-line as it uses the app label, whose size is undefined -->
+ <Preference
+ android:key="@string/pk_privacy_work_policy"
+ android:title="@string/work_policy_privacy_settings"
+ android:summary="@string/work_policy_privacy_settings_summary"
+ android:icon="@drawable/ic_corp_icon"
+ settings:controller="com.android.car.settings.enterprise.WorkPolicyInfoPreferenceController"
+ settings:singleLineTitle="false">
+ </Preference>
+
</PreferenceScreen>
diff --git a/res/xml/profile_details_fragment.xml b/res/xml/profile_details_fragment.xml
index 5cc0a76..5744e8b 100644
--- a/res/xml/profile_details_fragment.xml
+++ b/res/xml/profile_details_fragment.xml
@@ -61,4 +61,9 @@
android:title="@string/delete_this_profile_text"
settings:controller="com.android.car.settings.profiles.ProfileDetailsDeletePreferenceController"
settings:showChevron="false"/>
+ <com.android.car.ui.preference.CarUiPreference
+ android:key="@string/pk_profile_details_end_session"
+ android:title="@*android:string/global_action_logout"
+ settings:controller="com.android.car.settings.profiles.ProfileDetailsEndSessionPreferenceController"
+ settings:showChevron="false"/>
</PreferenceScreen>
diff --git a/res/xml/reset_options_fragment.xml b/res/xml/reset_options_fragment.xml
index a769b02..71f24a9 100644
--- a/res/xml/reset_options_fragment.xml
+++ b/res/xml/reset_options_fragment.xml
@@ -30,7 +30,7 @@
android:key="@string/pk_reset_app_pref"
android:title="@string/reset_app_pref_title"
settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
- <com.android.car.settings.common.ClickableWhileDisabledPreference
+ <Preference
android:fragment="com.android.car.settings.system.FactoryResetFragment"
android:key="@string/pk_factory_reset"
android:title="@string/factory_reset_title"
diff --git a/res/xml/security_settings_fragment.xml b/res/xml/security_settings_fragment.xml
index 032a1a5..a158109 100644
--- a/res/xml/security_settings_fragment.xml
+++ b/res/xml/security_settings_fragment.xml
@@ -43,4 +43,20 @@
android:value="com.android.settings.category.ia.security"/>
</intent>
</com.android.car.settings.common.LogicalPreferenceGroup>
+ <Preference
+ android:icon="@drawable/ic_corp_icon"
+ android:key="@string/pk_enterprise_privacy_settings"
+ android:title="@string/enterprise_privacy_settings"
+ android:summary="@string/empty_placeholder"
+ android:fragment="com.android.car.settings.enterprise.EnterprisePrivacySettingsFragment"
+ settings:controller=
+ "com.android.car.settings.enterprise.EnterprisePrivacySettingsPreferenceController" />
+ <Preference
+ android:icon="@drawable/ic_storage_apps"
+ android:key="@string/pk_manage_device_admin_settings"
+ android:title="@string/manage_device_admin"
+ android:summary="@string/empty_placeholder"
+ android:fragment="com.android.car.settings.enterprise.DeviceAdminAppsFragment"
+ settings:controller=
+ "com.android.car.settings.enterprise.ManageDeviceAdminPreferenceController" />
</PreferenceScreen>
diff --git a/res/xml/sound_settings_fragment.xml b/res/xml/sound_settings_fragment.xml
index 6ecb5e2..7d4c7aa 100644
--- a/res/xml/sound_settings_fragment.xml
+++ b/res/xml/sound_settings_fragment.xml
@@ -27,16 +27,19 @@
android:key="@string/pk_default_ringtone"
android:ringtoneType="ringtone"
android:title="@string/ringtone_title"
+ android:summary="@string/empty_placeholder"
settings:controller="com.android.car.settings.sound.RingtonePreferenceController"/>
<com.android.car.settings.sound.RingtonePreference
android:key="@string/pk_default_notification"
android:ringtoneType="notification"
android:title="@string/notification_ringtone_title"
+ android:summary="@string/empty_placeholder"
settings:controller="com.android.car.settings.sound.RingtonePreferenceController"/>
<com.android.car.settings.sound.RingtonePreference
android:key="@string/pk_default_alarm"
android:ringtoneType="alarm"
android:title="@string/alarm_ringtone_title"
+ android:summary="@string/empty_placeholder"
settings:controller="com.android.car.settings.sound.RingtonePreferenceController"/>
<com.android.car.settings.common.LogicalPreferenceGroup
android:key="@string/pk_sounds_extra_settings"
diff --git a/res/xml/vehicle_data_fragment.xml b/res/xml/vehicle_data_fragment.xml
index 0188021..7fd5caf 100644
--- a/res/xml/vehicle_data_fragment.xml
+++ b/res/xml/vehicle_data_fragment.xml
@@ -21,13 +21,13 @@
android:title="@string/privacy_vehicle_data_title"
android:key="@string/psk_vehicle_data">
- <com.android.car.settings.common.ClickableWhileDisabledPreference
+ <Preference
android:key="@string/pk_vehicle_data_delete_profile"
android:title="@string/vehicle_data_delete_user_title"
android:summary="@string/vehicle_data_delete_user_summary"
settings:controller="com.android.car.settings.privacy.DeleteUserPreferenceController"/>
- <com.android.car.settings.common.ClickableWhileDisabledPreference
+ <Preference
android:fragment="com.android.car.settings.system.FactoryResetFragment"
android:key="@string/pk_factory_reset"
android:title="@string/factory_reset_title"
diff --git a/res/xml/wifi_list_fragment.xml b/res/xml/wifi_list_fragment.xml
index f4ae249..e1be990 100644
--- a/res/xml/wifi_list_fragment.xml
+++ b/res/xml/wifi_list_fragment.xml
@@ -18,7 +18,7 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/wifi_settings"
android:key="@string/psk_wifi_list">
- <com.android.car.settings.common.ClickableWhileDisabledSwitchPreference
+ <com.android.car.settings.common.ColoredSwitchPreference
android:key="@string/pk_wifi_state_switch"
android:title="@string/wifi_settings"
style="@style/ColoredSwitchPreferenceStyle"
diff --git a/src/com/android/car/settings/TEST_MAPPING b/src/com/android/car/settings/TEST_MAPPING
index 0523989..0eedbb9 100644
--- a/src/com/android/car/settings/TEST_MAPPING
+++ b/src/com/android/car/settings/TEST_MAPPING
@@ -1,10 +1,10 @@
{
"auto-end-to-end-postsubmit": [
{
- "name": "AndroidAutoUiTests",
+ "name": "AndroidAutomotiveSettingsTests",
"options" : [
{
- "include-filter": "android.test.functional.auto.apps.SettingHelperTest"
+ "include-filter": "android.platform.tests.SettingTest"
}
]
}
diff --git a/src/com/android/car/settings/accessibility/AccessibilitySettingsFragment.java b/src/com/android/car/settings/accessibility/AccessibilitySettingsFragment.java
new file mode 100644
index 0000000..b77ae2c
--- /dev/null
+++ b/src/com/android/car/settings/accessibility/AccessibilitySettingsFragment.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * The main page for accessibility settings. This allows users to change accessibility settings
+ * like closed captions styling and text size.
+ */
+public class AccessibilitySettingsFragment extends SettingsFragment {
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.accessibility_settings_fragment;
+ }
+
+}
diff --git a/src/com/android/car/settings/accessibility/CaptionSettingsPreferenceController.java b/src/com/android/car/settings/accessibility/CaptionSettingsPreferenceController.java
new file mode 100644
index 0000000..057db02
--- /dev/null
+++ b/src/com/android/car/settings/accessibility/CaptionSettingsPreferenceController.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * {@link PreferenceController} for the preference which leads the user to the caption settings
+ * from within accessibility settings.
+ */
+public class CaptionSettingsPreferenceController extends
+ PreferenceController<Preference> {
+
+ public CaptionSettingsPreferenceController(Context context,
+ String preferenceKey, FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected void updateState(Preference preference) {
+ preference.setSummary(getSummary());
+ }
+
+ @Override
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
+ }
+
+ private CharSequence getSummary() {
+ boolean captionsEnabled = Settings.Secure.getInt(getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0) != 0;
+ return captionsEnabled ? getContext().getString(R.string.captions_settings_on)
+ : getContext().getString(R.string.captions_settings_off);
+ }
+}
diff --git a/src/com/android/car/settings/accessibility/CaptionsSettingsFragment.java b/src/com/android/car/settings/accessibility/CaptionsSettingsFragment.java
new file mode 100644
index 0000000..ef59359
--- /dev/null
+++ b/src/com/android/car/settings/accessibility/CaptionsSettingsFragment.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Fragment for video closed caption related settings.
+ */
+public class CaptionsSettingsFragment extends SettingsFragment {
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.captions_settings_fragment;
+ }
+}
diff --git a/src/com/android/car/settings/accessibility/CaptionsTextSizeListPreferenceController.java b/src/com/android/car/settings/accessibility/CaptionsTextSizeListPreferenceController.java
new file mode 100644
index 0000000..d6461ec
--- /dev/null
+++ b/src/com/android/car/settings/accessibility/CaptionsTextSizeListPreferenceController.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Preference controller for setting the captions text size. This is achieved through the settings
+ * secure constant {@link Settings.Secure#ACCESSIBILITY_CAPTIONING_FONT_SCALE}.
+ */
+public class CaptionsTextSizeListPreferenceController extends PreferenceController<ListPreference> {
+
+ private static final int DEFAULT_SELECTOR_INDEX = 2;
+ private static final float DEFAULT_TEXT_SIZE = 1.0F;
+
+ @VisibleForTesting
+ final String[] mFontSizeTitles;
+ private final String[] mFontSizeStringValues;
+ private final float[] mFontSizeFloatValues;
+
+ public CaptionsTextSizeListPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mFontSizeTitles = new String[]{
+ context.getString(R.string.captions_settings_text_size_very_small),
+ context.getString(R.string.captions_settings_text_size_small),
+ context.getString(R.string.captions_settings_text_size_default),
+ context.getString(R.string.captions_settings_text_size_large),
+ context.getString(R.string.captions_settings_text_size_very_large)
+ };
+ mFontSizeStringValues = new String[]{
+ "0.25",
+ "0.5",
+ "1.0",
+ "1.5",
+ "2.0"
+ };
+ mFontSizeFloatValues = new float[mFontSizeStringValues.length];
+ for (int i = 0; i < mFontSizeStringValues.length; i++) {
+ mFontSizeFloatValues[i] = Float.parseFloat(mFontSizeStringValues[i]);
+ }
+ }
+
+ @Override
+ protected Class<ListPreference> getPreferenceType() {
+ return ListPreference.class;
+ }
+
+ @Override
+ protected void updateState(ListPreference preference) {
+ preference.setEntries(mFontSizeTitles);
+ preference.setEntryValues(mFontSizeStringValues);
+ int currentFontSizeIndex = getCurrentSelectedFontSizeIndex();
+ preference.setValueIndex(currentFontSizeIndex);
+ preference.setSummary(getSummary(currentFontSizeIndex));
+ }
+
+ @Override
+ public boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
+ float newFontValue = Float.parseFloat((String) newValue);
+ Settings.Secure.putFloat(getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE, newFontValue);
+ return true;
+ }
+
+ private CharSequence getSummary(int currentFontSizeIndex) {
+ return mFontSizeTitles[currentFontSizeIndex];
+ }
+
+ private int getCurrentSelectedFontSizeIndex() {
+ float currentFontScale = Settings.Secure.getFloat(getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE, DEFAULT_TEXT_SIZE);
+
+ int selectorIndex = DEFAULT_SELECTOR_INDEX;
+ for (int i = 0; i < mFontSizeFloatValues.length; i++) {
+ if (mFontSizeFloatValues[i] == currentFontScale) {
+ selectorIndex = i;
+ break;
+ }
+ }
+
+ return selectorIndex;
+ }
+}
diff --git a/src/com/android/car/settings/accessibility/CaptionsTextStyleListPreferenceController.java b/src/com/android/car/settings/accessibility/CaptionsTextStyleListPreferenceController.java
new file mode 100644
index 0000000..80411a7
--- /dev/null
+++ b/src/com/android/car/settings/accessibility/CaptionsTextStyleListPreferenceController.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Preference controller for setting the captions text style. This is achieved through the settings
+ * secure constant {@link Settings.Secure#ACCESSIBILITY_CAPTIONING_PRESET}.
+ */
+public class CaptionsTextStyleListPreferenceController extends
+ PreferenceController<ListPreference> {
+
+ private static final int DEFAULT_SELECTOR_INDEX = 0;
+ private static final int DEFAULT_STYLE_PRESET = 4;
+
+ @VisibleForTesting
+ final String[] mFontStyleTitles;
+ private final String[] mFontStyleStringValues;
+ private final int[] mFontStyleIntValues;
+
+ public CaptionsTextStyleListPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mFontStyleTitles = new String[]{
+ context.getString(R.string.captions_settings_text_style_by_app),
+ context.getString(R.string.captions_settings_text_style_white_on_black),
+ context.getString(R.string.captions_settings_text_style_black_on_white),
+ context.getString(R.string.captions_settings_text_style_yellow_on_black),
+ context.getString(R.string.captions_settings_text_style_yellow_on_blue)
+ };
+ mFontStyleStringValues = new String[]{
+ "4",
+ "0",
+ "1",
+ "2",
+ "3"
+ };
+ mFontStyleIntValues = new int[mFontStyleStringValues.length];
+ for (int i = 0; i < mFontStyleStringValues.length; i++) {
+ mFontStyleIntValues[i] = Integer.parseInt(mFontStyleStringValues[i]);
+ }
+ }
+
+ @Override
+ protected Class<ListPreference> getPreferenceType() {
+ return ListPreference.class;
+ }
+
+ @Override
+ protected void updateState(ListPreference preference) {
+ preference.setEntries(mFontStyleTitles);
+ preference.setEntryValues(mFontStyleStringValues);
+ int currentFontStyleIndex = getCurrentSelectedFontStyleIndex();
+ preference.setValueIndex(currentFontStyleIndex);
+ preference.setSummary(getSummary(currentFontStyleIndex));
+ }
+
+ @Override
+ public boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
+ int newFontValue = Integer.parseInt((String) newValue);
+ Settings.Secure.putInt(getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, newFontValue);
+ return true;
+ }
+
+ private CharSequence getSummary(int currentFontStyleIndex) {
+ return mFontStyleTitles[currentFontStyleIndex];
+ }
+
+ private int getCurrentSelectedFontStyleIndex() {
+ int currentFontStyle = Settings.Secure.getInt(getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, DEFAULT_STYLE_PRESET);
+
+ int selectorIndex = DEFAULT_SELECTOR_INDEX;
+ for (int i = 0; i < mFontStyleIntValues.length; i++) {
+ if (mFontStyleIntValues[i] == currentFontStyle) {
+ selectorIndex = i;
+ break;
+ }
+ }
+
+ return selectorIndex;
+ }
+}
diff --git a/src/com/android/car/settings/accessibility/ShowCaptionsSwitchPreferenceController.java b/src/com/android/car/settings/accessibility/ShowCaptionsSwitchPreferenceController.java
new file mode 100644
index 0000000..9cad26e
--- /dev/null
+++ b/src/com/android/car/settings/accessibility/ShowCaptionsSwitchPreferenceController.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.car.settings.common.ColoredSwitchPreference;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Enables/disables default captions settings for video apps via the relevant settings constant.
+ */
+public class ShowCaptionsSwitchPreferenceController extends
+ PreferenceController<ColoredSwitchPreference> {
+
+ public ShowCaptionsSwitchPreferenceController(Context context,
+ String preferenceKey,
+ FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected void updateState(ColoredSwitchPreference preference) {
+ getPreference().setChecked(Settings.Secure.getInt(getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0) != 0);
+ }
+
+ @Override
+ protected boolean handlePreferenceChanged(ColoredSwitchPreference preference,
+ Object newValue) {
+ boolean captionsEnabled = (Boolean) newValue;
+ Settings.Secure.putInt(getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, captionsEnabled ? 1 : 0);
+ return true;
+ }
+
+ @Override
+ protected Class<ColoredSwitchPreference> getPreferenceType() {
+ return ColoredSwitchPreference.class;
+ }
+}
diff --git a/src/com/android/car/settings/accounts/AccountDetailsPreferenceController.java b/src/com/android/car/settings/accounts/AccountDetailsPreferenceController.java
index 22542cf..1685b7d 100644
--- a/src/com/android/car/settings/accounts/AccountDetailsPreferenceController.java
+++ b/src/com/android/car/settings/accounts/AccountDetailsPreferenceController.java
@@ -16,6 +16,12 @@
package com.android.car.settings.accounts;
+import static android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
+
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AuthenticatorException;
@@ -34,6 +40,7 @@
import com.android.car.settings.common.ErrorDialog;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
+import com.android.car.settings.enterprise.EnterpriseUtils;
import com.android.car.settings.profiles.ProfileHelper;
import java.io.IOException;
@@ -107,8 +114,12 @@
/* rejectListener= */ null,
/* neutralListener= */ null);
- getPreference().setSecondaryActionVisible(getProfileHelper()
- .canCurrentProcessModifyAccounts());
+ getPreference().setSecondaryActionVisible(
+ getSecondaryActionAvailabilityStatus() == AVAILABLE
+ || getSecondaryActionAvailabilityStatus() == AVAILABLE_FOR_VIEWING);
+ getPreference().setSecondaryActionEnabled(
+ getSecondaryActionAvailabilityStatus() != DISABLED_FOR_PROFILE);
+
getPreference().setOnSecondaryActionClickListener(this::onRemoveAccountClicked);
}
@@ -133,7 +144,22 @@
}
}
+ private int getSecondaryActionAvailabilityStatus() {
+ ProfileHelper profileHelper = getProfileHelper();
+ if (profileHelper.canCurrentProcessModifyAccounts()) {
+ return AVAILABLE;
+ }
+ if (profileHelper.isDemoOrGuest()
+ || hasUserRestrictionByUm(getContext(), DISALLOW_MODIFY_ACCOUNTS)) {
+ return DISABLED_FOR_PROFILE;
+ }
+ return AVAILABLE_FOR_VIEWING;
+ }
+
private void onRemoveAccountClicked() {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_MODIFY_ACCOUNTS)) {
+ showActionDisabledByAdminDialog();
+ }
ConfirmationDialogFragment dialog =
new ConfirmationDialogFragment.Builder(getContext())
.setTitle(R.string.really_remove_account_title)
@@ -150,6 +176,13 @@
ErrorDialog.newInstance(R.string.remove_account_error_title), /* tag= */ null);
}
+ private void showActionDisabledByAdminDialog() {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ DISALLOW_MODIFY_ACCOUNTS),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
+
@VisibleForTesting
ProfileHelper getProfileHelper() {
return ProfileHelper.getInstance(getContext());
diff --git a/src/com/android/car/settings/accounts/AccountGroupPreferenceController.java b/src/com/android/car/settings/accounts/AccountGroupPreferenceController.java
index 846130e..f3bc84e 100644
--- a/src/com/android/car/settings/accounts/AccountGroupPreferenceController.java
+++ b/src/com/android/car/settings/accounts/AccountGroupPreferenceController.java
@@ -16,6 +16,10 @@
package com.android.car.settings.accounts;
+import static android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
+
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
+
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
@@ -44,10 +48,26 @@
}
@Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> getProfileHelper()
+ .runClickableWhileDisabled(getContext(), getFragmentController()));
+ }
+
+ @Override
protected int getAvailabilityStatus() {
- boolean isCurrentUser = getProfileHelper().isCurrentProcessUser(getUserInfo());
+ ProfileHelper profileHelper = getProfileHelper();
+ boolean isCurrentUser = profileHelper.isCurrentProcessUser(getUserInfo());
boolean canModifyAccounts = getProfileHelper().canCurrentProcessModifyAccounts();
- return (isCurrentUser && canModifyAccounts) ? AVAILABLE : DISABLED_FOR_PROFILE;
+
+ if (isCurrentUser && canModifyAccounts) {
+ return AVAILABLE;
+ }
+ if (!isCurrentUser || profileHelper.isDemoOrGuest()
+ || hasUserRestrictionByUm(getContext(), DISALLOW_MODIFY_ACCOUNTS)) {
+ return DISABLED_FOR_PROFILE;
+ }
+ return AVAILABLE_FOR_VIEWING;
}
@VisibleForTesting
diff --git a/src/com/android/car/settings/accounts/AccountListPreferenceController.java b/src/com/android/car/settings/accounts/AccountListPreferenceController.java
index bfe2c15..ec97b2b 100644
--- a/src/com/android/car/settings/accounts/AccountListPreferenceController.java
+++ b/src/com/android/car/settings/accounts/AccountListPreferenceController.java
@@ -16,6 +16,10 @@
package com.android.car.settings.accounts;
+import static android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
+
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
+
import android.accounts.Account;
import android.accounts.AccountManager;
import android.car.drivingstate.CarUxRestrictions;
@@ -93,10 +97,27 @@
}
@Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> getProfileHelper()
+ .runClickableWhileDisabled(getContext(), getFragmentController()));
+ }
+
+ @Override
protected int getAvailabilityStatus() {
- boolean canModifyAccounts = ProfileHelper.getInstance(getContext())
- .canCurrentProcessModifyAccounts();
- return canModifyAccounts ? AVAILABLE : DISABLED_FOR_PROFILE;
+ ProfileHelper profileHelper = getProfileHelper();
+ boolean canModifyAccounts = profileHelper.canCurrentProcessModifyAccounts();
+
+ if (canModifyAccounts) {
+ return AVAILABLE;
+ }
+
+ if (profileHelper.isDemoOrGuest()
+ || hasUserRestrictionByUm(getContext(), DISALLOW_MODIFY_ACCOUNTS)) {
+ return DISABLED_FOR_PROFILE;
+ }
+
+ return AVAILABLE_FOR_VIEWING;
}
/**
@@ -273,6 +294,11 @@
return false;
}
+ @VisibleForTesting
+ ProfileHelper getProfileHelper() {
+ return ProfileHelper.getInstance(getContext());
+ }
+
private static class AccountPreference extends CarUiPreference {
/** Account that this Preference represents. */
private final Account mAccount;
diff --git a/src/com/android/car/settings/accounts/AddAccountPreferenceController.java b/src/com/android/car/settings/accounts/AddAccountPreferenceController.java
index 5a6d234..8e74822 100644
--- a/src/com/android/car/settings/accounts/AddAccountPreferenceController.java
+++ b/src/com/android/car/settings/accounts/AddAccountPreferenceController.java
@@ -16,6 +16,10 @@
package com.android.car.settings.accounts;
+import static android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
+
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
+
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
@@ -62,6 +66,13 @@
}
@Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> getProfileHelper()
+ .runClickableWhileDisabled(getContext(), getFragmentController()));
+ }
+
+ @Override
protected boolean handlePreferenceClicked(Preference preference) {
AccountTypesHelper helper = getAccountTypesHelper();
@@ -90,7 +101,11 @@
if (getProfileHelper().canCurrentProcessModifyAccounts()) {
return AVAILABLE;
}
- return DISABLED_FOR_PROFILE;
+ if (getProfileHelper().isDemoOrGuest()
+ || hasUserRestrictionByUm(getContext(), DISALLOW_MODIFY_ACCOUNTS)) {
+ return DISABLED_FOR_PROFILE;
+ }
+ return AVAILABLE_FOR_VIEWING;
}
@VisibleForTesting
diff --git a/src/com/android/car/settings/accounts/SyncPreference.java b/src/com/android/car/settings/accounts/SyncPreference.java
index aca1173..047c8e5 100644
--- a/src/com/android/car/settings/accounts/SyncPreference.java
+++ b/src/com/android/car/settings/accounts/SyncPreference.java
@@ -22,7 +22,6 @@
import androidx.preference.PreferenceViewHolder;
-import com.android.car.apps.common.util.Themes;
import com.android.car.settings.R;
import com.android.car.ui.preference.CarUiSwitchPreference;
@@ -69,15 +68,15 @@
switch (mSyncState) {
case ACTIVE:
setIcon(R.drawable.ic_sync_anim);
- getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+ getIcon().setTintList(getContext().getColorStateList(R.color.icon_color_default));
break;
case PENDING:
setIcon(R.drawable.ic_sync);
- getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+ getIcon().setTintList(getContext().getColorStateList(R.color.icon_color_default));
break;
case FAILED:
setIcon(R.drawable.ic_sync_problem);
- getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+ getIcon().setTintList(getContext().getColorStateList(R.color.icon_color_default));
break;
default:
setIcon(null);
diff --git a/src/com/android/car/settings/applications/ApplicationActionButtonsPreferenceController.java b/src/com/android/car/settings/applications/ApplicationActionButtonsPreferenceController.java
index 2622c5e..bfb40c1 100644
--- a/src/com/android/car/settings/applications/ApplicationActionButtonsPreferenceController.java
+++ b/src/com/android/car/settings/applications/ApplicationActionButtonsPreferenceController.java
@@ -54,6 +54,7 @@
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.enterprise.DeviceAdminAddActivity;
import com.android.car.settings.profiles.ProfileHelper;
import com.android.settingslib.Utils;
import com.android.settingslib.applications.ApplicationsState;
@@ -90,6 +91,8 @@
Arrays.asList(UserManager.DISALLOW_APPS_CONTROL);
private static final List<String> UNINSTALL_RESTRICTIONS =
Arrays.asList(UserManager.DISALLOW_UNINSTALL_APPS, UserManager.DISALLOW_APPS_CONTROL);
+ private static final List<String> DISABLE_RESTRICTIONS =
+ Arrays.asList(UserManager.DISALLOW_APPS_CONTROL);
@VisibleForTesting
static final String DISABLE_CONFIRM_DIALOG_TAG =
@@ -101,6 +104,9 @@
@VisibleForTesting
static final int UNINSTALL_REQUEST_CODE = 10;
+ @VisibleForTesting
+ static final int UNINSTALL_DEVICE_ADMIN_REQUEST_CODE = 11;
+
private DevicePolicyManager mDpm;
private PackageManager mPm;
private UserManager mUserManager;
@@ -151,17 +157,14 @@
};
@VisibleForTesting
- final ConfirmationDialogFragment.ConfirmListener mDisableConfirmListener =
- new ConfirmationDialogFragment.ConfirmListener() {
- @Override
- public void onConfirm(@Nullable Bundle arguments) {
- mPm.setApplicationEnabledSetting(mPackageName,
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, /* flags= */ 0);
- updateUninstallButtonInner(false);
- }
- };
+ final ConfirmationDialogFragment.ConfirmListener mDisableConfirmListener = i -> {
+ mPm.setApplicationEnabledSetting(mPackageName,
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, /* flags= */ 0);
+ updateUninstallButtonInner(false);
+ };
private final View.OnClickListener mDisableClickListener = i -> {
+ if (ignoreActionBecauseItsDisabledByAdmin(DISABLE_RESTRICTIONS)) return;
ConfirmationDialogFragment dialogFragment =
new ConfirmationDialogFragment.Builder(getContext())
.setMessage(getContext().getString(R.string.app_disable_dialog_text))
@@ -173,6 +176,7 @@
};
private final View.OnClickListener mEnableClickListener = i -> {
+ if (ignoreActionBecauseItsDisabledByAdmin(DISABLE_RESTRICTIONS)) return;
mPm.setApplicationEnabledSetting(mPackageName,
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, /* flags= */ 0);
updateUninstallButtonInner(true);
@@ -181,10 +185,19 @@
private final View.OnClickListener mUninstallClickListener = i -> {
if (ignoreActionBecauseItsDisabledByAdmin(UNINSTALL_RESTRICTIONS)) return;
Uri packageUri = Uri.parse("package:" + mPackageName);
- Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);
- uninstallIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
- getFragmentController().startActivityForResult(uninstallIntent, UNINSTALL_REQUEST_CODE,
- /* callback= */ this);
+ if (mDpm.packageHasActiveAdmins(mPackageName)) {
+ // Show Device Admin app details screen to deactivate the device admin before it can
+ // be uninstalled.
+ Intent deviceAdminIntent = new Intent(getContext(), DeviceAdminAddActivity.class)
+ .putExtra(DeviceAdminAddActivity.EXTRA_DEVICE_ADMIN_PACKAGE_NAME, mPackageName);
+ getFragmentController().startActivityForResult(deviceAdminIntent,
+ UNINSTALL_DEVICE_ADMIN_REQUEST_CODE, /* callback= */ this);
+ } else {
+ Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);
+ uninstallIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
+ getFragmentController().startActivityForResult(uninstallIntent, UNINSTALL_REQUEST_CODE,
+ /* callback= */ this);
+ }
};
private final ApplicationsState.Callbacks mApplicationStateCallbacks =
@@ -406,11 +419,6 @@
return true;
}
- if (mDpm.packageHasActiveAdmins(mPackageName)) {
- LOG.d("Uninstall disabled because package has active admins");
- return true;
- }
-
// We don't allow uninstalling profile/device owner on any profile because if it's a system
// app, "uninstall" is actually "downgrade to the system version + disable", and
// "downgrade" will clear data on all profiles.
@@ -536,7 +544,8 @@
@Override
public void processActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
- if (requestCode == UNINSTALL_REQUEST_CODE) {
+ if (requestCode == UNINSTALL_REQUEST_CODE
+ || requestCode == UNINSTALL_DEVICE_ADMIN_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
getFragmentController().goBack();
} else {
diff --git a/src/com/android/car/settings/applications/ApplicationDetailsFragment.java b/src/com/android/car/settings/applications/ApplicationDetailsFragment.java
index 6683a83..b1f35b7 100644
--- a/src/com/android/car/settings/applications/ApplicationDetailsFragment.java
+++ b/src/com/android/car/settings/applications/ApplicationDetailsFragment.java
@@ -83,9 +83,10 @@
R.string.pk_application_details_permissions).setPackageName(mPackageName);
use(StoragePreferenceController.class,
R.string.pk_application_details_storage)
- .setAppEntry(mAppEntry).setPackageName(mPackageName);
- use(PeakPerformancePreferenceController.class,
- R.string.pk_application_details_peak_performance).setPackageInfo(mPackageInfo);
+ .setAppEntry(mAppEntry).setAppState(mAppState).setPackageName(mPackageName);
+ use(PrioritizeAppPerformancePreferenceController.class,
+ R.string.pk_application_details_prioritize_app_performance)
+ .setPackageInfo(mPackageInfo);
use(HibernationSwitchPreferenceController.class,
R.string.pk_hibernation_switch)
.setPackageName(mPackageName);
diff --git a/src/com/android/car/settings/applications/HibernatedAppsPreferenceController.java b/src/com/android/car/settings/applications/HibernatedAppsPreferenceController.java
index b568c0a..7a51ab6 100644
--- a/src/com/android/car/settings/applications/HibernatedAppsPreferenceController.java
+++ b/src/com/android/car/settings/applications/HibernatedAppsPreferenceController.java
@@ -26,6 +26,7 @@
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.utils.StringUtil;
/**
* A preference controller handling the logic for updating summary of hibernated apps.
@@ -52,8 +53,8 @@
@Override
public void onHibernatedAppsCountLoaded(int hibernatedAppsCount) {
- getPreference().setSummary(getContext().getResources().getQuantityString(
- R.plurals.unused_apps_summary, hibernatedAppsCount, hibernatedAppsCount));
+ getPreference().setSummary(StringUtil.getIcuPluralsString(getContext(), hibernatedAppsCount,
+ R.string.unused_apps_summary));
refreshUi();
}
}
diff --git a/src/com/android/car/settings/applications/PeakPerformancePreferenceController.java b/src/com/android/car/settings/applications/PeakPerformancePreferenceController.java
deleted file mode 100644
index c24a0ec..0000000
--- a/src/com/android/car/settings/applications/PeakPerformancePreferenceController.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.applications;
-
-import android.car.Car;
-import android.car.drivingstate.CarUxRestrictions;
-import android.car.watchdog.CarWatchdogManager;
-import android.car.watchdog.PackageKillableState;
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.os.UserHandle;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.TwoStatePreference;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.ConfirmationDialogFragment;
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.Logger;
-import com.android.car.settings.common.PreferenceController;
-import com.android.internal.annotations.GuardedBy;
-
-import java.util.Objects;
-
-/**
- * Controller for preference which enables / disables I/O overuse killing for an application.
- */
-public class PeakPerformancePreferenceController extends PreferenceController<TwoStatePreference> {
- private static final Logger LOG = new Logger(PeakPerformancePreferenceController.class);
-
- @VisibleForTesting
- static final String TURN_OFF_PEAK_PERFORMANCE_DIALOG_TAG =
- "com.android.car.settings.applications.TurnOffPeakPerformanceDialog";
-
- private final Object mLock = new Object();
- @GuardedBy("mLock")
- private CarWatchdogManager mCarWatchdogManager;
-
- private Car mCar;
- private String mPackageName;
- private UserHandle mUserHandle;
- private int mKillableState;
-
- public PeakPerformancePreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController,
- CarUxRestrictions uxRestrictions) {
- super(context, preferenceKey, fragmentController, uxRestrictions);
- }
-
- @Override
- protected void onCreateInternal() {
- if (mCar != null && mCar.isConnected()) {
- mCar.disconnect();
- mCar = null;
- }
- mCar = Car.createCar(getContext(), null, Car.CAR_WAIT_TIMEOUT_WAIT_FOREVER,
- (Car car, boolean ready) -> {
- synchronized (mLock) {
- if (ready) {
- mCarWatchdogManager = (CarWatchdogManager) car.getCarManager(
- Car.CAR_WATCHDOG_SERVICE);
- } else {
- mCarWatchdogManager = null;
- }
- }
- });
- }
-
- @Override
- protected void onDestroyInternal() {
- if (mCar != null) {
- mCar.disconnect();
- mCar = null;
- }
- }
-
- /**
- * Set the package info of the application.
- */
- public void setPackageInfo(PackageInfo packageInfo) {
- mPackageName = packageInfo.packageName;
- mUserHandle = UserHandle.getUserHandleForUid(packageInfo.applicationInfo.uid);
- }
-
- @Override
- protected Class<TwoStatePreference> getPreferenceType() {
- return TwoStatePreference.class;
- }
-
- @Override
- protected void updateState(TwoStatePreference preference) {
- mKillableState = getKillableState();
- preference.setSummary(getContext().getString(R.string.peak_performance_summary));
- preference.setChecked(mKillableState == PackageKillableState.KILLABLE_STATE_YES);
- preference.setEnabled(mKillableState != PackageKillableState.KILLABLE_STATE_NEVER);
- }
-
- @Override
- protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
- if (mKillableState == PackageKillableState.KILLABLE_STATE_NEVER) {
- return false;
- }
-
- boolean shouldKill = (boolean) newValue;
-
- // If shouldKill is true, switch toggle going from OFF to ON.
- if (shouldKill) {
- setKillableState(true);
- preference.setChecked(true);
- mKillableState = PackageKillableState.KILLABLE_STATE_YES;
- } else {
- ConfirmationDialogFragment dialogFragment =
- new ConfirmationDialogFragment.Builder(getContext())
- .setTitle(R.string.peak_performance_dialog_title)
- .setMessage(R.string.peak_performance_dialog_text)
- .setPositiveButton(R.string.peak_performance_dialog_action_off,
- arguments -> {
- setKillableState(false);
- preference.setChecked(false);
- mKillableState = PackageKillableState.KILLABLE_STATE_NO;
- })
- .setNegativeButton(
- R.string.peak_performance_dialog_action_on,
- /* rejectListener= */null)
- .build();
- getFragmentController().showDialog(dialogFragment,
- TURN_OFF_PEAK_PERFORMANCE_DIALOG_TAG);
- }
- return shouldKill;
- }
-
- private int getKillableState() {
- synchronized (mLock) {
- return Objects.requireNonNull(mCarWatchdogManager).getPackageKillableStatesAsUser(
- mUserHandle).stream()
- .filter(pks -> pks.getPackageName().equals(mPackageName))
- .findFirst().map(PackageKillableState::getKillableState).orElse(-1);
- }
- }
-
- private void setKillableState(boolean isKillable) {
- synchronized (mLock) {
- mCarWatchdogManager.setKillablePackageAsUser(mPackageName, mUserHandle, isKillable);
- }
- }
-}
diff --git a/src/com/android/car/settings/applications/PermissionsPreferenceController.java b/src/com/android/car/settings/applications/PermissionsPreferenceController.java
index 98d4634..8caaa11 100644
--- a/src/com/android/car/settings/applications/PermissionsPreferenceController.java
+++ b/src/com/android/car/settings/applications/PermissionsPreferenceController.java
@@ -31,6 +31,7 @@
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PreferenceController;
import com.android.settingslib.applications.PermissionsSummaryHelper;
+import com.android.settingslib.utils.StringUtil;
import java.util.ArrayList;
import java.util.List;
@@ -114,10 +115,9 @@
ArrayList<CharSequence> list = new ArrayList<>(grantedGroupLabels);
if (additionalGrantedPermissionCount > 0) {
// N additional permissions.
- list.add(res.getQuantityString(
- R.plurals.runtime_permissions_additional_count,
+ list.add(StringUtil.getIcuPluralsString(getContext(),
additionalGrantedPermissionCount,
- additionalGrantedPermissionCount));
+ R.string.runtime_permissions_additional_count));
}
if (list.isEmpty()) {
mSummary = res.getString(
diff --git a/src/com/android/car/settings/applications/PrioritizeAppPerformancePreferenceController.java b/src/com/android/car/settings/applications/PrioritizeAppPerformancePreferenceController.java
new file mode 100644
index 0000000..fc59436
--- /dev/null
+++ b/src/com/android/car/settings/applications/PrioritizeAppPerformancePreferenceController.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import android.car.Car;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.watchdog.CarWatchdogManager;
+import android.car.watchdog.PackageKillableState;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.os.UserHandle;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.Objects;
+
+/** Controller for preference which turns on / off prioritize app performance setting. */
+public class PrioritizeAppPerformancePreferenceController
+ extends PreferenceController<TwoStatePreference> {
+ private static final Logger LOG =
+ new Logger(PrioritizeAppPerformancePreferenceController.class);
+
+ @VisibleForTesting
+ static final String TURN_ON_PRIORITIZE_APP_PERFORMANCE_DIALOG_TAG =
+ "com.android.car.settings.applications.TurnOnPrioritizeAppPerformanceDialogTag";
+
+ private final Object mLock = new Object();
+ @GuardedBy("mLock")
+ private CarWatchdogManager mCarWatchdogManager;
+
+ private Car mCar;
+ private String mPackageName;
+ private UserHandle mUserHandle;
+
+ private final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+ setKillableState(false);
+ getPreference().setChecked(true);
+ };
+
+ public PrioritizeAppPerformancePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected void onCreateInternal() {
+ if (mCar != null && mCar.isConnected()) {
+ mCar.disconnect();
+ mCar = null;
+ }
+ mCar = Car.createCar(getContext(), null, Car.CAR_WAIT_TIMEOUT_WAIT_FOREVER,
+ (car, isReady) -> {
+ synchronized (mLock) {
+ mCarWatchdogManager = isReady
+ ? (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE)
+ : null;
+ }
+ });
+
+ ConfirmationDialogFragment dialogFragment =
+ (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+ TURN_ON_PRIORITIZE_APP_PERFORMANCE_DIALOG_TAG);
+ ConfirmationDialogFragment.resetListeners(
+ dialogFragment, mConfirmListener, /* rejectListener= */ null,
+ /* neutralListener= */ null);
+ }
+
+ @Override
+ protected void onDestroyInternal() {
+ if (mCar != null) {
+ mCar.disconnect();
+ mCar = null;
+ }
+ }
+
+ /**
+ * Set the package info of the application.
+ */
+ public void setPackageInfo(PackageInfo packageInfo) {
+ mPackageName = packageInfo.packageName;
+ mUserHandle = UserHandle.getUserHandleForUid(packageInfo.applicationInfo.uid);
+ }
+
+ @Override
+ protected Class<TwoStatePreference> getPreferenceType() {
+ return TwoStatePreference.class;
+ }
+
+ @Override
+ protected void updateState(TwoStatePreference preference) {
+ int killableState = getKillableState();
+ preference.setChecked(killableState == PackageKillableState.KILLABLE_STATE_NO);
+ preference.setEnabled(killableState != PackageKillableState.KILLABLE_STATE_NEVER);
+ }
+
+ @Override
+ protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+ boolean isToggledOn = (boolean) newValue;
+ if (isToggledOn) {
+ showConfirmationDialog();
+ return false;
+ }
+ setKillableState(true);
+ return true;
+ }
+
+ private int getKillableState() {
+ synchronized (mLock) {
+ return Objects.requireNonNull(mCarWatchdogManager)
+ .getPackageKillableStatesAsUser(mUserHandle).stream()
+ .filter(pks -> pks.getPackageName().equals(mPackageName))
+ .findFirst().map(PackageKillableState::getKillableState).orElse(-1);
+ }
+ }
+
+ private void setKillableState(boolean isKillable) {
+ synchronized (mLock) {
+ mCarWatchdogManager.setKillablePackageAsUser(mPackageName, mUserHandle, isKillable);
+ }
+ }
+
+ private void showConfirmationDialog() {
+ ConfirmationDialogFragment dialogFragment =
+ new ConfirmationDialogFragment.Builder(getContext())
+ .setTitle(R.string.prioritize_app_performance_dialog_title)
+ .setMessage(R.string.prioritize_app_performance_dialog_text)
+ .setPositiveButton(R.string.prioritize_app_performance_dialog_action_on,
+ mConfirmListener)
+ .setNegativeButton(R.string.prioritize_app_performance_dialog_action_off,
+ /* rejectListener= */ null)
+ .build();
+ getFragmentController().showDialog(
+ dialogFragment, TURN_ON_PRIORITIZE_APP_PERFORMANCE_DIALOG_TAG);
+ }
+}
diff --git a/src/com/android/car/settings/applications/StoragePreferenceController.java b/src/com/android/car/settings/applications/StoragePreferenceController.java
index 42633f5..1d269e4 100644
--- a/src/com/android/car/settings/applications/StoragePreferenceController.java
+++ b/src/com/android/car/settings/applications/StoragePreferenceController.java
@@ -18,7 +18,9 @@
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
+import android.os.UserHandle;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import com.android.car.settings.R;
@@ -27,11 +29,55 @@
import com.android.car.settings.storage.AppStorageSettingsDetailsFragment;
import com.android.settingslib.applications.ApplicationsState;
+import java.util.ArrayList;
+
/** Business logic for the storage entry in the application details settings. */
public class StoragePreferenceController extends PreferenceController<Preference> {
- private String mPackageName;
+ private ApplicationsState mApplicationsState;
private ApplicationsState.AppEntry mAppEntry;
+ private ApplicationsState.Session mSession;
+ private String mPackageName;
+
+ @VisibleForTesting
+ final ApplicationsState.Callbacks mApplicationStateCallbacks =
+ new ApplicationsState.Callbacks() {
+ @Override
+ public void onRunningStateChanged(boolean running) {
+ }
+
+ @Override
+ public void onPackageListChanged() {
+ }
+
+ @Override
+ public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+ }
+
+ @Override
+ public void onPackageIconChanged() {
+ }
+
+ @Override
+ public void onPackageSizeChanged(String packageName) {
+ if (packageName.equals(mPackageName)) {
+ refreshUi();
+ }
+ }
+
+ @Override
+ public void onAllSizesComputed() {
+ refreshUi();
+ }
+
+ @Override
+ public void onLauncherInfoChanged() {
+ }
+
+ @Override
+ public void onLoadEntriesCompleted() {
+ }
+ };
public StoragePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -43,11 +89,19 @@
return Preference.class;
}
+
/** Sets the {@link ApplicationsState.AppEntry} which is used to load the app size. */
public StoragePreferenceController setAppEntry(ApplicationsState.AppEntry appEntry) {
mAppEntry = appEntry;
return this;
}
+
+ /** Sets the {@link ApplicationsState} which is used to load the app size. */
+ public StoragePreferenceController setAppState(ApplicationsState applicationsState) {
+ mApplicationsState = applicationsState;
+ return this;
+ }
+
/**
* Set the packageName, which is used to open the AppStorageSettingsDetailsFragment
*/
@@ -58,16 +112,40 @@
@Override
protected void checkInitialized() {
- if (mAppEntry == null || mPackageName == null) {
+ if (mAppEntry == null || mApplicationsState == null || mPackageName == null) {
throw new IllegalStateException(
- "AppEntry and PackageName should be set before calling this function");
+ "AppEntry, ApplicationsState and PackageName should be set before calling this "
+ + "function");
}
}
@Override
+ protected void onCreateInternal() {
+ mSession = mApplicationsState.newSession(mApplicationStateCallbacks);
+ }
+
+ @Override
+ protected void onStartInternal() {
+ mSession.onResume();
+ }
+
+ @Override
+ protected void onStopInternal() {
+ mSession.onPause();
+ }
+
+ @Override
protected void updateState(Preference preference) {
- preference.setSummary(
- getContext().getString(R.string.storage_type_internal, mAppEntry.sizeStr));
+ refreshAppEntry();
+ if (mAppEntry == null) {
+ getFragmentController().goBack();
+ } else if (mAppEntry.sizeStr == null) {
+ preference.setSummary(
+ getContext().getString(R.string.memory_calculating_size));
+ } else {
+ preference.setSummary(
+ getContext().getString(R.string.storage_type_internal, mAppEntry.sizeStr));
+ }
}
@Override
@@ -76,4 +154,9 @@
AppStorageSettingsDetailsFragment.getInstance(mPackageName));
return true;
}
+
+ // TODO(b/201351382): Remove after SettingsLib investigation
+ private void refreshAppEntry() {
+ mAppEntry = mApplicationsState.getEntry(mPackageName, UserHandle.myUserId());
+ }
}
diff --git a/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java b/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java
index 43885f0..e198fdc 100644
--- a/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java
+++ b/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java
@@ -26,6 +26,7 @@
import android.os.UserHandle;
import android.provider.Settings;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.TwoStatePreference;
import com.android.car.settings.common.FragmentController;
@@ -38,13 +39,20 @@
public abstract class AssistConfigBasePreferenceController extends
PreferenceController<TwoStatePreference> {
- private final SettingObserver mSettingObserver;
+ final SettingObserver mSettingObserver;
private final AssistUtils mAssistUtils;
public AssistConfigBasePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions, new AssistUtils(context));
+ }
+
+ @VisibleForTesting
+ AssistConfigBasePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ AssistUtils assistUtils) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mAssistUtils = new AssistUtils(context);
+ mAssistUtils = assistUtils;
mSettingObserver = new SettingObserver(getSettingUris(), this::refreshUi);
}
@@ -76,8 +84,8 @@
* Creates an observer that listens for changes to {@link Settings.Secure#ASSISTANT} as well as
* any other URI defined by {@link #getSettingUris()}.
*/
- private static class SettingObserver extends ContentObserver {
-
+ @VisibleForTesting
+ static class SettingObserver extends ContentObserver {
private static final Uri ASSIST_URI = Settings.Secure.getUriFor(Settings.Secure.ASSISTANT);
private final List<Uri> mUriList;
private final Runnable mSettingChangeListener;
diff --git a/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceController.java b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceController.java
index e0ed7a9..89da80e 100644
--- a/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceController.java
+++ b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceController.java
@@ -27,6 +27,7 @@
import android.provider.Settings;
import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import com.android.car.settings.applications.defaultapps.DefaultAppsPickerEntryBasePreferenceController;
import com.android.car.settings.common.FragmentController;
@@ -44,7 +45,8 @@
private static final Uri ASSIST_URI = Settings.Secure.getUriFor(Settings.Secure.ASSISTANT);
- private final ContentObserver mSettingObserver = new ContentObserver(
+ @VisibleForTesting
+ final ContentObserver mSettingObserver = new ContentObserver(
new Handler(Looper.getMainLooper())) {
@Override
public void onChange(boolean selfChange, Uri uri) {
@@ -61,9 +63,17 @@
public DefaultVoiceInputPickerEntryPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ new VoiceInputInfoProvider(context), new AssistUtils(context));
+ }
+
+ @VisibleForTesting
+ DefaultVoiceInputPickerEntryPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ VoiceInputInfoProvider voiceInputInfoProvider, AssistUtils assistUtils) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mVoiceInputInfoProvider = new VoiceInputInfoProvider(context);
- mAssistUtils = new AssistUtils(context);
+ mVoiceInputInfoProvider = voiceInputInfoProvider;
+ mAssistUtils = assistUtils;
}
@Override
diff --git a/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceController.java b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceController.java
index 0cc1eaf..6b1b932 100644
--- a/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceController.java
+++ b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceController.java
@@ -23,6 +23,7 @@
import android.text.TextUtils;
import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import com.android.car.settings.applications.defaultapps.DefaultAppsPickerBasePreferenceController;
import com.android.car.settings.common.FragmentController;
@@ -45,9 +46,17 @@
public DefaultVoiceInputPickerPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions, new AssistUtils(context),
+ new VoiceInputInfoProvider(context));
+ }
+
+ @VisibleForTesting
+ DefaultVoiceInputPickerPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ AssistUtils assistUtils, VoiceInputInfoProvider voiceInputInfoProvider) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mAssistUtils = new AssistUtils(context);
- mVoiceInputInfoProvider = new VoiceInputInfoProvider(context);
+ mAssistUtils = assistUtils;
+ mVoiceInputInfoProvider = voiceInputInfoProvider;
if (Objects.equals(mAssistUtils.getAssistComponentForUser(getCurrentProcessUserId()),
VoiceInputUtils.getCurrentService(getContext()))) {
ComponentName cn = mAssistUtils.getAssistComponentForUser(getCurrentProcessUserId());
diff --git a/src/com/android/car/settings/applications/assist/VoiceInputInfoProvider.java b/src/com/android/car/settings/applications/assist/VoiceInputInfoProvider.java
index ef01f4d..1fd0223 100644
--- a/src/com/android/car/settings/applications/assist/VoiceInputInfoProvider.java
+++ b/src/com/android/car/settings/applications/assist/VoiceInputInfoProvider.java
@@ -110,7 +110,7 @@
for (ResolveInfo resolveInfo : mAvailableVoiceInteractionServices) {
VoiceInteractionServiceInfo interactionServiceInfo = new VoiceInteractionServiceInfo(
mContext.getPackageManager(), resolveInfo.serviceInfo);
- if (interactionServiceInfo.getParseError() != null) {
+ if (hasParseError(interactionServiceInfo)) {
LOG.w("Error in VoiceInteractionService " + resolveInfo.serviceInfo.packageName
+ "/" + resolveInfo.serviceInfo.name + ": "
+ interactionServiceInfo.getParseError());
@@ -146,6 +146,11 @@
Collections.sort(mVoiceRecognitionInfoList);
}
+ @VisibleForTesting
+ boolean hasParseError(VoiceInteractionServiceInfo voiceInteractionServiceInfo) {
+ return voiceInteractionServiceInfo.getParseError() != null;
+ }
+
/**
* Base object used to represent {@link VoiceInteractionInfo} and {@link VoiceRecognitionInfo}.
*/
diff --git a/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java
index e1aaf45..2cedc08 100644
--- a/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java
+++ b/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java
@@ -48,13 +48,21 @@
.addCategory(Intent.CATEGORY_BROWSABLE)
.setData(Uri.parse("http:"));
- private final PackageManager mPm;
+ protected final PackageManager mPm;
private ApplicationsState.AppEntry mAppEntry;
public AppLaunchSettingsBasePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ context.getPackageManager());
+ }
+
+ @VisibleForTesting
+ AppLaunchSettingsBasePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ PackageManager packageManager) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mPm = context.getPackageManager();
+ mPm = packageManager;
}
/** Sets the app entry associated with this settings screen. */
diff --git a/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceController.java
index 310d14b..54fa191 100644
--- a/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceController.java
+++ b/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceController.java
@@ -25,6 +25,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.ListPreference;
import com.android.car.settings.R;
@@ -40,13 +41,18 @@
private static final Logger LOG = new Logger(AppLinkStatePreferenceController.class);
- private final PackageManager mPm;
private boolean mHasDomainUrls;
public AppLinkStatePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mPm = context.getPackageManager();
+ }
+
+ @VisibleForTesting
+ AppLinkStatePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ PackageManager packageManager) {
+ super(context, preferenceKey, fragmentController, uxRestrictions, packageManager);
}
@Override
diff --git a/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceController.java
index e608196..a1b2fe2 100644
--- a/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceController.java
+++ b/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceController.java
@@ -24,6 +24,7 @@
import android.os.RemoteException;
import android.os.ServiceManager;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import com.android.car.settings.R;
@@ -44,14 +45,20 @@
private static final Logger LOG = new Logger(ClearDefaultsPreferenceController.class);
private final IUsbManager mUsbManager;
- private final PackageManager mPm;
public ClearDefaultsPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
IBinder b = ServiceManager.getService(Context.USB_SERVICE);
mUsbManager = IUsbManager.Stub.asInterface(b);
- mPm = context.getPackageManager();
+ }
+
+ @VisibleForTesting
+ ClearDefaultsPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ PackageManager packageManager, IUsbManager iUsbManager) {
+ super(context, preferenceKey, fragmentController, uxRestrictions, packageManager);
+ mUsbManager = iUsbManager;
}
@Override
diff --git a/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java
index 30f1dba..2416196 100644
--- a/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java
+++ b/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java
@@ -84,10 +84,18 @@
public DomainAppPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ ApplicationsState.getInstance((Application) context.getApplicationContext()),
+ context.getPackageManager());
+ }
+
+ @VisibleForTesting
+ DomainAppPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ ApplicationsState applicationsState, PackageManager packageManager) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mApplicationsState = ApplicationsState.getInstance(
- (Application) context.getApplicationContext());
- mPm = context.getPackageManager();
+ mApplicationsState = applicationsState;
+ mPm = packageManager;
}
@Override
diff --git a/src/com/android/car/settings/applications/specialaccess/AppEntryListManager.java b/src/com/android/car/settings/applications/specialaccess/AppEntryListManager.java
index 7359f80..368f1e5 100644
--- a/src/com/android/car/settings/applications/specialaccess/AppEntryListManager.java
+++ b/src/com/android/car/settings/applications/specialaccess/AppEntryListManager.java
@@ -23,6 +23,7 @@
import android.os.Message;
import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import com.android.settingslib.applications.ApplicationsState;
@@ -72,7 +73,8 @@
void loadExtraInfo(List<ApplicationsState.AppEntry> entries);
}
- private final ApplicationsState.Callbacks mSessionCallbacks =
+ @VisibleForTesting
+ final ApplicationsState.Callbacks mSessionCallbacks =
new ApplicationsState.Callbacks() {
@Override
public void onRunningStateChanged(boolean running) {
@@ -131,8 +133,12 @@
private boolean mHasReceivedExtraInfo;
public AppEntryListManager(Context context) {
- mApplicationsState = ApplicationsState.getInstance(
- (Application) context.getApplicationContext());
+ this(context, ApplicationsState.getInstance((Application) context.getApplicationContext()));
+ }
+
+ @VisibleForTesting
+ AppEntryListManager(Context context, ApplicationsState applicationsState) {
+ mApplicationsState = applicationsState;
// Run on the same background thread as the ApplicationsState to make sure updates don't
// conflict.
mBackgroundHandler = new BackgroundHandler(new WeakReference<>(this),
diff --git a/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceController.java
index 9f01b98..1b59b9e 100644
--- a/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceController.java
+++ b/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceController.java
@@ -101,8 +101,16 @@
public AppOpsPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ context.getSystemService(AppOpsManager.class));
+ }
+
+ @VisibleForTesting
+ AppOpsPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ AppOpsManager appOpsManager) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+ mAppOpsManager = appOpsManager;
mAppEntryListManager = new AppEntryListManager(context);
}
diff --git a/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridge.java b/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridge.java
index 4a3d0a1..9fcd94e 100644
--- a/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridge.java
+++ b/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridge.java
@@ -60,16 +60,19 @@
* operation.
*/
public AppStateAppOpsBridge(Context context, int appOpsOpCode, String permission) {
- this(context, appOpsOpCode, permission, AppGlobals.getPackageManager());
+ this(context, appOpsOpCode, permission, AppGlobals.getPackageManager(),
+ UserManager.get(context).getUserProfiles(),
+ context.getSystemService(AppOpsManager.class));
}
@VisibleForTesting
AppStateAppOpsBridge(Context context, int appOpsOpCode, String permission,
- IPackageManager packageManager) {
+ IPackageManager packageManager, List<UserHandle> profiles,
+ AppOpsManager appOpsManager) {
mContext = context;
mIPackageManager = packageManager;
- mProfiles = UserManager.get(context).getUserProfiles();
- mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+ mProfiles = profiles;
+ mAppOpsManager = appOpsManager;
mAppOpsOpCode = appOpsOpCode;
mPermission = permission;
}
diff --git a/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceController.java
index 05f2a80..61ba2e5 100644
--- a/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceController.java
+++ b/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceController.java
@@ -23,6 +23,7 @@
import android.content.pm.ResolveInfo;
import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import com.android.car.settings.common.FragmentController;
@@ -39,8 +40,15 @@
public MoreSpecialAccessPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ context.getPackageManager());
+ }
+
+ @VisibleForTesting
+ MoreSpecialAccessPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ PackageManager packageManager) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- PackageManager packageManager = getContext().getPackageManager();
String packageName = packageManager.getPermissionControllerPackageName();
if (packageName != null) {
Intent intent = new Intent(Intent.ACTION_MANAGE_SPECIAL_APP_ACCESSES).setPackage(
diff --git a/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
index e3f024a..2fcded2 100644
--- a/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
+++ b/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
@@ -67,6 +67,8 @@
private final IconDrawableFactory mIconDrawableFactory;
private final ServiceListing.Callback mCallback = this::onServicesReloaded;
+ @VisibleForTesting
+ AsyncTask<Void, Void, Void> mAsyncTask;
private final ConfirmationDialogFragment.ConfirmListener mGrantConfirmListener = arguments -> {
ComponentName service = arguments.getParcelable(KEY_SERVICE);
@@ -80,8 +82,16 @@
public NotificationAccessPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ context.getSystemService(NotificationManager.class));
+ }
+
+ @VisibleForTesting
+ NotificationAccessPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ NotificationManager notificationManager) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mNm = context.getSystemService(NotificationManager.class);
+ mNm = notificationManager;
mServiceListing = new ServiceListing.Builder(context)
.setPermission(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE)
.setIntentAction(NotificationListenerService.SERVICE_INTERFACE)
@@ -136,7 +146,8 @@
mServiceListing.removeCallback(mCallback);
}
- private void onServicesReloaded(List<ServiceInfo> services) {
+ @VisibleForTesting
+ void onServicesReloaded(List<ServiceInfo> services) {
PackageManager packageManager = getContext().getPackageManager();
services.sort(new PackageItemInfo.DisplayNameComparator(packageManager));
getPreference().removeAll();
@@ -180,11 +191,16 @@
private void revokeNotificationAccess(ComponentName service) {
mNm.setNotificationListenerAccessGranted(service, /* granted= */ false);
- AsyncTask.execute(() -> {
- if (!mNm.isNotificationPolicyAccessGrantedForPackage(service.getPackageName())) {
- mNm.removeAutomaticZenRules(service.getPackageName());
+ mAsyncTask = new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... unused) {
+ if (!mNm.isNotificationPolicyAccessGrantedForPackage(service.getPackageName())) {
+ mNm.removeAutomaticZenRules(service.getPackageName());
+ }
+ return null;
}
- });
+ };
+ mAsyncTask.execute();
}
private boolean promptUserToConfirmChange(ComponentName service, String label,
diff --git a/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java
index 752ceda..e6ac2fd 100644
--- a/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java
+++ b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java
@@ -88,15 +88,22 @@
}
};
- @VisibleForTesting
- AppEntryListManager mAppEntryListManager;
+ private AppEntryListManager mAppEntryListManager;
private List<AppEntry> mEntries;
public PremiumSmsAccessPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions, SmsManager.getDefault(),
+ new AppEntryListManager(context));
+ }
+
+ @VisibleForTesting
+ PremiumSmsAccessPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ SmsManager smsManager, AppEntryListManager appEntryListManager) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mSmsManager = SmsManager.getDefault();
- mAppEntryListManager = new AppEntryListManager(context);
+ mSmsManager = smsManager;
+ mAppEntryListManager = appEntryListManager;
}
@Override
diff --git a/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java
index 33bde19..59cde92 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java
@@ -18,6 +18,7 @@
import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
@@ -36,6 +37,8 @@
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+import java.util.Set;
+
/**
* Displays a list of bonded (paired) Bluetooth devices. Clicking on a device launch the device
@@ -53,6 +56,8 @@
private static final MultiActionPreference.ActionItem MEDIA_BUTTON =
MultiActionPreference.ActionItem.ACTION_ITEM3;
+ private final BluetoothDeviceFilter.Filter mBondedDeviceTypeFilter =
+ new BondedDeviceTypeFilter();
private boolean mShowDeviceDetails = true;
public BluetoothBondedDevicesPreferenceController(Context context, String preferenceKey,
@@ -70,7 +75,7 @@
@Override
protected BluetoothDeviceFilter.Filter getDeviceFilter() {
- return BluetoothDeviceFilter.BONDED_DEVICE_FILTER;
+ return mBondedDeviceTypeFilter;
}
@Override
@@ -264,4 +269,15 @@
preference.getActionItem(MEDIA_BUTTON).setEnabled(false);
});
}
+
+ /** Filter that matches only bonded devices with specific device types. */
+ //TODO(b/198339129): Use BluetoothDeviceFilter.BONDED_DEVICE_FILTER
+ private class BondedDeviceTypeFilter implements BluetoothDeviceFilter.Filter {
+ @Override
+ public boolean matches(BluetoothDevice device) {
+ Set<BluetoothDevice> bondedDevices = mBluetoothManager.getBluetoothAdapter()
+ .getBondedDevices();
+ return bondedDevices != null && bondedDevices.contains(device);
+ }
+ }
}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
index 654bec8..edc9584 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
@@ -26,7 +26,6 @@
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
-import com.android.car.apps.common.util.Themes;
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.settingslib.bluetooth.BluetoothUtils;
@@ -83,7 +82,7 @@
preference.setTitle(cachedDevice.getName());
preference.setIcon(pair.first);
preference.getIcon().setTintList(
- Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+ getContext().getColorStateList(R.color.icon_color_default));
preference.setSummary(summaryJoiner.toString());
}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceController.java
index 12ba64c..25e20a1 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceController.java
@@ -116,7 +116,7 @@
} else {
BluetoothUtils.showError(getContext(), cachedDevice.getName(),
R.string.bluetooth_pairing_error_message);
- refreshUi();
+ reenableScanning();
}
}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/car/settings/bluetooth/BluetoothDevicePreference.java
index a200d7c..0b852e8 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothDevicePreference.java
@@ -27,7 +27,6 @@
import androidx.annotation.Nullable;
import androidx.preference.Preference;
-import com.android.car.apps.common.util.Themes;
import com.android.car.settings.R;
import com.android.car.settings.common.MultiActionPreference;
import com.android.car.settings.common.ToggleButtonActionItem;
@@ -117,7 +116,7 @@
.getBtClassDrawableWithDescription(getContext(), mCachedDevice);
if (pair.first != null) {
setIcon(pair.first);
- getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+ getIcon().setTintList(getContext().getColorStateList(R.color.icon_color_default));
}
setEnabled(!mCachedDevice.isBusy());
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java b/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java
index 7dbd755..740d6d3 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java
@@ -16,6 +16,7 @@
package com.android.car.settings.bluetooth;
+import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
@@ -36,6 +37,14 @@
@VisibleForTesting
final BluetoothCallback mCallback = new BluetoothCallback() {
@Override
+ public void onBluetoothStateChanged(int bluetoothState) {
+ // If bluetooth is turned off, go back since pairing is no longer possible
+ if (bluetoothState == BluetoothAdapter.STATE_OFF) {
+ goBack();
+ }
+ }
+
+ @Override
public void onScanningStateChanged(boolean started) {
}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java
index 67d6e00..38dff7e 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java
@@ -47,7 +47,7 @@
public abstract class BluetoothPreferenceController<V extends Preference> extends
PreferenceController<V> implements BluetoothCallback {
- private final LocalBluetoothManager mBluetoothManager;
+ protected final LocalBluetoothManager mBluetoothManager;
private final UserManager mUserManager;
public BluetoothPreferenceController(Context context, String preferenceKey,
diff --git a/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java
index 8c96619..4215578 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java
@@ -20,6 +20,7 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothManager;
import android.car.drivingstate.CarUxRestrictions;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -45,13 +46,14 @@
private static final Logger LOG = new Logger(
BluetoothScanningDevicesGroupPreferenceController.class);
- private final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ protected final BluetoothAdapter mBluetoothAdapter;
private final AlwaysDiscoverable mAlwaysDiscoverable;
- private boolean mIsScanningEnabled = true;
+ private boolean mIsScanningEnabled;
public BluetoothScanningDevicesGroupPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
+ mBluetoothAdapter = getContext().getSystemService(BluetoothManager.class).getAdapter();
mAlwaysDiscoverable = new AlwaysDiscoverable(context, mBluetoothAdapter);
}
@@ -70,6 +72,12 @@
protected abstract void onDeviceClickedInternal(CachedBluetoothDevice cachedDevice);
@Override
+ protected void onStartInternal() {
+ super.onStartInternal();
+ mIsScanningEnabled = true;
+ }
+
+ @Override
protected void onStopInternal() {
super.onStopInternal();
disableScanning();
@@ -88,6 +96,13 @@
}
}
+ protected void reenableScanning() {
+ if (isStarted()) {
+ mIsScanningEnabled = true;
+ }
+ refreshUi();
+ }
+
private boolean shouldEnableScanning() {
for (CachedBluetoothDevice device : getPreferenceMap().keySet()) {
if (device.getBondState() == BluetoothDevice.BOND_BONDING) {
@@ -133,6 +148,9 @@
@Override
public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
LOG.d("onDeviceBondStateChanged device: " + cachedDevice + " state: " + bondState);
+ if (bondState == BluetoothDevice.BOND_NONE && isStarted()) {
+ mIsScanningEnabled = true;
+ }
refreshUi();
}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothStateSwitchPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothStateSwitchPreferenceController.java
index bb5c1d4..6909695 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothStateSwitchPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothStateSwitchPreferenceController.java
@@ -18,6 +18,10 @@
import static android.car.hardware.power.PowerComponent.BLUETOOTH;
import static android.os.UserManager.DISALLOW_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
import android.bluetooth.BluetoothAdapter;
import android.car.drivingstate.CarUxRestrictions;
@@ -29,22 +33,20 @@
import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
import com.android.car.settings.R;
-import com.android.car.settings.common.ClickableWhileDisabledSwitchPreference;
+import com.android.car.settings.common.ColoredSwitchPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PowerPolicyListener;
import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import java.util.function.Consumer;
-
/**
* Enables/disables bluetooth state via SwitchPreference.
*/
public class BluetoothStateSwitchPreferenceController extends
- PreferenceController<ClickableWhileDisabledSwitchPreference> {
+ PreferenceController<ColoredSwitchPreference> {
private final Context mContext;
private final IntentFilter mIntentFilter = new IntentFilter(
@@ -56,10 +58,11 @@
handleStateChanged(state);
}
};
- private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ private final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
private LocalBluetoothManager mLocalBluetoothManager;
private UserManager mUserManager;
private boolean mUpdating = false;
+ private boolean mIsPowerOn = true;
@VisibleForTesting
final PowerPolicyListener mPowerPolicyListener;
@@ -71,29 +74,30 @@
super(context, preferenceKey, fragmentController, uxRestrictions);
mContext = context;
mPowerPolicyListener = new PowerPolicyListener(context, BLUETOOTH,
- isOn -> {
- enableSwitchPreference(getPreference(), isOn, /* forPowerPolicy= */ true);
+ isPowerOn -> {
+ mIsPowerOn = isPowerOn;
+ enableSwitchPreference(getPreference(), /* enabled= */ mIsPowerOn);
});
}
@Override
- protected Class<ClickableWhileDisabledSwitchPreference> getPreferenceType() {
- return ClickableWhileDisabledSwitchPreference.class;
+ protected Class<ColoredSwitchPreference> getPreferenceType() {
+ return ColoredSwitchPreference.class;
}
@Override
- protected void updateState(ClickableWhileDisabledSwitchPreference preference) {
+ protected void updateState(ColoredSwitchPreference preference) {
updateSwitchPreference(mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON
|| mBluetoothAdapter.getState() == BluetoothAdapter.STATE_TURNING_ON);
}
@Override
- protected boolean handlePreferenceChanged(ClickableWhileDisabledSwitchPreference preference,
+ protected boolean handlePreferenceChanged(ColoredSwitchPreference preference,
Object newValue) {
if (mUpdating) {
return false;
}
- enableSwitchPreference(preference, /* enabled= */ false, /* forPowerPolicy= */ false);
+ enableSwitchPreference(preference, /* enabled= */ false);
boolean bluetoothEnabled = (Boolean) newValue;
if (bluetoothEnabled) {
mBluetoothAdapter.enable();
@@ -110,8 +114,36 @@
if (mLocalBluetoothManager == null) {
getFragmentController().goBack();
}
- getPreference().setContentDescription(
+ ColoredSwitchPreference preference = getPreference();
+ preference.setContentDescription(
mContext.getString(R.string.bluetooth_state_switch_content_description));
+ preference.setClickableWhileDisabled(true);
+ preference.setDisabledClickListener(p -> {
+ // This is logic when clicking while disabled:
+ // 1. If power is off, then show a toast with the related error message;
+ // 2. If restricted by DPM, show a dialog message with the related restriction message;
+ // 3. Do nothing otherwise.
+ if (!mIsPowerOn) {
+ Toast.makeText(getContext(),
+ getContext().getString(R.string.power_component_disabled),
+ Toast.LENGTH_LONG).show();
+ } else if (getAvailabilityStatus() == AVAILABLE_FOR_VIEWING) {
+ showActionDisabledByAdminDialog();
+ }
+ });
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ return hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_BLUETOOTH)
+ ? AVAILABLE_FOR_VIEWING : AVAILABLE;
+ }
+
+ private void showActionDisabledByAdminDialog() {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ DISALLOW_CONFIG_BLUETOOTH),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
}
@Override
@@ -148,24 +180,20 @@
mUpdating = true;
switch (state) {
case BluetoothAdapter.STATE_TURNING_ON:
- enableSwitchPreference(getPreference(), /* enabled= */ false,
- /* forPowerPolicy= */ false);
+ enableSwitchPreference(getPreference(), /* enabled= */ false);
updateSwitchPreference(true);
break;
case BluetoothAdapter.STATE_ON:
- enableSwitchPreference(getPreference(), !isUserRestricted(),
- /* forPowerPolicy= */ false);
+ enableSwitchPreference(getPreference(), /* enabled= */ !isUserRestricted());
updateSwitchPreference(true);
break;
case BluetoothAdapter.STATE_TURNING_OFF:
- enableSwitchPreference(getPreference(), /* enabled= */ false,
- /* forPowerPolicy= */ false);
+ enableSwitchPreference(getPreference(), /* enabled= */ false);
updateSwitchPreference(false);
break;
case BluetoothAdapter.STATE_OFF:
default:
- enableSwitchPreference(getPreference(), !isUserRestricted(),
- /* forPowerPolicy= */ false);
+ enableSwitchPreference(getPreference(), /* enabled= */ !isUserRestricted());
updateSwitchPreference(false);
}
mUpdating = false;
@@ -183,13 +211,7 @@
getPreference().setChecked(enabled);
}
- private void enableSwitchPreference(ClickableWhileDisabledSwitchPreference preference,
- boolean enabled, boolean forPowerPolicy) {
- Consumer<Preference> listener = !forPowerPolicy ? null : p ->
- Toast.makeText(getContext(),
- getContext().getString(R.string.power_component_disabled),
- Toast.LENGTH_LONG).show();
- preference.setDisabledClickListener(listener);
- preference.setEnabled(enabled);
+ private void enableSwitchPreference(ColoredSwitchPreference preference, boolean enabled) {
+ preference.setEnabled(enabled && getAvailabilityStatus() == AVAILABLE);
}
}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java
index add98ba..3cc6a1d 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java
@@ -30,6 +30,8 @@
import com.android.settingslib.bluetooth.BluetoothDeviceFilter.Filter;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import java.util.Set;
+
/**
* Displays a list of unbonded (unpaired) Bluetooth devices. This controller also sets the
* Bluetooth adapter to discovery mode and begins scanning for discoverable devices for as long as
@@ -66,7 +68,7 @@
} else {
BluetoothUtils.showError(getContext(), cachedDevice.getName(),
R.string.bluetooth_pairing_error_message);
- refreshUi();
+ reenableScanning();
}
}
@@ -82,11 +84,14 @@
/** Filter that matches only unbonded devices with specific device types. */
private class UnbondedDeviceTypeFilter implements Filter {
+ @Override
public boolean matches(BluetoothDevice device) {
int[] unbondedMajorClassFilter = getContext()
.getResources()
.getIntArray(R.array.config_unbonded_device_filter_allowlist);
- boolean matches = device.getBondState() != BluetoothDevice.BOND_BONDED;
+ //TODO(b/198339129): change to use device bond status
+ Set<BluetoothDevice> bondedDevices = mBluetoothAdapter.getBondedDevices();
+ boolean matches = bondedDevices == null || !bondedDevices.contains(device);
if (matches && unbondedMajorClassFilter.length > 0) {
matches = device.getBluetoothClass() != null
&& ArrayUtils.contains(
diff --git a/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java b/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java
index c18f9f2..09b096e 100644
--- a/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java
@@ -19,6 +19,9 @@
import static android.os.UserManager.DISALLOW_BLUETOOTH;
import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+
import android.bluetooth.BluetoothAdapter;
import android.car.drivingstate.CarUxRestrictions;
import android.content.BroadcastReceiver;
@@ -34,6 +37,7 @@
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
/**
* Controls a preference that, when clicked, launches the page for pairing new Bluetooth devices.
@@ -44,7 +48,6 @@
public class PairNewDevicePreferenceController extends PreferenceController<Preference> implements
LifecycleObserver {
- private final UserManager mUserManager;
private final IntentFilter mIntentFilter = new IntentFilter(
BluetoothAdapter.ACTION_STATE_CHANGED);
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -53,6 +56,7 @@
refreshUi();
}
};
+ private final UserManager mUserManager;
public PairNewDevicePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -66,6 +70,23 @@
}
@Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ if (getAvailabilityStatus() == AVAILABLE_FOR_VIEWING) {
+ showActionDisabledByAdminDialog();
+ }
+ });
+ }
+
+ private void showActionDisabledByAdminDialog() {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ DISALLOW_CONFIG_BLUETOOTH),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
+
+ @Override
protected void checkInitialized() {
if (getPreference().getIntent() == null && getPreference().getFragment() == null) {
throw new IllegalStateException(
@@ -78,6 +99,9 @@
if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
return UNSUPPORTED_ON_DEVICE;
}
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_BLUETOOTH)) {
+ return AVAILABLE_FOR_VIEWING;
+ }
return isUserRestricted() ? DISABLED_FOR_PROFILE : AVAILABLE;
}
diff --git a/src/com/android/car/settings/common/ActionButtonInfo.java b/src/com/android/car/settings/common/ActionButtonInfo.java
index 5adb1f2..0046e3d 100644
--- a/src/com/android/car/settings/common/ActionButtonInfo.java
+++ b/src/com/android/car/settings/common/ActionButtonInfo.java
@@ -30,6 +30,7 @@
import androidx.annotation.VisibleForTesting;
import com.android.car.settings.R;
+import com.android.car.ui.utils.CarUiUtils;
import java.lang.ref.WeakReference;
@@ -190,8 +191,8 @@
boolean enabled = isEnabled() || mIsPreferenceRestricted;
mButtonView.setEnabled(enabled);
- mButtonTextView.setEnabled(enabled);
- mButtonIconView.setEnabled(enabled);
+ CarUiUtils.makeAllViewsEnabledAndUxRestricted(mButtonView, isEnabled(),
+ mIsPreferenceRestricted);
mButtonIconView.setVisibility(mIcon != null ? View.VISIBLE : View.GONE);
diff --git a/src/com/android/car/settings/common/BaseCarSettingsActivity.java b/src/com/android/car/settings/common/BaseCarSettingsActivity.java
index de6d7e0..c746f51 100644
--- a/src/com/android/car/settings/common/BaseCarSettingsActivity.java
+++ b/src/com/android/car/settings/common/BaseCarSettingsActivity.java
@@ -464,6 +464,9 @@
mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
+ if (finalFocusArea.isInTouchMode() || finalFocusArea.hasFocus()) {
+ return;
+ }
boolean success = finalFocusArea.performAccessibilityAction(
ACTION_FOCUS, /* arguments= */ null);
if (success) {
diff --git a/src/com/android/car/settings/common/CarSettingActivities.java b/src/com/android/car/settings/common/CarSettingActivities.java
index d4f6680..bb59380 100644
--- a/src/com/android/car/settings/common/CarSettingActivities.java
+++ b/src/com/android/car/settings/common/CarSettingActivities.java
@@ -27,6 +27,8 @@
import androidx.fragment.app.Fragment;
import com.android.car.settings.R;
+import com.android.car.settings.accessibility.AccessibilitySettingsFragment;
+import com.android.car.settings.accessibility.CaptionsSettingsFragment;
import com.android.car.settings.accounts.ChooseAccountFragment;
import com.android.car.settings.applications.ApplicationDetailsFragment;
import com.android.car.settings.applications.ApplicationsSettingsFragment;
@@ -40,7 +42,6 @@
import com.android.car.settings.applications.specialaccess.UsageAccessFragment;
import com.android.car.settings.applications.specialaccess.WifiControlFragment;
import com.android.car.settings.bluetooth.BluetoothSettingsFragment;
-import com.android.car.settings.datausage.DataUsageFragment;
import com.android.car.settings.datetime.DatetimeSettingsFragment;
import com.android.car.settings.display.DisplaySettingsFragment;
import com.android.car.settings.inputmethod.KeyboardFragment;
@@ -350,17 +351,6 @@
}
}
- /**
- * Mobile Data Usage Activity.
- */
- public static class DataUsageActivity extends BaseCarSettingsActivity {
- @Nullable
- @Override
- protected Fragment getInitialFragment() {
- return new DataUsageFragment();
- }
- }
-
// Apps & Notifications sub-sections
/**
@@ -596,4 +586,26 @@
}
}
+ /**
+ * Accessibility Activity.
+ */
+ public static class AccessibilityActivity extends BaseCarSettingsActivity {
+ @Nullable
+ @Override
+ protected Fragment getInitialFragment() {
+ return new AccessibilitySettingsFragment();
+ }
+ }
+
+ /**
+ * Captions Activity.
+ */
+ public static class CaptionsActivity extends BaseCarSettingsActivity {
+ @Nullable
+ @Override
+ protected Fragment getInitialFragment() {
+ return new CaptionsSettingsFragment();
+ }
+ }
+
}
diff --git a/src/com/android/car/settings/common/ClickableWhileDisabledPreference.java b/src/com/android/car/settings/common/ClickableWhileDisabledPreference.java
deleted file mode 100644
index 893923c..0000000
--- a/src/com/android/car/settings/common/ClickableWhileDisabledPreference.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.common;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-import androidx.annotation.Nullable;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.car.ui.preference.CarUiPreference;
-
-import java.util.function.Consumer;
-
-/**
- * Preference that can be given a disabled look but still be clickable. This enables behavior such
- * as showing a Toast message when clicking on a disabled preference to explain why it's disabled.
- */
-public class ClickableWhileDisabledPreference extends CarUiPreference {
-
- private Consumer<Preference> mClickListener;
-
- public ClickableWhileDisabledPreference(Context context, AttributeSet attrs,
- int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- public ClickableWhileDisabledPreference(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public ClickableWhileDisabledPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public ClickableWhileDisabledPreference(Context context) {
- super(context);
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- holder.itemView.setAllowClickWhenDisabled(true);
- }
-
- @Override
- @SuppressWarnings("RestrictTo")
- public void performClick() {
- if (!isEnabled()) {
- if (mClickListener != null) {
- mClickListener.accept(this);
- }
- } else {
- super.performClick();
- }
- }
-
- /**
- * Sets the click listener for when the preference is disabled.
- * @param listener Listener to call when the preference is disabled and clicked.
- */
- public void setDisabledClickListener(@Nullable Consumer<Preference> listener) {
- mClickListener = listener;
- }
-}
diff --git a/src/com/android/car/settings/common/ClickableWhileDisabledSwitchPreference.java b/src/com/android/car/settings/common/ClickableWhileDisabledSwitchPreference.java
deleted file mode 100644
index 4a24da6..0000000
--- a/src/com/android/car/settings/common/ClickableWhileDisabledSwitchPreference.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.common;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-import androidx.annotation.Nullable;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-import java.util.function.Consumer;
-
-/**
- * Extends {@link ColoredSwitchPreference} to give a disabled look while it is clickable.
- */
-public class ClickableWhileDisabledSwitchPreference extends ColoredSwitchPreference {
-
- private Consumer<Preference> mClickListener;
-
- public ClickableWhileDisabledSwitchPreference(Context context, AttributeSet attrs,
- int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- public ClickableWhileDisabledSwitchPreference(Context context, AttributeSet attrs,
- int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public ClickableWhileDisabledSwitchPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public ClickableWhileDisabledSwitchPreference(Context context) {
- super(context);
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- holder.itemView.setAllowClickWhenDisabled(true);
- }
-
- @Override
- @SuppressWarnings("RestrictTo")
- public void performClick() {
- if (!isEnabled()) {
- if (mClickListener != null) {
- mClickListener.accept(this);
- }
- } else {
- super.performClick();
- }
- }
-
- /**
- * Sets the click listener for when the preference is disabled.
- * @param listener Listener to call when the preference is disabled and clicked.
- */
- public void setDisabledClickListener(@Nullable Consumer<Preference> listener) {
- mClickListener = listener;
- }
-}
diff --git a/src/com/android/car/settings/common/ConfirmationDialogFragment.java b/src/com/android/car/settings/common/ConfirmationDialogFragment.java
index 021bd4c..90be0c6 100644
--- a/src/com/android/car/settings/common/ConfirmationDialogFragment.java
+++ b/src/com/android/car/settings/common/ConfirmationDialogFragment.java
@@ -311,12 +311,13 @@
@Override
protected void onDialogClosed(boolean positiveResult) {
if (mDismissListener != null) {
- mDismissListener.onDismiss(getArguments().getBundle(ARGUMENTS_KEY));
+ mDismissListener.onDismiss(getArguments().getBundle(ARGUMENTS_KEY), positiveResult);
}
}
@Override
public void onClick(DialogInterface dialog, int which) {
+ super.onClick(dialog, which);
if (which == DialogInterface.BUTTON_POSITIVE) {
if (mConfirmListener != null) {
mConfirmListener.onConfirm(getArguments().getBundle(ARGUMENTS_KEY));
@@ -363,10 +364,12 @@
/** Listens to the dismiss action. */
public interface DismissListener {
/**
- * Defines the action to take when the dialog is closed. The bundle will contain the
- * arguments added when constructing the dialog through with
- * {@link Builder#addArgumentString(String, String)}.
+ * Defines the action to take when the dialog is closed.
+ * @param arguments - bundle containing the arguments added when constructing the dialog
+ * through with {@link Builder#addArgumentString(String, String)}.
+ * @param positiveResult - whether or not the dialog was dismissed because of a positive
+ * button press.
*/
- void onDismiss(@Nullable Bundle arguments);
+ void onDismiss(@Nullable Bundle arguments, boolean positiveResult);
}
}
diff --git a/src/com/android/car/settings/common/DrawableUtil.java b/src/com/android/car/settings/common/DrawableUtil.java
new file mode 100644
index 0000000..4fb0cae
--- /dev/null
+++ b/src/com/android/car/settings/common/DrawableUtil.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+
+/** Contains utility functions to operate on Drawables. */
+public class DrawableUtil {
+
+ private DrawableUtil() {
+ }
+
+ /**
+ * Create an {@link Icon} object from a {@link Drawable}.
+ */
+ public static Icon createIconFromDrawable(Drawable drawable) {
+ return Icon.createWithBitmap(createBitmapFromDrawable(drawable));
+ }
+
+ /**
+ * Create an {@link Bitmap} image from a {@link Drawable}.
+ */
+ public static Bitmap createBitmapFromDrawable(Drawable drawable) {
+ Bitmap bitmap;
+ if (drawable instanceof BitmapDrawable) {
+ bitmap = ((BitmapDrawable) drawable).getBitmap();
+ } else {
+ int width = drawable.getIntrinsicWidth();
+ int height = drawable.getIntrinsicHeight();
+ bitmap = createBitmap(drawable,
+ width > 0 ? width : 1,
+ height > 0 ? height : 1);
+ }
+ return bitmap;
+ }
+
+ private static Bitmap createBitmap(Drawable drawable, int width, int height) {
+ Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ drawable.draw(canvas);
+ return bitmap;
+ }
+}
diff --git a/src/com/android/car/settings/common/ExtraSettingsUtil.java b/src/com/android/car/settings/common/ExtraSettingsUtil.java
index 1a9ed8e..8d540b2 100644
--- a/src/com/android/car/settings/common/ExtraSettingsUtil.java
+++ b/src/com/android/car/settings/common/ExtraSettingsUtil.java
@@ -34,7 +34,6 @@
import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
-import com.android.car.apps.common.util.Themes;
import com.android.car.settings.R;
import java.util.List;
@@ -84,8 +83,8 @@
icon = new TopLevelIcon(context, icon, R.dimen.top_level_foreground_icon_inset);
((TopLevelIcon) icon).setBackgroundColor(context, metaData, packageName);
} else if (isIconTintable(metaData)) {
- // If the icon is tintable, tint it with the default icon color attribute
- icon.mutate().setTintList(Themes.getAttrColorStateList(context, R.attr.iconColor));
+ // If the icon is tintable, tint it with the default icon color
+ icon.mutate().setTintList(context.getColorStateList(R.color.icon_color_default));
}
return icon;
}
diff --git a/src/com/android/car/settings/common/Logger.java b/src/com/android/car/settings/common/Logger.java
index e41137b..b2bd5be 100644
--- a/src/com/android/car/settings/common/Logger.java
+++ b/src/com/android/car/settings/common/Logger.java
@@ -198,4 +198,9 @@
private boolean isI() {
return Log.isLoggable(TAG, Log.INFO) || forceAllLogging();
}
+
+ @Override
+ public String toString() {
+ return "Logger[TAG=" + TAG + ", prefix=\"" + mPrefix + "\"]";
+ }
}
diff --git a/src/com/android/car/settings/common/PreferenceController.java b/src/com/android/car/settings/common/PreferenceController.java
index 8af1117..6ab84cc 100644
--- a/src/com/android/car/settings/common/PreferenceController.java
+++ b/src/com/android/car/settings/common/PreferenceController.java
@@ -23,12 +23,14 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
import com.android.car.settings.R;
+import com.android.car.ui.preference.ClickableWhileDisabledPreference;
import com.android.car.ui.preference.UxRestrictablePreference;
import java.lang.annotation.Retention;
@@ -36,6 +38,7 @@
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
+import java.util.function.Consumer;
/**
* Controller which encapsulates the business logic associated with a {@link Preference}. All car
@@ -455,14 +458,27 @@
* additional driving restrictions.
*/
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
- boolean restrict = false;
- if (!isUxRestrictionsIgnored(mAlwaysIgnoreUxRestrictions,
+ boolean restrict = shouldApplyUxRestrictions(uxRestrictions);
+
+ restrictPreference(mPreference, restrict);
+ }
+
+ /**
+ * Decides whether or not this {@link PreferenceController} should apply {@code uxRestrictions}
+ * based on the type of restrictions currently present, and the value of the {@code
+ * config_always_ignore_ux_restrictions} and
+ * {@code config_ignore_ux_restrictions} config flags.
+ * <p>
+ * It is not expected that subclasses will override this functionality. If they do, it is
+ * important to respect the config flags being consulted here.
+ *
+ * @return true if {@code uxRestrictions} should be applied and false otherwise.
+ */
+ protected boolean shouldApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
+ return !isUxRestrictionsIgnored(mAlwaysIgnoreUxRestrictions,
mPreferencesIgnoringUxRestrictions)
&& CarUxRestrictionsHelper.isNoSetup(uxRestrictions)
- && getAvailabilityStatus() != AVAILABLE_FOR_VIEWING) {
- restrict = true;
- }
- restrictPreference(mPreference, restrict);
+ && getAvailabilityStatus() != AVAILABLE_FOR_VIEWING;
}
/**
@@ -489,6 +505,32 @@
}
/**
+ * Updates the clickable while disabled state and action for a preference. This will also
+ * update all child preferences with the same state and action when {@param preference}
+ * is a PreferenceGroup.
+ *
+ * @param preference the preference to update
+ * @param clickable whether or not the preference should be clickable when disabled
+ * @param disabledClickAction the action that should be taken when clicked while disabled
+ */
+ protected void setClickableWhileDisabled(Preference preference, boolean clickable,
+ @Nullable Consumer<Preference> disabledClickAction) {
+ if (preference instanceof ClickableWhileDisabledPreference) {
+ ClickableWhileDisabledPreference pref =
+ (ClickableWhileDisabledPreference) preference;
+ pref.setClickableWhileDisabled(clickable);
+ pref.setDisabledClickListener(disabledClickAction);
+ }
+ if (preference instanceof PreferenceGroup) {
+ PreferenceGroup preferenceGroup = (PreferenceGroup) preference;
+ for (int i = 0; i < preferenceGroup.getPreferenceCount(); i++) {
+ setClickableWhileDisabled(preferenceGroup.getPreference(i), clickable,
+ disabledClickAction);
+ }
+ }
+ }
+
+ /**
* Called when the associated preference is changed by the user. This is called before the state
* of the preference is updated and before the state is persisted.
*
diff --git a/src/com/android/car/settings/common/SeekBarPreference.java b/src/com/android/car/settings/common/SeekBarPreference.java
index 4493771..efcd1f3 100644
--- a/src/com/android/car/settings/common/SeekBarPreference.java
+++ b/src/com/android/car/settings/common/SeekBarPreference.java
@@ -93,8 +93,9 @@
private final View.OnKeyListener mSeekBarKeyListener = new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
- // Don't allow events through if there is no SeekBar or we're in non-adjustable mode.
- if (mSeekBar == null || !mAdjustable) {
+ // Don't allow events through if there is no SeekBar, the SeekBar is disabled,
+ // or we're in non-adjustable mode.
+ if (mSeekBar == null || !mSeekBar.isEnabled() || !mAdjustable) {
return false;
}
@@ -204,6 +205,7 @@
view.itemView.setOnKeyListener(mSeekBarKeyListener);
view.itemView.setOnFocusChangeListener(mSeekBarFocusChangeListener);
view.itemView.setOnGenericMotionListener(mSeekBarScrollListener);
+
mSeekBar = (SeekBar) view.findViewById(R.id.seekbar);
mSeekBarValueTextView = (TextView) view.findViewById(R.id.seekbar_value);
if (mShowSeekBarValue) {
@@ -233,7 +235,11 @@
if (mSeekBarValueTextView != null) {
mSeekBarValueTextView.setText(String.valueOf(mSeekBarValue));
}
- mSeekBar.setEnabled(isEnabled());
+ boolean enabled = isEnabled() && !isUxRestricted();
+ mSeekBar.setEnabled(enabled);
+ if (!enabled && mInDirectManipulationMode) {
+ setInDirectManipulationMode(view.itemView, false);
+ }
}
@Override
diff --git a/src/com/android/car/settings/common/SettingsFragment.java b/src/com/android/car/settings/common/SettingsFragment.java
index b9bed02..d766630 100644
--- a/src/com/android/car/settings/common/SettingsFragment.java
+++ b/src/com/android/car/settings/common/SettingsFragment.java
@@ -147,7 +147,7 @@
protected void enableRotaryScroll() {
CarUiRecyclerView recyclerView = getView().findViewById(R.id.settings_recycler_view);
if (recyclerView != null) {
- ViewUtils.setRotaryScrollEnabled(recyclerView, /* isVertical= */ true);
+ ViewUtils.setRotaryScrollEnabled(recyclerView.getView(), /* isVertical= */ true);
}
}
@@ -207,10 +207,10 @@
}
@Override
- public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
+ public CarUiRecyclerView onCreateCarUiRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
inflater.inflate(R.layout.settings_recyclerview_default, parent, /* attachToRoot= */ true);
- return parent.requireViewById(R.id.settings_recycler_view);
+ return parent.findViewById(R.id.settings_recycler_view);
}
@Override
diff --git a/src/com/android/car/settings/common/SummaryPreference.java b/src/com/android/car/settings/common/SummaryPreference.java
new file mode 100644
index 0000000..e0d8075
--- /dev/null
+++ b/src/com/android/car/settings/common/SummaryPreference.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.IdRes;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+import com.android.car.ui.preference.CarUiPreference;
+
+/**
+ * A Preference that allows a summary text to be on the different side of the title.
+ */
+public class SummaryPreference extends CarUiPreference {
+
+ public SummaryPreference(Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init(context, attrs);
+ }
+
+ public SummaryPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context, attrs);
+ }
+
+ public SummaryPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context, attrs);
+ }
+
+ public SummaryPreference(Context context) {
+ super(context);
+ init(context, /* attrs= */ null);
+ }
+
+ private void init(Context context, AttributeSet attrs) {
+ setLayoutResource(R.layout.summary_preference);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ View itemView = holder.itemView;
+ setTextView(itemView, R.id.title, getTitle());
+ setTextView(itemView, R.id.summary, getSummary());
+ }
+
+ private void setTextView(View view, @IdRes int id, CharSequence text) {
+ TextView textView = view.findViewById(id);
+ if (textView != null) {
+ textView.setText(text);
+ textView.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE);
+ }
+ }
+}
diff --git a/src/com/android/car/settings/common/TopLevelMenuFragment.java b/src/com/android/car/settings/common/TopLevelMenuFragment.java
index ea07225..9c0dd13 100644
--- a/src/com/android/car/settings/common/TopLevelMenuFragment.java
+++ b/src/com/android/car/settings/common/TopLevelMenuFragment.java
@@ -32,9 +32,9 @@
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
-import androidx.recyclerview.widget.RecyclerView;
import com.android.car.settings.R;
+import com.android.car.ui.recyclerview.CarUiRecyclerView;
import java.util.List;
@@ -80,10 +80,10 @@
}
@Override
- public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
+ public CarUiRecyclerView onCreateCarUiRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
inflater.inflate(R.layout.top_level_recyclerview, parent, /* attachToRoot= */ true);
- return parent.requireViewById(R.id.top_level_recycler_view);
+ return parent.findViewById(R.id.top_level_recycler_view);
}
@Override
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/common/UpdateSummaryPreferenceController.java
similarity index 62%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/common/UpdateSummaryPreferenceController.java
index 03e8185..2d1d6ac 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/common/UpdateSummaryPreferenceController.java
@@ -14,34 +14,40 @@
* limitations under the License.
*/
-package com.android.car.settings.enterprise;
+package com.android.car.settings.common;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
+import androidx.annotation.CallSuper;
import androidx.preference.Preference;
-import com.android.car.settings.common.FragmentController;
-
/**
- * Controller for the cancel button in the device admin details screen.
+ * Controller that used to update the summary of a preference.
*/
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+public class UpdateSummaryPreferenceController extends PreferenceController<Preference> {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ private String mSummary;
+
+ public UpdateSummaryPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
}
@Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ @CallSuper
+ protected void updateState(Preference preference) {
+ preference.setSummary(mSummary);
+ }
+
+ /** Sets summary text */
+ public void setSummary(String summary) {
+ mSummary = summary;
+ refreshUi();
}
}
diff --git a/src/com/android/car/settings/common/rotary/NumberPickerRotationHandler.java b/src/com/android/car/settings/common/rotary/NumberPickerRotationHandler.java
index 4ff5b32..9ac1af0 100644
--- a/src/com/android/car/settings/common/rotary/NumberPickerRotationHandler.java
+++ b/src/com/android/car/settings/common/rotary/NumberPickerRotationHandler.java
@@ -18,6 +18,7 @@
import android.view.MotionEvent;
import android.view.View;
+import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.NumberPicker;
/** A rotation handler for {@link NumberPicker} instances. */
@@ -28,7 +29,15 @@
if (focusedView instanceof NumberPicker) {
NumberPicker numberPicker = (NumberPicker) focusedView;
float scroll = event.getAxisValue(MotionEvent.AXIS_SCROLL);
- numberPicker.setValue(numberPicker.getValue() + Math.round(scroll));
+ // NumberPicker#setValue(int) doesn't notify change listener, so perform an
+ // accessibility action instead.
+ int scrollValue = Math.round(scroll);
+ int scrollDirection = scrollValue > 0 ? AccessibilityNodeInfo.ACTION_SCROLL_FORWARD
+ : AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD;
+ for (int i = 0; i < Math.abs(scrollValue); i++) {
+ numberPicker.getAccessibilityNodeProvider().performAction(View.NO_ID,
+ scrollDirection, /* arguments= */ null);
+ }
return true;
}
return false;
diff --git a/src/com/android/car/settings/datausage/AppDataUsageFragment.java b/src/com/android/car/settings/datausage/AppDataUsageFragment.java
index 384e090..85c8ee8 100644
--- a/src/com/android/car/settings/datausage/AppDataUsageFragment.java
+++ b/src/com/android/car/settings/datausage/AppDataUsageFragment.java
@@ -23,7 +23,6 @@
import android.os.Bundle;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
-import android.text.format.DateUtils;
import android.util.Pair;
import androidx.annotation.VisibleForTesting;
@@ -33,15 +32,18 @@
import com.android.car.settings.R;
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.SettingsFragment;
-import com.android.settingslib.NetworkPolicyEditor;
+import com.android.settingslib.net.DataUsageController;
+import com.android.settingslib.net.NetworkCycleChartData;
import java.time.ZonedDateTime;
import java.util.Iterator;
+import java.util.Map;
/**
* Screen to display list of applications using the data.
*/
-public class AppDataUsageFragment extends SettingsFragment {
+public class AppDataUsageFragment extends SettingsFragment implements
+ DataUsageCyclePreferenceController.DataCyclePickedListener<NetworkCycleChartData> {
private static final Logger LOG = new Logger(AppDataUsageFragment.class);
@@ -50,10 +52,13 @@
private static final int SUB_ID_NULL = Integer.MIN_VALUE;
private AppsNetworkStatsManager mAppsNetworkStatsManager;
- private NetworkPolicyEditor mPolicyEditor;
+ private DataUsageCycleManager mDataUsageCycleManager;
private NetworkTemplate mNetworkTemplate;
+ private DataUsageController mDataUsageController;
private Bundle mBundle;
+ private LoaderManager mLoaderManager;
+ private AppDataUsageTotalPreferenceController mAppDataUsageTotalPreferenceController;
/**
* Creates a new instance of the {@link AppDataUsageFragment}, which shows settings related to
@@ -88,10 +93,25 @@
subId = DataUsageUtils.getDefaultSubscriptionId(subscriptionManager);
}
mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(telephonyManager, subId);
- mPolicyEditor = getNetworkPolicyEditor(context);
+ mDataUsageController = new DataUsageController(context);
mAppsNetworkStatsManager = new AppsNetworkStatsManager(getContext());
mAppsNetworkStatsManager.registerListener(
use(AppDataUsagePreferenceController.class, R.string.pk_app_data_usage_detail));
+ mDataUsageCycleManager = new DataUsageCycleManager(getContext(), mNetworkTemplate);
+ mDataUsageCycleManager.registerListener(use(DataUsageCyclePreferenceController.class,
+ R.string.pk_data_usage_usage_history));
+ use(DataUsageCyclePreferenceController.class,
+ R.string.pk_data_usage_usage_history)
+ .setDataCyclePickedListener(this)
+ .setDataUsageInfo(mDataUsageController.getDataUsageInfo(mNetworkTemplate));
+
+ long usage = mDataUsageController.getDataUsageInfo(mNetworkTemplate).usageLevel;
+ mAppDataUsageTotalPreferenceController =
+ use(AppDataUsageTotalPreferenceController.class, R.string.pk_data_usage_all_apps);
+ mAppDataUsageTotalPreferenceController.setDataUsage(usage);
+
+ use(AppDataUsagePreferenceController.class, R.string.pk_app_data_usage_detail)
+ .setNetworkTemplate(mNetworkTemplate);
}
@Override
@@ -99,41 +119,14 @@
super.onCreate(savedInstanceState);
mBundle = getBundleForNetworkStats();
- LoaderManager loaderManager = LoaderManager.getInstance(this);
- mAppsNetworkStatsManager.startLoading(loaderManager, mBundle);
+ mLoaderManager = LoaderManager.getInstance(this);
+ mAppsNetworkStatsManager.startLoading(mLoaderManager, mBundle);
+ mDataUsageCycleManager.startLoading(mLoaderManager);
}
private Bundle getBundleForNetworkStats() {
- long historyStart = System.currentTimeMillis();
- long historyEnd = historyStart + 1;
-
- long start = 0;
- long end = 0;
-
- boolean hasCycles = false;
-
- NetworkPolicy policy = mPolicyEditor.getPolicy(mNetworkTemplate);
- if (policy != null) {
- Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = getCycleIterator(policy);
- while (it.hasNext()) {
- Pair<ZonedDateTime, ZonedDateTime> cycle = it.next();
- start = cycle.first.toInstant().toEpochMilli();
- end = cycle.second.toInstant().toEpochMilli();
- hasCycles = true;
- }
- }
-
- if (!hasCycles) {
- // no policy defined cycles; show entry for each four-week period
- long cycleEnd = historyEnd;
- while (cycleEnd > historyStart) {
- long cycleStart = cycleEnd - (DateUtils.WEEK_IN_MILLIS * 4);
-
- start = cycleStart;
- end = cycleEnd;
- cycleEnd = cycleStart;
- }
- }
+ long start = mDataUsageController.getDataUsageInfo(mNetworkTemplate).cycleStart;
+ long end = mDataUsageController.getDataUsageInfo(mNetworkTemplate).cycleEnd;
return SummaryForAllUidLoader.buildArgs(mNetworkTemplate, start, end);
}
@@ -144,12 +137,18 @@
}
@VisibleForTesting
- NetworkPolicyEditor getNetworkPolicyEditor(Context context) {
- return new NetworkPolicyEditor(NetworkPolicyManager.from(context));
- }
-
- @VisibleForTesting
Iterator<Pair<ZonedDateTime, ZonedDateTime>> getCycleIterator(NetworkPolicy policy) {
return NetworkPolicyManager.cycleIterator(policy);
}
+
+ @Override
+ public void onDataCyclePicked(String cycle, Map<CharSequence, NetworkCycleChartData> usages) {
+ mAppDataUsageTotalPreferenceController.setDataUsage(usages.get(cycle).getTotalUsage());
+
+ mBundle = SummaryForAllUidLoader.buildArgs(
+ mNetworkTemplate,
+ usages.get(cycle).getStartTime(),
+ usages.get(cycle).getEndTime());
+ mAppsNetworkStatsManager.startLoading(mLoaderManager, mBundle);
+ }
}
diff --git a/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java b/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java
index ecdc08f..6859e3a 100644
--- a/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java
+++ b/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java
@@ -23,9 +23,11 @@
import android.content.Context;
import android.content.pm.UserInfo;
import android.net.NetworkStats;
+import android.net.NetworkTemplate;
import android.os.UserHandle;
import android.util.SparseArray;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceGroup;
import com.android.car.settings.R;
@@ -54,11 +56,20 @@
PreferenceController<PreferenceGroup> implements AppsNetworkStatsManager.Callback {
private final UidDetailProvider mUidDetailProvider;
+ private NetworkTemplate mNetworkTemplate;
public AppDataUsagePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ new UidDetailProvider(context));
+ }
+
+ @VisibleForTesting
+ AppDataUsagePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ UidDetailProvider uidDetailProvider) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mUidDetailProvider = new UidDetailProvider(getContext());
+ mUidDetailProvider = uidDetailProvider;
}
@Override
@@ -87,6 +98,11 @@
sortAndAddPreferences(items, largest);
}
+ /** Sets the {@link NetworkTemplate} */
+ public void setNetworkTemplate(NetworkTemplate networkTemplate) {
+ mNetworkTemplate = networkTemplate;
+ }
+
private long aggregateDataUsage(SparseArray<AppItem> knownItems, List<AppItem> items,
NetworkStats.Entry entry, List<UserInfo> profiles) {
int currentUserId = UserHandle.myUserId();
@@ -180,6 +196,7 @@
}
private void sortAndAddPreferences(List<AppItem> items, long largest) {
+ getPreference().removeAll();
Collections.sort(items);
for (int i = 0; i < items.size(); i++) {
int percentTotal = largest != 0 ? (int) (items.get(i).total * 100 / largest) : 0;
@@ -235,10 +252,14 @@
mDetail = provider.getUidDetail(item.key, /* blocking= */ false);
if (mDetail != null) {
setAppInfo();
+ setOnClickListener();
} else {
ThreadUtils.postOnBackgroundThread(() -> {
mDetail = provider.getUidDetail(mItem.key, /* blocking= */ true);
- ThreadUtils.postOnMainThread(() -> setAppInfo());
+ ThreadUtils.postOnMainThread(() -> {
+ setAppInfo();
+ setOnClickListener();
+ });
});
}
}
@@ -253,5 +274,15 @@
setTitle(null);
}
}
+
+ private void setOnClickListener() {
+ if (mDetail != null && mNetworkTemplate != null) {
+ setOnPreferenceClickListener(p -> {
+ getFragmentController().launchFragment(
+ AppSpecificDataUsageFragment.getInstance(mItem, mNetworkTemplate));
+ return true;
+ });
+ }
+ }
}
}
diff --git a/src/com/android/car/settings/datausage/AppDataUsageTotalPreferenceController.java b/src/com/android/car/settings/datausage/AppDataUsageTotalPreferenceController.java
new file mode 100644
index 0000000..e2a79dc
--- /dev/null
+++ b/src/com/android/car/settings/datausage/AppDataUsageTotalPreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.annotation.CallSuper;
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller to update total data usage for all the apps.
+ */
+public class AppDataUsageTotalPreferenceController extends PreferenceController<Preference> {
+
+ private static final String STRING_FORMAT = "%s: %s";
+
+ private String mFieldName;
+ private String mDataUsage;
+
+ public AppDataUsageTotalPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mFieldName = context.getString(R.string.data_usage_all_apps_title);
+ }
+
+ @Override
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
+ }
+
+ @Override
+ @CallSuper
+ protected void updateState(Preference preference) {
+ getPreference().setTitle(getTitle());
+ }
+
+ private String getTitle() {
+ return String.format(STRING_FORMAT, mFieldName, mDataUsage);
+ }
+
+ /** Set data usage in bytes */
+ public void setDataUsage(long usage) {
+ mDataUsage = DataUsageUtils.bytesToIecUnits(getContext(), usage).toString();
+ }
+}
diff --git a/src/com/android/car/settings/datausage/AppSpecificDataUsageCyclePreferenceController.java b/src/com/android/car/settings/datausage/AppSpecificDataUsageCyclePreferenceController.java
new file mode 100644
index 0000000..1e82e80
--- /dev/null
+++ b/src/com/android/car/settings/datausage/AppSpecificDataUsageCyclePreferenceController.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.net.NetworkCycleDataForUid;
+
+import java.util.List;
+
+/**
+ * Controller used to handle Data Usage cycle change for a specific app uid.
+ */
+public class AppSpecificDataUsageCyclePreferenceController extends
+ DataUsageCycleBasePreferenceController<NetworkCycleDataForUid> implements
+ AppSpecificDataUsageManager.AppSpecificDataLoaderCallback {
+
+ public AppSpecificDataUsageCyclePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ public void onDataLoaded(List<NetworkCycleDataForUid> networkCycleChartData) {
+ onLoaded(networkCycleChartData);
+ }
+}
diff --git a/src/com/android/car/settings/datausage/AppSpecificDataUsageFragment.java b/src/com/android/car/settings/datausage/AppSpecificDataUsageFragment.java
new file mode 100644
index 0000000..c0e97fe
--- /dev/null
+++ b/src/com/android/car/settings/datausage/AppSpecificDataUsageFragment.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.annotation.XmlRes;
+import androidx.loader.app.LoaderManager;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.common.UpdateSummaryPreferenceController;
+import com.android.settingslib.AppItem;
+import com.android.settingslib.net.DataUsageController;
+import com.android.settingslib.net.NetworkCycleDataForUid;
+import com.android.settingslib.net.UidDetail;
+import com.android.settingslib.net.UidDetailProvider;
+
+import java.util.Map;
+
+/**
+ * Screen to display detailed data usage information for a specific app.
+ */
+public class AppSpecificDataUsageFragment extends SettingsFragment implements
+ AppSpecificDataUsageCyclePreferenceController.DataCyclePickedListener
+ <NetworkCycleDataForUid> {
+ private static final Logger LOG = new Logger(AppSpecificDataUsageFragment.class);
+
+ private static final String EXTRA_PACKAGE_NAME = "extra_app_item_key";
+
+ private AppSpecificDataUsageManager mAppSpecificDataUsageManager;
+
+ /** Creates an instance of this fragment, passing packageName as an argument. */
+ public static AppSpecificDataUsageFragment getInstance(AppItem appItem,
+ NetworkTemplate networkTemplate) {
+ AppSpecificDataUsageFragment
+ appSpecificDataUsageFragment = new AppSpecificDataUsageFragment();
+ Bundle bundle = new Bundle();
+ bundle.putObject(EXTRA_PACKAGE_NAME, appItem);
+ bundle.putParcelable(NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE, networkTemplate);
+ appSpecificDataUsageFragment.setArguments(bundle);
+ return appSpecificDataUsageFragment;
+ }
+
+ @Override
+ @XmlRes
+ protected int getPreferenceScreenResId() {
+ return R.xml.app_specific_data_usage_fragment;
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ AppItem appItem = (AppItem) getArguments().get(EXTRA_PACKAGE_NAME);
+
+ NetworkTemplate networkTemplate = getArguments().getParcelable(
+ NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE);
+ if (networkTemplate == null) {
+ TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
+ SubscriptionManager subscriptionManager =
+ context.getSystemService(SubscriptionManager.class);
+ networkTemplate = DataUsageUtils.getMobileNetworkTemplate(telephonyManager,
+ DataUsageUtils.getDefaultSubscriptionId(subscriptionManager));
+ }
+
+ mAppSpecificDataUsageManager = new AppSpecificDataUsageManager(context, networkTemplate,
+ appItem.key);
+ mAppSpecificDataUsageManager.registerListener(
+ use(AppSpecificDataUsageCyclePreferenceController.class,
+ R.string.pk_app_specific_usage_cycle));
+
+ UidDetailProvider uidDetailProvider = new UidDetailProvider(context);
+ UidDetail uidDetail = uidDetailProvider.getUidDetail(appItem.key, true /* blocking */);
+ use(AppSpecificDataUsageHeaderPreferenceController.class,
+ R.string.pk_app_specific_usage_title)
+ .setTitle(uidDetail.label.toString())
+ .setIcon(uidDetail.icon);
+
+ DataUsageController dataUsageController = new DataUsageController(context);
+ use(AppSpecificDataUsageCyclePreferenceController.class,
+ R.string.pk_app_specific_usage_cycle)
+ .setDataCyclePickedListener(this)
+ .setDataUsageInfo(dataUsageController.getDataUsageInfo(networkTemplate));
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ LoaderManager loaderManager = LoaderManager.getInstance(this);
+ mAppSpecificDataUsageManager.startLoading(loaderManager);
+ }
+
+ @Override
+ public void onDataCyclePicked(String cycle, Map<CharSequence, NetworkCycleDataForUid> usages) {
+ // TODO: (b/203824535) Default to generic "Calculating..." string after string freeze when
+ // not yet loaded.
+ NetworkCycleDataForUid cycleData = usages.get(cycle);
+ use(UpdateSummaryPreferenceController.class,
+ R.string.pk_app_specific_usage_total)
+ .setSummary(DataUsageUtils.bytesToIecUnits(getContext(), cycleData.getTotalUsage())
+ .toString());
+ use(UpdateSummaryPreferenceController.class,
+ R.string.pk_app_specific_usage_foreground)
+ .setSummary(DataUsageUtils.bytesToIecUnits(getContext(),
+ cycleData.getForegroudUsage()).toString());
+ use(UpdateSummaryPreferenceController.class,
+ R.string.pk_app_specific_usage_background)
+ .setSummary(DataUsageUtils.bytesToIecUnits(getContext(),
+ cycleData.getBackgroudUsage()).toString());
+ }
+}
diff --git a/src/com/android/car/settings/datausage/AppSpecificDataUsageHeaderPreferenceController.java b/src/com/android/car/settings/datausage/AppSpecificDataUsageHeaderPreferenceController.java
new file mode 100644
index 0000000..f4ef5ff
--- /dev/null
+++ b/src/com/android/car/settings/datausage/AppSpecificDataUsageHeaderPreferenceController.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+import com.android.car.settings.common.EntityHeaderPreference;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller used to update the title and the icon for the header.
+ */
+public class AppSpecificDataUsageHeaderPreferenceController extends
+ PreferenceController<EntityHeaderPreference> {
+
+ private String mTitle;
+ private Drawable mIcon;
+
+ public AppSpecificDataUsageHeaderPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected Class<EntityHeaderPreference> getPreferenceType() {
+ return EntityHeaderPreference.class;
+ }
+
+ /** Sets the title. */
+ public AppSpecificDataUsageHeaderPreferenceController setTitle(String title) {
+ mTitle = title;
+ return this;
+ }
+
+ /** Sets the icon. */
+ public AppSpecificDataUsageHeaderPreferenceController setIcon(Drawable icon) {
+ mIcon = icon;
+ return this;
+ }
+
+ @Override
+ protected void checkInitialized() {
+ if (mTitle == null || mIcon == null) {
+ throw new IllegalStateException(
+ "Title and Icon should be set before calling this function");
+ }
+ }
+
+ @Override
+ protected void updateState(EntityHeaderPreference preference) {
+ preference.setTitle(mTitle);
+ preference.setIcon(mIcon);
+ }
+}
diff --git a/src/com/android/car/settings/datausage/AppSpecificDataUsageManager.java b/src/com/android/car/settings/datausage/AppSpecificDataUsageManager.java
new file mode 100644
index 0000000..7655764
--- /dev/null
+++ b/src/com/android/car/settings/datausage/AppSpecificDataUsageManager.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+
+import com.android.settingslib.net.NetworkCycleDataForUid;
+import com.android.settingslib.net.NetworkCycleDataForUidLoader;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to manage the callbacks needed to calculate data usage cycles for a specific app uid.
+ */
+public class AppSpecificDataUsageManager {
+
+ /**
+ * Callback when the NetworkDataCyclesForUid result is loaded.
+ */
+ public interface AppSpecificDataLoaderCallback {
+ /**
+ * Called when the data is successfully loaded from
+ * {@link AppSpecificDataUsageManager.NetworkDataCyclesForUidResult}.
+ */
+ void onDataLoaded(List<NetworkCycleDataForUid> networkCycleChartDataForUid);
+ }
+
+ @VisibleForTesting
+ static final int NETWORK_CYCLE_LOADER_ID = 12;
+
+ private final Context mContext;
+ private final NetworkTemplate mNetworkTemplate;
+ private final int mUid;
+ private final List<AppSpecificDataUsageManager.AppSpecificDataLoaderCallback> mListeners =
+ new ArrayList<>();
+
+ AppSpecificDataUsageManager(Context context, NetworkTemplate networkTemplate, int uid) {
+ mContext = context;
+ mNetworkTemplate = networkTemplate;
+ mUid = uid;
+ }
+
+ /**
+ * Registers a listener that will be notified once the data is loaded.
+ */
+ public void registerListener(
+ AppSpecificDataUsageManager.AppSpecificDataLoaderCallback listener) {
+ if (!mListeners.contains(listener)) {
+ mListeners.add(listener);
+ }
+ }
+
+ /**
+ * Unregisters the listener.
+ */
+ public void unregisterListener(
+ AppSpecificDataUsageManager.AppSpecificDataLoaderCallback listener) {
+ mListeners.remove(listener);
+ }
+
+ /**
+ * Start calculating the storage stats for app uid.
+ */
+ public void startLoading(LoaderManager loaderManager) {
+ loaderManager.restartLoader(NETWORK_CYCLE_LOADER_ID, null,
+ new NetworkDataCyclesForUidResult());
+ }
+
+ private void onReceive(List<NetworkCycleDataForUid> networkCycleDataLoaderList) {
+ for (AppSpecificDataUsageManager.AppSpecificDataLoaderCallback listener : mListeners) {
+ listener.onDataLoaded(networkCycleDataLoaderList);
+ }
+ }
+
+ /**
+ * Callback to calculate network data cycles for app uid.
+ */
+ private class NetworkDataCyclesForUidResult implements LoaderManager.LoaderCallbacks
+ <List<NetworkCycleDataForUid>> {
+ @Override
+ public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) {
+ NetworkCycleDataForUidLoader.Builder builder =
+ NetworkCycleDataForUidLoader.builder(mContext)
+ .setRetrieveDetail(true)
+ .addUid(mUid);
+ builder.setNetworkTemplate(mNetworkTemplate);
+ return builder.build();
+ }
+
+ @Override
+ public void onLoadFinished(@NonNull Loader<List<NetworkCycleDataForUid>> loader,
+ List<NetworkCycleDataForUid> networkCycleDataLoaderList) {
+ onReceive(networkCycleDataLoaderList);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<List<NetworkCycleDataForUid>> loader) {}
+ }
+}
diff --git a/src/com/android/car/settings/datausage/AppsNetworkStatsManager.java b/src/com/android/car/settings/datausage/AppsNetworkStatsManager.java
index 2fc6cbc..a4ed19d 100644
--- a/src/com/android/car/settings/datausage/AppsNetworkStatsManager.java
+++ b/src/com/android/car/settings/datausage/AppsNetworkStatsManager.java
@@ -27,6 +27,7 @@
import android.os.RemoteException;
import android.os.ServiceManager;
+import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
@@ -74,6 +75,14 @@
}
}
+ @VisibleForTesting
+ AppsNetworkStatsManager(Context context, NetworkPolicyManager networkPolicyManager,
+ INetworkStatsSession iNetworkStatsSession) {
+ mContext = context;
+ mNetworkPolicyManager = networkPolicyManager;
+ mStatsSession = iNetworkStatsSession;
+ }
+
/**
* Registers a listener that will be notified once the data is loaded.
*/
diff --git a/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceController.java b/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceController.java
index 9d0f96a..45ea229 100644
--- a/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceController.java
+++ b/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceController.java
@@ -18,21 +18,28 @@
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
import android.text.format.Time;
-import androidx.preference.Preference;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.ListPreference;
+import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
+import java.util.stream.IntStream;
+
/**
- * Preference which opens a {@link UsageCycleResetDayOfMonthPickerDialog} in order to pick the date
- * on which the data warning/limit cycle should end.
+ * ListPreference used to pick the date on which the data warning/limit cycle should end.
*/
public class CycleResetDayOfMonthPickerPreferenceController extends
- DataWarningAndLimitBasePreferenceController<Preference> implements
- UsageCycleResetDayOfMonthPickerDialog.ResetDayOfMonthPickedListener {
+ DataWarningAndLimitBasePreferenceController<ListPreference> {
- private static final String CYCLE_PICKER_DIALOG_TAG = "cycle_picker_dialog_tag";
+ @VisibleForTesting
+ static final int MIN_DAY = 1;
+ @VisibleForTesting
+ static final int MAX_DAY = 31;
public CycleResetDayOfMonthPickerPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -40,33 +47,38 @@
}
@Override
- protected Class<Preference> getPreferenceType() {
- return Preference.class;
+ protected Class<ListPreference> getPreferenceType() {
+ return ListPreference.class;
}
@Override
protected void onCreateInternal() {
- UsageCycleResetDayOfMonthPickerDialog dialog =
- (UsageCycleResetDayOfMonthPickerDialog) getFragmentController().findDialogByTag(
- CYCLE_PICKER_DIALOG_TAG);
- if (dialog != null) {
- dialog.setResetDayOfMonthPickedListener(/* listener= */ this);
+ CharSequence[] list = IntStream.rangeClosed(MIN_DAY, MAX_DAY)
+ .mapToObj(i-> String.valueOf(i)).toArray(CharSequence[]::new);
+ getPreference().setEntryValues(list);
+ getPreference().setEntries(list);
+ }
+
+ @Override
+ protected void updateState(ListPreference preference) {
+ String prefix = getContext().getString(R.string.cycle_reset_day_of_month_picker_subtitle);
+ int cycleDayOfMonth = getNetworkPolicyEditor().getPolicyCycleDay(getNetworkTemplate());
+ if (cycleDayOfMonth >= MIN_DAY && cycleDayOfMonth <= MAX_DAY) {
+ String cycleDayOfMonthString = String.valueOf(cycleDayOfMonth);
+ getPreference().setValue(cycleDayOfMonthString);
+ getPreference().setSummary(BidiFormatter.getInstance().unicodeWrap(
+ String.join(" ", prefix, cycleDayOfMonthString),
+ TextDirectionHeuristics.LOCALE));
}
}
@Override
- protected boolean handlePreferenceClicked(Preference preference) {
-
- UsageCycleResetDayOfMonthPickerDialog dialog =
- UsageCycleResetDayOfMonthPickerDialog.newInstance(
- getNetworkPolicyEditor().getPolicyCycleDay(getNetworkTemplate()));
- dialog.setResetDayOfMonthPickedListener(/* listener= */ this);
- getFragmentController().showDialog(dialog, CYCLE_PICKER_DIALOG_TAG);
+ protected boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
+ onDayOfMonthPicked(Integer.valueOf((String) newValue));
return true;
}
- @Override
- public void onDayOfMonthPicked(int dayOfMonth) {
+ private void onDayOfMonthPicked(int dayOfMonth) {
getNetworkPolicyEditor().setPolicyCycleDay(getNetworkTemplate(), dayOfMonth,
new Time().timezone);
}
diff --git a/src/com/android/car/settings/datausage/DataLimitPreferenceController.java b/src/com/android/car/settings/datausage/DataLimitPreferenceController.java
index b4e54b6..8086544 100644
--- a/src/com/android/car/settings/datausage/DataLimitPreferenceController.java
+++ b/src/com/android/car/settings/datausage/DataLimitPreferenceController.java
@@ -32,7 +32,6 @@
import com.android.car.settings.R;
import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.datausage.UsageBytesThresholdPickerDialog.BytesThresholdPickedListener;
/** Controls setting the data limit threshold. */
public class DataLimitPreferenceController extends
@@ -44,11 +43,6 @@
static final float LIMIT_BYTES_MULTIPLIER = 1.2f;
private static final long GIB_IN_BYTES = 1024 * 1024 * 1024;
- private final BytesThresholdPickedListener mThresholdPickedListener = numBytes -> {
- getNetworkPolicyEditor().setPolicyLimitBytes(getNetworkTemplate(), numBytes);
- refreshUi();
- };
-
private TwoStatePreference mEnableDataLimitPreference;
private Preference mSetDataLimitPreference;
@@ -77,13 +71,12 @@
/* confirmListener= */ this,
/* rejectListener= */ null,
/* neutralListener= */ null);
+ }
- UsageBytesThresholdPickerDialog dialog =
- (UsageBytesThresholdPickerDialog) getFragmentController().findDialogByTag(
- UsageBytesThresholdPickerDialog.TAG);
- if (dialog != null) {
- dialog.setBytesThresholdPickedListener(mThresholdPickedListener);
- }
+ @Override
+ public void onStartInternal() {
+ super.onStartInternal();
+ getNetworkPolicyEditor().read();
}
@Override
@@ -139,11 +132,8 @@
@Override
public boolean onPreferenceClick(Preference preference) {
- UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
- R.string.data_usage_limit_editor_title,
- getNetworkPolicyEditor().getPolicyLimitBytes(getNetworkTemplate()));
- dialog.setBytesThresholdPickedListener(mThresholdPickedListener);
- getFragmentController().showDialog(dialog, UsageBytesThresholdPickerDialog.TAG);
+ getFragmentController().launchFragment(DataLimitSetThresholdFragment
+ .newInstance(getNetworkTemplate()));
return true;
}
}
diff --git a/src/com/android/car/settings/datausage/DataLimitSetThresholdFragment.java b/src/com/android/car/settings/datausage/DataLimitSetThresholdFragment.java
new file mode 100644
index 0000000..e00855e
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataLimitSetThresholdFragment.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+
+import com.android.car.settings.R;
+
+/** Screen used to pick the data usage limit threshold bytes. */
+public class DataLimitSetThresholdFragment extends DataUsageSetThresholdBaseFragment {
+
+ /**
+ * Creates a new instance of {@link DataLimitSetThresholdFragment} with the given template. If
+ * the template is {@code null}, the fragment will use the default data network template.
+ */
+ public static DataLimitSetThresholdFragment newInstance(@Nullable NetworkTemplate template) {
+ DataLimitSetThresholdFragment fragment = new DataLimitSetThresholdFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE, template);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ void onSave(long threshold) {
+ mPolicyEditor.setPolicyLimitBytes(mNetworkTemplate, threshold);
+ }
+
+ @Override
+ @StringRes
+ protected int getTitleResId() {
+ return R.string.data_usage_limit_editor_title;
+ }
+
+ @Override
+ protected long getInitialBytes() {
+ return mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate);
+ }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageCycleBasePreferenceController.java b/src/com/android/car/settings/datausage/DataUsageCycleBasePreferenceController.java
new file mode 100644
index 0000000..0d3b3e9
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageCycleBasePreferenceController.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.text.format.DateUtils;
+
+import androidx.annotation.CallSuper;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.net.DataUsageController;
+import com.android.settingslib.net.NetworkCycleData;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Base preference controller for loading data cycle information
+ *
+ * @param <T> type of the {@link NetworkCycleData} objects that will be loaded.
+ */
+public abstract class DataUsageCycleBasePreferenceController<T extends NetworkCycleData> extends
+ PreferenceController<ListPreference> {
+ private List<T> mList;
+ private boolean mIsLoaded = false;
+ private DataCyclePickedListener<T> mDataCyclePickedListener;
+ private Map<CharSequence, T> mDataUsages = new HashMap<>();
+ private DataUsageController.DataUsageInfo mDataUsageInfo;
+
+ /** A listener that is called when a data cycle is selected.
+ *
+ * @param <T> type of the {@link NetworkCycleData} objects that was loaded.
+ */
+ public interface DataCyclePickedListener<T> {
+ /** Callback when a new data cycle is selected */
+ void onDataCyclePicked(String cycle, Map<CharSequence, T> usages);
+ }
+
+ public DataUsageCycleBasePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected Class<ListPreference> getPreferenceType() {
+ return ListPreference.class;
+ }
+
+ @Override
+ @CallSuper
+ protected void updateState(ListPreference preference) {
+ CharSequence entry = getPreference().getEntry();
+ if (entry != null) {
+ preference.setEnabled(true);
+ getPreference().setSummary(entry);
+ } else {
+ preference.setEnabled(false);
+ getPreference().setSummary(mDataUsageInfo.period);
+ }
+ String cycle = getPreference().getValue();
+ if (mIsLoaded) {
+ mDataCyclePickedListener.onDataCyclePicked(cycle, mDataUsages);
+ }
+ }
+
+ @Override
+ @CallSuper
+ protected void checkInitialized() {
+ if (mDataCyclePickedListener == null || mDataUsageInfo == null) {
+ throw new IllegalStateException("DataCyclePickedListener and DataUsageInfo should be "
+ + "set before calling this function.");
+ }
+ }
+
+ /** Set DataCyclePickedListener */
+ public DataUsageCycleBasePreferenceController<T> setDataCyclePickedListener(
+ DataCyclePickedListener<T> listener) {
+ mDataCyclePickedListener = listener;
+ return this;
+ }
+
+ /** Set DataUsageInfo */
+ public void setDataUsageInfo(DataUsageController.DataUsageInfo dataUsageInfo) {
+ mDataUsageInfo = dataUsageInfo;
+ }
+
+ /** Called to parse loaded data */
+ protected void onLoaded(List<T> data) {
+ mList = data;
+ // TODO: (b/202973988) The data loaded is empty occasionally. In that case, we will not
+ // refresh the UI or mark it as loaded.
+ if (mList != null && !mList.isEmpty()) {
+ updateCycle(getPreference());
+ mIsLoaded = true;
+ refreshUi();
+ }
+ }
+
+ private void updateCycle(ListPreference preference) {
+ if (mIsLoaded) {
+ return;
+ }
+ ArrayList<CharSequence> entries = new ArrayList<>();
+ ArrayList<CharSequence> entryValues = new ArrayList<>();
+ for (int i = 0; i < mList.size(); i++) {
+ T networkCycleData = mList.get(i);
+ CharSequence entry = formatDate(
+ networkCycleData.getStartTime(), networkCycleData.getEndTime());
+ CharSequence entryValue = String.valueOf(i);
+ entries.add(entry);
+ entryValues.add(entryValue);
+ mDataUsages.put(entryValue, networkCycleData);
+ }
+ preference.setEntries(entries.toArray(new CharSequence[entries.size()]));
+ preference.setEntryValues(entryValues.toArray(new CharSequence[entries.size()]));
+ preference.setSummary(entries.get(0));
+ preference.setValueIndex(0);
+ }
+
+ private String formatDate(long startTime, long endTime) {
+ return DateUtils.formatDateRange(getContext(), startTime, endTime,
+ DateUtils.FORMAT_ABBREV_MONTH | DateUtils.FORMAT_SHOW_DATE);
+ }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageCycleManager.java b/src/com/android/car/settings/datausage/DataUsageCycleManager.java
new file mode 100644
index 0000000..d6b340b
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageCycleManager.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+
+import com.android.settingslib.net.NetworkCycleChartData;
+import com.android.settingslib.net.NetworkCycleChartDataLoader;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to manage the callbacks needed to calculate data usage cycles.
+ */
+public class DataUsageCycleManager {
+
+ /**
+ * Callback for when NetworkDataCycles is loaded.
+ */
+ public interface DataUsageCycleLoaderCallback {
+ /**
+ * Called when the data is successfully loaded from
+ * {@link DataUsageCycleManager.NetworkDataCyclesResult}.
+ */
+ void onDataLoaded(List<NetworkCycleChartData> networkCycleChartData);
+ }
+
+ @VisibleForTesting
+ static final int NETWORK_CYCLE_LOADER_ID = 11;
+
+ private final Context mContext;
+ private final NetworkTemplate mNetworkTemplate;
+ private final List<DataUsageCycleManager.DataUsageCycleLoaderCallback> mListeners =
+ new ArrayList<>();
+
+ DataUsageCycleManager(Context context, NetworkTemplate networkTemplate) {
+ mContext = context;
+ mNetworkTemplate = networkTemplate;
+ }
+
+ /**
+ * Registers a listener that will be notified once the data is loaded.
+ */
+ public void registerListener(DataUsageCycleManager.DataUsageCycleLoaderCallback listener) {
+ if (!mListeners.contains(listener)) {
+ mListeners.add(listener);
+ }
+ }
+
+ /**
+ * Unregisters the listener.
+ */
+ public void unregisterListener(DataUsageCycleManager.DataUsageCycleLoaderCallback listener) {
+ mListeners.remove(listener);
+ }
+
+ /**
+ * Start calculating the storage stats.
+ */
+ public void startLoading(LoaderManager loaderManager) {
+ loaderManager.restartLoader(NETWORK_CYCLE_LOADER_ID, null, new NetworkDataCyclesResult());
+ }
+
+ private void onReceive(List<NetworkCycleChartData> networkCycleDataLoaderList) {
+ for (DataUsageCycleManager.DataUsageCycleLoaderCallback listener : mListeners) {
+ listener.onDataLoaded(networkCycleDataLoaderList);
+ }
+ }
+
+ /**
+ * Callback to calculate network data cycles.
+ */
+ private class NetworkDataCyclesResult implements LoaderManager.LoaderCallbacks
+ <List<NetworkCycleChartData>> {
+ @Override
+ public Loader<List<NetworkCycleChartData>> onCreateLoader(int id, Bundle args) {
+ return NetworkCycleChartDataLoader.builder(mContext)
+ .setNetworkTemplate(mNetworkTemplate)
+ .build();
+ }
+
+ @Override
+ public void onLoadFinished(@NonNull Loader<List<NetworkCycleChartData>> loader,
+ List<NetworkCycleChartData> networkCycleDataLoaderList) {
+ onReceive(networkCycleDataLoaderList);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<List<NetworkCycleChartData>> loader) {}
+ }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageCyclePreferenceController.java b/src/com/android/car/settings/datausage/DataUsageCyclePreferenceController.java
new file mode 100644
index 0000000..c52edf9
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageCyclePreferenceController.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.net.NetworkCycleChartData;
+
+import java.util.List;
+
+/**
+ * Controller used to handle Data Usage cycle change.
+ */
+public class DataUsageCyclePreferenceController extends
+ DataUsageCycleBasePreferenceController<NetworkCycleChartData> implements
+ DataUsageCycleManager.DataUsageCycleLoaderCallback {
+
+ public DataUsageCyclePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ public void onDataLoaded(List<NetworkCycleChartData> networkCycleChartData) {
+ onLoaded(networkCycleChartData);
+ }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageEditTextPreference.java b/src/com/android/car/settings/datausage/DataUsageEditTextPreference.java
new file mode 100644
index 0000000..c714feb
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageEditTextPreference.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.EditText;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+import com.android.car.ui.preference.CarUiPreference;
+
+/** CarUiPreference that shows an edit text with numberDecimal input type */
+public class DataUsageEditTextPreference extends CarUiPreference {
+
+ private String mTextToSet;
+ private EditText mEditText;
+
+ public DataUsageEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init();
+ }
+
+ public DataUsageEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ public DataUsageEditTextPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public DataUsageEditTextPreference(Context context) {
+ super(context);
+ init();
+ }
+
+ private void init() {
+ setLayoutResource(R.layout.data_usage_edit_text_preference);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder view) {
+ super.onBindViewHolder(view);
+
+ mEditText = (EditText) view.findViewById(R.id.data_usage_edit_text);
+
+ if (mTextToSet != null) {
+ mEditText.setText(mTextToSet);
+ mTextToSet = null;
+ }
+ }
+
+ /** Sets the EditText text */
+ public void setText(String textToSet) {
+ mTextToSet = textToSet;
+ notifyChanged();
+ }
+
+ /** Returns the current the EditText text */
+ public String getText() {
+ return mEditText.getText().toString();
+ }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageEditTextPreferenceController.java b/src/com/android/car/settings/datausage/DataUsageEditTextPreferenceController.java
new file mode 100644
index 0000000..ce45baa
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageEditTextPreferenceController.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Business logic for changing the data warning value. */
+public class DataUsageEditTextPreferenceController extends
+ PreferenceController<DataUsageEditTextPreference> {
+
+ private String mDefaultText;
+
+ public DataUsageEditTextPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected Class<DataUsageEditTextPreference> getPreferenceType() {
+ return DataUsageEditTextPreference.class;
+ }
+
+ /** Sets the default text of the edit text */
+ public void setDefaultText(String text) {
+ mDefaultText = text;
+ }
+
+ @Override
+ protected void checkInitialized() {
+ if (mDefaultText == null) {
+ throw new IllegalStateException(
+ "Default text should be set before calling this function");
+ }
+ }
+
+ @Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+
+ getPreference().setText(mDefaultText);
+ }
+
+ /** Returns the current text of the edit text */
+ public String getText() {
+ return getPreference().getText();
+ }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageFragment.java b/src/com/android/car/settings/datausage/DataUsageFragment.java
deleted file mode 100644
index 161c3f4..0000000
--- a/src/com/android/car/settings/datausage/DataUsageFragment.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.provider.Settings;
-
-import androidx.annotation.XmlRes;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.SettingsFragment;
-import com.android.car.settings.network.NetworkUtils;
-import com.android.car.settings.search.CarBaseSearchIndexProvider;
-import com.android.settingslib.search.SearchIndexable;
-
-/** Data usage settings homepage. */
-@SearchIndexable
-public class DataUsageFragment extends SettingsFragment {
-
- @Override
- @XmlRes
- protected int getPreferenceScreenResId() {
- return R.xml.data_usage_fragment;
- }
-
- public static final CarBaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new CarBaseSearchIndexProvider(R.xml.data_usage_fragment,
- Settings.ACTION_MOBILE_DATA_USAGE) {
- @Override
- protected boolean isPageSearchEnabled(Context context) {
- return NetworkUtils.hasMobileNetwork(
- context.getSystemService(ConnectivityManager.class));
- }
- };
-}
diff --git a/src/com/android/car/settings/datausage/DataUsagePreferenceController.java b/src/com/android/car/settings/datausage/DataUsagePreferenceController.java
index b0febdd..b02b9e7 100644
--- a/src/com/android/car/settings/datausage/DataUsagePreferenceController.java
+++ b/src/com/android/car/settings/datausage/DataUsagePreferenceController.java
@@ -18,26 +18,32 @@
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
-import android.telephony.SubscriptionManager;
import androidx.preference.Preference;
+import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.network.NetworkBasePreferenceController;
+import com.android.settingslib.net.DataUsageController;
+import com.android.settingslib.utils.StringUtil;
+
+import java.util.concurrent.TimeUnit;
/**
* Controller to handle the business logic for AppDataUsage preference on the data usage screen
*/
-public class DataUsagePreferenceController extends PreferenceController<Preference> {
+public class DataUsagePreferenceController extends
+ NetworkBasePreferenceController<Preference> {
- private int mSubId = Integer.MIN_VALUE;
+ private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1);
+ private static final String STRING_FORMAT = "%s, %s";
- private SubscriptionManager mSubscriptionManager;
+ private final DataUsageController mDataUsageController;
public DataUsagePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+ mDataUsageController = new DataUsageController(context);
}
@Override
@@ -47,21 +53,35 @@
@Override
protected boolean handlePreferenceClicked(Preference preference) {
- int subId = mSubId != Integer.MIN_VALUE ? mSubId : getDefaultSubId();
- AppDataUsageFragment appDataUsageFragment = AppDataUsageFragment.newInstance(subId);
+ AppDataUsageFragment appDataUsageFragment = AppDataUsageFragment.newInstance(getSubId());
getFragmentController().launchFragment(appDataUsageFragment);
return true;
}
- /**
- * Sets the subId for which data usage will be loaded. If this is not set then default subId
- * will be used to load data.
- */
- public void setSubId(int subId) {
- mSubId = subId;
+ @Override
+ protected void updateState(Preference preference) {
+ DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
+ getNetworkTemplate());
+ getPreference().setSummary(String.format(STRING_FORMAT, getUsageText(info),
+ getRemainingBillingCycleTimeText(info)));
}
- private int getDefaultSubId() {
- return DataUsageUtils.getDefaultSubscriptionId(mSubscriptionManager);
+ private CharSequence getUsageText(DataUsageController.DataUsageInfo info) {
+ return DataUsageUtils.bytesToIecUnits(getContext(), info.usageLevel);
+ }
+
+ private CharSequence getRemainingBillingCycleTimeText(DataUsageController.DataUsageInfo info) {
+ long millisLeft = info.cycleEnd - System.currentTimeMillis();
+ if (millisLeft <= 0) {
+ return getContext().getString(R.string.billing_cycle_none_left);
+ } else {
+ int daysLeft = (int) (millisLeft / MILLIS_IN_A_DAY);
+ if (daysLeft < 1) {
+ return getContext().getString(R.string.billing_cycle_less_than_one_day_left);
+ } else {
+ return StringUtil.getIcuPluralsString(getContext(), daysLeft,
+ R.string.billing_cycle_days_left);
+ }
+ }
}
}
diff --git a/src/com/android/car/settings/datausage/DataUsageSetThresholdBaseFragment.java b/src/com/android/car/settings/datausage/DataUsageSetThresholdBaseFragment.java
new file mode 100644
index 0000000..69e4cc9
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageSetThresholdBaseFragment.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.car.ui.toolbar.MenuItem;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import java.util.Collections;
+import java.util.List;
+
+/** Screen used to pick the data usage warning threshold bytes. */
+public abstract class DataUsageSetThresholdBaseFragment extends SettingsFragment {
+
+ @VisibleForTesting
+ static final long MIB_IN_BYTES = 1024 * 1024;
+ @VisibleForTesting
+ static final long GIB_IN_BYTES = MIB_IN_BYTES * 1024;
+ @VisibleForTesting
+ static final long MAX_DATA_LIMIT_BYTES = 50000 * GIB_IN_BYTES;
+ @VisibleForTesting
+ static final float MB_GB_SUFFIX_THRESHOLD = 1.5f;
+
+ @VisibleForTesting
+ DataUsageUnitPreferenceController mDataWarningUnitsPreferenceController;
+ @VisibleForTesting
+ DataUsageEditTextPreferenceController mDataUsageEditTextPreferenceController;
+ @VisibleForTesting
+ NetworkPolicyEditor mPolicyEditor;
+ @VisibleForTesting
+ NetworkTemplate mNetworkTemplate;
+
+ private MenuItem mSaveButton;
+ private TelephonyManager mTelephonyManager;
+ private SubscriptionManager mSubscriptionManager;
+
+ @Override
+ @XmlRes
+ protected int getPreferenceScreenResId() {
+ return R.xml.data_usage_set_threshold_fragment;
+ }
+
+ @Override
+ protected List<MenuItem> getToolbarMenuItems() {
+ return Collections.singletonList(mSaveButton);
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+
+ if (mPolicyEditor == null) {
+ mPolicyEditor = new NetworkPolicyEditor(NetworkPolicyManager.from(context));
+
+ // Loads the current policies to the policy editor cache.
+ mPolicyEditor.read();
+ }
+ mNetworkTemplate = getArguments().getParcelable(
+ NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE);
+ if (mNetworkTemplate == null) {
+ mTelephonyManager = context.getSystemService(TelephonyManager.class);
+ mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+ mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(mTelephonyManager,
+ DataUsageUtils.getDefaultSubscriptionId(mSubscriptionManager));
+ }
+
+ mSaveButton = new MenuItem.Builder(context)
+ .setTitle(R.string.data_usage_warning_save_title)
+ .setOnClickListener(i -> {
+ onSaveClicked();
+ })
+ .build();
+
+ mDataUsageEditTextPreferenceController = use(
+ DataUsageEditTextPreferenceController.class,
+ R.string.pk_data_usage_edit_text);
+ mDataWarningUnitsPreferenceController = use(DataUsageUnitPreferenceController.class,
+ R.string.pk_data_usage_radio_group);
+
+ long currentWarningBytes = getInitialBytes();
+ String bytesText;
+ if (currentWarningBytes > MB_GB_SUFFIX_THRESHOLD * GIB_IN_BYTES) {
+ mDataWarningUnitsPreferenceController.setDefaultSelection(/* isGb= */ true);
+ bytesText = formatText(currentWarningBytes / (float) GIB_IN_BYTES);
+ } else {
+ mDataWarningUnitsPreferenceController.setDefaultSelection(/* isGb= */ false);
+ bytesText = formatText(currentWarningBytes / (float) MIB_IN_BYTES);
+ }
+
+ mDataUsageEditTextPreferenceController.setDefaultText(bytesText);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ getPreferenceScreen().setTitle(getTitleResId());
+ }
+
+ @VisibleForTesting
+ void onSaveClicked() {
+ onSave(getCurrentThreshold());
+ goBack();
+ }
+
+ @VisibleForTesting
+ long getCurrentThreshold() {
+ String bytesString = mDataUsageEditTextPreferenceController.getText();
+ if (bytesString.isEmpty() || bytesString.equals(".")) {
+ bytesString = "0";
+ }
+
+ long bytes = (long) (Float.parseFloat(bytesString)
+ * (mDataWarningUnitsPreferenceController.isGbSelected()
+ ? GIB_IN_BYTES : MIB_IN_BYTES));
+
+ // To fix the overflow problem.
+ return Math.min(MAX_DATA_LIMIT_BYTES, bytes);
+ }
+
+ private String formatText(float v) {
+ v = Math.round(v * 100) / 100f;
+ return String.valueOf(v);
+ }
+
+ /**
+ * Callback when save button is clicked
+ *
+ * @param threshold number of bytes set
+ */
+ @VisibleForTesting
+ abstract void onSave(long threshold);
+
+ /** Returns the screen title res id */
+ @StringRes
+ protected abstract int getTitleResId();
+
+ /** Returns the initial bytes to be displayed */
+ protected abstract long getInitialBytes();
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/car/settings/datausage/DataUsageSummaryPreference.java
index 79f2952..94c8039 100644
--- a/src/com/android/car/settings/datausage/DataUsageSummaryPreference.java
+++ b/src/com/android/car/settings/datausage/DataUsageSummaryPreference.java
@@ -33,8 +33,6 @@
/** Extends {@link ProgressBarPreference} in order to support multiple text fields. */
public class DataUsageSummaryPreference extends ProgressBarPreference {
- private CharSequence mDataLimitText;
- private CharSequence mRemainingBillingCycleText;
private CharSequence mCarrierInfoText;
private Intent mManageSubscriptionIntent;
@StyleRes
@@ -65,32 +63,6 @@
setLayoutResource(R.layout.data_usage_summary_preference);
}
- /** Sets the data limit text. */
- public void setDataLimitText(CharSequence text) {
- if (!TextUtils.equals(mDataLimitText, text)) {
- mDataLimitText = text;
- notifyChanged();
- }
- }
-
- /** Gets the data limit text. */
- public CharSequence getDataLimitText() {
- return mDataLimitText;
- }
-
- /** Sets the remaining billing cycle description. */
- public void setRemainingBillingCycleText(CharSequence text) {
- if (!TextUtils.equals(mRemainingBillingCycleText, text)) {
- mRemainingBillingCycleText = text;
- notifyChanged();
- }
- }
-
- /** Gets the remaining billing cycle description. */
- public CharSequence getRemainingBillingCycleText() {
- return mRemainingBillingCycleText;
- }
-
/** Sets the carrier info text. */
public void setCarrierInfoText(CharSequence text) {
if (!TextUtils.equals(mCarrierInfoText, text)) {
@@ -133,9 +105,6 @@
public void onBindViewHolder(PreferenceViewHolder view) {
super.onBindViewHolder(view);
- setTextAndVisibility((TextView) view.findViewById(R.id.data_limit_text), mDataLimitText);
- setTextAndVisibility((TextView) view.findViewById(R.id.remaining_billing_cycle_time_text),
- mRemainingBillingCycleText);
TextView carrierInfo = (TextView) view.findViewById(R.id.carrier_info_text);
setTextAndVisibility(carrierInfo, mCarrierInfoText);
carrierInfo.setTextAppearance(mCarrierInfoTextStyle);
diff --git a/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java
index 43602c2..7882d3a 100644
--- a/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java
+++ b/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java
@@ -21,12 +21,10 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.INetworkPolicyManager;
-import android.net.NetworkTemplate;
import android.os.ServiceManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionPlan;
-import android.telephony.TelephonyManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
@@ -40,7 +38,7 @@
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
-import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.network.NetworkBasePreferenceController;
import com.android.car.settings.network.NetworkUtils;
import com.android.settingslib.net.DataUsageController;
import com.android.settingslib.utils.StringUtil;
@@ -53,7 +51,7 @@
* the appropriate summary text.
*/
public class DataUsageSummaryPreferenceController extends
- PreferenceController<DataUsageSummaryPreference> {
+ NetworkBasePreferenceController<DataUsageSummaryPreference> {
private static final Logger LOG = new Logger(DataUsageSummaryPreferenceController.class);
private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1);
@@ -66,9 +64,7 @@
static final long WARNING_AGE = TimeUnit.HOURS.toMillis(6L);
private final SubscriptionManager mSubscriptionManager;
- private final TelephonyManager mTelephonyManager;
private final DataUsageController mDataUsageController;
- private final NetworkTemplate mDefaultTemplate;
/** Name of the carrier, or null if not available */
@Nullable
@@ -92,13 +88,18 @@
public DataUsageSummaryPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
- super(context, preferenceKey, fragmentController, uxRestrictions);
- mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
- mTelephonyManager = context.getSystemService(TelephonyManager.class);
- mDataUsageController = new DataUsageController(context);
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ context.getSystemService(SubscriptionManager.class),
+ new DataUsageController(context));
+ }
- int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(mSubscriptionManager);
- mDefaultTemplate = DataUsageUtils.getMobileNetworkTemplate(mTelephonyManager, defaultSubId);
+ @VisibleForTesting
+ DataUsageSummaryPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ SubscriptionManager subscriptionManager, DataUsageController dataUsageController) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mSubscriptionManager = subscriptionManager;
+ mDataUsageController = dataUsageController;
}
@Override
@@ -108,7 +109,7 @@
@Override
protected int getAvailabilityStatus() {
- return NetworkUtils.hasSim(mTelephonyManager) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ return NetworkUtils.hasSim(getTelephonyManager()) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
@@ -120,7 +121,7 @@
@Override
protected void updateState(DataUsageSummaryPreference preference) {
DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
- mDefaultTemplate);
+ getNetworkTemplate());
if (mSubscriptionManager != null) {
refreshDataplanInfo(info);
@@ -129,9 +130,6 @@
preference.setTitle(getUsageText());
preference.setManageSubscriptionIntent(mManageSubscriptionIntent);
- preference.setDataLimitText(getLimitText(info));
- preference.setRemainingBillingCycleText(getRemainingBillingCycleTimeText());
-
// Carrier Info has special styling based on when it was last updated.
preference.setCarrierInfoText(getCarrierInfoText());
long updateAgeMillis = calculateTruncatedUpdateAge(mSnapshotTime);
@@ -166,37 +164,6 @@
return usageText;
}
-
- private CharSequence getLimitText(DataUsageController.DataUsageInfo info) {
- if (info.warningLevel > 0 && info.limitLevel > 0) {
- return TextUtils.expandTemplate(
- getContext().getText(R.string.cell_data_warning_and_limit),
- DataUsageUtils.bytesToIecUnits(getContext(), info.warningLevel),
- DataUsageUtils.bytesToIecUnits(getContext(), info.limitLevel));
- } else if (info.warningLevel > 0) {
- return TextUtils.expandTemplate(getContext().getText(R.string.cell_data_warning),
- DataUsageUtils.bytesToIecUnits(getContext(), info.warningLevel));
- } else if (info.limitLevel > 0) {
- return TextUtils.expandTemplate(getContext().getText(R.string.cell_data_limit),
- DataUsageUtils.bytesToIecUnits(getContext(), info.limitLevel));
- }
-
- return null;
- }
-
- private CharSequence getRemainingBillingCycleTimeText() {
- long millisLeft = mCycleEnd - System.currentTimeMillis();
- if (millisLeft <= 0) {
- return getContext().getString(R.string.billing_cycle_none_left);
- } else {
- int daysLeft = (int) (millisLeft / MILLIS_IN_A_DAY);
- return daysLeft < 1
- ? getContext().getString(R.string.billing_cycle_less_than_one_day_left)
- : getContext().getResources().getQuantityString(
- R.plurals.billing_cycle_days_left, daysLeft, daysLeft);
- }
- }
-
private CharSequence getCarrierInfoText() {
if (mDataplanCount > 0 && mSnapshotTime >= 0L) {
long updateAgeMillis = calculateTruncatedUpdateAge(mSnapshotTime);
@@ -235,13 +202,12 @@
mDataplanUse = info.usageLevel;
mCycleEnd = info.cycleEnd;
- int defaultSubId = SubscriptionManager.getDefaultSubscriptionId();
- SubscriptionInfo subInfo = mSubscriptionManager.getDefaultDataSubscriptionInfo();
+ SubscriptionInfo subInfo = mSubscriptionManager.getActiveSubscriptionInfo(getSubId());
if (subInfo != null) {
mCarrierName = subInfo.getCarrierName();
- List<SubscriptionPlan> plans = mSubscriptionManager.getSubscriptionPlans(defaultSubId);
+ List<SubscriptionPlan> plans = mSubscriptionManager.getSubscriptionPlans(getSubId());
SubscriptionPlan primaryPlan = DataUsageUtils.getPrimaryPlan(mSubscriptionManager,
- defaultSubId);
+ getSubId());
if (primaryPlan != null) {
mDataplanCount = plans.size();
mDataplanSize = primaryPlan.getDataLimitBytes();
@@ -258,7 +224,7 @@
mSnapshotTime = primaryPlan.getDataUsageTime();
}
}
- mManageSubscriptionIntent = createManageSubscriptionIntent(defaultSubId);
+ mManageSubscriptionIntent = createManageSubscriptionIntent(getSubId());
}
/**
diff --git a/src/com/android/car/settings/datausage/DataUsageUnitPreferenceController.java b/src/com/android/car/settings/datausage/DataUsageUnitPreferenceController.java
new file mode 100644
index 0000000..a0f6b97
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageUnitPreferenceController.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.GroupSelectionPreferenceController;
+import com.android.car.ui.preference.CarUiRadioButtonPreference;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Class that manages whether the data warning gigabyte or megabyte radio buttons are selected */
+public class DataUsageUnitPreferenceController extends GroupSelectionPreferenceController {
+
+ private final String mGbPreferenceKey;
+ private final String mMbPreferenceKey;
+
+ private String mSelectedKey;
+
+ public DataUsageUnitPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mGbPreferenceKey = context.getString(R.string.pk_data_usage_radio_gb);
+ mMbPreferenceKey = context.getString(R.string.pk_data_usage_radio_mb);
+ }
+
+ @Override
+ protected Class<PreferenceGroup> getPreferenceType() {
+ return PreferenceGroup.class;
+ }
+
+ /** Sets whether GB or MB radio button should be selected by default */
+ public void setDefaultSelection(boolean isGb) {
+ mSelectedKey = isGb ? mGbPreferenceKey : mMbPreferenceKey;
+ }
+
+ @Override
+ protected void checkInitialized() {
+ if (mSelectedKey == null) {
+ throw new IllegalStateException(
+ "Default selection should be set before calling this function");
+ }
+ }
+
+ @Override
+ protected String getCurrentCheckedKey() {
+ return mSelectedKey;
+ }
+
+ @NonNull
+ @Override
+ protected List<TwoStatePreference> getGroupPreferences() {
+ List<TwoStatePreference> entries = new ArrayList<>();
+
+ // Create GB preference
+ CarUiRadioButtonPreference gbPreference = new CarUiRadioButtonPreference(getContext());
+ gbPreference.setKey(mGbPreferenceKey);
+ gbPreference.setTitle(com.android.internal.R.string.gigabyteShort);
+
+ // Create MB preference
+ CarUiRadioButtonPreference mbPreference = new CarUiRadioButtonPreference(getContext());
+ mbPreference.setKey(mMbPreferenceKey);
+ mbPreference.setTitle(com.android.internal.R.string.megabyteShort);
+
+ entries.add(gbPreference);
+ entries.add(mbPreference);
+ return entries;
+ }
+
+ @Override
+ protected boolean handleGroupItemSelected(TwoStatePreference preference) {
+ mSelectedKey = preference.getKey().equals(mGbPreferenceKey)
+ ? mGbPreferenceKey : mMbPreferenceKey;
+ return true;
+ }
+
+ /** Returns whether the gigabyte radio button is selected */
+ public boolean isGbSelected() {
+ return mSelectedKey.equals(mGbPreferenceKey);
+ }
+}
diff --git a/src/com/android/car/settings/datausage/DataWarningAndLimitPreferenceController.java b/src/com/android/car/settings/datausage/DataWarningAndLimitPreferenceController.java
new file mode 100644
index 0000000..88391a7
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataWarningAndLimitPreferenceController.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.text.TextUtils;
+
+import androidx.annotation.CallSuper;
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.network.NetworkBasePreferenceController;
+import com.android.settingslib.net.DataUsageController;
+
+/**
+ * Controller updating data warning summary.
+ */
+public class DataWarningAndLimitPreferenceController extends
+ NetworkBasePreferenceController<Preference> {
+
+ private DataUsageController mDataUsageController;
+
+ public DataWarningAndLimitPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mDataUsageController = new DataUsageController(context);
+ }
+
+ @Override
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
+ }
+
+ @Override
+ @CallSuper
+ protected void updateState(Preference preference) {
+ getPreference().setSummary(getLimitText());
+ }
+
+ private CharSequence getLimitText() {
+ DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
+ getNetworkTemplate());
+ if (info.warningLevel > 0 && info.limitLevel > 0) {
+ return TextUtils.expandTemplate(
+ getContext().getText(R.string.cell_data_warning_and_limit),
+ DataUsageUtils.bytesToIecUnits(getContext(), info.warningLevel),
+ DataUsageUtils.bytesToIecUnits(getContext(), info.limitLevel));
+ } else if (info.warningLevel > 0) {
+ return TextUtils.expandTemplate(getContext().getText(R.string.cell_data_warning),
+ DataUsageUtils.bytesToIecUnits(getContext(), info.warningLevel));
+ } else if (info.limitLevel > 0) {
+ return TextUtils.expandTemplate(getContext().getText(R.string.cell_data_limit),
+ DataUsageUtils.bytesToIecUnits(getContext(), info.limitLevel));
+ }
+
+ return null;
+ }
+}
diff --git a/src/com/android/car/settings/datausage/DataWarningPreferenceController.java b/src/com/android/car/settings/datausage/DataWarningPreferenceController.java
index b16857a..9104e41 100644
--- a/src/com/android/car/settings/datausage/DataWarningPreferenceController.java
+++ b/src/com/android/car/settings/datausage/DataWarningPreferenceController.java
@@ -27,7 +27,6 @@
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.datausage.UsageBytesThresholdPickerDialog.BytesThresholdPickedListener;
import com.android.settingslib.net.DataUsageController;
/** Controls setting the data warning threshold. */
@@ -36,10 +35,6 @@
Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener {
private final DataUsageController mDataUsageController;
- private final BytesThresholdPickedListener mThresholdPickedListener = numBytes -> {
- getNetworkPolicyEditor().setPolicyWarningBytes(getNetworkTemplate(), numBytes);
- refreshUi();
- };
private TwoStatePreference mEnableDataWarningPreference;
private Preference mSetDataWarningPreference;
@@ -63,13 +58,12 @@
mSetDataWarningPreference = getPreference().findPreference(
getContext().getString(R.string.pk_data_warning));
mSetDataWarningPreference.setOnPreferenceClickListener(this);
+ }
- UsageBytesThresholdPickerDialog dialog =
- (UsageBytesThresholdPickerDialog) getFragmentController().findDialogByTag(
- UsageBytesThresholdPickerDialog.TAG);
- if (dialog != null) {
- dialog.setBytesThresholdPickedListener(mThresholdPickedListener);
- }
+ @Override
+ public void onStartInternal() {
+ super.onStartInternal();
+ getNetworkPolicyEditor().read();
}
@Override
@@ -98,11 +92,8 @@
@Override
public boolean onPreferenceClick(Preference preference) {
- UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
- R.string.data_usage_warning_editor_title,
- getNetworkPolicyEditor().getPolicyWarningBytes(getNetworkTemplate()));
- dialog.setBytesThresholdPickedListener(mThresholdPickedListener);
- getFragmentController().showDialog(dialog, UsageBytesThresholdPickerDialog.TAG);
+ getFragmentController().launchFragment(DataWarningSetThresholdFragment
+ .newInstance(getNetworkTemplate()));
return true;
}
}
diff --git a/src/com/android/car/settings/datausage/DataWarningSetThresholdFragment.java b/src/com/android/car/settings/datausage/DataWarningSetThresholdFragment.java
new file mode 100644
index 0000000..881ecad
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataWarningSetThresholdFragment.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+
+import com.android.car.settings.R;
+
+/** Screen used to pick the data usage warning threshold bytes. */
+public class DataWarningSetThresholdFragment extends DataUsageSetThresholdBaseFragment {
+
+ /**
+ * Creates a new instance of {@link DataWarningSetThresholdFragment} with the given template. If
+ * the template is {@code null}, the fragment will use the default data network template.
+ */
+ public static DataWarningSetThresholdFragment newInstance(@Nullable NetworkTemplate template) {
+ DataWarningSetThresholdFragment fragment = new DataWarningSetThresholdFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE, template);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ void onSave(long threshold) {
+ mPolicyEditor.setPolicyWarningBytes(mNetworkTemplate, threshold);
+ }
+
+ @Override
+ @StringRes
+ protected int getTitleResId() {
+ return R.string.data_usage_warning_editor_title;
+ }
+
+ @Override
+ protected long getInitialBytes() {
+ return mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate);
+ }
+}
diff --git a/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialog.java b/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialog.java
deleted file mode 100644
index 1ca8d1a..0000000
--- a/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialog.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.NumberPicker;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.car.settings.R;
-import com.android.car.ui.preference.CarUiDialogFragment;
-
-/** Dialog that is used to pick the start day of month to track a data usage cycle. */
-public class UsageCycleResetDayOfMonthPickerDialog extends CarUiDialogFragment {
-
- private static final String ARG_SELECTED_DAY_OF_MONTH = "arg_selected_day_of_month";
-
- /**
- * Defines the time frequency at which touch listener should be triggered when holding either
- * arrow button.
- */
- @VisibleForTesting
- static final int TIME_INTERVAL_MILLIS = 250;
-
- private static final int MIN_DAY = 1;
- private static final int MAX_DAY = 31;
- private ResetDayOfMonthPickedListener mResetDayOfMonthPickedListener;
- private NumberPicker mCycleDayOfMonthPicker;
- private View mUpArrow;
- private View mDownArrow;
-
- /**
- * Creates a new instance of the {@link UsageCycleResetDayOfMonthPickerDialog} with the {@link
- * NumberPicker} set to showing the value {@code startDayOfMonth}.
- */
- public static UsageCycleResetDayOfMonthPickerDialog newInstance(int startDayOfMonth) {
- UsageCycleResetDayOfMonthPickerDialog dialog = new UsageCycleResetDayOfMonthPickerDialog();
- Bundle args = new Bundle();
- args.putInt(ARG_SELECTED_DAY_OF_MONTH, startDayOfMonth);
- dialog.setArguments(args);
- return dialog;
- }
-
- /** Sets a {@link ResetDayOfMonthPickedListener}. */
- public void setResetDayOfMonthPickedListener(
- ResetDayOfMonthPickedListener resetDayOfMonthPickedListener) {
- mResetDayOfMonthPickedListener = resetDayOfMonthPickedListener;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
-
- // Use builder context to keep consistent theme.
- LayoutInflater inflater = LayoutInflater.from(builder.getContext());
- View view = inflater.inflate(R.layout.usage_cycle_reset_day_of_month_picker,
- /* root= */ null, /* attachToRoot= */ false);
-
- int cycleDayOfMonth = getArguments().getInt(ARG_SELECTED_DAY_OF_MONTH);
- if (cycleDayOfMonth < MIN_DAY) {
- cycleDayOfMonth = MIN_DAY;
- }
- if (cycleDayOfMonth > MAX_DAY) {
- cycleDayOfMonth = MAX_DAY;
- }
-
- mCycleDayOfMonthPicker = view.findViewById(R.id.cycle_reset_day_of_month);
- mCycleDayOfMonthPicker.setMinValue(MIN_DAY);
- mCycleDayOfMonthPicker.setMaxValue(MAX_DAY);
- mCycleDayOfMonthPicker.setValue(cycleDayOfMonth);
- mCycleDayOfMonthPicker.setWrapSelectorWheel(true);
-
- mUpArrow = view.findViewById(R.id.up_arrow_container);
- mUpArrow.setOnTouchListener(new CycleArrowTouchListener(
- () -> mCycleDayOfMonthPicker.setValue(mCycleDayOfMonthPicker.getValue() - 1),
- TIME_INTERVAL_MILLIS));
-
- mDownArrow = view.findViewById(R.id.down_arrow_container);
- mDownArrow.setOnTouchListener(new CycleArrowTouchListener(
- () -> mCycleDayOfMonthPicker.setValue(mCycleDayOfMonthPicker.getValue() + 1),
- TIME_INTERVAL_MILLIS));
-
- return builder
- .setTitle(R.string.cycle_reset_day_of_month_picker_title)
- .setView(view)
- .setPositiveButton(R.string.cycle_reset_day_of_month_picker_positive_button,
- (dialog, which) -> {
- if (which == DialogInterface.BUTTON_POSITIVE) {
- if (mResetDayOfMonthPickedListener != null) {
- mResetDayOfMonthPickedListener.onDayOfMonthPicked(
- mCycleDayOfMonthPicker.getValue());
- }
- }
- })
- .create();
- }
-
- @Override
- protected void onDialogClosed(boolean positiveResult) {
- }
-
- /** Gets the current day of month selected by the {@link NumberPicker}. */
- public int getSelectedDayOfMonth() {
- return mCycleDayOfMonthPicker.getValue();
- }
-
- /** A listener that is called when a date is selected. */
- public interface ResetDayOfMonthPickedListener {
- /** A method that determines how to process the selected day of month. */
- void onDayOfMonthPicked(int dayOfMonth);
- }
-
- private static class CycleArrowTouchListener implements View.OnTouchListener {
-
- private final IntervalActionListener mIntervalActionListener;
- private final long mTimeIntervalMillis;
-
- private Handler mHandler = new Handler();
- private Runnable mAction;
-
- CycleArrowTouchListener(IntervalActionListener listener, long timeIntervalMillis) {
- mIntervalActionListener = listener;
- mTimeIntervalMillis = timeIntervalMillis;
-
- mAction = () -> {
- mHandler.postDelayed(this.mAction, mTimeIntervalMillis);
- maybeTriggerAction();
- };
- }
-
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- mHandler.removeCallbacks(mAction);
- mHandler.postDelayed(mAction, mTimeIntervalMillis);
- maybeTriggerAction();
- v.setPressed(true);
- return true;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- mHandler.removeCallbacks(mAction);
- v.setPressed(false);
- return true;
- }
- return false;
- }
-
- private void maybeTriggerAction() {
- if (mIntervalActionListener != null) {
- mIntervalActionListener.takeAction();
- }
- }
-
- /** Action that should be taken per time interval that the button is held. */
- interface IntervalActionListener {
- /** Defines the action to take at each time interval. */
- void takeAction();
- }
- }
-}
diff --git a/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceController.java b/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceController.java
index f311e6f..0883f6a 100644
--- a/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceController.java
+++ b/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceController.java
@@ -21,7 +21,7 @@
import android.content.Intent;
import android.provider.Settings;
-import androidx.preference.TwoStatePreference;
+import androidx.preference.SwitchPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
@@ -30,7 +30,7 @@
* Business logic which controls the auto datetime toggle.
*/
public class AutoDatetimeTogglePreferenceController extends
- PreferenceController<TwoStatePreference> {
+ PreferenceController<SwitchPreference> {
public AutoDatetimeTogglePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -38,17 +38,24 @@
}
@Override
- protected Class<TwoStatePreference> getPreferenceType() {
- return TwoStatePreference.class;
+ protected Class<SwitchPreference> getPreferenceType() {
+ return SwitchPreference.class;
}
@Override
- protected void updateState(TwoStatePreference preference) {
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ DatetimeUtils.runClickableWhileDisabled(getContext(), getFragmentController()));
+ }
+
+ @Override
+ protected void updateState(SwitchPreference preference) {
preference.setChecked(isEnabled());
}
@Override
- protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+ protected boolean handlePreferenceChanged(SwitchPreference preference, Object newValue) {
boolean isAutoDatetimeEnabled = (boolean) newValue;
Settings.Global.putInt(getContext().getContentResolver(), Settings.Global.AUTO_TIME,
isAutoDatetimeEnabled ? 1 : 0);
@@ -57,6 +64,11 @@
return true;
}
+ @Override
+ public int getAvailabilityStatus() {
+ return DatetimeUtils.getAvailabilityStatus(getContext());
+ }
+
private boolean isEnabled() {
return Settings.Global.getInt(getContext().getContentResolver(),
Settings.Global.AUTO_TIME, 0) > 0;
diff --git a/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceController.java b/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceController.java
index 2f001cf..8e1e74d 100644
--- a/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceController.java
+++ b/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceController.java
@@ -21,7 +21,7 @@
import android.content.Intent;
import android.provider.Settings;
-import androidx.preference.TwoStatePreference;
+import androidx.preference.SwitchPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
@@ -30,7 +30,7 @@
* Business logic for the toggle which chooses to use the network provided time zone.
*/
public class AutoTimeZoneTogglePreferenceController extends
- PreferenceController<TwoStatePreference> {
+ PreferenceController<SwitchPreference> {
public AutoTimeZoneTogglePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -38,12 +38,19 @@
}
@Override
- protected Class<TwoStatePreference> getPreferenceType() {
- return TwoStatePreference.class;
+ protected Class<SwitchPreference> getPreferenceType() {
+ return SwitchPreference.class;
}
@Override
- protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ DatetimeUtils.runClickableWhileDisabled(getContext(), getFragmentController()));
+ }
+
+ @Override
+ protected boolean handlePreferenceChanged(SwitchPreference preference, Object newValue) {
boolean isAutoTimezoneEnabled = (boolean) newValue;
Settings.Global.putInt(getContext().getContentResolver(), Settings.Global.AUTO_TIME_ZONE,
isAutoTimezoneEnabled ? 1 : 0);
@@ -53,10 +60,15 @@
}
@Override
- protected void updateState(TwoStatePreference preference) {
+ protected void updateState(SwitchPreference preference) {
preference.setChecked(isEnabled());
}
+ @Override
+ public int getAvailabilityStatus() {
+ return DatetimeUtils.getAvailabilityStatus(getContext());
+ }
+
private boolean isEnabled() {
return Settings.Global.getInt(getContext().getContentResolver(),
Settings.Global.AUTO_TIME_ZONE, 0) > 0;
diff --git a/src/com/android/car/settings/datetime/DatePickerPreferenceController.java b/src/com/android/car/settings/datetime/DatePickerPreferenceController.java
index a4b193c..ce89518 100644
--- a/src/com/android/car/settings/datetime/DatePickerPreferenceController.java
+++ b/src/com/android/car/settings/datetime/DatePickerPreferenceController.java
@@ -56,6 +56,13 @@
}
@Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ DatetimeUtils.runClickableWhileDisabled(getContext(), getFragmentController()));
+ }
+
+ @Override
protected Class<Preference> getPreferenceType() {
return Preference.class;
}
@@ -76,7 +83,13 @@
public void updateState(Preference preference) {
preference.setSummary(DateFormat.getLongDateFormat(getContext()).format(
Calendar.getInstance().getTime()));
- preference.setEnabled(!autoDatetimeIsEnabled());
+ // When the status is AVAILABLE_FOR_VIEWING, this preference should always be disabled
+ preference.setEnabled(!autoDatetimeIsEnabled() && getAvailabilityStatus() == AVAILABLE);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return DatetimeUtils.getAvailabilityStatus(getContext());
}
private boolean autoDatetimeIsEnabled() {
diff --git a/src/com/android/car/settings/datetime/DatetimeUtils.java b/src/com/android/car/settings/datetime/DatetimeUtils.java
new file mode 100644
index 0000000..4770c53
--- /dev/null
+++ b/src/com/android/car/settings/datetime/DatetimeUtils.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.datetime;
+
+import static android.os.UserManager.DISALLOW_CONFIG_DATE_TIME;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+
+import android.content.Context;
+import android.os.UserManager;
+import android.widget.Toast;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
+
+/**
+ * Generic helper methods for this package.
+ */
+ // TODO(b/186905050): add unit tests for this class and {@code PreferenceController} that uses
+ // this class's methods.
+public final class DatetimeUtils {
+
+ /**
+ * Returns {@code PreferenceController.AVAILABLE_FOR_VIEWING} when there is
+ * {@code DISALLOW_CONFIG_DATE_TIME} on the user. Otherwise, returns
+ * {@code PreferenceController.AVAILABLE}.
+ */
+ public static int getAvailabilityStatus(Context context) {
+ if (context.getSystemService(UserManager.class)
+ .hasUserRestriction(DISALLOW_CONFIG_DATE_TIME)) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
+ }
+
+ /**
+ * Shows {@code ActionDisabledByAdminDialog} when the action is disallowed by
+ * a device owner or a profile owner. Otherwise, a {@code Toast} will be shwon to inform the
+ * user that the action is disabled.
+ */
+ public static void runClickableWhileDisabled(Context context,
+ FragmentController fragmentController) {
+ if (hasUserRestrictionByDpm(context, DISALLOW_CONFIG_DATE_TIME)) {
+ showActionDisabledByAdminDialog(context, fragmentController);
+ } else {
+ Toast.makeText(context, context.getString(R.string.action_unavailable),
+ Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private static void showActionDisabledByAdminDialog(Context context,
+ FragmentController fragmentController) {
+ fragmentController.showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(context,
+ DISALLOW_CONFIG_DATE_TIME),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
+
+ private DatetimeUtils() {
+ throw new UnsupportedOperationException("Provides only static methods");
+ }
+}
diff --git a/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceController.java b/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceController.java
index 74e73a1..c1b8f60 100644
--- a/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceController.java
+++ b/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceController.java
@@ -24,7 +24,7 @@
import android.provider.Settings;
import android.text.format.DateFormat;
-import androidx.preference.TwoStatePreference;
+import androidx.preference.SwitchPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
@@ -34,7 +34,7 @@
/**
* Business logic for toggle which chooses between 12 hour or 24 hour formats.
*/
-public class TimeFormatTogglePreferenceController extends PreferenceController<TwoStatePreference> {
+public class TimeFormatTogglePreferenceController extends PreferenceController<SwitchPreference> {
public static final String HOURS_12 = "12";
public static final String HOURS_24 = "24";
@@ -57,8 +57,15 @@
}
@Override
- protected Class<TwoStatePreference> getPreferenceType() {
- return TwoStatePreference.class;
+ protected Class<SwitchPreference> getPreferenceType() {
+ return SwitchPreference.class;
+ }
+
+ @Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ DatetimeUtils.runClickableWhileDisabled(getContext(), getFragmentController()));
}
/** Starts the broadcast receiver which listens for time changes */
@@ -77,7 +84,7 @@
}
@Override
- protected void updateState(TwoStatePreference preference) {
+ protected void updateState(SwitchPreference preference) {
Calendar now = Calendar.getInstance();
mTimeFormatDemoDate.setTimeZone(now.getTimeZone());
// We use December 31st because it's unambiguous when demonstrating the date format.
@@ -90,7 +97,7 @@
}
@Override
- protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+ protected boolean handlePreferenceChanged(SwitchPreference preference, Object newValue) {
boolean isUse24HourFormatEnabled = (boolean) newValue;
Settings.System.putString(getContext().getContentResolver(),
Settings.System.TIME_12_24,
@@ -105,6 +112,11 @@
return true;
}
+ @Override
+ public int getAvailabilityStatus() {
+ return DatetimeUtils.getAvailabilityStatus(getContext());
+ }
+
private boolean is24Hour() {
return DateFormat.is24HourFormat(getContext());
}
diff --git a/src/com/android/car/settings/datetime/TimePickerPreferenceController.java b/src/com/android/car/settings/datetime/TimePickerPreferenceController.java
index c4bdc97..b2a412b 100644
--- a/src/com/android/car/settings/datetime/TimePickerPreferenceController.java
+++ b/src/com/android/car/settings/datetime/TimePickerPreferenceController.java
@@ -61,6 +61,13 @@
return Preference.class;
}
+ @Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ DatetimeUtils.runClickableWhileDisabled(getContext(), getFragmentController()));
+ }
+
/** Starts the broadcast receiver which listens for time changes */
@Override
protected void onStartInternal() {
@@ -77,7 +84,13 @@
public void updateState(Preference preference) {
preference.setSummary(
DateFormat.getTimeFormat(getContext()).format(Calendar.getInstance().getTime()));
- preference.setEnabled(!autoDatetimeIsEnabled());
+ preference.setEnabled(!autoDatetimeIsEnabled()
+ && getAvailabilityStatus() == AVAILABLE);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return DatetimeUtils.getAvailabilityStatus(getContext());
}
private boolean autoDatetimeIsEnabled() {
diff --git a/src/com/android/car/settings/datetime/TimeZonePickerPreferenceController.java b/src/com/android/car/settings/datetime/TimeZonePickerPreferenceController.java
index 6a45f72..a6be83c 100644
--- a/src/com/android/car/settings/datetime/TimeZonePickerPreferenceController.java
+++ b/src/com/android/car/settings/datetime/TimeZonePickerPreferenceController.java
@@ -61,6 +61,13 @@
return Preference.class;
}
+ @Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ DatetimeUtils.runClickableWhileDisabled(getContext(), getFragmentController()));
+ }
+
/** Starts the broadcast receiver which listens for time changes */
@Override
protected void onStartInternal() {
@@ -78,7 +85,12 @@
Calendar now = Calendar.getInstance();
preference.setSummary(ZoneGetter.getTimeZoneOffsetAndName(getContext(), now.getTimeZone(),
now.getTime()));
- preference.setEnabled(!autoTimezoneIsEnabled());
+ preference.setEnabled(!autoTimezoneIsEnabled() && getAvailabilityStatus() == AVAILABLE);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return DatetimeUtils.getAvailabilityStatus(getContext());
}
private boolean autoTimezoneIsEnabled() {
diff --git a/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java b/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java
index 2fbf604..467499d 100644
--- a/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java
+++ b/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java
@@ -59,6 +59,13 @@
}
@Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ DatetimeUtils.runClickableWhileDisabled(getContext(), getFragmentController()));
+ }
+
+ @Override
protected void updateState(PreferenceGroup preferenceGroup) {
if (mZonesList == null) {
constructTimeZoneList();
@@ -68,6 +75,11 @@
}
}
+ @Override
+ public int getAvailabilityStatus() {
+ return DatetimeUtils.getAvailabilityStatus(getContext());
+ }
+
private void constructTimeZoneList() {
// We load all of the time zones on the UI thread. However it shouldn't be very expensive
// and also shouldn't take a long time. We can revisit this to setup background work and
diff --git a/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceController.java b/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceController.java
index 5c9cb33..f9bcc8f 100644
--- a/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceController.java
+++ b/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceController.java
@@ -16,20 +16,45 @@
package com.android.car.settings.display;
+import static android.os.UserManager.DISALLOW_CONFIG_BRIGHTNESS;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
+
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
import android.provider.Settings;
+import android.widget.Toast;
import androidx.preference.TwoStatePreference;
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
/** Business logic for controlling the adaptive brightness setting. */
public class AdaptiveBrightnessTogglePreferenceController extends
PreferenceController<TwoStatePreference> {
+ private static final Logger LOG =
+ new Logger(AdaptiveBrightnessTogglePreferenceController.class);
+ private static final Uri ADAPTIVE_BRIGHTNESS_URI = Settings.System.getUriFor(
+ Settings.System.SCREEN_BRIGHTNESS_MODE);
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+ private final ContentObserver mAdaptiveBrightnessObserver = new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ refreshUi();
+ }
+ };
+
public AdaptiveBrightnessTogglePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
@@ -41,13 +66,48 @@
}
@Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_BRIGHTNESS)) {
+ showActionDisabledByAdminDialog();
+ } else {
+ Toast.makeText(getContext(),
+ getContext().getString(R.string.action_unavailable),
+ Toast.LENGTH_LONG).show();
+ LOG.d(getContext().getString(R.string.action_unavailable));
+ }
+ });
+ }
+
+ @Override
+ protected void onStartInternal() {
+ super.onStartInternal();
+ getContext().getContentResolver().registerContentObserver(ADAPTIVE_BRIGHTNESS_URI,
+ /* notifyForDescendants= */ false, mAdaptiveBrightnessObserver);
+ }
+
+ @Override
+ protected void onStopInternal() {
+ super.onStopInternal();
+ getContext().getContentResolver().unregisterContentObserver(mAdaptiveBrightnessObserver);
+ }
+
+ @Override
protected void updateState(TwoStatePreference preference) {
preference.setChecked(isAdaptiveBrightnessChecked());
}
@Override
public int getAvailabilityStatus() {
- return supportsAdaptiveBrightness() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ if (!supportsAdaptiveBrightness()) {
+ return UNSUPPORTED_ON_DEVICE;
+ }
+ if (hasUserRestrictionByUm(getContext(), DISALLOW_CONFIG_BRIGHTNESS)
+ || hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_BRIGHTNESS)) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
}
@Override
@@ -70,4 +130,11 @@
private boolean supportsAdaptiveBrightness() {
return getContext().getResources().getBoolean(R.bool.config_automatic_brightness_available);
}
+
+ private void showActionDisabledByAdminDialog() {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ DISALLOW_CONFIG_BRIGHTNESS),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
}
diff --git a/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java b/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java
index a6db4b4..5aa7e8b 100644
--- a/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java
+++ b/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java
@@ -16,31 +16,54 @@
package com.android.car.settings.display;
+import static android.os.UserManager.DISALLOW_CONFIG_BRIGHTNESS;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
import android.os.PowerManager;
import android.os.UserHandle;
import android.provider.Settings;
+import android.widget.Toast;
+import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.common.SeekBarPreference;
+import com.android.car.settings.enterprise.EnterpriseUtils;
/** Business logic for changing the brightness of the display. */
public class BrightnessLevelPreferenceController extends PreferenceController<SeekBarPreference> {
private static final Logger LOG = new Logger(BrightnessLevelPreferenceController.class);
+ private static final Uri BRIGHTNESS_URI = Settings.System.getUriFor(
+ Settings.System.SCREEN_BRIGHTNESS);
private final int mMaximumBacklight;
private final int mMinimumBacklight;
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+ private final ContentObserver mBrightnessObserver = new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ refreshUi();
+ }
+ };
public BrightnessLevelPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
+
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mMaximumBacklight = powerManager.getMaximumScreenBrightnessSetting();
mMinimumBacklight = powerManager.getMinimumScreenBrightnessSetting();
@@ -52,6 +75,33 @@
}
@Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_BRIGHTNESS)) {
+ showActionDisabledByAdminDialog();
+ } else {
+ Toast.makeText(getContext(),
+ getContext().getString(R.string.action_unavailable),
+ Toast.LENGTH_LONG).show();
+ }
+ });
+ }
+
+ @Override
+ protected void onStartInternal() {
+ super.onStartInternal();
+ getContext().getContentResolver().registerContentObserver(BRIGHTNESS_URI,
+ /* notifyForDescendants= */ false, mBrightnessObserver);
+ }
+
+ @Override
+ protected void onStopInternal() {
+ super.onStopInternal();
+ getContext().getContentResolver().unregisterContentObserver(mBrightnessObserver);
+ }
+
+ @Override
protected void updateState(SeekBarPreference preference) {
preference.setMax(GAMMA_SPACE_MAX);
preference.setValue(getSeekbarValue());
@@ -78,4 +128,20 @@
}
return gamma;
}
+
+ @Override
+ public int getAvailabilityStatus() {
+ if (hasUserRestrictionByUm(getContext(), DISALLOW_CONFIG_BRIGHTNESS)
+ || hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_BRIGHTNESS)) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
+ }
+
+ private void showActionDisabledByAdminDialog() {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ DISALLOW_CONFIG_BRIGHTNESS),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
}
diff --git a/src/com/android/car/settings/enterprise/ActionDisabledByAdminActivity.java b/src/com/android/car/settings/enterprise/ActionDisabledByAdminActivity.java
index 409a141..b279c08 100644
--- a/src/com/android/car/settings/enterprise/ActionDisabledByAdminActivity.java
+++ b/src/com/android/car/settings/enterprise/ActionDisabledByAdminActivity.java
@@ -20,6 +20,7 @@
import android.content.Intent;
import android.os.Bundle;
+import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentActivity;
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
@@ -28,10 +29,11 @@
* Shows a dialog explaining that an action is not enabled due to restrictions imposed by an active
* device administrator.
*/
-//TODO(b/186905050): add unit tests
+// TODO(b/186905050): add unit tests
public final class ActionDisabledByAdminActivity extends FragmentActivity {
- private static final String FRAGMENT_TAG =
+ @VisibleForTesting
+ static final String FRAGMENT_TAG =
"ActionDisabledByAdminActivity.ActionDisabledByAdminDialogFragment";
@Override
@@ -41,14 +43,14 @@
getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
String restriction = getRestrictionFromIntent(getIntent());
- ActionDisabledByAdminDialogFragment.newInstance(restriction, getUserId())
- .show(getSupportFragmentManager(), FRAGMENT_TAG);
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- finish();
+ ActionDisabledByAdminDialogFragment fragment =
+ EnterpriseUtils.getActionDisabledByAdminDialog(this, restriction);
+ fragment.setDismissListener(res -> {
+ if (!isChangingConfigurations()) {
+ finish();
+ }
+ });
+ fragment.show(getSupportFragmentManager(), FRAGMENT_TAG);
}
private String getRestrictionFromIntent(Intent intent) {
diff --git a/src/com/android/car/settings/enterprise/ActionDisabledByAdminDialogFragment.java b/src/com/android/car/settings/enterprise/ActionDisabledByAdminDialogFragment.java
index 4e91fce..c85e460 100644
--- a/src/com/android/car/settings/enterprise/ActionDisabledByAdminDialogFragment.java
+++ b/src/com/android/car/settings/enterprise/ActionDisabledByAdminDialogFragment.java
@@ -22,6 +22,7 @@
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
@@ -30,6 +31,8 @@
import android.os.UserHandle;
import android.util.IconDrawableFactory;
+import androidx.annotation.VisibleForTesting;
+
import com.android.car.settings.R;
import com.android.car.settings.common.Logger;
import com.android.car.ui.AlertDialogBuilder;
@@ -55,23 +58,36 @@
private static final Logger LOG = new Logger(TAG);
private static final String EXTRA_RESTRICTION = TAG + "_restriction";
- private static final String EXTRA_USER_ID = TAG + "_userId";
+ private static final String EXTRA_RESTRICTED_PKG = TAG + "_pkg";
+ private static final String EXTRA_ADMIN_USER_ID = TAG + "_userId";
- private String mRestriction;
+ @VisibleForTesting
+ String mRestriction;
+ String mRestrictedPackage;
@UserIdInt
- private int mUserId;
+ private int mAdminUserId;
private ActionDisabledByAdminController mActionDisabledByAdminController;
+ private DismissListener mDismissListener;
/**
* Gets the dialog for the given user and restriction.
*/
public static ActionDisabledByAdminDialogFragment newInstance(String restriction,
@UserIdInt int userId) {
+ return newInstance(restriction, null, userId);
+ }
+
+ /**
+ * Gets the dialog for the given user and restriction.
+ */
+ public static ActionDisabledByAdminDialogFragment newInstance(String restriction,
+ @Nullable String restrictedPackage, @UserIdInt int userId) {
ActionDisabledByAdminDialogFragment instance = new ActionDisabledByAdminDialogFragment();
instance.mRestriction = restriction;
- instance.mUserId = userId;
+ instance.mRestrictedPackage = restrictedPackage;
+ instance.mAdminUserId = userId;
return instance;
}
@@ -79,7 +95,8 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (savedInstanceState != null) {
mRestriction = savedInstanceState.getString(EXTRA_RESTRICTION);
- mUserId = savedInstanceState.getInt(EXTRA_USER_ID);
+ mRestrictedPackage = savedInstanceState.getString(EXTRA_RESTRICTED_PKG);
+ mAdminUserId = savedInstanceState.getInt(EXTRA_ADMIN_USER_ID);
}
return initialize(getContext()).create();
}
@@ -89,26 +106,45 @@
super.onSaveInstanceState(outState);
outState.putString(EXTRA_RESTRICTION, mRestriction);
- outState.putInt(EXTRA_USER_ID, mUserId);
+ outState.putString(EXTRA_RESTRICTED_PKG, mRestrictedPackage);
+ outState.putInt(EXTRA_ADMIN_USER_ID, mAdminUserId);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
+ if (mDismissListener != null) {
+ mDismissListener.onDismiss(positiveResult);
+ mDismissListener = null;
+ }
+ }
+
+ /** Sets the listeners which listens for the dialog dismissed */
+ public void setDismissListener(DismissListener dismissListener) {
+ mDismissListener = dismissListener;
}
private AlertDialogBuilder initialize(Context context) {
- EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal
- .checkIfRestrictionEnforced(context, mRestriction, mUserId);
+ Intent intent = getActivity().getIntent();
+ boolean hasValidIntent = intent != null
+ && intent.getParcelableExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN) != null;
+ EnforcedAdmin enforcedAdmin = hasValidIntent
+ ? EnterpriseUtils.getEnforcedAdminFromIntent(context, intent)
+ : EnterpriseUtils.getEnforcedAdmin(context, mAdminUserId,
+ mRestriction, mRestrictedPackage);
+ LOG.i("hasValidIntent: " + hasValidIntent + " enforcedAdmin: " + enforcedAdmin
+ + " mAdminUserId: " + mAdminUserId);
AlertDialogBuilder builder = new AlertDialogBuilder(context)
.setPositiveButton(R.string.okay, /* listener= */ null);
mActionDisabledByAdminController = ActionDisabledByAdminControllerFactory
.createInstance(context, mRestriction, new DeviceAdminStringProviderImpl(context),
context.getUser());
+ // Learn more button should launch admin policy information on the current user
mActionDisabledByAdminController.initialize(
- new ActionDisabledLearnMoreButtonLauncherImpl(builder));
+ new ActionDisabledLearnMoreButtonLauncherImpl(builder,
+ /* preferredUser= */ context.getUser()));
if (enforcedAdmin != null) {
- mActionDisabledByAdminController.updateEnforcedAdmin(enforcedAdmin, mUserId);
+ mActionDisabledByAdminController.updateEnforcedAdmin(enforcedAdmin, mAdminUserId);
mActionDisabledByAdminController.setupLearnMoreButton(context);
}
initializeDialogViews(context, builder, enforcedAdmin,
@@ -119,7 +155,6 @@
// NOTE: methods below were copied from phone Settings
// (com.android.settings.enterprise.ActionDisabledByAdminDialogHelper), but adjusted to
// use a AlertDialogBuilder directly, instead of an Activity hosting a dialog.
-
private static @UserIdInt int getEnforcementAdminUserId(@Nullable EnforcedAdmin admin) {
return admin == null || admin.user == null ? UserHandle.USER_NULL
: admin.user.getIdentifier();
@@ -138,10 +173,10 @@
mActionDisabledByAdminController.updateEnforcedAdmin(enforcedAdmin, userId);
}
- if (isNotCurrentUserOrProfile(context, admin, userId)) {
+ if (isNotValidEnforcedAdmin(context, enforcedAdmin)) {
admin = null;
}
- setAdminSupportIcon(context, builder, admin, userId);
+ // NOTE: not showing icon
setAdminSupportTitle(context, builder, mRestriction);
if (enforcedAdmin != null) {
@@ -149,24 +184,31 @@
}
}
+ private boolean isNotValidEnforcedAdmin(Context context, EnforcedAdmin enforcedAdmin) {
+ if (enforcedAdmin == null) {
+ LOG.w("isNotValidEnforcedAdmin(): enforcedAdmin is null");
+ return true;
+ }
+ ComponentName admin = enforcedAdmin.component;
+ int userId = getEnforcementAdminUserId(enforcedAdmin);
+ if (isNotCurrentUserOrProfile(context, admin, userId)
+ && isNotDeviceOwner(context, admin, userId)) {
+ LOG.w("isNotValidEnforcedAdmin(): is not current user or profile/device owner");
+ return true;
+ }
+ return false;
+ }
+
private boolean isNotCurrentUserOrProfile(Context context, ComponentName admin,
@UserIdInt int userId) {
return !RestrictedLockUtilsInternal.isAdminInCurrentUserOrProfile(context, admin)
|| !RestrictedLockUtils.isCurrentUserOrProfile(context, userId);
}
- private void setAdminSupportIcon(Context context, AlertDialogBuilder builder,
- ComponentName admin, @UserIdInt int userId) {
- if (isNotCurrentUserOrProfile(context, admin, userId)) {
- builder.setIcon(context.getDrawable(com.android.internal.R.drawable.ic_info));
- } else {
- Drawable badgedIcon = getBadgedIcon(
- IconDrawableFactory.newInstance(context),
- context.getPackageManager(),
- admin.getPackageName(),
- userId);
- builder.setIcon(badgedIcon);
- }
+ private boolean isNotDeviceOwner(Context context, ComponentName admin,
+ @UserIdInt int userId) {
+ EnforcedAdmin deviceOwner = RestrictedLockUtilsInternal.getDeviceOwner(context);
+ return !((deviceOwner.component).equals(admin) && userId == UserHandle.USER_SYSTEM);
}
private void setAdminSupportTitle(Context context, AlertDialogBuilder builder,
@@ -181,9 +223,7 @@
return;
}
CharSequence supportMessage = null;
- if (!RestrictedLockUtilsInternal.isAdminInCurrentUserOrProfile(context,
- enforcedAdmin.component) || !RestrictedLockUtils.isCurrentUserOrProfile(
- context, getEnforcementAdminUserId(enforcedAdmin))) {
+ if (isNotValidEnforcedAdmin(context, enforcedAdmin)) {
enforcedAdmin.component = null;
} else {
if (enforcedAdmin.user == null) {
@@ -214,4 +254,15 @@
return packageManager.getDefaultActivityIcon();
}
}
+
+ /** Listens to the dismiss action. */
+ public interface DismissListener {
+ /**
+ * Defines the action to take when the dialog is closed.
+ *
+ * @param positiveResult - whether or not the dialog was dismissed because of a positive
+ * button press.
+ */
+ void onDismiss(boolean positiveResult);
+ }
}
diff --git a/src/com/android/car/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImpl.java b/src/com/android/car/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImpl.java
index 8d23130..9333449 100644
--- a/src/com/android/car/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImpl.java
+++ b/src/com/android/car/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImpl.java
@@ -23,6 +23,8 @@
import android.content.Intent;
import android.os.UserHandle;
+import androidx.annotation.Nullable;
+
import com.android.car.settings.R;
import com.android.car.settings.common.Logger;
import com.android.car.ui.AlertDialogBuilder;
@@ -36,11 +38,20 @@
extends ActionDisabledLearnMoreButtonLauncher {
private static final Logger LOG = new Logger(ActionDisabledLearnMoreButtonLauncherImpl.class);
-
+ /**
+ * The {@link UserHandle} which is preferred for launching the help page or admin policies in
+ */
+ @Nullable private final UserHandle mPreferredUser;
private final AlertDialogBuilder mBuilder;
ActionDisabledLearnMoreButtonLauncherImpl(AlertDialogBuilder builder) {
+ this(builder, /* preferredUser= */ null);
+ }
+
+ ActionDisabledLearnMoreButtonLauncherImpl(AlertDialogBuilder builder,
+ UserHandle preferredUser) {
mBuilder = requireNonNull(builder, "builder cannot be null");
+ mPreferredUser = preferredUser;
}
@Override
@@ -51,17 +62,24 @@
}
@Override
- protected void launchShowAdminPolicies(Context context, UserHandle user, ComponentName admin) {
+ protected void launchShowAdminPolicies(Context context, UserHandle adminUser,
+ ComponentName admin) {
requireNonNull(context, "context cannot be null");
- requireNonNull(user, "user cannot be null");
+ requireNonNull(adminUser, "user cannot be null");
requireNonNull(admin, "admin cannot be null");
Intent intent = new Intent()
.setClass(context, DeviceAdminAddActivity.class)
.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin)
.putExtra(DeviceAdminAddActivity.EXTRA_CALLED_FROM_SUPPORT_DIALOG, true);
- LOG.d("launching " + intent + " for user " + user);
- context.startActivityAsUser(intent, user);
+ if (mPreferredUser != null) {
+ context.startActivityAsUser(intent, mPreferredUser);
+ LOG.d("launching " + intent + " for preferred user: " + mPreferredUser
+ + " instead of adminUser");
+ return;
+ }
+ LOG.d("launching " + intent + " for admin user: " + adminUser);
+ context.startActivityAsUser(intent, adminUser);
}
@Override
diff --git a/src/com/android/car/settings/enterprise/AdminGrantedCameraPermissionPreferenceController.java b/src/com/android/car/settings/enterprise/AdminGrantedCameraPermissionPreferenceController.java
new file mode 100644
index 0000000..95e6f78
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/AdminGrantedCameraPermissionPreferenceController.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.Manifest;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Controller to show apps that were granted camera permission by the device owner.
+ */
+public final class AdminGrantedCameraPermissionPreferenceController
+ extends BaseAdminGrantedPermissionsPreferenceController<Preference> {
+
+ public AdminGrantedCameraPermissionPreferenceController(Context context,
+ String preferenceKey, FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions,
+ Manifest.permission.CAMERA);
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/AdminGrantedLocationPermissionsPreferenceController.java b/src/com/android/car/settings/enterprise/AdminGrantedLocationPermissionsPreferenceController.java
new file mode 100644
index 0000000..2d19b30
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/AdminGrantedLocationPermissionsPreferenceController.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.Manifest;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+* Controller to show apps that were granted location permissions by the device owner.
+*/
+public final class AdminGrantedLocationPermissionsPreferenceController
+ extends BaseAdminGrantedPermissionsPreferenceController<Preference> {
+
+ public AdminGrantedLocationPermissionsPreferenceController(Context context,
+ String preferenceKey, FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION);
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/AdminGrantedMicrophonePermissionPreferenceController.java b/src/com/android/car/settings/enterprise/AdminGrantedMicrophonePermissionPreferenceController.java
new file mode 100644
index 0000000..0e0a3a3
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/AdminGrantedMicrophonePermissionPreferenceController.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.Manifest;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+* Controller to show apps that were granted microphone permission by the device owner.
+*/
+public final class AdminGrantedMicrophonePermissionPreferenceController
+ extends BaseAdminGrantedPermissionsPreferenceController<Preference> {
+
+ public AdminGrantedMicrophonePermissionPreferenceController(Context context,
+ String preferenceKey, FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions,
+ Manifest.permission.RECORD_AUDIO);
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/AlwaysOnCurrentUserPreferenceController.java
similarity index 64%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/AlwaysOnCurrentUserPreferenceController.java
index 03e8185..872280a 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/AlwaysOnCurrentUserPreferenceController.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
@@ -24,24 +23,22 @@
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
- */
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+* Controller to show whether the device owner set an always-on VPN for the user.
+*/
+public final class AlwaysOnCurrentUserPreferenceController
+ extends BaseEnterprisePreferenceController<Preference> {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public AlwaysOnCurrentUserPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ // TODO(b/206155695): implement / add unit test
+ return DISABLED_FOR_PROFILE;
}
}
diff --git a/src/com/android/car/settings/enterprise/BaseAdminActionReporterPreferenceController.java b/src/com/android/car/settings/enterprise/BaseAdminActionReporterPreferenceController.java
new file mode 100644
index 0000000..40bff63
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/BaseAdminActionReporterPreferenceController.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.annotation.Nullable;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.text.format.DateUtils;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+import java.util.Date;
+
+/**
+ * Base class for controllers that shows the last time the device owner executed an action.
+ */
+abstract class BaseAdminActionReporterPreferenceController<P extends Preference>
+ extends BaseEnterprisePrivacyPreferenceController<P> {
+
+ protected BaseAdminActionReporterPreferenceController(Context context,
+ String preferenceKey, FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ Date timestamp = getAdminActionTimestamp();
+
+ if (timestamp == null) {
+ preference.setSummary(R.string.enterprise_privacy_none);
+ } else {
+ preference.setSummary(DateUtils.formatDateTime(getContext(), timestamp.getTime(),
+ DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE));
+ }
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
+
+ return isEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ }
+
+ @Nullable
+ protected abstract Date getAdminActionTimestamp();
+
+ protected abstract boolean isEnabled();
+}
diff --git a/src/com/android/car/settings/enterprise/BaseAdminGrantedPermissionsPreferenceController.java b/src/com/android/car/settings/enterprise/BaseAdminGrantedPermissionsPreferenceController.java
new file mode 100644
index 0000000..e73be22
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/BaseAdminGrantedPermissionsPreferenceController.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Base class for controller that show apps that were granted permissions by the device owner.
+ */
+abstract class BaseAdminGrantedPermissionsPreferenceController<P extends Preference>
+ extends BaseEnterprisePreferenceController<P> {
+
+ private final String[] mPermissions;
+
+ BaseAdminGrantedPermissionsPreferenceController(Context context,
+ String preferenceKey, FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions, String... permissions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mPermissions = permissions;
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
+
+ // TODO(b/206155448): implement / add unit test
+ return DISABLED_FOR_PROFILE;
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/BaseDeviceAdminAddPreferenceController.java b/src/com/android/car/settings/enterprise/BaseDeviceAdminAddPreferenceController.java
index b7f9d90..9d6d9d3 100644
--- a/src/com/android/car/settings/enterprise/BaseDeviceAdminAddPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/BaseDeviceAdminAddPreferenceController.java
@@ -17,18 +17,12 @@
package com.android.car.settings.enterprise;
import android.app.admin.DeviceAdminInfo;
-import android.app.admin.DevicePolicyManager;
import android.car.drivingstate.CarUxRestrictions;
-import android.content.ComponentName;
import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.UserManager;
import androidx.preference.Preference;
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.Logger;
-import com.android.car.settings.common.PreferenceController;
import java.util.Objects;
@@ -36,41 +30,21 @@
* Base class for controllers in the device admin details screen.
*/
abstract class BaseDeviceAdminAddPreferenceController<P extends Preference>
- extends PreferenceController<P> {
-
- protected final Logger mLogger = new Logger(getClass());
-
- protected final DevicePolicyManager mDpm;
- protected final PackageManager mPm;
- protected final UserManager mUm;
+ extends BaseEnterprisePreferenceController<P> {
protected DeviceAdminInfo mDeviceAdminInfo;
protected BaseDeviceAdminAddPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
-
- mDpm = context.getSystemService(DevicePolicyManager.class);
- mPm = context.getPackageManager();
- mUm = context.getSystemService(UserManager.class);
}
@Override
- protected Class<P> getPreferenceType() {
- return (Class<P>) Preference.class;
- }
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
- @Override
- protected final int getAvailabilityStatus() {
- return mDeviceAdminInfo == null ? CONDITIONALLY_UNAVAILABLE : getRealAvailabilityStatus();
- }
-
- /**
- * Method that can be overridden to define the real value of {@link #getAvailabilityStatus()}
- * when the {@link #setDeviceAdmin(DeviceAdminInfo) DeviceAdminInfo} is set.
- */
- protected int getRealAvailabilityStatus() {
- return AVAILABLE;
+ return mDeviceAdminInfo == null ? CONDITIONALLY_UNAVAILABLE : AVAILABLE;
}
final <T extends BaseDeviceAdminAddPreferenceController<P>> T setDeviceAdmin(
@@ -82,11 +56,7 @@
}
final boolean isProfileOrDeviceOwner() {
- return isProfileOrDeviceOwner(mDeviceAdminInfo.getComponent());
- }
-
- final boolean isProfileOrDeviceOwner(ComponentName admin) {
- return admin.equals(mDpm.getProfileOwner())
- || admin.equals(mDpm.getDeviceOwnerComponentOnCallingUser());
+ return mDeviceAdminInfo == null
+ ? false : isProfileOrDeviceOwner(mDeviceAdminInfo.getComponent());
}
}
diff --git a/src/com/android/car/settings/enterprise/BaseEnterprisePreferenceController.java b/src/com/android/car/settings/enterprise/BaseEnterprisePreferenceController.java
new file mode 100644
index 0000000..74cc754
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/BaseEnterprisePreferenceController.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+import android.app.admin.DeviceAdminInfo;
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.UserManager;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Base class for controllers in the enterprise module.
+ */
+abstract class BaseEnterprisePreferenceController<P extends Preference>
+ extends PreferenceController<P> {
+
+ protected final Logger mLogger = new Logger(getClass());
+
+ protected final DevicePolicyManager mDpm;
+ protected final PackageManager mPm;
+ protected final UserManager mUm;
+
+ private final boolean mHasFeature;
+
+ protected BaseEnterprisePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+
+ mHasFeature = context.getPackageManager()
+ .hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN);
+
+ mDpm = context.getSystemService(DevicePolicyManager.class);
+ mPm = context.getPackageManager();
+ mUm = context.getSystemService(UserManager.class);
+ }
+
+ @Override
+ protected Class<P> getPreferenceType() {
+ return (Class<P>) Preference.class;
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ return mHasFeature ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+
+ final boolean isProfileOrDeviceOwner(ComponentName admin) {
+ return admin.equals(mDpm.getProfileOwner())
+ || admin.equals(mDpm.getDeviceOwnerComponentOnCallingUser());
+ }
+
+ @Nullable
+ protected final CharSequence getDescription(DeviceAdminInfo deviceAdminInfo) {
+ try {
+ return deviceAdminInfo.loadDescription(mPm);
+ } catch (Resources.NotFoundException e) {
+ mLogger.v("No description for "
+ + deviceAdminInfo.getComponent().flattenToShortString());
+ }
+ return null;
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/BaseEnterprisePrivacyPreferenceController.java b/src/com/android/car/settings/enterprise/BaseEnterprisePrivacyPreferenceController.java
new file mode 100644
index 0000000..868f58c
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/BaseEnterprisePrivacyPreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Base class for controllers in the Enterprise Privacy / Managed Device Info screen.
+ */
+abstract class BaseEnterprisePrivacyPreferenceController<P extends Preference>
+ extends BaseEnterprisePreferenceController<P> {
+
+ protected final EnterprisePrivacyFeatureProvider mEnterprisePrivacyFeatureProvider;
+
+ protected BaseEnterprisePrivacyPreferenceController(Context context,
+ String preferenceKey, FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+
+ mEnterprisePrivacyFeatureProvider =
+ new EnterprisePrivacyFeatureProviderImpl(context, mDpm, mPm);
+ }
+
+ protected BaseEnterprisePrivacyPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ EnterprisePrivacyFeatureProvider provider) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+
+ mEnterprisePrivacyFeatureProvider = provider;
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/BugReportsPreferenceController.java
similarity index 67%
rename from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
rename to src/com/android/car/settings/enterprise/BugReportsPreferenceController.java
index 03e8185..9c5096e 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/BugReportsPreferenceController.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
@@ -23,25 +22,26 @@
import com.android.car.settings.common.FragmentController;
-/**
- * Controller for the cancel button in the device admin details screen.
- */
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+import java.util.Date;
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+/**
+* Controller to show whether the device owner took bugreports.
+*/
+public final class BugReportsPreferenceController
+ extends BaseAdminActionReporterPreferenceController<Preference> {
+
+ public BugReportsPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
+ protected Date getAdminActionTimestamp() {
+ return mEnterprisePrivacyFeatureProvider.getLastBugReportRequestTime();
}
@Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
+ protected boolean isEnabled() {
return true;
}
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/CaCertsCurrentUserPreferenceController.java
similarity index 64%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/CaCertsCurrentUserPreferenceController.java
index 03e8185..d149dd5 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/CaCertsCurrentUserPreferenceController.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
@@ -24,24 +23,22 @@
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
- */
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+* Controller to show whether the device owner created CA Certificates for the user.
+*/
+public final class CaCertsCurrentUserPreferenceController
+ extends BaseEnterprisePreferenceController<Preference> {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public CaCertsCurrentUserPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ // TODO(b/206155848): implement / add unit test
+ return DISABLED_FOR_PROFILE;
}
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/DeviceAdminActivatedAppsPreferenceController.java
similarity index 62%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/DeviceAdminActivatedAppsPreferenceController.java
index 03e8185..bc59605 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/DeviceAdminActivatedAppsPreferenceController.java
@@ -17,31 +17,24 @@
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
import android.content.Context;
-import androidx.preference.Preference;
-
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
+ * Displays a list of activated device admin apps.
*/
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+public final class DeviceAdminActivatedAppsPreferenceController
+ extends DeviceAdminAppsPreferenceController {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public DeviceAdminActivatedAppsPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
-
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ protected boolean isIncluded(ComponentName componentName) {
+ return isActivated(componentName);
}
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddActionPreferenceController.java b/src/com/android/car/settings/enterprise/DeviceAdminAddActionPreferenceController.java
deleted file mode 100644
index 4ff5f7d..0000000
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddActionPreferenceController.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.enterprise;
-
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.ComponentName;
-import android.content.Context;
-
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.FragmentController;
-
-/**
- * Controller for the action (activate / deactivate).
- */
-public final class DeviceAdminAddActionPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
-
- /*
- * 3-state status for button:
- *
- * - null: button disabled
- * - true: admin active, button deactivates
- * - false: admin inactive, button activates
- */
- @Nullable
- private Boolean mIsActive;
-
- public DeviceAdminAddActionPreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
- super(context, preferenceKey, fragmentController, uxRestrictions);
- }
-
- @Override
- protected void updateState(Preference preference) {
- setIsActive();
-
- preference.setEnabled(mIsActive != null);
- preference.setTitle(mIsActive == null || mIsActive
- ? R.string.remove_device_admin
- : R.string.add_device_admin);
- }
-
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- if (mIsActive == null) {
- mLogger.wtf("handlePreferenceClicked() called when admin is a profile / device owner");
- } else {
- ComponentName admin = mDeviceAdminInfo.getComponent();
- if (mIsActive) {
- mLogger.i("Deactivating " + admin.flattenToShortString());
- mDpm.removeActiveAdmin(admin);
- } else {
- mLogger.i("Activating " + admin.flattenToShortString());
- // TODO(b/192372143): support refreshing
- mDpm.setActiveAdmin(admin, /* refreshing= */ false);
- }
- }
- getFragmentController().goBack();
- return true;
- }
-
- @VisibleForTesting
- void setIsActive() {
- ComponentName admin = mDeviceAdminInfo.getComponent();
- if (isProfileOrDeviceOwner(admin)) {
- // TODO(b/170332519): once work profiles are supported, they could be removed
- mLogger.d("updateState(): " + admin.toShortString() + " is PO or DO");
- mIsActive = null;
- } else {
- mIsActive = mDpm.isAdminActive(admin);
- }
-
- mLogger.d("updateState(): active = " + mIsActive);
- }
-}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddActivity.java b/src/com/android/car/settings/enterprise/DeviceAdminAddActivity.java
index db41050..69a3958 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddActivity.java
+++ b/src/com/android/car/settings/enterprise/DeviceAdminAddActivity.java
@@ -25,7 +25,11 @@
*/
public final class DeviceAdminAddActivity extends BaseCarSettingsActivity {
- static final String EXTRA_DEVICE_ADMIN_PACKAGE_NAME =
+ /**
+ * Optional key to map to the package name of the Device Admin.
+ * <p>Currently only used when uninstalling an active device admin.
+ */
+ public static final String EXTRA_DEVICE_ADMIN_PACKAGE_NAME =
"android.app.extra.DEVICE_ADMIN_PACKAGE_NAME";
static final String EXTRA_CALLED_FROM_SUPPORT_DIALOG =
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddExplanationPreferenceController.java b/src/com/android/car/settings/enterprise/DeviceAdminAddExplanationPreferenceController.java
index 633e7bf..1b0a346 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddExplanationPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/DeviceAdminAddExplanationPreferenceController.java
@@ -40,7 +40,10 @@
}
@Override
- protected int getRealAvailabilityStatus() {
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
+
return TextUtils.isEmpty(mExplanation) ? CONDITIONALLY_UNAVAILABLE : AVAILABLE;
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddFragment.java b/src/com/android/car/settings/enterprise/DeviceAdminAddFragment.java
index fa9e5e9..7c3f9e2 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddFragment.java
+++ b/src/com/android/car/settings/enterprise/DeviceAdminAddFragment.java
@@ -16,21 +16,39 @@
package com.android.car.settings.enterprise;
+import static android.app.Activity.RESULT_OK;
+import static android.os.Process.myUserHandle;
+
import static com.android.car.settings.enterprise.EnterpriseUtils.getAdminWithinPackage;
import static com.android.car.settings.enterprise.EnterpriseUtils.getDeviceAdminInfo;
import android.app.Activity;
import android.app.admin.DeviceAdminInfo;
+import android.app.admin.DeviceAdminReceiver;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.text.TextUtils;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceScreen;
import com.android.car.settings.R;
import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.common.SettingsFragment;
+import com.android.car.ui.toolbar.MenuItem;
import com.android.car.ui.toolbar.ToolbarController;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
/**
* A screen that shows details about a device administrator.
*/
@@ -38,17 +56,48 @@
private static final Logger LOG = new Logger(DeviceAdminAddFragment.class);
+ @VisibleForTesting
+ static final int UNINSTALL_DEVICE_ADMIN_REQUEST_CODE = 12;
+
+ private CharSequence mAppName;
+ private DevicePolicyManager mDpm;
+ private String mPackageToUninstall;
+ private ComponentName mAdminComponentToUninstall;
+ private boolean mIsActive;
+ private MenuItem mUninstallButton;
+
+ @VisibleForTesting
+ void setDevicePolicyManager(DevicePolicyManager dpm) {
+ mDpm = dpm;
+ }
+
@Override
protected int getPreferenceScreenResId() {
return R.xml.device_admin_add;
}
@Override
+ public List<MenuItem> getToolbarMenuItems() {
+ return Collections.singletonList(mUninstallButton);
+ }
+
+ @Override
public void onAttach(Context context) {
super.onAttach(context);
- Activity activity = requireActivity();
+ // Split in 2 as it would be hard to mock requireActivity();
+ onAttach(context, requireActivity());
+ }
+
+ @VisibleForTesting
+ void onAttach(Context context, Activity activity) {
+ setDevicePolicyManager(context.getSystemService(DevicePolicyManager.class));
Intent intent = activity.getIntent();
+ if (intent == null) {
+ LOG.e("no intent on " + activity);
+ activity.finish();
+ return;
+ }
ComponentName admin = (ComponentName)
intent.getParcelableExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN);
@@ -71,8 +120,24 @@
activity.finish();
return;
}
+ // DeviceAdminAddActivity.EXTRA_DEVICE_ADMIN_PACKAGE_NAME is set only when DeviceAdmin
+ // is called via Apps -> Uninstall for an active device admin. Set the package name to
+ // uninstall, which will enable and show the "Deactivate & uninstall" button.
+ setPackageToUninstall(adminPackage, admin);
+ } else {
+ // When activating, make sure the given component name is actually a valid device admin.
+ // No need to check this when deactivating, because it is safe to deactivate an active
+ // invalid device admin.
+ if (!isValidAdmin(context, admin)) {
+ LOG.w("Request to add invalid device admin: " + admin.flattenToShortString());
+ activity.finish();
+ return;
+ }
}
+ // TODO(b/202342351): both this method and isValidAdmin() call PM to get the ActivityInfo;
+ // they should be refactored so it's called just onces; similarly, isValidAdmin()
+ // also create a DeviceAdminInfo
DeviceAdminInfo deviceAdminInfo = getDeviceAdminInfo(context, admin);
LOG.d("Admin: " + admin + " DeviceAdminInfo: " + deviceAdminInfo);
@@ -83,8 +148,47 @@
return;
}
- use(DeviceAdminAddHeaderPreferenceController.class,
- R.string.pk_device_admin_add_header).setDeviceAdmin(deviceAdminInfo);
+ // This admin already exists, and we have two options at this point:
+ // 1. If new policy bits are set, show the user the new list.
+ // 2. If nothing has changed, simply return "OK" immediately.
+ if (isActionAddDeviceAdminActivity(activity)) {
+ boolean refreshing = false;
+ if (mDpm.isAdminActive(admin)) {
+ if (mDpm.isRemovingAdmin(admin, myUserHandle().getIdentifier())) {
+ LOG.w("Requested admin is already being removed: " + admin);
+ activity.finish();
+ return;
+ }
+ ArrayList<DeviceAdminInfo.PolicyInfo> policies = deviceAdminInfo.getUsedPolicies();
+ for (int i = 0, size = policies.size(); i < size; i++) {
+ DeviceAdminInfo.PolicyInfo pi = policies.get(i);
+ if (!mDpm.hasGrantedPolicy(admin, pi.ident)) {
+ refreshing = true;
+ break;
+ }
+ }
+ LOG.i("Try to add device admin for " + admin + ", refreshing=" + refreshing);
+ if (!refreshing) {
+ // Nothing changed (or policies were removed) - return immediately
+ activity.setResult(Activity.RESULT_OK);
+ activity.finish();
+ return;
+ }
+ // Update the active admin with the refreshed policies.
+ mDpm.setActiveAdmin(admin, refreshing);
+ }
+ }
+
+ mAppName = deviceAdminInfo.loadLabel(context.getPackageManager());
+
+ boolean showUninstallButton =
+ (mPackageToUninstall != null) && (mAdminComponentToUninstall != null);
+ setUninstallButton(context, showUninstallButton);
+
+ ((DeviceAdminAddHeaderPreferenceController) use(
+ DeviceAdminAddHeaderPreferenceController.class,
+ R.string.pk_device_admin_add_header).setDeviceAdmin(deviceAdminInfo))
+ .setActivationListener((value) -> onActivation(value));
((DeviceAdminAddExplanationPreferenceController) use(
DeviceAdminAddExplanationPreferenceController.class,
R.string.pk_device_admin_add_explanation).setDeviceAdmin(deviceAdminInfo))
@@ -96,20 +200,150 @@
R.string.pk_device_admin_add_policies).setDeviceAdmin(deviceAdminInfo);
use(DeviceAdminAddSupportPreferenceController.class,
R.string.pk_device_admin_add_support).setDeviceAdmin(deviceAdminInfo);
- use(DeviceAdminAddActionPreferenceController.class,
- R.string.pk_device_admin_add_action).setDeviceAdmin(deviceAdminInfo);
- use(DeviceAdminAddCancelPreferenceController.class,
- R.string.pk_device_admin_add_cancel).setDeviceAdmin(deviceAdminInfo);
+ }
+
+ private void onActivation(boolean value) {
+ Activity activity = requireActivity();
+ if (!isActionAddDeviceAdminActivity(activity)) {
+ return;
+ }
+
+ int result = value ? Activity.RESULT_OK : Activity.RESULT_CANCELED;
+ LOG.d("Setting " + activity + " result to " + result);
+ activity.setResult(result);
+ }
+
+ @VisibleForTesting
+ void setPackageToUninstall(String packageName, ComponentName componentName) {
+ mPackageToUninstall = packageName;
+ mAdminComponentToUninstall = componentName;
+ }
+
+ @VisibleForTesting
+ void setUninstallButton(Context context, boolean showButton) {
+ mUninstallButton = new MenuItem.Builder(context)
+ .setTitle(R.string.deactivate_and_uninstall_device_admin)
+ .setEnabled(showButton)
+ .setVisible(showButton)
+ .setOnClickListener(i -> startUninstall())
+ .build();
+ }
+
+ @VisibleForTesting
+ void startUninstall() {
+ mIsActive = mDpm.isAdminActive(mAdminComponentToUninstall);
+ if (mIsActive) {
+ LOG.i("Deactivating device admin: " + mAdminComponentToUninstall);
+ mDpm.removeActiveAdmin(mAdminComponentToUninstall);
+ }
+ LOG.i("Uninstalling package: " + mPackageToUninstall);
+ Uri packageUri = Uri.parse("package:" + mPackageToUninstall);
+ Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);
+ uninstallIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
+ startActivityForResult(uninstallIntent, UNINSTALL_DEVICE_ADMIN_REQUEST_CODE);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // Call super method to handle callback.
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode != UNINSTALL_DEVICE_ADMIN_REQUEST_CODE) {
+ return;
+ }
+ if (resultCode == RESULT_OK) {
+ Activity activity = requireActivity();
+ // On successful uninstalling, sets the results and finish the activity.
+ activity.setResult(RESULT_OK);
+ activity.finish();
+ } else {
+ if (mIsActive) {
+ // Set active admin back when uninstalling was failed/canceled.
+ mDpm.setActiveAdmin(mAdminComponentToUninstall, /* refreshing= */ false);
+ }
+ LOG.e("Uninstall failed with result " + resultCode);
+ }
+ }
+
+ @Override
+ public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
+ super.setPreferenceScreen(preferenceScreen);
+
+ // Split for testing, to avoid calling super.setPreferenceScreen() in tests.
+ setPreferenceScreenTitle(preferenceScreen);
+ }
+
+ @VisibleForTesting
+ void setPreferenceScreenTitle(PreferenceScreen preferenceScreen) {
+ if (!TextUtils.isEmpty(mAppName)) {
+ preferenceScreen.setTitle(mAppName);
+ }
}
@Override
protected void setupToolbar(ToolbarController toolbar) {
super.setupToolbar(toolbar);
- Intent intent = requireActivity().getIntent();
- String action = intent == null ? null : intent.getAction();
- if (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.equals(action)) {
+ // Must split in 2, otherwise tests would need to mock what's needed by super.setupToolbar()
+ setToolbarTitle(toolbar);
+ }
+
+ @VisibleForTesting
+ void setToolbarTitle(ToolbarController toolbar) {
+ if (isActionAddDeviceAdminActivity(requireActivity())) {
toolbar.setTitle(R.string.add_device_admin_msg);
}
}
+
+ private boolean isActionAddDeviceAdminActivity(Activity activity) {
+ Intent intent = activity.getIntent();
+ String action = intent == null ? null : intent.getAction();
+ return DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.equals(action);
+ }
+
+ // Must override so it can be spied (it's the exact same signature and modifier access, but it
+ // works now because the test class is in the same package).
+ @Override
+ protected <T extends PreferenceController> T use(Class<T> clazz, int preferenceKeyResId) {
+ return super.use(clazz, preferenceKeyResId);
+ }
+
+ private boolean isValidAdmin(Context context, ComponentName who) {
+ PackageManager pm = context.getPackageManager();
+ ActivityInfo ai;
+ try {
+ ai = pm.getReceiverInfo(who, PackageManager.GET_META_DATA);
+ } catch (PackageManager.NameNotFoundException e) {
+ LOG.w("Unable to retrieve device policy " + who, e);
+ return false;
+ }
+
+ if (mDpm.isAdminActive(who)) {
+ return true;
+ }
+ List<ResolveInfo> avail = pm.queryBroadcastReceivers(
+ new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
+ PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
+ int count = avail == null ? 0 : avail.size();
+ boolean found = false;
+ for (int i = 0; i < count; i++) {
+ ResolveInfo ri = avail.get(i);
+ if (ai.packageName.equals(ri.activityInfo.packageName)
+ && ai.name.equals(ri.activityInfo.name)) {
+ try {
+ // We didn't retrieve the meta data for all possible matches, so
+ // need to use the activity info of this specific one that was retrieved.
+ ri.activityInfo = ai;
+ new DeviceAdminInfo(context, ri);
+ found = true;
+ } catch (Exception e) {
+ LOG.w("Bad " + ri.activityInfo, e);
+ }
+ break;
+ }
+ }
+ if (!found) {
+ LOG.d("didn't find enabled admin receiver for " + who.flattenToShortString());
+ }
+ return found;
+ }
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddHeaderPreferenceController.java b/src/com/android/car/settings/enterprise/DeviceAdminAddHeaderPreferenceController.java
index a150b3a..67c2099 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddHeaderPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/DeviceAdminAddHeaderPreferenceController.java
@@ -16,43 +16,135 @@
package com.android.car.settings.enterprise;
+import android.annotation.Nullable;
+import android.app.AppOpsManager;
import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
import android.content.Context;
-import android.content.res.Resources;
import android.graphics.drawable.Drawable;
+import android.os.Binder;
+import android.os.IBinder;
+import android.text.TextUtils;
-import androidx.preference.Preference;
+import androidx.preference.TwoStatePreference;
import com.android.car.settings.common.FragmentController;
+import com.android.internal.annotations.VisibleForTesting;
/**
* Controller for the header preference the device admin details screen.
*/
public final class DeviceAdminAddHeaderPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+ extends BaseDeviceAdminAddPreferenceController<TwoStatePreference> {
+
+ private AppOpsManager mAppOps;
+ private final IBinder mToken = new Binder();
+ private @Nullable ActivationListener mActivationListener;
public DeviceAdminAddHeaderPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
+
+ mAppOps = context.getSystemService(AppOpsManager.class);
+ }
+
+ DeviceAdminAddHeaderPreferenceController setActivationListener(ActivationListener listener) {
+ mActivationListener = listener;
+ return this;
}
@Override
- protected void updateState(Preference preference) {
+ protected Class<TwoStatePreference> getPreferenceType() {
+ return TwoStatePreference.class;
+ }
+
+ @Override
+ protected void onResumeInternal() {
+ super.onResumeInternal();
+
+ // Split as a separate method for easier testing.
+ onResumeInternal((TwoStatePreference) getPreference());
+ }
+
+ @VisibleForTesting
+ void onResumeInternal(TwoStatePreference preference) {
+ setCurrentStatus(preference);
+
+ // As long as we are running, don't let anyone overlay stuff on top of the screen.
+ mAppOps.setUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, true, mToken);
+ mAppOps.setUserRestriction(AppOpsManager.OP_TOAST_WINDOW, true, mToken);
+ }
+
+ @Override
+ protected void onPauseInternal() {
+ super.onPauseInternal();
+
+ // Split as a separate method for easier testing.
+ onPauseInternal((TwoStatePreference) getPreference());
+ }
+
+ @VisibleForTesting
+ void onPauseInternal(TwoStatePreference preference) {
+ // Disable the toggle button when paused, to prevent tapjacking.
+ preference.setEnabled(false);
+
+ mAppOps.setUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, false, mToken);
+ mAppOps.setUserRestriction(AppOpsManager.OP_TOAST_WINDOW, false, mToken);
+ }
+
+ @Override
+ protected void updateState(TwoStatePreference preference) {
CharSequence name = mDeviceAdminInfo.loadLabel(mPm);
Drawable icon = mDeviceAdminInfo.loadIcon(mPm);
- CharSequence description = null;
- try {
- description = mDeviceAdminInfo.loadDescription(mPm);
- } catch (Resources.NotFoundException e) {
- mLogger.v("No description for "
- + mDeviceAdminInfo.getComponent().flattenToShortString());
- }
+ CharSequence description = getDescription(mDeviceAdminInfo);
mLogger.d("updateState: name=" + name + ", description=" + description);
preference.setTitle(name);
preference.setIcon(icon);
- if (description != null) {
+ if (!TextUtils.isEmpty(description)) {
preference.setSummary(description);
}
+
+ setCurrentStatus(preference);
+ }
+
+ @Override
+ protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+ boolean activated = (boolean) newValue;
+ ComponentName admin = mDeviceAdminInfo.getComponent();
+ if (activated) {
+ mLogger.i("Activating " + ComponentName.flattenToShortString(admin));
+ // TODO(b/192372143): support refreshing
+ mDpm.setActiveAdmin(admin, /* refreshing= */ false);
+ } else {
+ mLogger.i("Deactivating " + ComponentName.flattenToShortString(admin));
+ mDpm.removeActiveAdmin(admin);
+ }
+ if (mActivationListener != null) {
+ mActivationListener.onChanged(activated);
+ }
+ return true;
+ }
+
+ /** Sets the checked status and enabled status according to the device admin */
+ private void setCurrentStatus(TwoStatePreference preference) {
+ ComponentName componentName = mDeviceAdminInfo.getComponent();
+ preference.setChecked(isActive(componentName));
+ if (isProfileOrDeviceOwner(componentName)) {
+ // TODO(b/170332519): once work profiles are supported, they could be removed
+ mLogger.d("updateState(): " + ComponentName.flattenToShortString(componentName)
+ + " is PO or DO");
+ preference.setEnabled(false);
+ } else {
+ preference.setEnabled(true);
+ }
+ }
+
+ private boolean isActive(ComponentName componentName) {
+ return mDpm.isAdminActive(componentName);
+ }
+
+ interface ActivationListener {
+ void onChanged(boolean active);
}
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddPoliciesPreferenceController.java b/src/com/android/car/settings/enterprise/DeviceAdminAddPoliciesPreferenceController.java
index 5d8c0e6..d91d7c1 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddPoliciesPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/DeviceAdminAddPoliciesPreferenceController.java
@@ -16,59 +16,53 @@
package com.android.car.settings.enterprise;
+import static android.text.Html.FROM_HTML_MODE_LEGACY;
+
import android.app.admin.DeviceAdminInfo;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
+import android.text.Html;
-import androidx.preference.PreferenceGroup;
+import androidx.preference.Preference;
-import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
-import com.android.car.ui.preference.CarUiPreference;
/**
* Controller for the screen that shows the device policies requested by a device admin app.
*/
public final class DeviceAdminAddPoliciesPreferenceController
- extends BaseDeviceAdminAddPreferenceController<PreferenceGroup> {
-
- private final int mMaxDevicePoliciesShown;
+ extends BaseDeviceAdminAddPreferenceController<Preference> {
public DeviceAdminAddPoliciesPreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mMaxDevicePoliciesShown = context.getResources()
- .getInteger(R.integer.max_device_policies_shown);
}
@Override
- protected Class<PreferenceGroup> getPreferenceType() {
- return PreferenceGroup.class;
- }
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
- @Override
- protected int getRealAvailabilityStatus() {
return isProfileOrDeviceOwner() ? DISABLED_FOR_PROFILE : AVAILABLE;
}
@Override
- protected void updateState(PreferenceGroup preferenceGroup) {
- Context context = getContext();
- preferenceGroup.removeAll();
- preferenceGroup.setInitialExpandedChildrenCount(mMaxDevicePoliciesShown);
+ protected void updateState(Preference preference) {
+ preference.setTitle(getPolicyText());
+ }
- boolean isAdminUser = mUm.isAdminUser();
+ private CharSequence getPolicyText() {
+ Context context = getContext();
+ boolean isSystemUser = mUm.isSystemUser();
+ StringBuilder result = new StringBuilder();
for (DeviceAdminInfo.PolicyInfo pi : mDeviceAdminInfo.getUsedPolicies()) {
- int descriptionId = isAdminUser ? pi.description : pi.descriptionForSecondaryUsers;
- int labelId = isAdminUser ? pi.label : pi.labelForSecondaryUsers;
+ int labelId = isSystemUser ? pi.label : pi.labelForSecondaryUsers;
CharSequence label = context.getText(labelId);
- CharSequence description = context.getText(descriptionId);
- mLogger.v("Adding policy '" + label + "': " + description);
- CarUiPreference preference = new CarUiPreference(context);
- preference.setTitle(label);
- preference.setSummary(description);
- preferenceGroup.addPreference(preference);
+ mLogger.v("Adding policy: " + label);
+ result.append("<li> ").append(label).append("</li>");
}
+
+ return Html.fromHtml(result.toString(), FROM_HTML_MODE_LEGACY);
}
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddSupportPreferenceController.java b/src/com/android/car/settings/enterprise/DeviceAdminAddSupportPreferenceController.java
index 79b0697..5e8bd32 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddSupportPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/DeviceAdminAddSupportPreferenceController.java
@@ -42,9 +42,11 @@
}
@Override
- protected int getRealAvailabilityStatus() {
- setSupportMessage();
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
+ setSupportMessage();
return TextUtils.isEmpty(mSupportMessage) ? CONDITIONALLY_UNAVAILABLE : AVAILABLE;
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAppsFragment.java b/src/com/android/car/settings/enterprise/DeviceAdminAppsFragment.java
new file mode 100644
index 0000000..6e39c4e
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/DeviceAdminAppsFragment.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Displays controls for managing device admin apps. */
+public final class DeviceAdminAppsFragment extends SettingsFragment {
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.device_admin_apps_fragment;
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAppsPreferenceController.java b/src/com/android/car/settings/enterprise/DeviceAdminAppsPreferenceController.java
new file mode 100644
index 0000000..e4ec3fc
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/DeviceAdminAppsPreferenceController.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+import android.app.admin.DeviceAdminInfo;
+import android.app.admin.DeviceAdminReceiver;
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.text.TextUtils;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.ui.preference.CarUiPreference;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * Displays a list of device admin apps.
+ * <p>Before changing the value of a permission, the user is directed to a confirmation
+ * screen with more detailed information about the risks and potential effects.
+ */
+public abstract class DeviceAdminAppsPreferenceController
+ extends BaseEnterprisePreferenceController<PreferenceGroup> {
+
+ public DeviceAdminAppsPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected Class<PreferenceGroup> getPreferenceType() {
+ return PreferenceGroup.class;
+ }
+
+ @Override
+ protected void updateState(PreferenceGroup preferenceGroup) {
+ preferenceGroup.removeAll();
+
+ // NOTE: Only considering the current user for now. Later we may need to support profiles.
+ List<ResolveInfo> receivers = mPm.queryBroadcastReceivers(
+ new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
+ PackageManager.GET_META_DATA | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS);
+ for (ResolveInfo resolveInfo : receivers) {
+ DeviceAdminInfo deviceAdminInfo = createDeviceAdminInfo(resolveInfo.activityInfo);
+ // Add only visible ones (note: active admins are added regardless of visibility)
+ if (deviceAdminInfo != null && deviceAdminInfo.isVisible()) {
+ if (!isIncluded(deviceAdminInfo.getComponent())
+ || !deviceAdminInfo.getActivityInfo().applicationInfo.isInternal()) {
+ continue;
+ }
+ preferenceGroup.addPreference(createPreference(deviceAdminInfo));
+ }
+ }
+
+ if (preferenceGroup.getPreferenceCount() == 0) {
+ preferenceGroup.addPreference(createEmptyListPreference());
+ }
+ }
+
+ protected abstract boolean isIncluded(ComponentName componentName);
+
+ protected boolean isActivated(ComponentName componentName) {
+ return mDpm.isAdminActive(componentName);
+ }
+
+ private Preference createEmptyListPreference() {
+ CarUiPreference preference = new CarUiPreference(getContext());
+ preference.setTitle(R.string.device_admin_apps_list_empty);
+ preference.setSelectable(false);
+
+ return preference;
+ }
+
+ private Preference createPreference(DeviceAdminInfo deviceAdminInfo) {
+ CarUiPreference preference = new CarUiPreference(getContext());
+ preference.setTitle(deviceAdminInfo.loadLabel(mPm));
+ preference.setIcon(deviceAdminInfo.loadIcon(mPm));
+ CharSequence description = getDescription(deviceAdminInfo);
+ if (!TextUtils.isEmpty(description)) {
+ preference.setSummary(deviceAdminInfo.loadDescription(mPm));
+ }
+ preference.setKey(deviceAdminInfo.getPackageName());
+ ComponentName componentName = deviceAdminInfo.getComponent();
+ preference.setEnabled(isEnabled(componentName));
+ preference.setOnPreferenceClickListener(p -> launchDetailScreen(componentName));
+
+ return preference;
+ }
+
+ private boolean isEnabled(ComponentName componentName) {
+ return !mDpm.isRemovingAdmin(componentName, getContext().getUserId());
+ }
+
+ private boolean launchDetailScreen(ComponentName componentName) {
+ Intent intent = new Intent(getContext(), DeviceAdminAddActivity.class)
+ .putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
+ mLogger.d("Created intent " + intent + " for component: " + componentName);
+ getContext().startActivity(intent);
+
+ return true;
+ }
+
+ private @Nullable DeviceAdminInfo createDeviceAdminInfo(ActivityInfo ai) {
+ try {
+ return new DeviceAdminInfo(getContext(), ai);
+ } catch (XmlPullParserException | IOException e) {
+ mLogger.w("Skipping " + ai, e);
+ }
+ return null;
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/DeviceAdminDeactivatedAppsPreferenceController.java
similarity index 62%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/DeviceAdminDeactivatedAppsPreferenceController.java
index 03e8185..ecbdd03 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/DeviceAdminDeactivatedAppsPreferenceController.java
@@ -17,31 +17,24 @@
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
import android.content.Context;
-import androidx.preference.Preference;
-
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
+ * Displays a list of deactivated device admin apps.
*/
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+public final class DeviceAdminDeactivatedAppsPreferenceController
+ extends DeviceAdminAppsPreferenceController {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public DeviceAdminDeactivatedAppsPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
-
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ protected boolean isIncluded(ComponentName componentName) {
+ return !isActivated(componentName);
}
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminStringProviderImpl.java b/src/com/android/car/settings/enterprise/DeviceAdminStringProviderImpl.java
index 11161dc..09d9880 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminStringProviderImpl.java
+++ b/src/com/android/car/settings/enterprise/DeviceAdminStringProviderImpl.java
@@ -83,12 +83,13 @@
@Override
public String getDisabledBiometricsParentConsentTitle() {
- return mContext.getString(R.string.disabled_by_policy_title_biometric_parental_consent);
+ throw new UnsupportedOperationException(
+ "disabled_by_policy_title_biometric_parental_consent not used on automotive");
}
@Override
public String getDisabledBiometricsParentConsentContent() {
- return mContext.getString(R.string.disabled_by_policy_content_biometric_parental_consent);
+ throw new UnsupportedOperationException(
+ "disabled_by_policy_content_biometric_parental_consent not used on automotive");
}
-
}
diff --git a/src/com/android/car/settings/enterprise/EnterpriseDisclosurePreferenceController.java b/src/com/android/car/settings/enterprise/EnterpriseDisclosurePreferenceController.java
new file mode 100644
index 0000000..d133426
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/EnterpriseDisclosurePreferenceController.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import com.android.car.admin.ui.ManagedDeviceTextView;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.widget.FooterPreference;
+
+/**
+ * A preference controller for the disclosure to be shown when the car is managed by an enterprise.
+ * Inspired from {@link com.android.settings.accounts.EnterpriseDisclosurePreferenceController}.
+ */
+public final class EnterpriseDisclosurePreferenceController extends
+ BaseEnterprisePreferenceController<FooterPreference> {
+
+ public EnterpriseDisclosurePreferenceController(Context context, String key,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, key, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) {
+ return superStatus;
+ }
+ return EnterpriseUtils.hasDeviceOwner(getContext()) ? AVAILABLE : DISABLED_FOR_PROFILE;
+ }
+
+ @Override
+ protected void updateState(FooterPreference footerPreference) {
+ super.updateState(footerPreference);
+ CharSequence disclosure = ManagedDeviceTextView.getManagedDeviceText(getContext());
+ if (disclosure == null) {
+ footerPreference.setVisible(false);
+ return;
+ }
+ footerPreference.setVisible(true);
+ footerPreference.setTitle(disclosure);
+ footerPreference.setLearnMoreAction(view ->
+ getContext().startActivity(new Intent(Settings.ACTION_PRIVACY_SETTINGS))
+ );
+ String learnMoreContentDescription = getContext().getString(
+ R.string.footer_learn_more_content_description, getLabelName());
+ footerPreference.setLearnMoreContentDescription(learnMoreContentDescription);
+ }
+
+ private String getLabelName() {
+ return getContext().getString(R.string.user_add_account_menu);
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
similarity index 64%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
index 03e8185..9268cef 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
@@ -24,24 +23,22 @@
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
- */
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+* Controller to show which apps were installed by the device owner.
+*/
+public final class EnterpriseInstalledPackagesPreferenceController
+ extends BaseEnterprisePreferenceController<Preference> {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public EnterpriseInstalledPackagesPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ // TODO(b/206155370): implement / add unit test
+ return DISABLED_FOR_PROFILE;
}
}
diff --git a/src/com/android/car/settings/enterprise/EnterprisePrivacyFeatureProvider.java b/src/com/android/car/settings/enterprise/EnterprisePrivacyFeatureProvider.java
new file mode 100644
index 0000000..a709c1d
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/EnterprisePrivacyFeatureProvider.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+import android.annotation.Nullable;
+
+import java.util.Date;
+
+/**
+ * TODO(b/190867059): copied from phone (but stripped what's not used), should be moved to
+ * SettingsLib
+ */
+public interface EnterprisePrivacyFeatureProvider {
+
+ /**
+ * Returns the time at which the Device Owner last retrieved security logs, or {@code null} if
+ * logs were never retrieved by the Device Owner on this device.
+ */
+ @Nullable
+ Date getLastSecurityLogRetrievalTime();
+
+ /**
+ * Returns the time at which the Device Owner last requested a bug report, or {@code null} if no
+ * bug report was ever requested by the Device Owner on this device.
+ */
+ @Nullable
+ Date getLastBugReportRequestTime();
+
+ /**
+ * Returns the time at which the Device Owner last retrieved network logs, or {@code null} if
+ * logs were never retrieved by the Device Owner on this device.
+ */
+ @Nullable
+ Date getLastNetworkLogRetrievalTime();
+
+ /**
+ * Returns the label of the current user's input method if that input method was set by a Device
+ * Owner or Profile Owner in that user. Otherwise, returns {@code null}.
+ */
+ @Nullable
+ String getImeLabelIfOwnerSet();
+}
diff --git a/src/com/android/car/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/car/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
new file mode 100644
index 0000000..d74adbe
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.car.settings.common.Logger;
+
+import java.util.Date;
+
+/**
+ * TODO(b/190867059): copied from phone (but stripped what's not used), should be moved to
+ * SettingsLib
+ */
+final class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFeatureProvider {
+
+ private static final int MY_USER_ID = UserHandle.myUserId();
+
+ private final Logger mLogger = new Logger(getClass());
+ private final Context mContext;
+ private final DevicePolicyManager mDpm;
+ private final PackageManager mPm;
+
+ EnterprisePrivacyFeatureProviderImpl(Context context, DevicePolicyManager dpm,
+ PackageManager pm) {
+ mContext = context;
+ mDpm = dpm;
+ mPm = pm;
+ }
+
+ @Override
+ public Date getLastSecurityLogRetrievalTime() {
+ long timestamp = mDpm.getLastSecurityLogRetrievalTime();
+ return timestamp < 0 ? null : new Date(timestamp);
+ }
+
+ @Override
+ public Date getLastBugReportRequestTime() {
+ long timestamp = mDpm.getLastBugReportRequestTime();
+ return timestamp < 0 ? null : new Date(timestamp);
+ }
+
+ @Override
+ public Date getLastNetworkLogRetrievalTime() {
+ long timestamp = mDpm.getLastNetworkLogRetrievalTime();
+ return timestamp < 0 ? null : new Date(timestamp);
+ }
+
+ @Override
+ public String getImeLabelIfOwnerSet() {
+ if (!mDpm.isCurrentInputMethodSetByOwner()) {
+ return null;
+ }
+ String packageName = Settings.Secure.getStringForUser(mContext.getContentResolver(),
+ Settings.Secure.DEFAULT_INPUT_METHOD, MY_USER_ID);
+ if (packageName == null) {
+ return null;
+ }
+ try {
+ return mPm.getApplicationInfoAsUser(packageName, /* flags= */ 0, MY_USER_ID)
+ .loadLabel(mPm).toString();
+ } catch (PackageManager.NameNotFoundException e) {
+ mLogger.w("Could not get label for " + packageName + " and user " + MY_USER_ID, e);
+ return null;
+ }
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsActivity.java b/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsActivity.java
new file mode 100644
index 0000000..60d4bc7
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.BaseCarSettingsActivity;
+
+/**
+ * A screen that shows the privacy details about the device owner app.
+ */
+public final class EnterprisePrivacySettingsActivity extends BaseCarSettingsActivity {
+
+ @Override
+ protected Fragment getInitialFragment() {
+ return new EnterprisePrivacySettingsFragment();
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsFragment.java b/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsFragment.java
new file mode 100644
index 0000000..97ff6d8
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsFragment.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+import android.app.Activity;
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Displays privacy information about the device owner.*/
+public final class EnterprisePrivacySettingsFragment extends SettingsFragment {
+
+ private final Logger mLogger = new Logger(getClass());
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.enterprise_privacy_settings_fragment;
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+
+ // Split in 2 as it would be hard to mock requireActivity();
+ onAttach(context, requireActivity());
+ }
+
+ @VisibleForTesting
+ void onAttach(Context context, Activity activity) {
+ if (!EnterpriseUtils.hasDeviceOwner(context)) {
+ mLogger.d("finishing " + activity + " because there is no device owner");
+ activity.finish();
+ return;
+ }
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsPreferenceController.java
similarity index 60%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/EnterprisePrivacySettingsPreferenceController.java
index 03e8185..47bf036 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsPreferenceController.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
@@ -21,27 +20,27 @@
import androidx.preference.Preference;
+import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
+ * Controller for privacy information about the device owner.
+ *
+ * <p><b>NOTE: </b>phone provides different screens for financed devices, which we don't quite
+ * support yet (see {@code PrivacySettingsPreferenceFactory}
*/
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+public final class EnterprisePrivacySettingsPreferenceController
+ extends BaseEnterprisePreferenceController<Preference> {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public EnterprisePrivacySettingsPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
-
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ // NOTE: phone displays different messages when the device owner org name is known, but on
+ // automotive we're always showing the generic name
+ preference.setSummary(R.string.enterprise_privacy_settings_summary_generic);
}
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
similarity index 64%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
index 03e8185..b17f0eb 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
@@ -24,24 +23,22 @@
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
- */
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+* Controller to show which default apps were set by the device owner.
+*/
+public final class EnterpriseSetDefaultAppsPreferenceController
+ extends BaseEnterprisePreferenceController<Preference> {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public EnterpriseSetDefaultAppsPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ //TODO(b/206156024): implement / add unit test
+ return DISABLED_FOR_PROFILE;
}
}
diff --git a/src/com/android/car/settings/enterprise/EnterpriseUtils.java b/src/com/android/car/settings/enterprise/EnterpriseUtils.java
index 4a9999f..da2b0da 100644
--- a/src/com/android/car/settings/enterprise/EnterpriseUtils.java
+++ b/src/com/android/car/settings/enterprise/EnterpriseUtils.java
@@ -16,14 +16,21 @@
package com.android.car.settings.enterprise;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.admin.DeviceAdminInfo;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
import com.android.car.settings.common.Logger;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import com.android.settingslib.RestrictedLockUtilsInternal;
import org.xmlpull.v1.XmlPullParserException;
@@ -33,9 +40,12 @@
/**
* Generic helper methods for this package.
*/
-final class EnterpriseUtils {
+public final class EnterpriseUtils {
private static final Logger LOG = new Logger(EnterpriseUtils.class);
+ // TODO: ideally, we should not create a special user restriction other than what are
+ // defined in UserManager.
+ public static final String DISABLED_INPUT_METHOD = "disabled-input-method";
/**
* Gets the active admin for the given package.
@@ -76,6 +86,180 @@
}
}
+ /**
+ * Checks whether current user has the flag {@link UserManager.FLAG_DEMO}.
+ */
+ public static boolean isDemoUser(Context context) {
+ return UserManager.isDeviceInDemoMode(context)
+ && getUserManager(context).isDemoUser();
+ }
+
+ /**
+ * Checks whether current user has the flag {@link UserManager.FLAG_ADMIN}.
+ */
+ public static boolean isAdminUser(Context context) {
+ return getUserManager(context).isAdminUser();
+ }
+
+ /**
+ * Checks whether the restriction is set on the current user by device owner / profile owners
+ * but not by {@link UserManager}.
+ *
+ * <p>This includes restriction set on device owner but current user has affiliated profile
+ * owner.
+ */
+ public static boolean hasUserRestrictionByDpm(Context context, String restriction) {
+ if (hasUserRestrictionByUm(context, restriction)) {
+ return false;
+ }
+ return getUserManager(context).hasUserRestriction(restriction);
+ }
+
+ /**
+ * Checks whether there are restrictions set via {@link UserManager} which doesn't include
+ * restrictions set by device owner / profile owners.
+ */
+ public static boolean hasUserRestrictionByUm(Context context, String restriction) {
+ return getUserManager(context)
+ .hasBaseUserRestriction(restriction, UserHandle.of(context.getUserId()));
+ }
+
+ /**
+ * Checks whether device owner is set on the device.
+ */
+ public static boolean hasDeviceOwner(Context context) {
+ DevicePolicyManager dpm = getDevicePolicyManager(context);
+ return dpm.isDeviceManaged() && getDeviceOwner(context) != null;
+ }
+
+ /**
+ * Gets device owner user id on the device.
+ */
+ @UserIdInt
+ private static int getDeviceOwnerUserId(Context context) {
+ return getDevicePolicyManager(context).getDeviceOwnerUserId();
+ }
+
+ /**
+ * Gets device owner component on the device.
+ */
+ @Nullable
+ private static ComponentName getDeviceOwner(Context context) {
+ return getDevicePolicyManager(context).getDeviceOwnerComponentOnAnyUser();
+ }
+
+ private static UserManager getUserManager(Context context) {
+ return context.getSystemService(UserManager.class);
+ }
+
+ private static DevicePolicyManager getDevicePolicyManager(Context context) {
+ return context.getSystemService(DevicePolicyManager.class);
+ }
+
+ /**
+ * Gets an {@code ActionDisabledByAdminDialogFragment} for the target restriction to show on
+ * the current user.
+ */
+ public static ActionDisabledByAdminDialogFragment getActionDisabledByAdminDialog(
+ Context context, String restriction) {
+ return getActionDisabledByAdminDialog(context, restriction, /* restrictedPackage= */ null);
+ }
+
+ /**
+ * Gets an {@code ActionDisabledByAdminDialogFragment} when the input method is restricted for
+ * the current user.
+ */
+ public static ActionDisabledByAdminDialogFragment getInputMethodDisabledByAdminDialog(
+ Context context, String restriction) {
+ return getActionDisabledByAdminDialog(context, restriction, /* restrictedPackage= */ null);
+ }
+
+ /**
+ * Gets an {@code ActionDisabledByAdminDialogFragment} for the target restriction to show on
+ * the current user with additional restricted package information.
+ */
+ public static ActionDisabledByAdminDialogFragment getActionDisabledByAdminDialog(
+ Context context, String restriction, @Nullable String restrictedPackage) {
+ int adminUser = hasDeviceOwner(context)
+ ? getDeviceOwnerUserId(context)
+ : context.getUserId();
+ return ActionDisabledByAdminDialogFragment
+ .newInstance(restriction, restrictedPackage, adminUser);
+ }
+
+ /**
+ * Gets enforced admin information from Intent that started the
+ * {@code ActionDisabledByAdminDialogActivity}.
+ */
+ public static EnforcedAdmin getEnforcedAdminFromIntent(Context context, Intent intent) {
+ EnforcedAdmin admin = new EnforcedAdmin(null, context.getUser());
+ if (intent == null) {
+ return admin;
+ }
+ admin.component = intent.getParcelableExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN);
+ int userId = intent.getIntExtra(Intent.EXTRA_USER_ID, context.getUserId());
+
+ Bundle adminDetails = null;
+ if (admin.component == null) {
+ DevicePolicyManager devicePolicyManager = getDevicePolicyManager(context);
+ admin.component = adminDetails.getParcelable(DevicePolicyManager.EXTRA_DEVICE_ADMIN);
+ }
+
+ if (intent.hasExtra(Intent.EXTRA_USER)) {
+ admin.user = intent.getParcelableExtra(Intent.EXTRA_USER);
+ } else {
+ if (adminDetails != null) {
+ userId = adminDetails.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId());
+ }
+ if (userId == UserHandle.USER_NULL) {
+ admin.user = null;
+ } else {
+ admin.user = UserHandle.of(userId);
+ }
+ }
+ return admin;
+ }
+
+ /**
+ * Gets {@code RestrictedLockUtils.EnforcedAdmin} for the device policy that affects
+ * current user.
+ *
+ * @param context for current user
+ * @param adminUser which can be either profile owner on current user or device owner on
+ * headless system user
+ * @param restriction which can be user restriction or restriction policy defined
+ * in this class
+ * @param restrictedPackage is the target package that restriction policy is set
+ * @return {@code RestrictedLockUtils.EnforcedAdmin}
+ */
+ public static EnforcedAdmin getEnforcedAdmin(Context context, @UserIdInt int adminUser,
+ String restriction, String restrictedPackage) {
+ EnforcedAdmin admin = null;
+ if (hasUserRestrictionByDpm(context, restriction)) {
+ admin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
+ context, restriction, context.getUserId());
+ LOG.v("getEnforcedAdmin(): " + adminUser + " restriction: " + restriction
+ + " restrictedPackage: " + restrictedPackage);
+
+ if (admin.component == null && context.getUserId() != adminUser) {
+ // User restriction might be set on primary user which is user 0 as a device-wide
+ // policy.
+ admin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
+ context, restriction, adminUser);
+ }
+ } else if (restriction == DISABLED_INPUT_METHOD) {
+ if (restrictedPackage == null) {
+ LOG.e("getEnforcedAdmin() for " + DISABLED_INPUT_METHOD
+ + " fails since restrictedPackage is null");
+ return admin;
+ }
+ admin = RestrictedLockUtilsInternal.checkIfInputMethodDisallowed(
+ context, restrictedPackage, context.getUserId());
+ }
+ LOG.v("getEnforcedAdmin():" + admin);
+ return admin;
+ }
+
private EnterpriseUtils() {
throw new UnsupportedOperationException("Provides only static methods");
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/FailedPasswordWipeCurrentUserPreferenceController.java
similarity index 64%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/FailedPasswordWipeCurrentUserPreferenceController.java
index 03e8185..891e9d9 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/FailedPasswordWipeCurrentUserPreferenceController.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
@@ -24,24 +23,22 @@
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
+ * TODO(b/206156027): proper javadoc or remove
*/
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+public final class FailedPasswordWipeCurrentUserPreferenceController
+ extends BaseEnterprisePreferenceController<Preference> {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public FailedPasswordWipeCurrentUserPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ //TODO(b/206156027): implement / add unit test
+ return DISABLED_FOR_PROFILE;
}
}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/GlobalHttpProxyPreferenceController.java
similarity index 64%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/GlobalHttpProxyPreferenceController.java
index 03e8185..0e26b6f 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/GlobalHttpProxyPreferenceController.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
@@ -24,24 +23,22 @@
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
- */
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+* Controller to show whether the device owner created a global proxy.
+*/
+public final class GlobalHttpProxyPreferenceController
+ extends BaseEnterprisePreferenceController<Preference> {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public GlobalHttpProxyPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ //TODO(b/206155840): implement / add unit test
+ return DISABLED_FOR_PROFILE;
}
}
diff --git a/src/com/android/car/settings/enterprise/ImePreferenceController.java b/src/com/android/car/settings/enterprise/ImePreferenceController.java
new file mode 100644
index 0000000..470c42c
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/ImePreferenceController.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/**
+* Controller to show whether the device owner changed the keyboard for the user.
+*/
+public final class ImePreferenceController
+ extends BaseEnterprisePrivacyPreferenceController<Preference> {
+
+ public ImePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @VisibleForTesting
+ ImePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ EnterprisePrivacyFeatureProvider provider) {
+ super(context, preferenceKey, fragmentController, uxRestrictions, provider);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ preference.setSummary(getContext().getResources().getString(
+ R.string.enterprise_privacy_input_method_name,
+ mEnterprisePrivacyFeatureProvider.getImeLabelIfOwnerSet()));
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
+
+ return mEnterprisePrivacyFeatureProvider.getImeLabelIfOwnerSet() != null
+ ? AVAILABLE
+ : CONDITIONALLY_UNAVAILABLE;
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/ManageDeviceAdminPreferenceController.java b/src/com/android/car/settings/enterprise/ManageDeviceAdminPreferenceController.java
new file mode 100644
index 0000000..50924f3
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/ManageDeviceAdminPreferenceController.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.utils.StringUtil;
+
+import java.util.List;
+
+/**
+ * Controller for showing the device admin apps.
+ */
+public final class ManageDeviceAdminPreferenceController
+ extends BaseEnterprisePreferenceController<Preference> {
+
+ public ManageDeviceAdminPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected void updateState(Preference preference) {
+ int activeAdmins = getNumberOfAdmins();
+ mLogger.d("updateState(): Number of active device admin apps: " + activeAdmins);
+ String summary = activeAdmins == 0
+ ? getContext().getString(R.string.number_of_device_admins_none)
+ : StringUtil.getIcuPluralsString(getContext(), activeAdmins,
+ R.string.number_of_device_admins);
+ preference.setSummary(summary);
+ }
+
+ private int getNumberOfAdmins() {
+ // NOTE: Only considering the current user for now. Later we may need to support profiles.
+ List<ComponentName> activeAdmins = mDpm.getActiveAdmins();
+ mLogger.d("Active admin apps: " + activeAdmins
+ + " for current user: " + getContext().getUserId());
+ if (activeAdmins == null) {
+ return 0;
+ }
+ return activeAdmins.size();
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/NetworkLogsPreferenceController.java b/src/com/android/car/settings/enterprise/NetworkLogsPreferenceController.java
new file mode 100644
index 0000000..8d06e04
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/NetworkLogsPreferenceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+import java.util.Date;
+
+/**
+* Controller to show whether the device owner obtained network logs.
+*/
+public final class NetworkLogsPreferenceController
+ extends BaseAdminActionReporterPreferenceController<Preference> {
+
+ public NetworkLogsPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected Date getAdminActionTimestamp() {
+ return mEnterprisePrivacyFeatureProvider.getLastNetworkLogRetrievalTime();
+ }
+
+ @Override
+ protected boolean isEnabled() {
+ // TODO(b/207147813): on phone it checks provider.isNetworkLoggingEnabled() 1st, but that
+ // method is always returning false because of the current user / device owner mismatcher -
+ // we might need to fix it on DevicePolicyManagerService
+ return getAdminActionTimestamp() != null;
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/RemoteRequestBugreportActivity.java b/src/com/android/car/settings/enterprise/RemoteRequestBugreportActivity.java
index ed6f726..478d584 100644
--- a/src/com/android/car/settings/enterprise/RemoteRequestBugreportActivity.java
+++ b/src/com/android/car/settings/enterprise/RemoteRequestBugreportActivity.java
@@ -73,7 +73,8 @@
ConfirmationDialogFragment.Builder builder =
new ConfirmationDialogFragment.Builder(this);
- ConfirmationDialogFragment.DismissListener dismissListener = arguments -> finish();
+ ConfirmationDialogFragment.DismissListener dismissListener =
+ (arguments, positiveResult) -> finish();
switch (notificationType) {
case NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED:
diff --git a/src/com/android/car/settings/enterprise/SecurityLogsPreferenceController.java b/src/com/android/car/settings/enterprise/SecurityLogsPreferenceController.java
new file mode 100644
index 0000000..a03956d
--- /dev/null
+++ b/src/com/android/car/settings/enterprise/SecurityLogsPreferenceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+import java.util.Date;
+
+/**
+* Controller to show whether the device owner obtained securitylogs.
+*/
+public final class SecurityLogsPreferenceController
+ extends BaseAdminActionReporterPreferenceController<Preference> {
+
+ public SecurityLogsPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected Date getAdminActionTimestamp() {
+ return mEnterprisePrivacyFeatureProvider.getLastSecurityLogRetrievalTime();
+ }
+
+ @Override
+ protected boolean isEnabled() {
+ // TODO(b/207147813): on phone it checks provider.isSecurityLoggingEnabled() 1st, but that
+ // method is always returning false because of the current user / device owner mismatcher -
+ // we might need to fix it on DevicePolicyManagerService
+ return getAdminActionTimestamp() != null;
+ }
+}
diff --git a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java b/src/com/android/car/settings/enterprise/WipeDevicePreferenceController.java
similarity index 65%
copy from src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
copy to src/com/android/car/settings/enterprise/WipeDevicePreferenceController.java
index 03e8185..09ecdaf 100644
--- a/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/WipeDevicePreferenceController.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.car.settings.enterprise;
import android.car.drivingstate.CarUxRestrictions;
@@ -24,24 +23,22 @@
import com.android.car.settings.common.FragmentController;
/**
- * Controller for the cancel button in the device admin details screen.
+ * TODO(b/206156027): proper javadoc or remove
*/
-public final class DeviceAdminAddCancelPreferenceController
- extends BaseDeviceAdminAddPreferenceController<Preference> {
+public final class WipeDevicePreferenceController
+ extends BaseEnterprisePreferenceController<Preference> {
- public DeviceAdminAddCancelPreferenceController(Context context, String preferenceKey,
+ public WipeDevicePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- protected void updateState(Preference preference) {
- preference.setTitle(com.android.internal.R.string.cancel);
- }
+ protected int getAvailabilityStatus() {
+ int superStatus = super.getAvailabilityStatus();
+ if (superStatus != AVAILABLE) return superStatus;
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
- getFragmentController().goBack();
- return true;
+ //TODO(b/206156027): implement / add unit test
+ return DISABLED_FOR_PROFILE;
}
}
diff --git a/src/com/android/car/settings/enterprise/WorkPolicyInfoPreferenceController.java b/src/com/android/car/settings/enterprise/WorkPolicyInfoPreferenceController.java
index 5916186..9766aca 100644
--- a/src/com/android/car/settings/enterprise/WorkPolicyInfoPreferenceController.java
+++ b/src/com/android/car/settings/enterprise/WorkPolicyInfoPreferenceController.java
@@ -20,6 +20,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.UserHandle;
@@ -29,6 +30,7 @@
import androidx.annotation.Nullable;
import androidx.preference.Preference;
+import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PreferenceController;
@@ -51,6 +53,9 @@
@Nullable
private Intent mIntent;
+ @Nullable
+ private CharSequence mAdminName;
+
public WorkPolicyInfoPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
@@ -70,43 +75,62 @@
@Override
protected void updateState(Preference preference) {
- updateIntent();
+ updateState();
- if (mIntent != null) {
- preference.setIntent(mIntent);
- }
+ if (mIntent == null || mAdminName == null) return;
+
+ preference.setIntent(mIntent);
+
+ CharSequence title = getContext().getString(R.string.work_policy_privacy_settings,
+ mAdminName);
+ LOG.d("Setting title to " + title);
+ preference.setTitle(title);
};
@Override
protected int getAvailabilityStatus() {
if (!mEnabled) return UNSUPPORTED_ON_DEVICE;
- updateIntent();
+ updateState();
- return mIntent == null ? DISABLED_FOR_PROFILE : AVAILABLE;
+ return (mIntent == null || mAdminName == null) ? DISABLED_FOR_PROFILE : AVAILABLE;
}
- private void updateIntent() {
- mIntent = null;
+ private void updateState() {
+ resetState();
ComponentName admin = mDpm.getProfileOwner();
if (admin == null) {
LOG.d("no profile owner for user " + MY_USER_ID + ")");
return;
}
-
+ String adminPkgName = admin.getPackageName();
mIntent = new Intent(Settings.ACTION_SHOW_WORK_POLICY_INFO)
- .setPackage(admin.getPackageName())
+ .setPackage(adminPkgName)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
List<ResolveInfo> activities = mPm.queryIntentActivities(mIntent, /* flags= */ 0);
if (activities.isEmpty()) {
LOG.d(admin.flattenToShortString() + " does not declare "
+ Settings.ACTION_SHOW_WORK_POLICY_INFO);
- mIntent = null;
+ resetState();
return;
}
- LOG.d("updateIntent(): " + admin.flattenToShortString());
+ try {
+ ApplicationInfo appInfo = mPm.getApplicationInfo(adminPkgName, /* flags= */ 0);
+ mAdminName = appInfo.loadLabel(mPm);
+ } catch (Exception e) {
+ LOG.e("could not get name of app " + adminPkgName, e);
+ resetState();
+ return;
+ }
+
+ LOG.d("updateState(): name=" + mAdminName + ", admin=" + admin.flattenToShortString());
+ }
+
+ private void resetState() {
+ mIntent = null;
+ mAdminName = null;
}
}
diff --git a/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java b/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
index 30a34eb..3fc38b4 100644
--- a/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
+++ b/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
@@ -16,6 +16,8 @@
package com.android.car.settings.inputmethod;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
import android.app.admin.DevicePolicyManager;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
@@ -25,12 +27,12 @@
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceGroup;
-import androidx.preference.SwitchPreference;
import com.android.car.settings.R;
import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
import com.android.car.ui.preference.CarUiSwitchPreference;
import java.util.Collections;
@@ -126,22 +128,26 @@
mInputMethodManager, a)));
for (InputMethodInfo inputMethodInfo : inputMethodInfos) {
- if (!isInputMethodAllowedByOrganization(permittedInputMethodsSet, inputMethodInfo)) {
- continue;
- }
// Hide "Google voice typing" IME.
if (inputMethodInfo.getPackageName().equals(InputMethodUtil.GOOGLE_VOICE_TYPING)) {
continue;
}
- preferenceGroup.addPreference(createSwitchPreference(inputMethodInfo));
+ preferenceGroup
+ .addPreference(createSwitchPreference(permittedInputMethodsSet, inputMethodInfo));
}
}
private boolean isInputMethodAllowedByOrganization(Set<String> permittedList,
InputMethodInfo inputMethodInfo) {
- // permittedList is null means that all input methods are allowed.
- return (permittedList == null) || permittedList.contains(inputMethodInfo.getPackageName());
+ // If an input method is enabled but not included in the permitted list, then set it as
+ // allowed by organization. Doing so will allow the user to disable the input method and
+ // remain complaint with the organization's policy. Once disabled, the input method
+ // cannot be re-enabled because it is not in the permitted list. Note: permittedList
+ // is null means that all input methods are allowed.
+ return (permittedList == null)
+ || permittedList.contains(inputMethodInfo.getPackageName())
+ || isInputMethodEnabled(inputMethodInfo);
}
private boolean isInputMethodEnabled(InputMethodInfo inputMethodInfo) {
@@ -177,12 +183,13 @@
}
/**
- * Create a SwitchPreference to enable/disable an input method.
+ * Create a CarUiSwitchPreference to enable/disable an input method.
*
- * @return {@code SwitchPreference} which allows a user to enable/disable an input method.
+ * @return {@code CarUiSwitchPreference} which allows a user to enable/disable an input method.
*/
- private SwitchPreference createSwitchPreference(InputMethodInfo inputMethodInfo) {
- SwitchPreference switchPreference = new CarUiSwitchPreference(getContext());
+ private CarUiSwitchPreference createSwitchPreference(Set<String> permittedInputMethodsSet,
+ InputMethodInfo inputMethodInfo) {
+ CarUiSwitchPreference switchPreference = new CarUiSwitchPreference(getContext());
switchPreference.setKey(String.valueOf(inputMethodInfo.getId()));
switchPreference.setIcon(InputMethodUtil.getPackageIcon(mPackageManager, inputMethodInfo));
switchPreference.setTitle(InputMethodUtil.getPackageLabel(mPackageManager,
@@ -201,6 +208,12 @@
switchPreference.setEnabled(!isOnlyEnabledDefaultInputMethod(inputMethodInfo));
}
+ if (!isInputMethodAllowedByOrganization(permittedInputMethodsSet, inputMethodInfo)) {
+ switchPreference.setEnabled(false);
+ setClickableWhileDisabled(switchPreference, /* clickable= */ true, p ->
+ showActionDisabledByAdminDialog(inputMethodInfo.getPackageName()));
+ return switchPreference;
+ }
switchPreference.setOnPreferenceChangeListener((switchPref, newValue) -> {
boolean enable = (boolean) newValue;
if (enable) {
@@ -239,4 +252,13 @@
getFragmentController().showDialog(dialog, SECURITY_WARN_DIALOG_TAG);
}
+
+ // TODO: ideally we need to refactor this method. See reasoning on
+ // EnterpriseUtils.DISABLED_INPUT_METHOD constant.
+ private void showActionDisabledByAdminDialog(String inputMethodPkg) {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ EnterpriseUtils.DISABLED_INPUT_METHOD, inputMethodPkg),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
}
diff --git a/src/com/android/car/settings/location/AdasGroupPreferenceController.java b/src/com/android/car/settings/location/AdasGroupPreferenceController.java
new file mode 100644
index 0000000..9cc9ec6
--- /dev/null
+++ b/src/com/android/car/settings/location/AdasGroupPreferenceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.location;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.location.LocationManager;
+
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller for displaying {@link AdasLocationSwitchSubMenuPreference} and a preference divider.
+ */
+public class AdasGroupPreferenceController extends PreferenceController<PreferenceGroup> {
+
+ private final LocationManager mLocationManager;
+
+ public AdasGroupPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mLocationManager = context.getSystemService(LocationManager.class);
+ }
+
+ @Override
+ protected Class<PreferenceGroup> getPreferenceType() {
+ return PreferenceGroup.class;
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ return mLocationManager.isAdasGnssLocationEnabled() ? UNSUPPORTED_ON_DEVICE : AVAILABLE;
+ }
+}
diff --git a/src/com/android/car/settings/location/AdasLocationFragment.java b/src/com/android/car/settings/location/AdasLocationFragment.java
new file mode 100644
index 0000000..2b36bd5
--- /dev/null
+++ b/src/com/android/car/settings/location/AdasLocationFragment.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.location;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Driver assistance page.
+ */
+public class AdasLocationFragment extends SettingsFragment {
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.adas_location_fragment;
+ }
+}
diff --git a/src/com/android/car/settings/location/AdasLocationSwitchPreferenceController.java b/src/com/android/car/settings/location/AdasLocationSwitchPreferenceController.java
new file mode 100644
index 0000000..1eb5db9
--- /dev/null
+++ b/src/com/android/car/settings/location/AdasLocationSwitchPreferenceController.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.location;
+
+import static android.car.hardware.power.PowerComponent.LOCATION;
+import static android.os.UserManager.DISALLOW_CONFIG_LOCATION;
+import static android.os.UserManager.DISALLOW_SHARE_LOCATION;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.location.LocationManager;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PowerPolicyListener;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
+import com.android.car.ui.preference.CarUiTwoActionSwitchPreference;
+
+/**
+ * Enables/disables ADAS (Advanced Driver-assistance systems) GNSS bypass via SwitchPreference.
+ */
+public class AdasLocationSwitchPreferenceController extends
+ PreferenceController<CarUiTwoActionSwitchPreference> {
+ private final Context mContext;
+ private final LocationManager mLocationManager;
+
+ private final BroadcastReceiver mAdasReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ refreshUi();
+ }
+ };
+
+ private final BroadcastReceiver mLocationReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // Turns Driver assistance on when main location switch is on. Location service don't
+ // support the case where main location switch on and Driver assistance off
+ if (mLocationManager.isLocationEnabled()) {
+ mLocationManager.setAdasGnssLocationEnabled(true);
+ }
+ refreshUi();
+ }
+ };
+
+ private static final IntentFilter INTENT_FILTER_ADAS_GNSS_ENABLED_CHANGED = new IntentFilter(
+ LocationManager.ACTION_ADAS_GNSS_ENABLED_CHANGED);
+
+ private static final IntentFilter INTENT_FILTER_LOCATION_MODE_CHANGED = new IntentFilter(
+ LocationManager.MODE_CHANGED_ACTION);
+ @VisibleForTesting
+ final PowerPolicyListener mPowerPolicyListener;
+
+ public AdasLocationSwitchPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mContext = context;
+ mLocationManager = context.getSystemService(LocationManager.class);
+ mPowerPolicyListener = new PowerPolicyListener(context, LOCATION,
+ isOn -> {
+ handlePowerPolicyChange(getPreference(), isOn);
+ });
+ }
+
+ @Override
+ protected Class<CarUiTwoActionSwitchPreference> getPreferenceType() {
+ return CarUiTwoActionSwitchPreference.class;
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_LOCATION)
+ || hasUserRestrictionByDpm(getContext(), DISALLOW_SHARE_LOCATION)) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
+ }
+
+ @Override
+ protected void updateState(CarUiTwoActionSwitchPreference preference) {
+ updateSwitchPreference(preference, mLocationManager.isAdasGnssLocationEnabled());
+ }
+
+ @Override
+ protected void onCreateInternal() {
+ getPreference().setOnSecondaryActionClickListener(isChecked -> {
+ if (!isChecked) {
+ getFragmentController().showDialog(getConfirmationDialog(),
+ ConfirmationDialogFragment.TAG);
+ refreshUi();
+ } else {
+ mLocationManager.setAdasGnssLocationEnabled(true);
+ }
+ });
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_SHARE_LOCATION)) {
+ showActionDisabledByAdminDialog(DISALLOW_SHARE_LOCATION);
+ return;
+ }
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_LOCATION)) {
+ showActionDisabledByAdminDialog(DISALLOW_CONFIG_LOCATION);
+ return;
+ }
+ });
+ }
+
+ @Override
+ protected void onStartInternal() {
+ mContext.registerReceiver(mAdasReceiver, INTENT_FILTER_ADAS_GNSS_ENABLED_CHANGED);
+ mContext.registerReceiver(mLocationReceiver, INTENT_FILTER_LOCATION_MODE_CHANGED);
+ }
+
+ @Override
+ protected void onResumeInternal() {
+ mPowerPolicyListener.handleCurrentPolicy();
+ }
+
+ @Override
+ protected void onStopInternal() {
+ mContext.unregisterReceiver(mAdasReceiver);
+ mContext.unregisterReceiver(mLocationReceiver);
+ }
+
+ @Override
+ protected void onDestroyInternal() {
+ mPowerPolicyListener.release();
+ }
+
+ private void updateSwitchPreference(CarUiTwoActionSwitchPreference preference,
+ boolean enabled) {
+ if (enabled && hasUserRestrictionByDpm(getContext(), DISALLOW_SHARE_LOCATION)) {
+ preference.setSecondaryActionChecked(false);
+ preference.setSecondaryActionEnabled(false);
+ } else {
+ preference.setSecondaryActionChecked(enabled);
+ preference.setSecondaryActionEnabled(!mLocationManager.isLocationEnabled());
+ }
+ }
+
+ private void handlePowerPolicyChange(CarUiTwoActionSwitchPreference preference,
+ boolean enabled) {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_LOCATION)
+ || hasUserRestrictionByDpm(getContext(), DISALLOW_SHARE_LOCATION)
+ || mLocationManager.isLocationEnabled()) {
+ preference.setSecondaryActionEnabled(false);
+ return;
+ }
+ preference.setSecondaryActionEnabled(enabled);
+ }
+
+ /**
+ * Assigns confirm action as negative button listener and cancel action as positive button
+ * listener, because the UX design requires the cancel button has to be on right and the confirm
+ * button on left.
+ */
+ private ConfirmationDialogFragment getConfirmationDialog() {
+ return new ConfirmationDialogFragment.Builder(getContext())
+ .setMessage(mContext
+ .getString(R.string.location_driver_assistance_toggle_off_warning))
+ .setNegativeButton(mContext
+ .getString(R.string.driver_assistance_warning_confirm_label), arguments -> {
+ mLocationManager.setAdasGnssLocationEnabled(false);
+ })
+ .setPositiveButton(android.R.string.cancel,
+ /* rejectListener= */ null)
+ .build();
+ }
+
+ private void showActionDisabledByAdminDialog(String restrictionType) {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ restrictionType),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
+}
diff --git a/src/com/android/car/settings/location/AdasLocationSwitchSubMenuPreferenceController.java b/src/com/android/car/settings/location/AdasLocationSwitchSubMenuPreferenceController.java
new file mode 100644
index 0000000..6b4a245
--- /dev/null
+++ b/src/com/android/car/settings/location/AdasLocationSwitchSubMenuPreferenceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.location;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.ui.preference.CarUiTwoActionTextPreference;
+
+/**
+ * The preference on Driver assistance page for enabling or disabling ADAS GNSS bypass.
+ */
+public class AdasLocationSwitchSubMenuPreferenceController extends
+ PreferenceController<CarUiTwoActionTextPreference> {
+
+ public AdasLocationSwitchSubMenuPreferenceController(Context context,
+ String preferenceKey,
+ FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected Class<CarUiTwoActionTextPreference> getPreferenceType() {
+ return CarUiTwoActionTextPreference.class;
+ }
+
+ @Override
+ protected void onCreateInternal() {
+ getPreference().setOnSecondaryActionClickListener(() -> {
+ getFragmentController().goBack();
+ });
+ }
+}
diff --git a/src/com/android/car/settings/location/LocationStateSwitchPreferenceController.java b/src/com/android/car/settings/location/LocationStateSwitchPreferenceController.java
index ad39149..13c04f0 100644
--- a/src/com/android/car/settings/location/LocationStateSwitchPreferenceController.java
+++ b/src/com/android/car/settings/location/LocationStateSwitchPreferenceController.java
@@ -17,6 +17,11 @@
package com.android.car.settings.location;
import static android.car.hardware.power.PowerComponent.LOCATION;
+import static android.os.UserManager.DISALLOW_CONFIG_LOCATION;
+import static android.os.UserManager.DISALLOW_SHARE_LOCATION;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
import android.car.drivingstate.CarUxRestrictions;
import android.content.BroadcastReceiver;
@@ -31,21 +36,27 @@
import androidx.annotation.VisibleForTesting;
import com.android.car.settings.R;
-import com.android.car.settings.common.ClickableWhileDisabledSwitchPreference;
+import com.android.car.settings.common.ColoredSwitchPreference;
+import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PowerPolicyListener;
import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
import com.android.settingslib.Utils;
/**
* Enables/disables location state via SwitchPreference.
*/
public class LocationStateSwitchPreferenceController extends
- PreferenceController<ClickableWhileDisabledSwitchPreference> {
-
+ PreferenceController<ColoredSwitchPreference> {
+ private static final Logger LOG = new Logger(
+ LocationStateSwitchPreferenceController.class);
private static final IntentFilter INTENT_FILTER_LOCATION_MODE_CHANGED =
new IntentFilter(LocationManager.MODE_CHANGED_ACTION);
+ private boolean mIsPowerPolicyOn = true;
+
private final Context mContext;
private final LocationManager mLocationManager;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -67,24 +78,44 @@
mLocationManager = context.getSystemService(LocationManager.class);
mPowerPolicyListener = new PowerPolicyListener(context, LOCATION,
isOn -> {
- enableSwitchPreference(getPreference(), isOn);
+ LOG.d("setting mIsPowerPolicyOn to " + isOn);
+ mIsPowerPolicyOn = isOn;
+ // mIsPowerPolicyOn is used in deciding the availability status.
+ // Call refreshUi() so that the UI can be updated as per
+ // getAvailabilityStatus().
+ refreshUi();
});
}
@Override
- protected Class<ClickableWhileDisabledSwitchPreference> getPreferenceType() {
- return ClickableWhileDisabledSwitchPreference.class;
+ protected int getAvailabilityStatus() {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_LOCATION)
+ || hasUserRestrictionByDpm(getContext(), DISALLOW_SHARE_LOCATION)
+ || !mIsPowerPolicyOn) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
}
@Override
- protected void updateState(ClickableWhileDisabledSwitchPreference preference) {
+ protected Class<ColoredSwitchPreference> getPreferenceType() {
+ return ColoredSwitchPreference.class;
+ }
+
+ @Override
+ protected void updateState(ColoredSwitchPreference preference) {
updateSwitchPreference(preference, mLocationManager.isLocationEnabled());
}
@Override
- protected boolean handlePreferenceChanged(ClickableWhileDisabledSwitchPreference preference,
+ protected boolean handlePreferenceChanged(ColoredSwitchPreference preference,
Object newValue) {
boolean locationEnabled = (Boolean) newValue;
+ if (!locationEnabled) {
+ getFragmentController().showDialog(getConfirmationDialog(),
+ ConfirmationDialogFragment.TAG);
+ return false;
+ }
Utils.updateLocationEnabled(
mContext,
locationEnabled,
@@ -97,10 +128,23 @@
protected void onCreateInternal() {
getPreference().setContentDescription(
getContext().getString(R.string.location_state_switch_content_description));
- getPreference().setDisabledClickListener(p ->
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ // All the cases here should coincide with the ones in getAvailabilityStatus()
+ if (!mIsPowerPolicyOn) {
Toast.makeText(getContext(),
getContext().getString(R.string.power_component_disabled),
- Toast.LENGTH_LONG).show());
+ Toast.LENGTH_LONG).show();
+ return;
+ }
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_SHARE_LOCATION)) {
+ showActionDisabledByAdminDialog(DISALLOW_SHARE_LOCATION);
+ return;
+ }
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_CONFIG_LOCATION)) {
+ showActionDisabledByAdminDialog(DISALLOW_CONFIG_LOCATION);
+ return;
+ }
+ });
}
@Override
@@ -123,15 +167,29 @@
mPowerPolicyListener.release();
}
- private void updateSwitchPreference(ClickableWhileDisabledSwitchPreference preference,
+ private void updateSwitchPreference(ColoredSwitchPreference preference,
boolean enabled) {
- preference.setTitle(enabled ? R.string.car_ui_preference_switch_on
- : R.string.car_ui_preference_switch_off);
- preference.setChecked(enabled);
+ preference.setChecked(enabled
+ && !hasUserRestrictionByDpm(getContext(), DISALLOW_SHARE_LOCATION));
}
- private void enableSwitchPreference(ClickableWhileDisabledSwitchPreference preference,
- boolean enabled) {
- preference.setEnabled(enabled);
+ private ConfirmationDialogFragment getConfirmationDialog() {
+ return new ConfirmationDialogFragment.Builder(getContext())
+ .setMessage(mContext.getString(R.string.location_toggle_off_warning))
+ .setPositiveButton(android.R.string.ok, arguments -> {
+ Utils.updateLocationEnabled(
+ mContext,
+ false,
+ UserHandle.myUserId(),
+ Settings.Secure.LOCATION_CHANGER_SYSTEM_SETTINGS);
+ })
+ .build();
+ }
+
+ private void showActionDisabledByAdminDialog(String restrictionType) {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ restrictionType),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
}
}
diff --git a/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceController.java b/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceController.java
index 10146a4..c6025dd 100644
--- a/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceController.java
+++ b/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceController.java
@@ -35,12 +35,14 @@
public class RecentLocationRequestsEntryPreferenceController extends
PreferenceController<Preference> {
+ private final LocationManager mLocationManager;
+
@VisibleForTesting
static final IntentFilter INTENT_FILTER_LOCATION_MODE_CHANGED =
new IntentFilter(LocationManager.MODE_CHANGED_ACTION);
- private final LocationManager mLocationManager;
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @VisibleForTesting
+ final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
refreshUi();
diff --git a/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java b/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java
index 045b318..55894b0 100644
--- a/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java
+++ b/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java
@@ -25,7 +25,6 @@
import android.provider.Settings;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
import androidx.annotation.VisibleForTesting;
import androidx.preference.TwoStatePreference;
@@ -33,14 +32,13 @@
import com.android.car.settings.R;
import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceController;
/**
* Business logic to control the toggle that enables/disables usage of mobile data. Does not have
* support for multi-sim.
*/
public class MobileDataTogglePreferenceController extends
- PreferenceController<TwoStatePreference> implements
+ NetworkBasePreferenceController<TwoStatePreference> implements
MobileNetworkUpdateManager.MobileNetworkUpdateListener {
@VisibleForTesting
@@ -50,8 +48,6 @@
ConfirmationDialogFragment.TAG + "_EnableMultisim";
private final SubscriptionManager mSubscriptionManager;
- private TelephonyManager mTelephonyManager;
- private int mSubId;
private final ContentObserver mMobileDataChangeObserver = new ContentObserver(
new Handler(Looper.getMainLooper())) {
@@ -73,8 +69,16 @@
public MobileDataTogglePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ context.getSystemService(SubscriptionManager.class));
+ }
+
+ @VisibleForTesting
+ MobileDataTogglePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ SubscriptionManager subscriptionManager) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mSubscriptionManager = getContext().getSystemService(SubscriptionManager.class);
+ mSubscriptionManager = subscriptionManager;
}
@Override
@@ -82,15 +86,9 @@
return TwoStatePreference.class;
}
- /** Sets the subscription id to be controlled by this controller. */
- public void setSubId(int subId) {
- mSubId = subId;
- mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
- }
-
@Override
protected int getAvailabilityStatus() {
- return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID ? AVAILABLE
+ return getSubId() != SubscriptionManager.INVALID_SUBSCRIPTION_ID ? AVAILABLE
: CONDITIONALLY_UNAVAILABLE;
}
@@ -113,15 +111,15 @@
@Override
protected void onStartInternal() {
- if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
- getContext().getContentResolver().registerContentObserver(getObservableUri(mSubId),
+ if (getSubId() != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ getContext().getContentResolver().registerContentObserver(getObservableUri(getSubId()),
/* notifyForDescendants= */ false, mMobileDataChangeObserver);
}
}
@Override
protected void onStopInternal() {
- if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ if (getSubId() != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
getContext().getContentResolver().unregisterContentObserver(mMobileDataChangeObserver);
}
}
@@ -130,16 +128,16 @@
protected void updateState(TwoStatePreference preference) {
preference.setEnabled(!isOpportunistic());
preference.setChecked(
- mTelephonyManager != null ? mTelephonyManager.isDataEnabled() : false);
+ getTelephonyManager() != null ? getTelephonyManager().isDataEnabled() : false);
}
@Override
protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
boolean newToggleValue = (boolean) newValue;
- boolean isMultiSim = (mTelephonyManager.getSimCount() > 1);
- int defaultSubId = mSubscriptionManager.getDefaultDataSubscriptionId();
+ boolean isMultiSim = (getTelephonyManager().getSimCount() > 1);
+ int defaultSubId = SubscriptionManager.getDefaultDataSubscriptionId();
boolean needToDisableOthers = mSubscriptionManager.isActiveSubscriptionId(defaultSubId)
- && mSubId != defaultSubId;
+ && getSubId() != defaultSubId;
if (!newToggleValue && !isMultiSim) {
getFragmentController().showDialog(getConfirmDataDisableDialog(), DISABLE_DIALOG_TAG);
@@ -154,23 +152,24 @@
@Override
public void onMobileNetworkUpdated(int subId) {
- setSubId(subId);
+ setFields(subId);
refreshUi();
}
private void setMobileDataEnabled(boolean enabled, boolean disableOtherSubscriptions) {
- NetworkUtils.setMobileDataEnabled(getContext(), mSubId, enabled, disableOtherSubscriptions);
+ NetworkUtils.setMobileDataEnabled(getContext(), getSubId(), enabled,
+ disableOtherSubscriptions);
refreshUi();
}
private boolean isOpportunistic() {
- SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(mSubId);
+ SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(getSubId());
return info != null && info.isOpportunistic();
}
private Uri getObservableUri(int subId) {
Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA);
- if (TelephonyManager.from(getContext()).getSimCount() != 1) {
+ if (getTelephonyManager().getSimCount() != 1) {
uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + subId);
}
return uri;
@@ -188,7 +187,7 @@
SubscriptionInfo previousSubInfo =
mSubscriptionManager.getDefaultDataSubscriptionInfo();
SubscriptionInfo newSubInfo =
- mSubscriptionManager.getActiveSubscriptionInfo(mSubId);
+ mSubscriptionManager.getActiveSubscriptionInfo(getSubId());
String previousName = (previousSubInfo == null)
? getContext().getResources().getString(R.string.sim_selection_required_pref)
diff --git a/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java b/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java
index 0f6ba7e..1fafabf 100644
--- a/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java
+++ b/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java
@@ -18,30 +18,44 @@
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
-import android.net.ConnectivityManager;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
import android.os.UserManager;
+import android.provider.Settings;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
-import androidx.preference.Preference;
+import androidx.annotation.CallSuper;
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
+import com.android.car.ui.preference.CarUiTwoActionSwitchPreference;
+import com.android.settingslib.utils.StringUtil;
import java.util.List;
/** Controls the preference for accessing mobile network settings. */
public class MobileNetworkEntryPreferenceController extends
- PreferenceController<Preference> implements
+ PreferenceController<CarUiTwoActionSwitchPreference> implements
SubscriptionsChangeListener.SubscriptionsChangeAction {
private final UserManager mUserManager;
private final SubscriptionsChangeListener mChangeListener;
private final SubscriptionManager mSubscriptionManager;
- private final ConnectivityManager mConnectivityManager;
private final TelephonyManager mTelephonyManager;
+ private final int mSubscriptionId;
+ private final ContentObserver mMobileDataChangeObserver = new ContentObserver(
+ new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+ refreshUi();
+ }
+ };
public MobileNetworkEntryPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -49,28 +63,52 @@
mUserManager = UserManager.get(context);
mChangeListener = new SubscriptionsChangeListener(context, /* action= */ this);
mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
- mConnectivityManager = context.getSystemService(ConnectivityManager.class);
mTelephonyManager = context.getSystemService(TelephonyManager.class);
+ mSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
}
@Override
- protected Class<Preference> getPreferenceType() {
- return Preference.class;
+ protected Class<CarUiTwoActionSwitchPreference> getPreferenceType() {
+ return CarUiTwoActionSwitchPreference.class;
+ }
+
+ @Override
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ getPreference().setOnSecondaryActionClickListener(isChecked -> {
+ mTelephonyManager.setDataEnabled(isChecked);
+ });
+ }
+
+ @Override
+ protected void updateState(CarUiTwoActionSwitchPreference preference) {
+ List<SubscriptionInfo> subs = SubscriptionUtils.getAvailableSubscriptions(
+ mSubscriptionManager, mTelephonyManager);
+ preference.setEnabled(!subs.isEmpty());
+ preference.setSummary(getSummary(subs));
+ getPreference().setSecondaryActionChecked(mTelephonyManager.isDataEnabled());
}
@Override
protected void onStartInternal() {
mChangeListener.start();
+ if (mSubscriptionId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ getContext().getContentResolver().registerContentObserver(getObservableUri(
+ mSubscriptionId), /* notifyForDescendants= */ false, mMobileDataChangeObserver);
+ }
}
@Override
protected void onStopInternal() {
mChangeListener.stop();
+ if (mSubscriptionId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ getContext().getContentResolver().unregisterContentObserver(mMobileDataChangeObserver);
+ }
}
@Override
protected int getAvailabilityStatus() {
- if (!NetworkUtils.hasMobileNetwork(mConnectivityManager)) {
+ if (!NetworkUtils.hasSim(mTelephonyManager)) {
return UNSUPPORTED_ON_DEVICE;
}
@@ -84,15 +122,7 @@
}
@Override
- protected void updateState(Preference preference) {
- List<SubscriptionInfo> subs = SubscriptionUtils.getAvailableSubscriptions(
- mSubscriptionManager, mTelephonyManager);
- preference.setEnabled(!subs.isEmpty());
- preference.setSummary(getSummary(subs));
- }
-
- @Override
- protected boolean handlePreferenceClicked(Preference preference) {
+ protected boolean handlePreferenceClicked(CarUiTwoActionSwitchPreference preference) {
List<SubscriptionInfo> subs = SubscriptionUtils.getAvailableSubscriptions(
mSubscriptionManager, mTelephonyManager);
if (subs.isEmpty()) {
@@ -109,6 +139,7 @@
}
@Override
+ @CallSuper
public void onSubscriptionsChanged() {
refreshUi();
}
@@ -120,8 +151,16 @@
} else if (count == 1) {
return subs.get(0).getDisplayName();
} else {
- return getContext().getResources().getQuantityString(
- R.plurals.mobile_network_summary_count, count, count);
+ return StringUtil.getIcuPluralsString(getContext(), count,
+ R.string.mobile_network_summary_count);
}
}
+
+ private Uri getObservableUri(int subId) {
+ Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA);
+ if (mTelephonyManager.getSimCount() != 1) {
+ uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + subId);
+ }
+ return uri;
+ }
}
diff --git a/src/com/android/car/settings/network/MobileNetworkFragment.java b/src/com/android/car/settings/network/MobileNetworkFragment.java
index 976a610..c0c3d7e 100644
--- a/src/com/android/car/settings/network/MobileNetworkFragment.java
+++ b/src/com/android/car/settings/network/MobileNetworkFragment.java
@@ -29,6 +29,9 @@
import com.android.car.settings.R;
import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.datausage.DataUsagePreferenceController;
+import com.android.car.settings.datausage.DataUsageSummaryPreferenceController;
+import com.android.car.settings.datausage.DataWarningAndLimitPreferenceController;
import com.android.car.settings.search.CarBaseSearchIndexProvider;
import com.android.car.ui.toolbar.ToolbarController;
import com.android.internal.util.CollectionUtils;
@@ -36,6 +39,7 @@
import com.google.android.collect.Lists;
+import java.util.Arrays;
import java.util.List;
/** Mobile network settings homepage. */
@@ -76,7 +80,7 @@
int subId = getArguments() != null
? getArguments().getInt(ARG_NETWORK_SUB_ID, MobileNetworkUpdateManager.SUB_ID_NULL)
: MobileNetworkUpdateManager.SUB_ID_NULL;
- mMobileNetworkUpdateManager = new MobileNetworkUpdateManager(context, subId);
+ mMobileNetworkUpdateManager = getMobileNetworkUpdateManager(context, subId);
getLifecycle().addObserver(mMobileNetworkUpdateManager);
List<MobileNetworkUpdateManager.MobileNetworkUpdateListener> listeners =
@@ -88,6 +92,22 @@
for (MobileNetworkUpdateManager.MobileNetworkUpdateListener listener : listeners) {
mMobileNetworkUpdateManager.registerListener(listener);
}
+
+ List<NetworkBasePreferenceController> preferenceControllers =
+ Arrays.asList(
+ use(DataUsageSummaryPreferenceController.class,
+ R.string.pk_data_usage_summary),
+ use(MobileDataTogglePreferenceController.class,
+ R.string.pk_mobile_data_toggle),
+ use(RoamingPreferenceController.class, R.string.pk_mobile_roaming_toggle),
+ use(DataUsagePreferenceController.class, R.string.pk_app_data_usage),
+ use(DataWarningAndLimitPreferenceController.class,
+ R.string.pk_data_warning_and_limit));
+
+ for (NetworkBasePreferenceController preferenceController :
+ preferenceControllers) {
+ preferenceController.setFields(subId);
+ }
}
@Override
@@ -132,6 +152,11 @@
return context.getSystemService(SubscriptionManager.class);
}
+ @VisibleForTesting
+ MobileNetworkUpdateManager getMobileNetworkUpdateManager(Context context, int subId) {
+ return new MobileNetworkUpdateManager(context, subId);
+ }
+
public static final CarBaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new CarBaseSearchIndexProvider(R.xml.mobile_network_fragment,
Settings.ACTION_NETWORK_OPERATOR_SETTINGS) {
diff --git a/src/com/android/car/settings/network/MobileNetworkUpdateManager.java b/src/com/android/car/settings/network/MobileNetworkUpdateManager.java
index 4b9a688..7cd5a97 100644
--- a/src/com/android/car/settings/network/MobileNetworkUpdateManager.java
+++ b/src/com/android/car/settings/network/MobileNetworkUpdateManager.java
@@ -24,6 +24,7 @@
import android.telephony.SubscriptionManager;
import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
@@ -51,7 +52,8 @@
private List<SubscriptionInfo> mSubscriptionInfos;
private int mCurSubscriptionId;
- private final SubscriptionManager.OnSubscriptionsChangedListener
+ @VisibleForTesting
+ final SubscriptionManager.OnSubscriptionsChangedListener
mOnSubscriptionsChangeListener =
new SubscriptionManager.OnSubscriptionsChangedListener() {
@Override
@@ -80,6 +82,16 @@
});
}
+ @VisibleForTesting
+ MobileNetworkUpdateManager(int subId, SubscriptionManager subscriptionManager,
+ PhoneChangeReceiver phoneChangeReceiver) {
+ mCurSubscriptionId = subId;
+ mSubscriptionManager = subscriptionManager;
+ mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
+
+ mPhoneChangeReceiver = phoneChangeReceiver;
+ }
+
/**
* Registers a listener that will receive necessary updates to changes in the mobile network.
*/
@@ -165,8 +177,10 @@
}
/** Broadcast receiver which observes changes in radio technology (i.e. CDMA vs GSM). */
- private static class PhoneChangeReceiver extends BroadcastReceiver {
- private static final IntentFilter RADIO_TECHNOLOGY_CHANGED_FILTER = new IntentFilter(
+ @VisibleForTesting
+ static class PhoneChangeReceiver extends BroadcastReceiver {
+ @VisibleForTesting
+ static final IntentFilter RADIO_TECHNOLOGY_CHANGED_FILTER = new IntentFilter(
TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
private Context mContext;
diff --git a/src/com/android/car/settings/network/NetworkBasePreferenceController.java b/src/com/android/car/settings/network/NetworkBasePreferenceController.java
new file mode 100644
index 0000000..c17117f
--- /dev/null
+++ b/src/com/android/car/settings/network/NetworkBasePreferenceController.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.network;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.NetworkTemplate;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.datausage.DataUsageUtils;
+
+/**
+ * Defines the shared getters and setters used by {@link PreferenceController} implementations
+ * related to mobile network fragment.
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller
+ * expects to operate.
+ */
+public abstract class NetworkBasePreferenceController<V extends Preference> extends
+ PreferenceController<V> {
+
+ private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ private TelephonyManager mTelephonyManager;
+ private NetworkTemplate mNetworkTemplate;
+
+ public NetworkBasePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ /** Gets the SubId. */
+ public int getSubId() {
+ return mSubId;
+ }
+
+ /** Gets the {@link TelephonyManager}. */
+ public TelephonyManager getTelephonyManager() {
+ return mTelephonyManager;
+ }
+
+ /** Gets the {@link NetworkTemplate}. */
+ public NetworkTemplate getNetworkTemplate() {
+ return mNetworkTemplate;
+ }
+
+ /** Sets the SubId, {@link TelephonyManager}, and {@link NetworkTemplate}. */
+ public void setFields(int subId) {
+ mSubId = subId;
+ mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
+ mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(mTelephonyManager, subId);
+ }
+}
diff --git a/src/com/android/car/settings/network/RoamingPreferenceController.java b/src/com/android/car/settings/network/RoamingPreferenceController.java
index b6cac0e..c2840e6 100644
--- a/src/com/android/car/settings/network/RoamingPreferenceController.java
+++ b/src/com/android/car/settings/network/RoamingPreferenceController.java
@@ -33,17 +33,15 @@
import com.android.car.settings.R;
import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceController;
/** Business logic for toggling the roaming state. */
// TODO: This preference should be available but unsearchable if subscription id is invalid.
-public class RoamingPreferenceController extends PreferenceController<TwoStatePreference> implements
+public class RoamingPreferenceController extends
+ NetworkBasePreferenceController<TwoStatePreference> implements
MobileNetworkUpdateManager.MobileNetworkUpdateListener {
private final CarrierConfigManager mCarrierConfigManager;
private final RoamingStateChangeObserver mRoamingStateChangeObserver;
- private TelephonyManager mTelephonyManager;
- private int mSubId;
private final ConfirmationDialogFragment.ConfirmListener mConfirmListener =
arguments -> setRoamingEnabled(true);
@@ -54,7 +52,6 @@
mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
mRoamingStateChangeObserver = new RoamingStateChangeObserver(
new Handler(Looper.getMainLooper()), this::refreshUi);
- mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
@Override
@@ -62,15 +59,9 @@
return TwoStatePreference.class;
}
- /** Set the subscription id for which the roaming toggle should take effect. */
- public void setSubId(int subId) {
- mSubId = subId;
- mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
- }
-
@Override
protected void onStartInternal() {
- mRoamingStateChangeObserver.register(getContext(), mSubId);
+ mRoamingStateChangeObserver.register(getContext(), getSubId());
ConfirmationDialogFragment.resetListeners(
(ConfirmationDialogFragment) getFragmentController().findDialogByTag(
@@ -87,9 +78,9 @@
@Override
protected void updateState(TwoStatePreference preference) {
- preference.setEnabled(mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- preference.setChecked(
- mTelephonyManager != null ? mTelephonyManager.isDataRoamingEnabled() : false);
+ preference.setEnabled(getSubId() != SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ preference.setChecked(getTelephonyManager() != null
+ ? getTelephonyManager().isDataRoamingEnabled() : false);
}
@Override
@@ -107,18 +98,18 @@
@Override
public void onMobileNetworkUpdated(int subId) {
- setSubId(subId);
+ setFields(subId);
refreshUi();
}
private void setRoamingEnabled(boolean enabled) {
- mTelephonyManager.setDataRoamingEnabled(enabled);
+ getTelephonyManager().setDataRoamingEnabled(enabled);
refreshUi();
}
private boolean isDialogNeeded() {
- boolean isRoamingEnabled = mTelephonyManager.isDataRoamingEnabled();
- PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
+ boolean isRoamingEnabled = getTelephonyManager().isDataRoamingEnabled();
+ PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(getSubId());
// Need dialog if we need to turn on roaming and the roaming charge indication is allowed.
if (!isRoamingEnabled && (carrierConfig == null || !carrierConfig.getBoolean(
diff --git a/src/com/android/car/settings/network/SubscriptionsChangeListener.java b/src/com/android/car/settings/network/SubscriptionsChangeListener.java
index dc77fe9..c029491 100644
--- a/src/com/android/car/settings/network/SubscriptionsChangeListener.java
+++ b/src/com/android/car/settings/network/SubscriptionsChangeListener.java
@@ -22,6 +22,8 @@
import android.content.IntentFilter;
import android.telephony.SubscriptionManager;
+import androidx.annotation.VisibleForTesting;
+
import com.android.internal.telephony.TelephonyIntents;
/** Listens to changes in availability of telephony subscriptions. */
@@ -33,14 +35,16 @@
void onSubscriptionsChanged();
}
- private static final IntentFilter RADIO_TECH_CHANGED_FILTER = new IntentFilter(
+ @VisibleForTesting
+ static final IntentFilter RADIO_TECH_CHANGED_FILTER = new IntentFilter(
TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
private final Context mContext;
private final SubscriptionManager mSubscriptionManager;
private final SubscriptionsChangeAction mSubscriptionsChangeAction;
- private final SubscriptionManager.OnSubscriptionsChangedListener mSubscriptionsChangedListener =
+ @VisibleForTesting
+ final SubscriptionManager.OnSubscriptionsChangedListener mSubscriptionsChangedListener =
new SubscriptionManager.OnSubscriptionsChangedListener() {
@Override
public void onSubscriptionsChanged() {
@@ -48,7 +52,8 @@
}
};
- private final BroadcastReceiver mRadioTechChangeReceiver = new BroadcastReceiver() {
+ @VisibleForTesting
+ final BroadcastReceiver mRadioTechChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (!isInitialStickyBroadcast()) {
diff --git a/src/com/android/car/settings/notifications/NotificationAccessConfirmationActivity.java b/src/com/android/car/settings/notifications/NotificationAccessConfirmationActivity.java
new file mode 100644
index 0000000..69f173d
--- /dev/null
+++ b/src/com/android/car/settings/notifications/NotificationAccessConfirmationActivity.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.android.car.settings.notifications;
+
+
+import static com.android.internal.notification.NotificationAccessConfirmationActivityContract.EXTRA_COMPONENT_NAME;
+import static com.android.internal.notification.NotificationAccessConfirmationActivityContract.EXTRA_PACKAGE_TITLE;
+
+import android.Manifest;
+import android.annotation.Nullable;
+import android.app.NotificationManager;
+import android.content.ComponentName;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityEvent;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.Logger;
+import com.android.internal.app.AlertActivity;
+import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
+
+/**
+ * This activity is a copy of
+ * {@link com.android.settings.notification.NotificationAccessConfirmationActivity}.
+ */
+public class NotificationAccessConfirmationActivity extends FragmentActivity {
+ private static final Logger LOG = new Logger(NotificationAccessConfirmationActivity.class);
+ private static final String REQUIRED_PERMISSION =
+ Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
+
+ private ComponentName mComponentName;
+
+ private final ConfirmationDialogFragment.ConfirmListener mConfirmListener =
+ arguments -> onAllow();
+
+ private final ConfirmationDialogFragment.RejectListener mRejectListener =
+ arguments -> cancel();
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
+ ConfirmationDialogFragment.resetListeners(findConfirmationDialogFragment(),
+ mConfirmListener,
+ mRejectListener,
+ /* neutralListener= */ null);
+
+
+ mComponentName = getIntent().getParcelableExtra(EXTRA_COMPONENT_NAME);
+ String pkgTitle = getIntent().getStringExtra(EXTRA_PACKAGE_TITLE);
+ if (TextUtils.isEmpty(pkgTitle)) {
+ LOG.e(EXTRA_PACKAGE_TITLE + " is empty");
+ finish();
+ }
+
+ ConfirmationDialogFragment confirmationDialogFragment =
+ new ConfirmationDialogFragment.Builder(this)
+ .setTitle(getString(R.string.notification_listener_security_warning_title,
+ pkgTitle))
+ .setMessage(
+ getString(R.string.notification_listener_security_warning_summary,
+ pkgTitle))
+ .setPositiveButton(R.string.allow, mConfirmListener)
+ .setNegativeButton(R.string.deny, mRejectListener)
+ .build();
+
+ // Consistent with the permission dialog
+ confirmationDialogFragment.setCancelable(false);
+ confirmationDialogFragment
+ .show(getSupportFragmentManager(), ConfirmationDialogFragment.TAG);
+ }
+
+ @Nullable
+ private ConfirmationDialogFragment findConfirmationDialogFragment() {
+ Fragment fragment = getSupportFragmentManager().findFragmentByTag(
+ ConfirmationDialogFragment.TAG);
+ if (fragment != null) {
+ return (ConfirmationDialogFragment) fragment;
+ }
+ return null;
+ }
+
+ private void onAllow() {
+ try {
+ ServiceInfo serviceInfo = getPackageManager().getServiceInfo(mComponentName, 0);
+ if (!REQUIRED_PERMISSION.equals(serviceInfo.permission)) {
+ LOG.e("Service " + mComponentName + " lacks permission " + REQUIRED_PERMISSION);
+ finish();
+ return;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ LOG.e("Failed to get service info for " + mComponentName, e);
+ finish();
+ return;
+ }
+
+ getSystemService(NotificationManager.class)
+ .setNotificationListenerAccessGranted(mComponentName, true);
+ finish();
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ return AlertActivity.dispatchPopulateAccessibilityEvent(this, event);
+ }
+
+ @Override
+ public void onBackPressed() {
+ // Suppress finishing the activity on back button press,
+ // consistently with the permission dialog behavior
+ }
+
+ private void cancel() {
+ finish();
+ }
+}
diff --git a/src/com/android/car/settings/privacy/DeleteUserPreferenceController.java b/src/com/android/car/settings/privacy/DeleteUserPreferenceController.java
index 776e484..932cebe 100644
--- a/src/com/android/car/settings/privacy/DeleteUserPreferenceController.java
+++ b/src/com/android/car/settings/privacy/DeleteUserPreferenceController.java
@@ -23,8 +23,9 @@
import android.os.UserManager;
import android.widget.Toast;
+import androidx.preference.Preference;
+
import com.android.car.settings.R;
-import com.android.car.settings.common.ClickableWhileDisabledPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.profiles.ProfileHelper;
@@ -34,7 +35,7 @@
/** Business logic for preference that deletes the current user profile. */
public class DeleteUserPreferenceController
- extends PreferenceController<ClickableWhileDisabledPreference> {
+ extends PreferenceController<Preference> {
private final UserInfo mUserInfo;
private final RemoveProfileHandler mRemoveProfileHandler;
@@ -61,18 +62,18 @@
protected void onCreateInternal() {
super.onCreateInternal();
mRemoveProfileHandler.resetListeners();
- getPreference().setDisabledClickListener(p ->
+ setClickableWhileDisabled(getPreference(), /* clickable= */true, p ->
Toast.makeText(getContext(), getContext().getString(R.string.action_unavailable),
Toast.LENGTH_LONG).show());
}
@Override
- protected Class<ClickableWhileDisabledPreference> getPreferenceType() {
- return ClickableWhileDisabledPreference.class;
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
}
@Override
- protected boolean handlePreferenceClicked(ClickableWhileDisabledPreference preference) {
+ protected boolean handlePreferenceClicked(Preference preference) {
mRemoveProfileHandler.showConfirmRemoveProfileDialog();
return true;
}
diff --git a/src/com/android/car/settings/privacy/LocationTogglePreferenceController.java b/src/com/android/car/settings/privacy/LocationTogglePreferenceController.java
deleted file mode 100644
index d2ad0b1..0000000
--- a/src/com/android/car/settings/privacy/LocationTogglePreferenceController.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.privacy;
-
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.location.LocationManager;
-import android.os.UserHandle;
-import android.provider.Settings;
-
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceController;
-import com.android.car.ui.preference.CarUiTwoActionSwitchPreference;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settingslib.Utils;
-
-/** Handles a {@link CarUiTwoActionSwitchPreference} which shows the current status of Location. */
-public class LocationTogglePreferenceController
- extends PreferenceController<CarUiTwoActionSwitchPreference> {
-
- @VisibleForTesting
- static final IntentFilter INTENT_FILTER_LOCATION_MODE_CHANGED =
- new IntentFilter(LocationManager.MODE_CHANGED_ACTION);
-
- private final Context mContext;
- private final LocationManager mLocationManager;
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- refreshUi();
- }
- };
-
- public LocationTogglePreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
- super(context, preferenceKey, fragmentController, uxRestrictions);
- mContext = context;
- mLocationManager = context.getSystemService(LocationManager.class);
- }
-
- @Override
- protected Class<CarUiTwoActionSwitchPreference> getPreferenceType() {
- return CarUiTwoActionSwitchPreference.class;
- }
-
- @Override
- protected void onCreateInternal() {
- getPreference().setOnSecondaryActionClickListener(locationEnabled -> {
- Utils.updateLocationEnabled(
- mContext,
- locationEnabled,
- UserHandle.myUserId(),
- Settings.Secure.LOCATION_CHANGER_SYSTEM_SETTINGS);
- });
- }
-
- @Override
- protected void onStartInternal() {
- mContext.registerReceiver(mReceiver, INTENT_FILTER_LOCATION_MODE_CHANGED);
- }
-
- @Override
- protected void onStopInternal() {
- mContext.unregisterReceiver(mReceiver);
- }
-
- @Override
- protected void updateState(CarUiTwoActionSwitchPreference preference) {
- preference.setSecondaryActionChecked(mLocationManager.isLocationEnabled());
- }
-}
diff --git a/src/com/android/car/settings/privacy/ManageMicPermissionsPreferenceController.java b/src/com/android/car/settings/privacy/ManageMicPermissionsPreferenceController.java
new file mode 100644
index 0000000..9d07cd6
--- /dev/null
+++ b/src/com/android/car/settings/privacy/ManageMicPermissionsPreferenceController.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import android.Manifest;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.SensorPrivacyManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.permission.PermissionControllerManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settingslib.utils.StringUtil;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * This controller displays the number of non-system apps that have access to microphone.
+ */
+public class ManageMicPermissionsPreferenceController extends
+ PreferenceController<Preference> {
+ private static final Logger LOG = new Logger(
+ ManageMicPermissionsPreferenceController.class);
+
+ private final AtomicInteger mLoadingInProgress = new AtomicInteger(0);
+ private int mNumTotal = 0;
+ private int mNumHasAccess = 0;
+
+ private final SensorPrivacyManager mSensorPrivacyManager;
+ private final UserManager mUserManager;
+ private final SensorPrivacyManager.OnSensorPrivacyChangedListener mListener =
+ (sensor, enabled) -> refreshUi();
+
+ public ManageMicPermissionsPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ SensorPrivacyManager.getInstance(context),
+ context.getSystemService(UserManager.class));
+ }
+
+ @VisibleForTesting
+ ManageMicPermissionsPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ SensorPrivacyManager sensorPrivacyManager, UserManager userManager) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mSensorPrivacyManager = sensorPrivacyManager;
+ mUserManager = userManager;
+ }
+
+ @Override
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
+ }
+
+ @Override
+ protected void onStartInternal() {
+ mSensorPrivacyManager.addSensorPrivacyListener(
+ SensorPrivacyManager.Sensors.MICROPHONE, mListener);
+ }
+
+ @Override
+ protected void onStopInternal() {
+ mSensorPrivacyManager.removeSensorPrivacyListener(SensorPrivacyManager.Sensors.MICROPHONE,
+ mListener);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ if (mSensorPrivacyManager.isSensorPrivacyEnabled(
+ SensorPrivacyManager.Sensors.MICROPHONE)) {
+ getPreference().setSummary(getContext().getString(
+ R.string.microphone_app_permission_summary_microphone_off));
+ return;
+ }
+ // Bail out if there's another loading request in progress.
+ if (mLoadingInProgress.get() != 0) {
+ return;
+ }
+ getPreference().setSummary(
+ getContext().getString(R.string.microphone_settings_loading_app_permission_stats));
+
+ mNumTotal = 0;
+ mNumHasAccess = 0;
+ // Retrieve a list of users inside the current user profile group.
+ List<UserHandle> users = mUserManager.getUserProfiles();
+ // need to asynchronously load 2 callbacks for each profile
+ mLoadingInProgress.set(2 * users.size());
+ for (UserHandle user : users) {
+ Context userContext = createPackageContextAsUser(getContext(), user);
+ if (userContext == null) {
+ // remove the two callbacks that we would normally expect for this user
+ if (mLoadingInProgress.addAndGet(-2) == 0) {
+ setAppCounts(mNumTotal, mNumHasAccess);
+ }
+ continue;
+ }
+ PermissionControllerManager permController =
+ userContext.getSystemService(PermissionControllerManager.class);
+ permController.countPermissionApps(
+ Collections.singletonList(Manifest.permission.RECORD_AUDIO), /* flags= */ 0,
+ (numApps) -> {
+ mNumTotal += numApps;
+ if (mLoadingInProgress.decrementAndGet() == 0) {
+ setAppCounts(mNumTotal, mNumHasAccess);
+ }
+ }, /* handler= */ null);
+ permController.countPermissionApps(
+ Collections.singletonList(Manifest.permission.RECORD_AUDIO),
+ PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED,
+ (numApps) -> {
+ mNumHasAccess += numApps;
+ if (mLoadingInProgress.decrementAndGet() == 0) {
+ setAppCounts(mNumTotal, mNumHasAccess);
+ }
+ }, /* handler= */ null);
+ }
+
+ }
+
+ private void setAppCounts(int numTotal, int numHasAccess) {
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", numHasAccess);
+ arguments.put("total_count", numTotal);
+ getPreference().setSummary(StringUtil.getIcuPluralsString(getContext(), arguments,
+ R.string.microphone_app_permission_summary_microphone_on));
+ }
+
+
+ /**
+ * Returns a context created from the given context for the given user, or null if it fails.
+ */
+ private Context createPackageContextAsUser(Context context, UserHandle userHandle) {
+ try {
+ return context.createPackageContextAsUser(
+ context.getPackageName(), /* flags= */ 0, userHandle);
+ } catch (PackageManager.NameNotFoundException e) {
+ LOG.e("Failed to create user context", e);
+ }
+ return null;
+ }
+}
+
diff --git a/src/com/android/car/settings/privacy/MicPreferenceController.java b/src/com/android/car/settings/privacy/MicPreferenceController.java
new file mode 100644
index 0000000..ae960ff
--- /dev/null
+++ b/src/com/android/car/settings/privacy/MicPreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionGroupInfo;
+import android.graphics.drawable.Drawable;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.ui.preference.CarUiPreference;
+
+/** Business logic for controlling the privacy center mic setting. */
+public class MicPreferenceController
+ extends PreferenceController<CarUiPreference> {
+ private static final Logger LOG = new Logger(MicPreferenceController.class);
+ public static final String PERMISSION_GROUP_MICROPHONE = "android.permission-group.MICROPHONE";
+
+ private PackageManager mPm;
+
+ public MicPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mPm = context.getPackageManager();
+ }
+
+ @Override
+ protected Class<CarUiPreference> getPreferenceType() {
+ return CarUiPreference.class;
+ }
+
+ @Override
+ protected void onCreateInternal() {
+ try {
+ PermissionGroupInfo groupInfo = mPm.getPermissionGroupInfo(
+ PERMISSION_GROUP_MICROPHONE,
+ /* flags= */ 0);
+ Drawable icon = groupInfo.loadIcon(mPm);
+ icon.mutate().setTintList(getContext().getColorStateList(R.color.icon_color_default));
+ getPreference().setIcon(icon);
+ } catch (PackageManager.NameNotFoundException e) {
+ // fall back to using the CarSettings icon specified in the resource file
+ LOG.e("Unable to load permission icon from PackageManager", e);
+ }
+ }
+}
diff --git a/src/com/android/car/settings/privacy/MicTogglePreferenceController.java b/src/com/android/car/settings/privacy/MicTogglePreferenceController.java
new file mode 100644
index 0000000..5fa7083
--- /dev/null
+++ b/src/com/android/car/settings/privacy/MicTogglePreferenceController.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.hardware.SensorPrivacyManager;
+
+import com.android.car.settings.common.ColoredSwitchPreference;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.annotations.VisibleForTesting;
+
+/** Business logic for controlling the mute mic toggle. */
+public class MicTogglePreferenceController extends PreferenceController<ColoredSwitchPreference> {
+
+ private final SensorPrivacyManager mSensorPrivacyManager;
+ private final SensorPrivacyManager.OnSensorPrivacyChangedListener mListener =
+ (sensor, enabled) -> refreshUi();
+
+ public MicTogglePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ SensorPrivacyManager.getInstance(context));
+ }
+
+ @VisibleForTesting
+ MicTogglePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ SensorPrivacyManager sensorPrivacyManager) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mSensorPrivacyManager = sensorPrivacyManager;
+ }
+
+ @Override
+ protected Class<ColoredSwitchPreference> getPreferenceType() {
+ return ColoredSwitchPreference.class;
+ }
+
+ @Override
+ protected void onStartInternal() {
+ mSensorPrivacyManager.addSensorPrivacyListener(
+ SensorPrivacyManager.Sensors.MICROPHONE, mListener);
+ }
+
+ @Override
+ protected void onStopInternal() {
+ mSensorPrivacyManager.removeSensorPrivacyListener(SensorPrivacyManager.Sensors.MICROPHONE,
+ mListener);
+ }
+
+ @Override
+ protected boolean handlePreferenceChanged(ColoredSwitchPreference preference,
+ Object newValue) {
+ boolean isChecked = (Boolean) newValue;
+ // Settings UX currently shows "checked means mic is enabled", but the underlying API is
+ // inversely written around "is mic muted?" So we must be careful when doing
+ // comparisons.
+ boolean isMicMuted = mSensorPrivacyManager.isSensorPrivacyEnabled(
+ SensorPrivacyManager.Sensors.MICROPHONE);
+ if (isChecked == isMicMuted) {
+ // UX and underlying API state for mic do not match, so update sensor privacy
+ mSensorPrivacyManager.setSensorPrivacyForProfileGroup(
+ SensorPrivacyManager.Sources.SETTINGS,
+ SensorPrivacyManager.Sensors.MICROPHONE,
+ !isChecked);
+ }
+ return true;
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ boolean hasFeatureMicToggle = mSensorPrivacyManager.supportsSensorToggle(
+ SensorPrivacyManager.Sensors.MICROPHONE);
+ return hasFeatureMicToggle ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ protected void updateState(ColoredSwitchPreference preference) {
+ preference.setChecked(!mSensorPrivacyManager.isSensorPrivacyEnabled(
+ SensorPrivacyManager.Sensors.MICROPHONE));
+ }
+}
diff --git a/src/com/android/car/settings/privacy/MicrophoneRecentAccessUtil.java b/src/com/android/car/settings/privacy/MicrophoneRecentAccessUtil.java
new file mode 100644
index 0000000..f8ad930
--- /dev/null
+++ b/src/com/android/car/settings/privacy/MicrophoneRecentAccessUtil.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.Intent;
+import android.icu.text.RelativeDateTimeFormatter;
+
+import com.android.car.ui.preference.CarUiPreference;
+import com.android.settingslib.applications.RecentAppOpsAccess;
+import com.android.settingslib.utils.StringUtil;
+
+/**
+ * Utilities related to microphone recent access.
+ */
+public final class MicrophoneRecentAccessUtil {
+ private MicrophoneRecentAccessUtil() {
+ }
+
+ /**
+ * Create a {@link CarUiPreference} for an app with it's last access time and a link to its
+ * microphone permission settings.
+ */
+ public static CarUiPreference createAppPreference(Context prefContext,
+ RecentAppOpsAccess.Access access) {
+ CarUiPreference pref = new CarUiPreference(prefContext);
+ pref.setIcon(access.icon);
+ pref.setTitle(access.label);
+ pref.setSummary(StringUtil.formatRelativeTime(prefContext,
+ System.currentTimeMillis() - access.accessFinishTime, false,
+ RelativeDateTimeFormatter.Style.SHORT));
+ pref.setOnPreferenceClickListener(preference -> {
+ Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSION);
+ intent.putExtra(Intent.EXTRA_PERMISSION_GROUP_NAME,
+ Manifest.permission_group.MICROPHONE);
+ intent.putExtra(Intent.EXTRA_PACKAGE_NAME, access.packageName);
+ intent.putExtra(Intent.EXTRA_USER, access.userHandle);
+ prefContext.startActivity(intent);
+ return true;
+ });
+ return pref;
+ }
+}
diff --git a/src/com/android/car/settings/privacy/MicrophoneRecentAccessViewAllFragment.java b/src/com/android/car/settings/privacy/MicrophoneRecentAccessViewAllFragment.java
new file mode 100644
index 0000000..a301284
--- /dev/null
+++ b/src/com/android/car/settings/privacy/MicrophoneRecentAccessViewAllFragment.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.car.ui.toolbar.MenuItem;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * All apps that have recently accessed microphone.
+ */
+public class MicrophoneRecentAccessViewAllFragment extends SettingsFragment {
+
+ private boolean mShowSystem = false;
+ private MenuItem mShowHideSystemMenu;
+ private MicrophoneRecentAccessViewAllPreferenceController mController;
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.microphone_recent_requests_view_all_fragment;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mShowHideSystemMenu = new MenuItem.Builder(getContext())
+ .setTitle(R.string.show_system)
+ .setOnClickListener(i -> setShowSystem(!mShowSystem))
+ .build();
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ mController = use(MicrophoneRecentAccessViewAllPreferenceController.class,
+ R.string.pk_microphone_recent_requests);
+ }
+
+ @Override
+ protected List<MenuItem> getToolbarMenuItems() {
+ return Arrays.asList(mShowHideSystemMenu);
+ }
+
+ private void setShowSystem(boolean showSystem) {
+ if (showSystem != mShowSystem) {
+ mShowSystem = showSystem;
+ mController.setShowSystem(showSystem);
+ updateMenu();
+ }
+ }
+
+ private void updateMenu() {
+ mShowHideSystemMenu.setTitle(mShowSystem ? R.string.hide_system : R.string.hide_system);
+ }
+}
diff --git a/src/com/android/car/settings/privacy/MicrophoneRecentAccessViewAllPreferenceController.java b/src/com/android/car/settings/privacy/MicrophoneRecentAccessViewAllPreferenceController.java
new file mode 100644
index 0000000..c9c460d
--- /dev/null
+++ b/src/com/android/car/settings/privacy/MicrophoneRecentAccessViewAllPreferenceController.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.ui.preference.CarUiPreference;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settingslib.applications.RecentAppOpsAccess;
+
+import java.util.List;
+
+/**
+ * This controller displays a list of recently used apps. Only non-system apps are displayed.
+ */
+public class MicrophoneRecentAccessViewAllPreferenceController extends
+ PreferenceController<LogicalPreferenceGroup> {
+
+ private final RecentAppOpsAccess mRecentMicrophoneAccesses;
+ private boolean mShowSystem = false;
+
+ public MicrophoneRecentAccessViewAllPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mRecentMicrophoneAccesses = RecentAppOpsAccess.createForMicrophone(context);
+ }
+
+ @VisibleForTesting
+ MicrophoneRecentAccessViewAllPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ RecentAppOpsAccess recentMicrophoneAccesses) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mRecentMicrophoneAccesses = recentMicrophoneAccesses;
+ }
+
+ @Override
+ protected Class<LogicalPreferenceGroup> getPreferenceType() {
+ return LogicalPreferenceGroup.class;
+ }
+
+ @Override
+ public void updateState(LogicalPreferenceGroup preference) {
+ super.updateState(preference);
+ List<RecentAppOpsAccess.Access> recentMicrophoneAccesses = loadData();
+ updateUi(recentMicrophoneAccesses);
+ }
+
+ /**
+ * Rebuilds the preference list to show system applications if {@code showSystem} is true.
+ * System applications will be hidden otherwise.
+ */
+ public void setShowSystem(boolean showSystem) {
+ if (mShowSystem != showSystem) {
+ mShowSystem = showSystem;
+ refreshUi();
+ }
+ }
+
+ private List<RecentAppOpsAccess.Access> loadData() {
+ return mRecentMicrophoneAccesses.getAppListSorted(mShowSystem);
+ }
+
+ private void updateUi(List<RecentAppOpsAccess.Access> recentMicrophoneAccesses) {
+ getPreference().removeAll();
+ if (recentMicrophoneAccesses.isEmpty()) {
+ getPreference().addPreference(createNoRecentAccessPreference());
+ } else {
+ for (RecentAppOpsAccess.Access request : recentMicrophoneAccesses) {
+ CarUiPreference appPreference = MicrophoneRecentAccessUtil.createAppPreference(
+ getContext(),
+ request);
+ getPreference().addPreference(appPreference);
+ }
+ }
+ }
+
+ private CarUiPreference createNoRecentAccessPreference() {
+ CarUiPreference preference = new CarUiPreference(getContext());
+ preference.setTitle(R.string.microphone_no_recent_access);
+ preference.setSelectable(false);
+ return preference;
+ }
+}
+
diff --git a/src/com/android/car/settings/privacy/MicrophoneRecentAccessesPreferenceController.java b/src/com/android/car/settings/privacy/MicrophoneRecentAccessesPreferenceController.java
new file mode 100644
index 0000000..89bd932
--- /dev/null
+++ b/src/com/android/car/settings/privacy/MicrophoneRecentAccessesPreferenceController.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.hardware.SensorPrivacyManager;
+
+import androidx.preference.PreferenceCategory;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.ui.preference.CarUiPreference;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settingslib.applications.RecentAppOpsAccess;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * This controller displays a list of apps that recently access the microphone. Only non-system apps
+ * are displayed.
+ */
+public class MicrophoneRecentAccessesPreferenceController extends
+ PreferenceController<PreferenceCategory> {
+
+ private final SensorPrivacyManager mSensorPrivacyManager;
+ private final SensorPrivacyManager.OnSensorPrivacyChangedListener mListener =
+ (sensor, enabled) -> refreshUi();
+ private final Set<CarUiPreference> mAddedPreferences = new HashSet<>();
+
+ private final RecentAppOpsAccess mRecentMicrophoneAccesses;
+ private final int mRecentAppsMaxCount;
+
+ public MicrophoneRecentAccessesPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ RecentAppOpsAccess.createForMicrophone(context),
+ context.getResources()
+ .getInteger(R.integer.recent_microphone_access_apps_list_count),
+ SensorPrivacyManager.getInstance(context));
+ }
+
+ @VisibleForTesting
+ MicrophoneRecentAccessesPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ RecentAppOpsAccess recentMicrophoneAccesses, int recentAppsMaxCount,
+ SensorPrivacyManager sensorPrivacyManager) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mRecentMicrophoneAccesses = recentMicrophoneAccesses;
+ mRecentAppsMaxCount = recentAppsMaxCount;
+ mSensorPrivacyManager = sensorPrivacyManager;
+ }
+
+ @Override
+ protected Class<PreferenceCategory> getPreferenceType() {
+ return PreferenceCategory.class;
+ }
+
+ @Override
+ protected void onStartInternal() {
+ mSensorPrivacyManager.addSensorPrivacyListener(
+ SensorPrivacyManager.Sensors.MICROPHONE, mListener);
+ }
+
+ @Override
+ protected void onStopInternal() {
+ mSensorPrivacyManager.removeSensorPrivacyListener(SensorPrivacyManager.Sensors.MICROPHONE,
+ mListener);
+ }
+
+ @Override
+ public void updateState(PreferenceCategory preference) {
+ super.updateState(preference);
+ if (mSensorPrivacyManager.isSensorPrivacyEnabled(
+ SensorPrivacyManager.Sensors.MICROPHONE)) {
+ getPreference().setVisible(false);
+ return;
+ }
+ getPreference().setVisible(true);
+ List<RecentAppOpsAccess.Access> sortedRecentMicrophoneAccesses = loadData();
+ updateUi(sortedRecentMicrophoneAccesses);
+ }
+
+ private List<RecentAppOpsAccess.Access> loadData() {
+ return mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false);
+ }
+
+ private boolean hasAtLeastOneRecentAppAccess() {
+ return !mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ true).isEmpty();
+ }
+
+ private void updateUi(List<RecentAppOpsAccess.Access> sortedRecentMicrophoneAccesses) {
+ // remove any already added preferences
+ for (CarUiPreference addedPreference : mAddedPreferences) {
+ getPreference().removePreference(addedPreference);
+ }
+ mAddedPreferences.clear();
+
+ if (sortedRecentMicrophoneAccesses.isEmpty()) {
+ CarUiPreference emptyPreference = createNoRecentAccessPreference();
+ getPreference().addPreference(emptyPreference);
+ mAddedPreferences.add(emptyPreference);
+ } else {
+ int count = Math.min(sortedRecentMicrophoneAccesses.size(), mRecentAppsMaxCount);
+ for (int i = 0; i < count; i++) {
+ RecentAppOpsAccess.Access request = sortedRecentMicrophoneAccesses.get(i);
+ CarUiPreference appPreference = MicrophoneRecentAccessUtil.createAppPreference(
+ getContext(),
+ request);
+ getPreference().addPreference(appPreference);
+ mAddedPreferences.add(appPreference);
+ }
+ }
+
+ if (hasAtLeastOneRecentAppAccess()) {
+ CarUiPreference viewAllPreference = createViewAllPreference();
+ getPreference().addPreference(viewAllPreference);
+ mAddedPreferences.add(viewAllPreference);
+ }
+ }
+
+ private CarUiPreference createNoRecentAccessPreference() {
+ CarUiPreference preference = new CarUiPreference(getContext());
+ preference.setTitle(R.string.microphone_no_recent_access);
+ preference.setSelectable(false);
+ return preference;
+ }
+
+ private CarUiPreference createViewAllPreference() {
+ CarUiPreference preference = new CarUiPreference(getContext());
+ preference.setTitle(R.string.microphone_settings_recent_requests_view_all_title);
+ preference.setIcon(R.drawable.ic_apps);
+ preference.setOnPreferenceClickListener(p -> {
+ getFragmentController().launchFragment(new MicrophoneRecentAccessViewAllFragment());
+ return true;
+ });
+ return preference;
+ }
+}
diff --git a/src/com/android/car/settings/privacy/MicrophoneSettingsFragment.java b/src/com/android/car/settings/privacy/MicrophoneSettingsFragment.java
new file mode 100644
index 0000000..6093270
--- /dev/null
+++ b/src/com/android/car/settings/privacy/MicrophoneSettingsFragment.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Main page that hosts privacy-related Microphone preferences.
+ */
+public class MicrophoneSettingsFragment extends SettingsFragment {
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.privacy_microphone_settings_fragment;
+ }
+}
diff --git a/src/com/android/car/settings/privacy/MuteMicTogglePreferenceController.java b/src/com/android/car/settings/privacy/MuteMicTogglePreferenceController.java
deleted file mode 100644
index 1be3de6..0000000
--- a/src/com/android/car/settings/privacy/MuteMicTogglePreferenceController.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.privacy;
-
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.Context;
-import android.hardware.SensorPrivacyManager;
-
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceController;
-import com.android.car.ui.preference.CarUiTwoActionSwitchPreference;
-import com.android.internal.annotations.VisibleForTesting;
-
-/** Business logic for controlling the mute mic setting. */
-public class MuteMicTogglePreferenceController
- extends PreferenceController<CarUiTwoActionSwitchPreference> {
-
- private SensorPrivacyManager mSensorPrivacyManager;
-
- private SensorPrivacyManager.OnSensorPrivacyChangedListener mListener =
- new SensorPrivacyManager.OnSensorPrivacyChangedListener() {
- @Override
- public void onSensorPrivacyChanged(int sensor, boolean enabled) {
- refreshUi();
- }
- };
-
- public MuteMicTogglePreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
- this(context, preferenceKey, fragmentController, uxRestrictions,
- SensorPrivacyManager.getInstance(context));
- }
-
- @VisibleForTesting
- MuteMicTogglePreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController, CarUxRestrictions uxRestrictions,
- SensorPrivacyManager sensorPrivacyManager) {
- super(context, preferenceKey, fragmentController, uxRestrictions);
- mSensorPrivacyManager = sensorPrivacyManager;
- }
-
- @Override
- protected Class<CarUiTwoActionSwitchPreference> getPreferenceType() {
- return CarUiTwoActionSwitchPreference.class;
- }
-
- @Override
- protected void onCreateInternal() {
- getPreference().setOnSecondaryActionClickListener(isChecked -> {
- // Settings UX currently shows "checked means mic is enabled", but the underlying API is
- // inversely written around "is mic muted?" So we must be careful when doing
- // comparisons.
- boolean isMicMuted = mSensorPrivacyManager.isSensorPrivacyEnabled(
- SensorPrivacyManager.Sensors.MICROPHONE);
- if (isChecked == isMicMuted) {
- // UX and underlying API state for mic do not match, so update sensor privacy
- mSensorPrivacyManager.setSensorPrivacyForProfileGroup(
- SensorPrivacyManager.Sources.SETTINGS,
- SensorPrivacyManager.Sensors.MICROPHONE,
- !isChecked);
- }
- });
- }
-
- @Override
- protected void onStartInternal() {
- mSensorPrivacyManager.addSensorPrivacyListener(
- SensorPrivacyManager.Sensors.MICROPHONE, mListener);
- }
-
- @Override
- protected void onStopInternal() {
- mSensorPrivacyManager.removeSensorPrivacyListener(SensorPrivacyManager.Sensors.MICROPHONE,
- mListener);
- }
-
- @Override
- protected int getAvailabilityStatus() {
- boolean hasFeatureMicToggle = mSensorPrivacyManager.supportsSensorToggle(
- SensorPrivacyManager.Sensors.MICROPHONE);
- return hasFeatureMicToggle ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
- }
-
- @Override
- protected void updateState(CarUiTwoActionSwitchPreference preference) {
- preference.setSecondaryActionChecked(!mSensorPrivacyManager.isSensorPrivacyEnabled(
- SensorPrivacyManager.Sensors.MICROPHONE));
- }
-}
diff --git a/src/com/android/car/settings/profiles/AddProfileHandler.java b/src/com/android/car/settings/profiles/AddProfileHandler.java
index fb866ba..e4cca50 100644
--- a/src/com/android/car/settings/profiles/AddProfileHandler.java
+++ b/src/com/android/car/settings/profiles/AddProfileHandler.java
@@ -16,10 +16,20 @@
package com.android.car.settings.profiles;
+import static android.os.UserManager.DISALLOW_ADD_USER;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
+
import android.car.Car;
import android.car.user.CarUserManager;
import android.content.Context;
import android.os.UserManager;
+import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -29,6 +39,7 @@
import com.android.car.settings.common.ErrorDialog;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
/**
* Consolidates adding profile logic into one handler so we can have consistent logic across various
@@ -39,6 +50,9 @@
@VisibleForTesting
static final String CONFIRM_CREATE_NEW_PROFILE_DIALOG_TAG =
"com.android.car.settings.profiles.ConfirmCreateNewProfileDialog";
+ @VisibleForTesting
+ static final String MAX_PROFILES_LIMIT_REACHED_DIALOG_TAG =
+ "com.android.car.settings.profiles.MaxProfilesLimitReachedDialog";
@VisibleForTesting
AddNewProfileTask mAddNewProfileTask;
@@ -105,7 +119,7 @@
}
/**
- * Handles events that should happen in host's updateState().
+ * Handles events that should happen in host's updateState() when there is task running.
*/
public void updateState(Preference preference) {
preference.setEnabled(!mIsBusy);
@@ -133,8 +147,25 @@
* @param userManager UserManager instance to evaluate
* @return whether the user has permissions to add profiles
*/
- public boolean canAddProfiles(UserManager userManager) {
- return !userManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER);
+ public static boolean canAddProfiles(UserManager userManager) {
+ return !userManager.hasUserRestriction(DISALLOW_ADD_USER);
+ }
+
+ /**
+ * Returns {@code PreferenceController.AVAILABLE} when preference should be available,
+ * {@code PreferenceController.DISABLED_FOR_PROFILE} when preference should be unavailable,
+ * {@code PreferenceController.AVAILABLE_FOR_VIEWING} when preference is visible but
+ * disabled.
+ */
+ public static int getAddProfilePreferenceAvailabilityStatus(Context context) {
+ UserManager um = getUserManager(context);
+ if (um.isDemoUser() || canAddProfiles(um)) {
+ return AVAILABLE;
+ }
+ if (hasUserRestrictionByUm(context, DISALLOW_ADD_USER)) {
+ return DISABLED_FOR_PROFILE;
+ }
+ return AVAILABLE_FOR_VIEWING;
}
/**
@@ -148,6 +179,37 @@
mFragmentController.showDialog(dialogFragment, CONFIRM_CREATE_NEW_PROFILE_DIALOG_TAG);
}
+ /**
+ * Shows a dialog or toast when the Preference is disabled while still visible.
+ */
+ public void runClickableWhileDisabled() {
+ if (hasUserRestrictionByDpm(mContext, DISALLOW_ADD_USER)) {
+ // Shows a dialog if this PreferenceController is disabled because there is
+ // restriction set from DevicePolicyManager
+ showActionDisabledByAdminDialog();
+ } else if (!getUserManager(mContext).canAddMoreUsers()) {
+ // Shows a dialog if no more profiles can be added because the maximum allowed number
+ // is reached
+ ConfirmationDialogFragment dialogFragment =
+ ProfilesDialogProvider.getMaxProfilesLimitReachedDialogFragment(mContext,
+ ProfileHelper.getInstance(mContext).getMaxSupportedRealProfiles());
+ mFragmentController.showDialog(dialogFragment, MAX_PROFILES_LIMIT_REACHED_DIALOG_TAG);
+ } else {
+ Toast.makeText(mContext, mContext.getString(R.string.action_unavailable),
+ Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private void showActionDisabledByAdminDialog() {
+ mFragmentController.showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(mContext, DISALLOW_ADD_USER),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
+
+ private static UserManager getUserManager(Context context) {
+ return context.getSystemService(UserManager.class);
+ }
+
@VisibleForTesting
void setCarUserManager(CarUserManager carUserManager) {
mCarUserManager = carUserManager;
diff --git a/src/com/android/car/settings/profiles/AddProfilePreferenceController.java b/src/com/android/car/settings/profiles/AddProfilePreferenceController.java
index 4cdc726..dbd4f18 100644
--- a/src/com/android/car/settings/profiles/AddProfilePreferenceController.java
+++ b/src/com/android/car/settings/profiles/AddProfilePreferenceController.java
@@ -16,6 +16,8 @@
package com.android.car.settings.profiles;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.os.UserManager;
@@ -23,7 +25,6 @@
import androidx.preference.Preference;
import com.android.car.settings.R;
-import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
import com.android.internal.annotations.VisibleForTesting;
@@ -46,7 +47,7 @@
FragmentController fragmentController,
CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mUserManager = UserManager.get(context);
+ mUserManager = context.getSystemService(UserManager.class);
mDemoProfileDialogHandler = new DemoProfileDialogHandler(context, fragmentController);
mAddProfileHandler = new AddProfileHandler(context, fragmentController, this);
}
@@ -67,6 +68,8 @@
getPreference().setTitle(R.string.add_profile_text);
getPreference().setIcon(R.drawable.ic_add);
}
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ mAddProfileHandler.runClickableWhileDisabled());
}
@Override
@@ -92,32 +95,25 @@
return true;
}
- // If no more profiles can be added because the maximum allowed number is reached, let the
- // user know.
- if (!mUserManager.canAddMoreUsers()) {
- ConfirmationDialogFragment dialogFragment =
- ProfilesDialogProvider.getMaxProfilesLimitReachedDialogFragment(getContext(),
- ProfileHelper.getInstance(getContext()).getMaxSupportedRealProfiles());
-
- getFragmentController().showDialog(dialogFragment,
- MAX_PROFILES_LIMIT_REACHED_DIALOG_TAG);
+ if (!mUserManager.canAddMoreUsers()
+ || hasUserRestrictionByDpm(getContext(), UserManager.DISALLOW_ADD_USER)) {
+ mAddProfileHandler.runClickableWhileDisabled();
return true;
}
- // Only add the add profile button if the current profile is allowed to add a profile.
+ // Add the add profile button if the current profile is allowed to add a profile.
if (mAddProfileHandler.canAddProfiles(mUserManager)) {
mAddProfileHandler.showAddProfileDialog();
return true;
}
+
return false;
}
@Override
protected int getAvailabilityStatus() {
- if (mUserManager.isDemoUser() || mAddProfileHandler.canAddProfiles(mUserManager)) {
- return AVAILABLE;
- }
- return DISABLED_FOR_PROFILE;
+ return mAddProfileHandler
+ .getAddProfilePreferenceAvailabilityStatus(getContext());
}
@VisibleForTesting
diff --git a/src/com/android/car/settings/profiles/ProfileDetailsActionButtonsPreferenceController.java b/src/com/android/car/settings/profiles/ProfileDetailsActionButtonsPreferenceController.java
index 1a84ae2..9908148 100644
--- a/src/com/android/car/settings/profiles/ProfileDetailsActionButtonsPreferenceController.java
+++ b/src/com/android/car/settings/profiles/ProfileDetailsActionButtonsPreferenceController.java
@@ -16,7 +16,11 @@
package com.android.car.settings.profiles;
+import static android.os.UserManager.DISALLOW_ADD_USER;
+
import static com.android.car.settings.common.ActionButtonsPreference.ActionButtons;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
@@ -126,14 +130,23 @@
ActionButtonInfo deleteButton = getPreference().getButton(ActionButtons.BUTTON4);
boolean isDemoProfile = mUserManager.isDemoUser();
+ // When DISALLOW_ADD_USER is set by device or profile owner, the button should still be
+ // visible but disabled
boolean shouldShowAddProfile = mUserManager.isAdminUser()
&& mProfileHelper.isCurrentProcessUser(getUserInfo())
- && mAddProfileHandler.canAddProfiles(mUserManager)
+ && !hasUserRestrictionByUm(getContext(), DISALLOW_ADD_USER)
&& !areThereOtherProfiles();
+ boolean shouldEnableAddProfile = shouldShowAddProfile
+ && !hasUserRestrictionByDpm(getContext(), DISALLOW_ADD_USER);
boolean shouldShowProfilesButton = isDemoProfile || shouldShowAddProfile
|| mUserManager.isAdminUser() && mProfileHelper.isCurrentProcessUser(getUserInfo())
&& areThereOtherProfiles();
+ int removeProfileAvailabilityStatus = mRemoveProfileHandler.getAvailabilityStatus(
+ getContext(), getUserInfo(), /* availableForCurrentProcessUser= */ false);
+ boolean shouldShowDeleteProfile = removeProfileAvailabilityStatus != DISABLED_FOR_PROFILE;
+ boolean shouldEnableDeleteProfile = removeProfileAvailabilityStatus == AVAILABLE;
+
int profileButtonText;
if (shouldShowAddProfile && isDemoProfile) {
profileButtonText = R.string.exit_retail_button_text;
@@ -162,6 +175,8 @@
.setOnClickListener(v -> {
if (shouldShowAddProfile && isDemoProfile) {
mDemoProfileDialogHandler.showExitRetailDialog();
+ } else if (shouldShowAddProfile && !shouldEnableAddProfile) {
+ mAddProfileHandler.runClickableWhileDisabled();
} else if (shouldShowAddProfile) {
mAddProfileHandler.showAddProfileDialog();
} else {
@@ -180,9 +195,14 @@
deleteButton
.setText(R.string.delete_button)
.setIcon(R.drawable.ic_delete)
- .setVisible(mRemoveProfileHandler.canRemoveProfile(getUserInfo())
- && !mProfileHelper.isCurrentProcessUser(getUserInfo()))
- .setOnClickListener(v -> mRemoveProfileHandler.showConfirmRemoveProfileDialog());
+ .setVisible(shouldShowDeleteProfile)
+ .setOnClickListener(v -> {
+ if (shouldEnableDeleteProfile) {
+ mRemoveProfileHandler.showConfirmRemoveProfileDialog();
+ } else {
+ mRemoveProfileHandler.runClickableWhileDisabled();
+ }
+ });
}
@Override
diff --git a/src/com/android/car/settings/profiles/ProfileDetailsDeletePreferenceController.java b/src/com/android/car/settings/profiles/ProfileDetailsDeletePreferenceController.java
index a51f06f..58ef520 100644
--- a/src/com/android/car/settings/profiles/ProfileDetailsDeletePreferenceController.java
+++ b/src/com/android/car/settings/profiles/ProfileDetailsDeletePreferenceController.java
@@ -22,16 +22,16 @@
import android.os.UserManager;
import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
+import com.android.car.ui.preference.CarUiPreference;
/**
* Controller that displays the preference for letting the user delete the current profile
*/
public class ProfileDetailsDeletePreferenceController
- extends ProfileDetailsBasePreferenceController<Preference> {
+ extends ProfileDetailsBasePreferenceController<CarUiPreference> {
private static final Logger LOG = new Logger(ProfileDetailsDeletePreferenceController.class);
@@ -58,14 +58,16 @@
}
@Override
- protected Class<Preference> getPreferenceType() {
- return Preference.class;
+ protected Class<CarUiPreference> getPreferenceType() {
+ return CarUiPreference.class;
}
@Override
protected void onCreateInternal() {
super.onCreateInternal();
mRemoveProfileHandler.resetListeners();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ mRemoveProfileHandler.runClickableWhileDisabled());
}
@Override
@@ -75,14 +77,18 @@
}
@Override
- protected void updateState(Preference preference) {
- preference.setVisible(mRemoveProfileHandler.canRemoveProfile(getUserInfo())
- && mProfileHelper.isCurrentProcessUser(getUserInfo()));
+ public boolean handlePreferenceClicked(CarUiPreference preference) {
+ if (getAvailabilityStatus() == AVAILABLE_FOR_VIEWING) {
+ mRemoveProfileHandler.runClickableWhileDisabled();
+ return true;
+ }
+ mRemoveProfileHandler.showConfirmRemoveProfileDialog();
+ return true;
}
@Override
- public boolean handlePreferenceClicked(Preference preference) {
- mRemoveProfileHandler.showConfirmRemoveProfileDialog();
- return true;
+ protected int getAvailabilityStatus() {
+ return mRemoveProfileHandler.getAvailabilityStatus(
+ getContext(), getUserInfo(), /* allowRemoveCurrentProcessUser= */ true);
}
}
diff --git a/src/com/android/car/settings/profiles/ProfileDetailsEndSessionPreferenceController.java b/src/com/android/car/settings/profiles/ProfileDetailsEndSessionPreferenceController.java
new file mode 100644
index 0000000..851181e
--- /dev/null
+++ b/src/com/android/car/settings/profiles/ProfileDetailsEndSessionPreferenceController.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.profiles;
+
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.ui.preference.CarUiPreference;
+
+/**
+ * Controller that ends a managed user session.
+ */
+// TODO(b/186905050, b/205185521): add unit test
+public class ProfileDetailsEndSessionPreferenceController
+ extends ProfileDetailsBasePreferenceController<CarUiPreference> {
+
+ private static final Logger LOG = new Logger(
+ ProfileDetailsEndSessionPreferenceController.class);
+
+ @Nullable
+ private final DevicePolicyManager mDpm;
+
+ private @UserIdInt int mLogoutUserId;
+
+ public ProfileDetailsEndSessionPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+
+ mDpm = context.getSystemService(DevicePolicyManager.class);
+ }
+
+ @Override
+ protected Class<CarUiPreference> getPreferenceType() {
+ return CarUiPreference.class;
+ }
+
+ @Override
+ public void setUserInfo(UserInfo userInfo) {
+ super.setUserInfo(userInfo);
+ }
+
+ @Override
+ public boolean handlePreferenceClicked(CarUiPreference preference) {
+ LOG.i("ending session (" + getUserInfo().toFullString() + ") and switching back to user "
+ + mLogoutUserId);
+ boolean switched = ProfileHelper.getInstance(getContext()).switchProfile(mLogoutUserId);
+ if (switched) {
+ LOG.d("clearing logout user");
+ mDpm.clearLogoutUser();
+ } else {
+ LOG.e("Switch failed");
+ }
+ return true;
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ if (mDpm == null) {
+ LOG.d("getAvailabilityStatus(): no dpm");
+ return UNSUPPORTED_ON_DEVICE;
+ }
+ boolean isLogoutEnabled = mDpm.isLogoutEnabled();
+ mLogoutUserId = mDpm.getLogoutUserId();
+ LOG.d("getAvailabilityStatus(): isLogoutEnabled()=" + isLogoutEnabled + ", mLogoutUserId="
+ + mLogoutUserId);
+ return isLogoutEnabled && mLogoutUserId != UserHandle.USER_NULL
+ ? AVAILABLE
+ : CONDITIONALLY_UNAVAILABLE;
+ }
+}
diff --git a/src/com/android/car/settings/profiles/ProfileDetailsFragment.java b/src/com/android/car/settings/profiles/ProfileDetailsFragment.java
index b991e20..93f2330 100644
--- a/src/com/android/car/settings/profiles/ProfileDetailsFragment.java
+++ b/src/com/android/car/settings/profiles/ProfileDetailsFragment.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.Intent;
+import android.content.pm.UserInfo;
import android.provider.Settings;
import androidx.annotation.XmlRes;
@@ -50,14 +51,17 @@
@Override
public void onAttach(Context context) {
super.onAttach(context);
+ UserInfo userInfo = getUserInfo();
use(ProfileDetailsHeaderPreferenceController.class,
- R.string.pk_profile_details_header).setUserInfo(getUserInfo());
+ R.string.pk_profile_details_header).setUserInfo(userInfo);
use(ProfileDetailsActionButtonsPreferenceController.class,
- R.string.pk_profile_details_action_buttons).setUserInfo(getUserInfo());
+ R.string.pk_profile_details_action_buttons).setUserInfo(userInfo);
use(AccountGroupPreferenceController.class,
- R.string.pk_account_group).setUserInfo(getUserInfo());
+ R.string.pk_account_group).setUserInfo(userInfo);
use(ProfileDetailsDeletePreferenceController.class,
- R.string.pk_profile_details_delete).setUserInfo(getUserInfo());
+ R.string.pk_profile_details_delete).setUserInfo(userInfo);
+ use(ProfileDetailsEndSessionPreferenceController.class,
+ R.string.pk_profile_details_end_session).setUserInfo(userInfo);
// Accounts information
Intent activityIntent = requireActivity().getIntent();
diff --git a/src/com/android/car/settings/profiles/ProfileGridRecyclerView.java b/src/com/android/car/settings/profiles/ProfileGridRecyclerView.java
index c484e16..3b6341d 100644
--- a/src/com/android/car/settings/profiles/ProfileGridRecyclerView.java
+++ b/src/com/android/car/settings/profiles/ProfileGridRecyclerView.java
@@ -321,12 +321,15 @@
public void onBindViewHolder(ProfileAdapterViewHolder holder, int position) {
ProfileRecord profileRecord = mProfiles.get(position);
Drawable circleIcon = getCircularProfileRecordIcon(profileRecord);
- if (profileRecord.mInfo != null) {
+ if (profileRecord.mType == ProfileRecord.ADD_PROFILE) {
+ // 'Add Profile' has badges if device admin exists.
+ holder.mProfileAvatarImageView.setDrawableWithBadge(circleIcon);
+ } else if (profileRecord.mInfo != null) {
// Profile might have badges (like managed profile)
holder.mProfileAvatarImageView.setDrawableWithBadge(circleIcon,
profileRecord.mInfo.id);
} else {
- // Guest or "Add Profile" don't have badges
+ // Guest does not have badges
holder.mProfileAvatarImageView.setDrawable(circleIcon);
}
holder.mProfileNameTextView.setText(getProfileRecordName(profileRecord));
diff --git a/src/com/android/car/settings/profiles/ProfileHelper.java b/src/com/android/car/settings/profiles/ProfileHelper.java
index 6c590f1..d4c3e54 100644
--- a/src/com/android/car/settings/profiles/ProfileHelper.java
+++ b/src/com/android/car/settings/profiles/ProfileHelper.java
@@ -15,6 +15,9 @@
*/
package com.android.car.settings.profiles;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -35,8 +38,11 @@
import android.os.UserManager;
import android.sysprop.CarProperties;
import android.util.Log;
+import android.widget.Toast;
import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
import com.android.internal.annotations.VisibleForTesting;
import java.lang.annotation.Retention;
@@ -102,7 +108,8 @@
if (sInstance == null) {
Context appContext = context.getApplicationContext();
Resources resources = appContext.getResources();
- sInstance = new ProfileHelper(UserManager.get(appContext), resources,
+ sInstance = new ProfileHelper(
+ appContext.getSystemService(UserManager.class), resources,
resources.getString(com.android.internal.R.string.owner_name),
resources.getString(R.string.user_guest),
getCarUserManager(appContext));
@@ -207,8 +214,17 @@
}
}
- private boolean switchProfile(@UserIdInt int userId) {
+ /**
+ * Switches to the given profile.
+ */
+ // TODO(b/186905050, b/205185521): add unit / robo test
+ public boolean switchProfile(@UserIdInt int userId) {
+ Log.i(TAG, "Switching to profile / user " + userId);
+
UserSwitchResult result = getResult("switch", mCarUserManager.switchUser(userId));
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Result: " + result);
+ }
return result != null && result.isSuccess();
}
@@ -332,8 +348,14 @@
*/
public boolean canCurrentProcessModifyAccounts() {
return !mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)
- && !mUserManager.isDemoUser()
- && !mUserManager.isGuestUser();
+ && !isDemoOrGuest();
+ }
+
+ /**
+ * Checks if the current process is demo or guest user.
+ */
+ public boolean isDemoOrGuest() {
+ return mUserManager.isDemoUser() || mUserManager.isGuestUser();
}
/**
@@ -457,4 +479,27 @@
public int getMaxSupportedRealProfiles() {
return getMaxSupportedProfiles() - getManagedProfilesCount();
}
+
+ /**
+ * When the Preference is disabled while still visible, {@code ActionDisabledByAdminDialog}
+ * should be shown when the action is disallowed by a device owner or a profile owner.
+ * Otherwise, a {@code Toast} will be shown to inform the user that the action is disabled.
+ */
+ public static void runClickableWhileDisabled(Context context,
+ FragmentController fragmentController) {
+ if (hasUserRestrictionByDpm(context, UserManager.DISALLOW_MODIFY_ACCOUNTS)) {
+ showActionDisabledByAdminDialog(context, fragmentController);
+ } else {
+ Toast.makeText(context, context.getString(R.string.action_unavailable),
+ Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private static void showActionDisabledByAdminDialog(Context context,
+ FragmentController fragmentController) {
+ fragmentController.showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(context,
+ UserManager.DISALLOW_MODIFY_ACCOUNTS),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
}
diff --git a/src/com/android/car/settings/profiles/ProfileIconProvider.java b/src/com/android/car/settings/profiles/ProfileIconProvider.java
index 82a8f48..fd48445 100644
--- a/src/com/android/car/settings/profiles/ProfileIconProvider.java
+++ b/src/com/android/car/settings/profiles/ProfileIconProvider.java
@@ -35,7 +35,8 @@
public class ProfileIconProvider {
// TODO (b/179802719) define this constant as MenuItem's attribute in 'Chassis' library
// Width of managed profile's badge in ratio to profile icon's width
- private static final float BADGE_WIDTH_TO_ICON_RATIO = 0.15f;
+ private static final float BADGE_WIDTH_TO_ICON_RATIO = 0.09f;
+ private static final float BADGE_PADDING = 1f;
/**
* Gets a scaled rounded icon for the given profile to use in settings. If a profile does
@@ -94,6 +95,7 @@
Drawable userIcon = getRoundedProfileIcon(userInfo, context);
UserAvatarView userAvatarView = new UserAvatarView(context);
userAvatarView.setBadgeDiameter(userIcon.getIntrinsicWidth() * BADGE_WIDTH_TO_ICON_RATIO);
+ userAvatarView.setBadgeMargin(BADGE_PADDING);
userAvatarView.setDrawableWithBadge(userIcon, userInfo.id);
return (Drawable) userAvatarView.getUserIconDrawable();
}
diff --git a/src/com/android/car/settings/profiles/ProfilesDialogProvider.java b/src/com/android/car/settings/profiles/ProfilesDialogProvider.java
index fad6224..502fc01 100644
--- a/src/com/android/car/settings/profiles/ProfilesDialogProvider.java
+++ b/src/com/android/car/settings/profiles/ProfilesDialogProvider.java
@@ -23,6 +23,7 @@
import com.android.car.settings.R;
import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.settingslib.utils.StringUtil;
/**
* Provides common Profiles-related ConfirmationDialogFragments to ensure consistency
@@ -87,8 +88,8 @@
Context context, int maxProfileLimit) {
return new ConfirmationDialogFragment.Builder(context)
.setTitle(R.string.user_limit_reached_title)
- .setMessage(context.getResources().getQuantityString(
- R.plurals.user_limit_reached_message, maxProfileLimit, maxProfileLimit))
+ .setMessage(StringUtil.getIcuPluralsString(context, maxProfileLimit,
+ R.string.user_limit_reached_message))
.setPositiveButton(android.R.string.ok, /* confirmListener= */ null)
.build();
}
diff --git a/src/com/android/car/settings/profiles/RemoveProfileHandler.java b/src/com/android/car/settings/profiles/RemoveProfileHandler.java
index b198a33..fd5aec1 100644
--- a/src/com/android/car/settings/profiles/RemoveProfileHandler.java
+++ b/src/com/android/car/settings/profiles/RemoveProfileHandler.java
@@ -16,16 +16,28 @@
package com.android.car.settings.profiles;
+import static android.os.UserManager.DISALLOW_REMOVE_USER;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
+
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
+import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
+import com.android.car.settings.R;
import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.ErrorDialog;
import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
/**
* Consolidates profile removal logic into one handler so we can have consistent logic across
@@ -100,9 +112,42 @@
* @return True if the profile can be deleted by the current active profile. False otherwise.
*/
public boolean canRemoveProfile(UserInfo userInfo) {
- return !mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)
- && userInfo.id != UserHandle.USER_SYSTEM
- && !mUserManager.isDemoUser();
+ return !mUserManager.hasUserRestriction(DISALLOW_REMOVE_USER)
+ && !isSystemOrDemoUser(userInfo);
+ }
+
+ /**
+ * Checks to see if the current active profile is {@code USER_SYSTEM} or has user type
+ * {@code USER_TYPE_FULL_DEMO}
+ */
+ public boolean isSystemOrDemoUser(UserInfo userInfo) {
+ return userInfo.id == UserHandle.USER_SYSTEM
+ || mUserManager.isDemoUser();
+ }
+
+ /**
+ * Returns {@code PreferenceController.AVAILABLE} when preference should be available,
+ * {@code PreferenceController.DISABLED_FOR_PROFILE} when preference should be unavailable,
+ * {@code PreferenceController.AVAILABLE_FOR_VIEWING} when preference is visible but
+ * disabled.
+ *
+ * @param context to get user restriction
+ * @param userInfo target user to check
+ * @param availableForCurrentProcessUser when true, only available for current user process.
+ * When false, disabled for current user process.
+ */
+ public int getAvailabilityStatus(Context context, UserInfo userInfo,
+ boolean availableForCurrentProcessUser) {
+ boolean allowCurrentProcess =
+ !(availableForCurrentProcessUser ^ mProfileHelper.isCurrentProcessUser(userInfo));
+ if (canRemoveProfile(userInfo) && allowCurrentProcess) {
+ return AVAILABLE;
+ }
+ if (!allowCurrentProcess || isSystemOrDemoUser(userInfo)
+ || hasUserRestrictionByUm(context, DISALLOW_REMOVE_USER)) {
+ return DISABLED_FOR_PROFILE;
+ }
+ return AVAILABLE_FOR_VIEWING;
}
/**
@@ -129,4 +174,24 @@
mFragmentController.showDialog(dialogFragment, REMOVE_PROFILE_DIALOG_TAG);
}
+ /**
+ * When the Preference is disabled while still visible, {@code ActionDisabledByAdminDialog}
+ * should be shown when the action is disallowed by a device owner or a profile owner.
+ * Otherwise, a {@code Toast} will be shown to inform the user that the action is disabled.
+ */
+ public void runClickableWhileDisabled() {
+ if (hasUserRestrictionByDpm(mContext, DISALLOW_REMOVE_USER)) {
+ showActionDisabledByAdminDialog();
+ } else {
+ Toast.makeText(mContext, mContext.getString(R.string.action_unavailable),
+ Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private void showActionDisabledByAdminDialog() {
+ mFragmentController.showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(mContext,
+ DISALLOW_REMOVE_USER),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
}
diff --git a/src/com/android/car/settings/qc/AdaptiveBrightnessSwitch.java b/src/com/android/car/settings/qc/AdaptiveBrightnessSwitch.java
new file mode 100644
index 0000000..e543425
--- /dev/null
+++ b/src/com/android/car/settings/qc/AdaptiveBrightnessSwitch.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
+import static com.android.car.settings.qc.SettingsQCRegistry.ADAPTIVE_BRIGHTNESS_SWITCH_URI;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.provider.Settings;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+/**
+ * QCItem for toggling adaptive brightness.
+ */
+public class AdaptiveBrightnessSwitch extends SettingsQCItem {
+ public AdaptiveBrightnessSwitch(Context context) {
+ super(context);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ if (!supportsAdaptiveBrightness()) {
+ return null;
+ }
+ QCActionItem actionItem = new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH)
+ .setChecked(isAdaptiveBrightnessEnabled())
+ .setAction(getBroadcastIntent())
+ .build();
+
+ QCList.Builder listBuilder = new QCList.Builder()
+ .addRow(new QCRow.Builder()
+ .setTitle(getContext().getString(R.string.auto_brightness_title))
+ .addEndItem(actionItem)
+ .build()
+ );
+ return listBuilder.build();
+ }
+
+ @Override
+ Uri getUri() {
+ return ADAPTIVE_BRIGHTNESS_SWITCH_URI;
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ boolean newState = intent.getBooleanExtra(QC_ACTION_TOGGLE_STATE,
+ !isAdaptiveBrightnessEnabled());
+ Settings.System.putInt(getContext().getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ newState ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
+ : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+ }
+
+ private boolean isAdaptiveBrightnessEnabled() {
+ int brightnessMode = Settings.System.getInt(getContext().getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+ return brightnessMode != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
+ }
+
+ @VisibleForTesting
+ boolean supportsAdaptiveBrightness() {
+ return getContext().getResources().getBoolean(R.bool.config_automatic_brightness_available);
+ }
+}
diff --git a/src/com/android/car/settings/qc/BaseVolumeSlider.java b/src/com/android/car/settings/qc/BaseVolumeSlider.java
new file mode 100644
index 0000000..4ea5431
--- /dev/null
+++ b/src/com/android/car/settings/qc/BaseVolumeSlider.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.car.media.CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING;
+import static android.car.media.CarAudioManager.PRIMARY_AUDIO_ZONE;
+
+import static com.android.car.qc.QCItem.QC_ACTION_SLIDER_VALUE;
+
+import android.app.PendingIntent;
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.media.CarAudioManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.os.Bundle;
+import android.util.SparseArray;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.qc.QCSlider;
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.sound.VolumeItemParser;
+
+/**
+ * Base class for showing a volume slider quick control view.
+ * Extended classes should override {@link #getUsages} and specify the array of audio usages that
+ * should be shown as part of the quick control.
+ */
+public abstract class BaseVolumeSlider extends SettingsQCItem {
+ static final int QC_VOLUME_SELF_CHANGE = 7919;
+ @VisibleForTesting
+ static final String EXTRA_GROUP_ID = "QC_VOLUME_EXTRA_GROUP_ID";
+ private static final Logger LOG = new Logger(BaseVolumeSlider.class);
+
+ private final SparseArray<VolumeItemParser.VolumeItem> mVolumeItems;
+ private Car mCar;
+ private CarAudioManager mCarAudioManager;
+
+ public BaseVolumeSlider(Context context) {
+ super(context);
+ mVolumeItems = VolumeItemParser.loadAudioUsageItems(context, carVolumeItemsXml());
+ }
+
+ protected abstract int[] getUsages();
+
+ @Override
+ QCItem getQCItem() {
+ if (!initializeCarAudioManager()) {
+ return null;
+ }
+
+ QCList.Builder listBuilder = new QCList.Builder();
+ for (int usage : getUsages()) {
+ VolumeItemParser.VolumeItem volumeItem = mVolumeItems.get(usage);
+ int groupId = mCarAudioManager.getVolumeGroupIdForUsage(usage);
+ int min = mCarAudioManager.getGroupMinVolume(groupId);
+ int max = mCarAudioManager.getGroupMaxVolume(groupId);
+ int value = mCarAudioManager.getGroupVolume(groupId);
+ int iconResId = volumeItem.getIcon();
+ if (mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_VOLUME_GROUP_MUTING)
+ && mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId)) {
+ iconResId = volumeItem.getMuteIcon();
+ }
+ listBuilder.addRow(new QCRow.Builder()
+ .setTitle(getContext().getString(volumeItem.getTitle()))
+ .setIcon(Icon.createWithResource(getContext(), iconResId))
+ .addSlider(new QCSlider.Builder()
+ .setMin(min)
+ .setMax(max)
+ .setValue(value)
+ .setInputAction(createSliderAction(groupId))
+ .build()
+ )
+ .build()
+ );
+ }
+
+ cleanupCarAudioManager();
+ return listBuilder.build();
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ int value = intent.getIntExtra(QC_ACTION_SLIDER_VALUE, Integer.MIN_VALUE);
+ int groupId = intent.getIntExtra(EXTRA_GROUP_ID, Integer.MIN_VALUE);
+ if (value == Integer.MIN_VALUE || groupId == Integer.MIN_VALUE) {
+ return;
+ }
+ if (!initializeCarAudioManager()) {
+ return;
+ }
+ setGroupVolume(groupId, value);
+ cleanupCarAudioManager();
+ }
+
+ /**
+ * The resource which lists the car volume resources associated with the various usage enums.
+ */
+ @XmlRes
+ protected int carVolumeItemsXml() {
+ return R.xml.car_volume_items;
+ }
+
+ /**
+ * Initializes the CarAudioManager instance.
+ * @return true if the CarAudioManager was successfully initialized, false otherwise.
+ */
+ private boolean initializeCarAudioManager() {
+ mCar = Car.createCar(getContext());
+ mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
+ if (mCarAudioManager == null) {
+ cleanupCarAudioManager();
+ return false;
+ }
+ return true;
+ }
+
+ private void cleanupCarAudioManager() {
+ if (mCar != null) {
+ mCar.disconnect();
+ }
+ mCar = null;
+ mCarAudioManager = null;
+ }
+
+ private PendingIntent createSliderAction(int groupId) {
+ Bundle extras = new Bundle();
+ extras.putInt(EXTRA_GROUP_ID, groupId);
+ return getBroadcastIntent(extras, groupId);
+ }
+
+ private void setGroupVolume(int volumeGroupId, int newVolume) {
+ try {
+ mCarAudioManager.setGroupVolume(volumeGroupId, newVolume, QC_VOLUME_SELF_CHANGE);
+ } catch (CarNotConnectedException e) {
+ LOG.w("Ignoring volume change event because the car isn't connected", e);
+ }
+ }
+}
diff --git a/src/com/android/car/settings/qc/BaseVolumeSliderWorker.java b/src/com/android/car/settings/qc/BaseVolumeSliderWorker.java
new file mode 100644
index 0000000..3ddacec
--- /dev/null
+++ b/src/com/android/car/settings/qc/BaseVolumeSliderWorker.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.car.media.CarAudioManager.PRIMARY_AUDIO_ZONE;
+
+import static com.android.car.settings.qc.BaseVolumeSlider.QC_VOLUME_SELF_CHANGE;
+
+import android.car.Car;
+import android.car.media.CarAudioManager;
+import android.content.Context;
+import android.net.Uri;
+
+import java.io.IOException;
+
+/**
+ * Base worker class for {@link BaseVolumeSlider} instances.
+ * @param <E> QCItem class that extends {@link BaseVolumeSlider}
+ */
+public abstract class BaseVolumeSliderWorker<E extends BaseVolumeSlider>
+ extends SettingsQCBackgroundWorker<E> {
+ private final Car mCar;
+ private CarAudioManager mCarAudioManager;
+
+ private final CarAudioManager.CarVolumeCallback mVolumeChangeCallback =
+ new CarAudioManager.CarVolumeCallback() {
+ @Override
+ public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {
+ if (flags != QC_VOLUME_SELF_CHANGE) {
+ updateVolumeAndMute(zoneId, groupId);
+ }
+ }
+
+ @Override
+ public void onMasterMuteChanged(int zoneId, int flags) {
+ // Mute is not being used yet
+ }
+
+ @Override
+ public void onGroupMuteChanged(int zoneId, int groupId, int flags) {
+ if (flags != QC_VOLUME_SELF_CHANGE) {
+ updateVolumeAndMute(zoneId, groupId);
+ }
+
+ }
+ };
+
+ public BaseVolumeSliderWorker(Context context, Uri uri) {
+ super(context, uri);
+ mCar = Car.createCar(getContext());
+ mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
+ }
+
+ protected abstract int[] getUsages();
+
+ @Override
+ protected void onQCItemSubscribe() {
+ if (mCarAudioManager != null) {
+ mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
+ }
+ }
+
+ @Override
+ protected void onQCItemUnsubscribe() {
+ if (mCarAudioManager != null) {
+ mCarAudioManager.unregisterCarVolumeCallback(mVolumeChangeCallback);
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ mCar.disconnect();
+ mCarAudioManager = null;
+ }
+
+ private void updateVolumeAndMute(int zoneId, int groupId) {
+ // Settings only handles primary zone changes
+ if (zoneId != PRIMARY_AUDIO_ZONE) {
+ return;
+ }
+ if (mCarAudioManager != null) {
+ for (int usage : getUsages()) {
+ if (mCarAudioManager.getVolumeGroupIdForUsage(usage) == groupId) {
+ notifyQCItemChange();
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/src/com/android/car/settings/qc/BluetoothSwitch.java b/src/com/android/car/settings/qc/BluetoothSwitch.java
new file mode 100644
index 0000000..ba308ed
--- /dev/null
+++ b/src/com/android/car/settings/qc/BluetoothSwitch.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+/**
+ * Bluetooth Switch QCItem.
+ */
+public class BluetoothSwitch extends SettingsQCItem {
+
+ public BluetoothSwitch(Context context) {
+ super(context);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ QCActionItem actionItem = new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH)
+ .setChecked(isBluetoothOn())
+ .setAction(getBroadcastIntent())
+ .build();
+
+ QCList.Builder listBuilder = new QCList.Builder()
+ .addRow(new QCRow.Builder()
+ .setTitle(getContext().getString(R.string.bluetooth_settings_title))
+ .addEndItem(actionItem)
+ .build()
+ );
+ return listBuilder.build();
+ }
+
+ @Override
+ Uri getUri() {
+ return SettingsQCRegistry.BLUETOOTH_SWITCH_URI;
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ boolean newState = intent.getBooleanExtra(QC_ACTION_TOGGLE_STATE, !isBluetoothOn());
+ if (newState) {
+ BluetoothAdapter.getDefaultAdapter().enable();
+ } else {
+ BluetoothAdapter.getDefaultAdapter().disable();
+ }
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return BluetoothSwitchWorker.class;
+ }
+
+ private boolean isBluetoothOn() {
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ return adapter.getState() == BluetoothAdapter.STATE_ON
+ || adapter.getState() == BluetoothAdapter.STATE_TURNING_ON;
+ }
+}
diff --git a/src/com/android/car/settings/qc/BluetoothSwitchWorker.java b/src/com/android/car/settings/qc/BluetoothSwitchWorker.java
new file mode 100644
index 0000000..c75f0c7
--- /dev/null
+++ b/src/com/android/car/settings/qc/BluetoothSwitchWorker.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.Uri;
+
+import java.io.IOException;
+
+/**
+ * Background worker for the {@link BluetoothSwitch} QCItem.
+ */
+public class BluetoothSwitchWorker extends SettingsQCBackgroundWorker<BluetoothSwitch> {
+
+ private boolean mReceiverRegistered;
+ private final IntentFilter mIntentFilter = new IntentFilter(
+ BluetoothAdapter.ACTION_STATE_CHANGED);
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ notifyQCItemChange();
+ }
+ };
+
+ public BluetoothSwitchWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+
+ @Override
+ protected void onQCItemSubscribe() {
+ if (!mReceiverRegistered) {
+ getContext().registerReceiver(mReceiver, mIntentFilter);
+ mReceiverRegistered = true;
+ }
+ }
+
+ @Override
+ protected void onQCItemUnsubscribe() {
+ unregisterBluetoothReceiver();
+ }
+
+ @Override
+ public void close() throws IOException {
+ unregisterBluetoothReceiver();
+ }
+
+ private void unregisterBluetoothReceiver() {
+ if (mReceiverRegistered) {
+ getContext().unregisterReceiver(mReceiver);
+ mReceiverRegistered = false;
+ }
+ }
+}
diff --git a/src/com/android/car/settings/qc/BrightnessSlider.java b/src/com/android/car/settings/qc/BrightnessSlider.java
new file mode 100644
index 0000000..efaa820
--- /dev/null
+++ b/src/com/android/car/settings/qc/BrightnessSlider.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_SLIDER_VALUE;
+import static com.android.car.settings.qc.SettingsQCRegistry.BRIGHTNESS_SLIDER_URI;
+import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
+import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
+import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.qc.QCSlider;
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+
+/**
+ * QCItem for showing a brightness slider.
+ */
+public class BrightnessSlider extends SettingsQCItem {
+ private static final Logger LOG = new Logger(BrightnessSlider.class);
+ private final int mMaximumBacklight;
+ private final int mMinimumBacklight;
+
+ public BrightnessSlider(Context context) {
+ super(context);
+ PowerManager powerManager = context.getSystemService(PowerManager.class);
+ mMaximumBacklight = powerManager.getMaximumScreenBrightnessSetting();
+ mMinimumBacklight = powerManager.getMinimumScreenBrightnessSetting();
+ }
+
+ @Override
+ QCItem getQCItem() {
+ QCList.Builder listBuilder = new QCList.Builder()
+ .addRow(getBrightnessRowBuilder().build());
+
+ return listBuilder.build();
+ }
+
+ @Override
+ Uri getUri() {
+ return BRIGHTNESS_SLIDER_URI;
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ int value = intent.getIntExtra(QC_ACTION_SLIDER_VALUE, Integer.MIN_VALUE);
+ if (value == Integer.MIN_VALUE) {
+ return;
+ }
+ int linear = convertGammaToLinear(value, mMinimumBacklight, mMaximumBacklight);
+ Settings.System.putIntForUser(getContext().getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS, linear, UserHandle.myUserId());
+ }
+
+ protected QCRow.Builder getBrightnessRowBuilder() {
+ return new QCRow.Builder()
+ .setTitle(getContext().getString(R.string.qc_display_brightness))
+ .addSlider(new QCSlider.Builder()
+ .setMax(GAMMA_SPACE_MAX)
+ .setValue(getSeekbarValue())
+ .setInputAction(getBroadcastIntent())
+ .build()
+ );
+ }
+
+ private int getSeekbarValue() {
+ int gamma = GAMMA_SPACE_MAX;
+ try {
+ int linear = Settings.System.getIntForUser(getContext().getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS, UserHandle.myUserId());
+ gamma = convertLinearToGamma(linear, mMinimumBacklight, mMaximumBacklight);
+ } catch (Settings.SettingNotFoundException e) {
+ LOG.w("Can't find setting for SCREEN_BRIGHTNESS.");
+ }
+ return gamma;
+ }
+}
diff --git a/src/com/android/car/settings/qc/BrightnessSliderWithIcon.java b/src/com/android/car/settings/qc/BrightnessSliderWithIcon.java
new file mode 100644
index 0000000..dd67494
--- /dev/null
+++ b/src/com/android/car/settings/qc/BrightnessSliderWithIcon.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.settings.qc.SettingsQCRegistry.BRIGHTNESS_SLIDER_WITH_ICON_URI;
+
+import android.content.Context;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+/**
+ * {@link BrightnessSlider} with an additional start icon.
+ */
+public class BrightnessSliderWithIcon extends BrightnessSlider {
+ public BrightnessSliderWithIcon(Context context) {
+ super(context);
+ }
+
+ @Override
+ Uri getUri() {
+ return BRIGHTNESS_SLIDER_WITH_ICON_URI;
+ }
+
+ @Override
+ protected QCRow.Builder getBrightnessRowBuilder() {
+ QCRow.Builder builder = super.getBrightnessRowBuilder();
+ builder.setIcon(Icon.createWithResource(getContext(), R.drawable.ic_qc_brightness));
+ return builder;
+ }
+}
diff --git a/src/com/android/car/settings/qc/CallVolumeSlider.java b/src/com/android/car/settings/qc/CallVolumeSlider.java
new file mode 100644
index 0000000..5042dc0
--- /dev/null
+++ b/src/com/android/car/settings/qc/CallVolumeSlider.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.media.AudioAttributes.USAGE_VOICE_COMMUNICATION;
+
+import static com.android.car.settings.qc.SettingsQCRegistry.CALL_VOLUME_SLIDER_URI;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Quick control for showing a in-call volume slider.
+ */
+public class CallVolumeSlider extends BaseVolumeSlider {
+ public CallVolumeSlider(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected int[] getUsages() {
+ return new int[]{USAGE_VOICE_COMMUNICATION};
+ }
+
+ @Override
+ Uri getUri() {
+ return CALL_VOLUME_SLIDER_URI;
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return CallVolumeSliderWorker.class;
+ }
+}
diff --git a/src/com/android/car/settings/qc/CallVolumeSliderWorker.java b/src/com/android/car/settings/qc/CallVolumeSliderWorker.java
new file mode 100644
index 0000000..aa45680
--- /dev/null
+++ b/src/com/android/car/settings/qc/CallVolumeSliderWorker.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.media.AudioAttributes.USAGE_VOICE_COMMUNICATION;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Background worker for the {@link CallVolumeSlider} QCItem.
+ */
+public class CallVolumeSliderWorker extends BaseVolumeSliderWorker<CallVolumeSlider> {
+ public CallVolumeSliderWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+
+ @Override
+ protected int[] getUsages() {
+ return new int[]{USAGE_VOICE_COMMUNICATION};
+ }
+}
diff --git a/src/com/android/car/settings/qc/HotspotQCUtils.java b/src/com/android/car/settings/qc/HotspotQCUtils.java
new file mode 100644
index 0000000..ac4cf5b
--- /dev/null
+++ b/src/com/android/car/settings/qc/HotspotQCUtils.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.TetheringManager;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+
+import com.android.internal.util.ConcurrentUtils;
+
+/**
+ * Helper methods for hotspot related quick controls.
+ */
+public final class HotspotQCUtils {
+ private HotspotQCUtils() {
+ }
+
+ /**
+ * Returns whether or not hotspot is currently enabled.
+ */
+ public static boolean isHotspotEnabled(WifiManager wifiManager) {
+ int state = wifiManager.getWifiApState();
+ return state == WifiManager.WIFI_AP_STATE_ENABLED
+ || state == WifiManager.WIFI_AP_STATE_ENABLING;
+ }
+
+ /**
+ * Returns whether or not hotspot is currently busy.
+ */
+ public static boolean isHotspotBusy(WifiManager wifiManager) {
+ int state = wifiManager.getWifiApState();
+ return state == WifiManager.WIFI_AP_STATE_ENABLING
+ || state == WifiManager.WIFI_AP_STATE_DISABLING;
+ }
+
+ /**
+ * Helper method to enable tethering with {@link TetheringManager.StartTetheringCallback}
+ * on success or failure.
+ */
+ public static void enableHotspot(TetheringManager tetheringManager,
+ TetheringManager.StartTetheringCallback callback) {
+ tetheringManager.startTethering(ConnectivityManager.TETHERING_WIFI,
+ ConcurrentUtils.DIRECT_EXECUTOR, callback);
+ }
+
+ /**
+ * Helper method to disable tethering.
+ */
+ public static void disableHotspot(TetheringManager tetheringManager) {
+ tetheringManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
+ }
+
+ /**
+ * Helper method to get the default {@link TetheringManager.StartTetheringCallback} used by
+ * hotspot quick controls.
+ */
+ public static TetheringManager.StartTetheringCallback getDefaultStartTetheringCallback(
+ Context context, Uri uri) {
+ return new TetheringManager.StartTetheringCallback() {
+ @Override
+ public void onTetheringFailed(final int result) {
+ context.getContentResolver().notifyChange(uri, /* observer= */null);
+ }
+ };
+ }
+}
diff --git a/src/com/android/car/settings/qc/HotspotRow.java b/src/com/android/car/settings/qc/HotspotRow.java
new file mode 100644
index 0000000..2391bb7
--- /dev/null
+++ b/src/com/android/car/settings/qc/HotspotRow.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
+import static com.android.car.settings.qc.SettingsQCRegistry.HOTSPOT_ROW_URI;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.TetheringManager;
+import android.net.Uri;
+import android.net.wifi.SoftApConfiguration;
+import android.net.wifi.WifiManager;
+import android.text.TextUtils;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+/**
+ * QCItem for showing a hotspot row element.
+ * The row contains an icon, the status, and a switch to enable/disable hotspot.
+ */
+public class HotspotRow extends SettingsQCItem {
+ private final TetheringManager mTetheringManager;
+ private final WifiManager mWifiManager;
+ // Assume hotspot is available until notified otherwise.
+ private boolean mIsSupported = true;
+ private int mConnectedDevicesCount;
+
+ public HotspotRow(Context context) {
+ super(context);
+ mTetheringManager = context.getSystemService(TetheringManager.class);
+ mWifiManager = context.getSystemService(WifiManager.class);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ Icon icon = Icon.createWithResource(getContext(), R.drawable.ic_qc_hotspot);
+
+ QCActionItem hotpotToggle = new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH)
+ .setChecked(HotspotQCUtils.isHotspotEnabled(mWifiManager))
+ .setEnabled(!HotspotQCUtils.isHotspotBusy(mWifiManager))
+ .setAvailable(mIsSupported)
+ .setAction(getBroadcastIntent())
+ .build();
+
+ QCRow hotspotRow = new QCRow.Builder()
+ .setIcon(icon)
+ .setTitle(getContext().getString(R.string.hotspot_settings_title))
+ .setSubtitle(getSubtitle())
+ .addEndItem(hotpotToggle)
+ .build();
+
+ return new QCList.Builder()
+ .addRow(hotspotRow)
+ .build();
+ }
+
+ @Override
+ Uri getUri() {
+ return HOTSPOT_ROW_URI;
+ }
+
+ boolean getHotspotSupported() {
+ return mIsSupported;
+ }
+
+ void setHotspotSupported(boolean supported) {
+ mIsSupported = supported;
+ }
+
+ void setConnectedDevicesCount(int devicesCount) {
+ mConnectedDevicesCount = devicesCount;
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ boolean newState = intent.getBooleanExtra(QC_ACTION_TOGGLE_STATE,
+ !mWifiManager.isWifiApEnabled());
+ if (newState) {
+ HotspotQCUtils.enableHotspot(mTetheringManager,
+ HotspotQCUtils.getDefaultStartTetheringCallback(getContext(), getUri()));
+ } else {
+ HotspotQCUtils.disableHotspot(mTetheringManager);
+ }
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return HotspotRowWorker.class;
+ }
+
+ /** Returns the subtitle to be shown for the hotspot quick controls item.
+ * There are three different states that can be shown:
+ * - If tethering is disabled, return the off string.
+ * - If tethering is enabled but no devices are connected, return the ssid + password string.
+ * - If tethering is enabled and devices are connected, return the devices connected string.
+ */
+ private String getSubtitle() {
+ if (!HotspotQCUtils.isHotspotEnabled(mWifiManager)) {
+ return getContext().getString(R.string.wifi_hotspot_state_off);
+ }
+ if (mConnectedDevicesCount > 0) {
+ return getContext().getResources().getQuantityString(
+ R.plurals.wifi_tether_connected_summary, mConnectedDevicesCount,
+ mConnectedDevicesCount);
+ }
+ String subtitle = getHotspotSSID();
+ if (TextUtils.isEmpty(subtitle)) {
+ // If there currently is no SSID to show, use a default "On" string
+ return getContext().getString(R.string.car_ui_preference_switch_on);
+ }
+ String password = getHotspotPassword();
+ if (!TextUtils.isEmpty(password)) {
+ subtitle += " / " + password;
+ }
+ return subtitle;
+ }
+
+ private String getHotspotSSID() {
+ return mWifiManager.getSoftApConfiguration().getSsid();
+ }
+
+ private String getHotspotPassword() {
+ int securityType = mWifiManager.getSoftApConfiguration().getSecurityType();
+ if (securityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {
+ return null;
+ }
+ return mWifiManager.getSoftApConfiguration().getPassphrase();
+ }
+}
diff --git a/src/com/android/car/settings/qc/HotspotRowWorker.java b/src/com/android/car/settings/qc/HotspotRowWorker.java
new file mode 100644
index 0000000..8801a73
--- /dev/null
+++ b/src/com/android/car/settings/qc/HotspotRowWorker.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.net.TetheringManager;
+import android.net.Uri;
+import android.net.wifi.SoftApInfo;
+import android.net.wifi.WifiClient;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.Looper;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * Background worker for the {@link HotspotRow} QCItem.
+ */
+public class HotspotRowWorker extends SettingsQCBackgroundWorker<HotspotRow> {
+ private final WifiManager mWifiManager;
+ private final TetheringManager mTetheringManager;
+ private final Handler mHandler;
+ private boolean mCallbacksRegistered;
+
+ private final TetheringManager.TetheringEventCallback mTetheringEventCallback =
+ new TetheringManager.TetheringEventCallback() {
+ @Override
+ public void onTetheringSupported(boolean supported) {
+ if (getQCItem().getHotspotSupported() != supported) {
+ getQCItem().setHotspotSupported(supported);
+ notifyQCItemChange();
+ }
+ }
+ };
+
+ private final WifiManager.SoftApCallback mSoftApCallback = new WifiManager.SoftApCallback() {
+ @Override
+ public void onStateChanged(int state, int failureReason) {
+ notifyQCItemChange();
+ }
+
+ @Override
+ public void onConnectedClientsChanged(@NonNull SoftApInfo info,
+ @NonNull List<WifiClient> clients) {
+ getQCItem().setConnectedDevicesCount(clients.size());
+ notifyQCItemChange();
+ }
+ };
+
+ public HotspotRowWorker(Context context, Uri uri) {
+ super(context, uri);
+ mWifiManager = context.getSystemService(WifiManager.class);
+ mTetheringManager = context.getSystemService(TetheringManager.class);
+ mHandler = new Handler(Looper.getMainLooper());
+ }
+
+ @Override
+ protected void onQCItemSubscribe() {
+ if (!mCallbacksRegistered) {
+ mTetheringManager.registerTetheringEventCallback(
+ new HandlerExecutor(mHandler), mTetheringEventCallback);
+ mWifiManager.registerSoftApCallback(getContext().getMainExecutor(), mSoftApCallback);
+ mCallbacksRegistered = true;
+ }
+ }
+
+ @Override
+ protected void onQCItemUnsubscribe() {
+ unregisterCallbacks();
+ }
+
+ @Override
+ public void close() throws IOException {
+ unregisterCallbacks();
+ }
+
+ private void unregisterCallbacks() {
+ if (mCallbacksRegistered) {
+ mWifiManager.unregisterSoftApCallback(mSoftApCallback);
+ mTetheringManager.unregisterTetheringEventCallback(mTetheringEventCallback);
+ mCallbacksRegistered = false;
+ }
+ }
+}
diff --git a/src/com/android/car/settings/qc/HotspotTile.java b/src/com/android/car/settings/qc/HotspotTile.java
new file mode 100644
index 0000000..37715ef
--- /dev/null
+++ b/src/com/android/car/settings/qc/HotspotTile.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.settings.qc.SettingsQCRegistry.HOTSPOT_TILE_URI;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.TetheringManager;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCTile;
+import com.android.car.settings.R;
+
+/**
+ * QCItem for showing a hotspot toggle.
+ */
+public class HotspotTile extends SettingsQCItem {
+ private final TetheringManager mTetheringManager;
+ private final WifiManager mWifiManager;
+ // Assume hotspot is available until notified otherwise.
+ private boolean mIsSupported = true;
+
+ public HotspotTile(Context context) {
+ super(context);
+ mTetheringManager = context.getSystemService(TetheringManager.class);
+ mWifiManager = context.getSystemService(WifiManager.class);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ Icon actionIcon = Icon.createWithResource(getContext(), R.drawable.ic_qc_hotspot);
+
+ QCTile.Builder tileBuilder = new QCTile.Builder()
+ .setSubtitle(getContext().getString(R.string.hotspot_settings_title))
+ .setIcon(actionIcon)
+ .setChecked(HotspotQCUtils.isHotspotEnabled(mWifiManager))
+ .setEnabled(!HotspotQCUtils.isHotspotBusy(mWifiManager))
+ .setAvailable(mIsSupported)
+ .setAction(getBroadcastIntent());
+ return tileBuilder.build();
+ }
+
+ @Override
+ Uri getUri() {
+ return HOTSPOT_TILE_URI;
+ }
+
+ boolean getHotspotSupported() {
+ return mIsSupported;
+ }
+
+ void setHotspotSupported(boolean supported) {
+ mIsSupported = supported;
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ boolean newState = intent.getBooleanExtra(QC_ACTION_TOGGLE_STATE,
+ !mWifiManager.isWifiApEnabled());
+ if (newState) {
+ HotspotQCUtils.enableHotspot(mTetheringManager,
+ HotspotQCUtils.getDefaultStartTetheringCallback(getContext(), getUri()));
+ } else {
+ HotspotQCUtils.disableHotspot(mTetheringManager);
+ }
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return HotspotTileWorker.class;
+ }
+}
diff --git a/src/com/android/car/settings/qc/HotspotTileWorker.java b/src/com/android/car/settings/qc/HotspotTileWorker.java
new file mode 100644
index 0000000..6a8abd4
--- /dev/null
+++ b/src/com/android/car/settings/qc/HotspotTileWorker.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.TetheringManager;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.Looper;
+
+import java.io.IOException;
+
+/**
+ * Background worker for the {@link HotspotTile} QCItem.
+ */
+public class HotspotTileWorker extends SettingsQCBackgroundWorker<HotspotTile> {
+
+ private final WifiManager mWifiManager;
+ private final TetheringManager mTetheringManager;
+ private final Handler mHandler;
+ private boolean mCallbacksRegistered;
+
+ private final TetheringManager.TetheringEventCallback mTetheringEventCallback =
+ new TetheringManager.TetheringEventCallback() {
+ @Override
+ public void onTetheringSupported(boolean supported) {
+ if (getQCItem().getHotspotSupported() != supported) {
+ getQCItem().setHotspotSupported(supported);
+ notifyQCItemChange();
+ }
+ }
+ };
+
+ private final WifiManager.SoftApCallback mSoftApCallback = new WifiManager.SoftApCallback() {
+ @Override
+ public void onStateChanged(int state, int failureReason) {
+ notifyQCItemChange();
+ }
+ };
+
+ public HotspotTileWorker(Context context, Uri uri) {
+ super(context, uri);
+ mWifiManager = context.getSystemService(WifiManager.class);
+ mTetheringManager = context.getSystemService(TetheringManager.class);
+ mHandler = new Handler(Looper.getMainLooper());
+ }
+
+ @Override
+ protected void onQCItemSubscribe() {
+ if (!mCallbacksRegistered) {
+ mTetheringManager.registerTetheringEventCallback(
+ new HandlerExecutor(mHandler), mTetheringEventCallback);
+ mWifiManager.registerSoftApCallback(getContext().getMainExecutor(), mSoftApCallback);
+ mCallbacksRegistered = true;
+ }
+ }
+
+ @Override
+ protected void onQCItemUnsubscribe() {
+ unregisterCallbacks();
+ }
+
+ @Override
+ public void close() throws IOException {
+ unregisterCallbacks();
+ }
+
+ private void unregisterCallbacks() {
+ if (mCallbacksRegistered) {
+ mWifiManager.unregisterSoftApCallback(mSoftApCallback);
+ mTetheringManager.unregisterTetheringEventCallback(mTetheringEventCallback);
+ mCallbacksRegistered = false;
+ }
+ }
+}
diff --git a/src/com/android/car/settings/qc/MediaVolumeSlider.java b/src/com/android/car/settings/qc/MediaVolumeSlider.java
new file mode 100644
index 0000000..1d440f7
--- /dev/null
+++ b/src/com/android/car/settings/qc/MediaVolumeSlider.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.media.AudioAttributes.USAGE_MEDIA;
+
+import static com.android.car.settings.qc.SettingsQCRegistry.MEDIA_VOLUME_SLIDER_URI;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Quick control for showing a media volume slider.
+ */
+public class MediaVolumeSlider extends BaseVolumeSlider {
+ public MediaVolumeSlider(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected int[] getUsages() {
+ return new int[]{USAGE_MEDIA};
+ }
+
+ @Override
+ Uri getUri() {
+ return MEDIA_VOLUME_SLIDER_URI;
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return MediaVolumeSliderWorker.class;
+ }
+}
diff --git a/src/com/android/car/settings/qc/MediaVolumeSliderWorker.java b/src/com/android/car/settings/qc/MediaVolumeSliderWorker.java
new file mode 100644
index 0000000..e1539bd
--- /dev/null
+++ b/src/com/android/car/settings/qc/MediaVolumeSliderWorker.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.media.AudioAttributes.USAGE_MEDIA;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Background worker for the {@link MediaVolumeSlider} QCItem.
+ */
+public class MediaVolumeSliderWorker extends BaseVolumeSliderWorker<MediaVolumeSlider> {
+
+ public MediaVolumeSliderWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+
+ @Override
+ protected int[] getUsages() {
+ return new int[]{USAGE_MEDIA};
+ }
+}
diff --git a/src/com/android/car/settings/qc/MobileDataBaseWorker.java b/src/com/android/car/settings/qc/MobileDataBaseWorker.java
new file mode 100644
index 0000000..351c0bf
--- /dev/null
+++ b/src/com/android/car/settings/qc/MobileDataBaseWorker.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+import android.telephony.SignalStrength;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
+
+import java.io.IOException;
+
+/**
+ * Base background worker for mobile data QCItems.
+ * @param <E> The {@link SettingsQCItem} the background worker is associated with.
+ */
+public abstract class MobileDataBaseWorker<E extends SettingsQCItem>
+ extends SettingsQCBackgroundWorker<E> {
+
+ private final TelephonyManager mTelephonyManager;
+ private final int mSubId;
+ private final SignalStrengthsListener mSignalStrengthsListener;
+ private boolean mCallbacksRegistered;
+
+ private final ContentObserver mMobileDataChangeObserver = new ContentObserver(
+ new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+ notifyQCItemChange();
+ }
+ };
+
+ protected MobileDataBaseWorker(Context context, Uri uri) {
+ super(context, uri);
+ mTelephonyManager = context.getSystemService(TelephonyManager.class);
+ mSubId = SubscriptionManager.getDefaultDataSubscriptionId();
+ mSignalStrengthsListener = new SignalStrengthsListener();
+ }
+
+ @Override
+ protected void onQCItemSubscribe() {
+ if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID && !mCallbacksRegistered) {
+ mTelephonyManager.registerTelephonyCallback(getContext().getMainExecutor(),
+ mSignalStrengthsListener);
+ getContext().getContentResolver().registerContentObserver(getObservableUri(mSubId),
+ /* notifyForDescendants= */ false, mMobileDataChangeObserver);
+ mCallbacksRegistered = true;
+ }
+ }
+
+ @Override
+ protected void onQCItemUnsubscribe() {
+ if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ unregisterCallbacks();
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ unregisterCallbacks();
+ }
+ }
+
+ private void unregisterCallbacks() {
+ if (mCallbacksRegistered) {
+ mTelephonyManager.unregisterTelephonyCallback(mSignalStrengthsListener);
+ getContext().getContentResolver().unregisterContentObserver(mMobileDataChangeObserver);
+ mCallbacksRegistered = false;
+ }
+ }
+
+ private Uri getObservableUri(int subId) {
+ Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA);
+ if (TelephonyManager.from(getContext()).getSimCount() != 1) {
+ uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + subId);
+ }
+ return uri;
+ }
+
+ private class SignalStrengthsListener extends TelephonyCallback
+ implements TelephonyCallback.SignalStrengthsListener {
+
+ @Override
+ public void onSignalStrengthsChanged(SignalStrength signalStrength) {
+ notifyQCItemChange();
+ }
+ }
+}
diff --git a/src/com/android/car/settings/qc/MobileDataRow.java b/src/com/android/car/settings/qc/MobileDataRow.java
new file mode 100644
index 0000000..48e7473
--- /dev/null
+++ b/src/com/android/car/settings/qc/MobileDataRow.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
+import static com.android.car.settings.qc.SettingsQCRegistry.MOBILE_DATA_ROW_URI;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+import com.android.settingslib.net.DataUsageController;
+
+/**
+ * QCItem for showing a mobile data row element.
+ * The row contains a data icon, the current default network name, and a switch
+ * to enable/disable mobile data.
+ */
+public class MobileDataRow extends SettingsQCItem {
+ private final DataUsageController mDataUsageController;
+
+ public MobileDataRow(Context context) {
+ super(context);
+ mDataUsageController = getDataUsageController(context);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ if (!mDataUsageController.isMobileDataSupported()) {
+ return null;
+ }
+ TelephonyManager manager = getContext().getSystemService(TelephonyManager.class);
+ String subtitle = manager != null ? manager.getNetworkOperatorName() : null;
+ if (TextUtils.isEmpty(subtitle)) {
+ subtitle = null;
+ }
+ Icon icon = MobileNetworkQCUtils.getMobileNetworkSignalIcon(getContext());
+
+ QCActionItem dataToggle = new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH)
+ .setChecked(mDataUsageController.isMobileDataEnabled())
+ .setAction(getBroadcastIntent())
+ .build();
+
+ QCRow dataRow = new QCRow.Builder()
+ .setTitle(getContext().getString(R.string.mobile_network_settings))
+ .setSubtitle(subtitle)
+ .setIcon(icon)
+ .addEndItem(dataToggle)
+ .build();
+
+ return new QCList.Builder()
+ .addRow(dataRow)
+ .build();
+ }
+
+ @Override
+ Uri getUri() {
+ return MOBILE_DATA_ROW_URI;
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ boolean newState = intent.getBooleanExtra(QC_ACTION_TOGGLE_STATE,
+ !mDataUsageController.isMobileDataEnabled());
+ mDataUsageController.setMobileDataEnabled(newState);
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return MobileDataRowWorker.class;
+ }
+
+ @VisibleForTesting
+ DataUsageController getDataUsageController(Context context) {
+ return new DataUsageController(context);
+ }
+}
diff --git a/src/com/android/car/settings/qc/MobileDataRowWorker.java b/src/com/android/car/settings/qc/MobileDataRowWorker.java
new file mode 100644
index 0000000..9b75540
--- /dev/null
+++ b/src/com/android/car/settings/qc/MobileDataRowWorker.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Background worker for the {@link MobileDataRow} QCItem.
+ */
+public class MobileDataRowWorker extends MobileDataBaseWorker<MobileDataRow> {
+
+ public MobileDataRowWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+}
diff --git a/src/com/android/car/settings/qc/MobileDataTile.java b/src/com/android/car/settings/qc/MobileDataTile.java
new file mode 100644
index 0000000..34bb86e
--- /dev/null
+++ b/src/com/android/car/settings/qc/MobileDataTile.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.settings.qc.SettingsQCRegistry.MOBILE_DATA_TILE_URI;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCTile;
+import com.android.car.settings.R;
+import com.android.settingslib.net.DataUsageController;
+
+/**
+ * QCItem for showing a mobile data toggle.
+ */
+public class MobileDataTile extends SettingsQCItem {
+
+ private final DataUsageController mDataUsageController;
+
+ public MobileDataTile(Context context) {
+ super(context);
+ mDataUsageController = getDataUsageController(context);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ if (!mDataUsageController.isMobileDataSupported()) {
+ return null;
+ }
+ TelephonyManager manager = getContext().getSystemService(TelephonyManager.class);
+ String subtitle = manager.getNetworkOperatorName();
+ if (TextUtils.isEmpty(subtitle)) {
+ subtitle = getContext().getString(R.string.mobile_network_toggle_title);
+ }
+ Icon icon = MobileNetworkQCUtils.getMobileNetworkSignalIcon(getContext());
+
+ return new QCTile.Builder()
+ .setIcon(icon)
+ .setChecked(mDataUsageController.isMobileDataEnabled())
+ .setAction(getBroadcastIntent())
+ .setSubtitle(subtitle)
+ .build();
+ }
+
+ @Override
+ Uri getUri() {
+ return MOBILE_DATA_TILE_URI;
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ boolean newState = intent.getBooleanExtra(QC_ACTION_TOGGLE_STATE,
+ !mDataUsageController.isMobileDataEnabled());
+ mDataUsageController.setMobileDataEnabled(newState);
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return MobileDataTileWorker.class;
+ }
+
+ @VisibleForTesting
+ DataUsageController getDataUsageController(Context context) {
+ return new DataUsageController(context);
+ }
+}
diff --git a/src/com/android/car/settings/qc/MobileDataTileWorker.java b/src/com/android/car/settings/qc/MobileDataTileWorker.java
new file mode 100644
index 0000000..dea8f08
--- /dev/null
+++ b/src/com/android/car/settings/qc/MobileDataTileWorker.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Background worker for the {@link MobileDataTile} QCItem.
+ */
+public class MobileDataTileWorker extends MobileDataBaseWorker<MobileDataTile> {
+
+ public MobileDataTileWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+}
diff --git a/src/com/android/car/settings/qc/MobileNetworkQCUtils.java b/src/com/android/car/settings/qc/MobileNetworkQCUtils.java
new file mode 100644
index 0000000..71d6acc
--- /dev/null
+++ b/src/com/android/car/settings/qc/MobileNetworkQCUtils.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.graphics.drawable.LayerDrawable;
+import android.telephony.SignalStrength;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+import android.view.Gravity;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.DrawableUtil;
+import com.android.settingslib.Utils;
+import com.android.settingslib.graph.SignalDrawable;
+import com.android.settingslib.net.SignalStrengthUtil;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Helper methods for Mobile network quick controls.
+ */
+public class MobileNetworkQCUtils {
+ private static final String TAG = "MobileNetworkQCUtils";
+ // Timeout for acquiring a signal drawable (in ms)
+ private static final long SIGNAL_DRAWABLE_TIMEOUT = 1000L;
+ private static final Drawable EMPTY_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);
+
+ private MobileNetworkQCUtils() {
+ }
+
+ /**
+ * Retrieve an icon representing the current network symbol.
+ */
+ public static Icon getMobileNetworkSignalIcon(Context context) {
+ // Set default drawable in case the SignalDrawable cannot be loaded
+ Drawable drawable = context.getDrawable(R.drawable.ic_qc_mobile_data);
+ try {
+ Semaphore lock = new Semaphore(/* permits= */0);
+ AtomicReference<Drawable> shared = new AtomicReference<>();
+ ThreadUtils.postOnMainThread(() -> {
+ shared.set(getSignalStrengthDrawable(context));
+ lock.release();
+ });
+ boolean success = lock.tryAcquire(SIGNAL_DRAWABLE_TIMEOUT, TimeUnit.MILLISECONDS);
+ if (success) {
+ drawable = shared.get();
+ } else {
+ Log.d(TAG, "Timed out getting signal drawable");
+ }
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Interrupted while obtaining signal drawable", e);
+ }
+
+ return DrawableUtil.createIconFromDrawable(drawable);
+ }
+
+ private static Drawable getSignalStrengthDrawable(Context context) {
+ TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
+ SignalStrength strength = telephonyManager.getSignalStrength();
+ int level = (strength == null) ? 0 : strength.getLevel();
+ int numLevels = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
+ if (SignalStrengthUtil.shouldInflateSignalStrength(context,
+ SubscriptionManager.getDefaultDataSubscriptionId())) {
+ level += 1;
+ numLevels += 1;
+ }
+ return createSignalDrawable(context, level, numLevels);
+ }
+
+ private static Drawable createSignalDrawable(Context context, int level, int numLevels) {
+ SignalDrawable signalDrawable = new SignalDrawable(context);
+ signalDrawable.setLevel(
+ SignalDrawable.getState(level, numLevels, /* cutOut= */ false));
+
+ Drawable[] layers = {EMPTY_DRAWABLE, signalDrawable};
+ int iconSize = context.getResources().getDimensionPixelSize(R.dimen.icon_size);
+
+ LayerDrawable icons = new LayerDrawable(layers);
+ // Set the network type icon at the top left
+ icons.setLayerGravity(/* index= */ 0, Gravity.TOP | Gravity.LEFT);
+ // Set the signal strength icon at the bottom right
+ icons.setLayerGravity(/* index= */ 1, Gravity.BOTTOM | Gravity.RIGHT);
+ icons.setLayerSize(/* index= */ 1, iconSize, iconSize);
+ icons.setTintList(Utils.getColorAttr(context, android.R.attr.colorControlNormal));
+ return icons;
+ }
+}
diff --git a/src/com/android/car/settings/qc/NavigationVolumeSlider.java b/src/com/android/car/settings/qc/NavigationVolumeSlider.java
new file mode 100644
index 0000000..80238c8
--- /dev/null
+++ b/src/com/android/car/settings/qc/NavigationVolumeSlider.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.media.AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
+
+import static com.android.car.settings.qc.SettingsQCRegistry.NAVIGATION_VOLUME_SLIDER_URI;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Quick control for showing a navigation volume slider.
+ */
+public class NavigationVolumeSlider extends BaseVolumeSlider {
+ public NavigationVolumeSlider(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected int[] getUsages() {
+ return new int[]{USAGE_ASSISTANCE_NAVIGATION_GUIDANCE};
+ }
+
+ @Override
+ Uri getUri() {
+ return NAVIGATION_VOLUME_SLIDER_URI;
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return NavigationVolumeSliderWorker.class;
+ }
+}
diff --git a/src/com/android/car/settings/qc/NavigationVolumeSliderWorker.java b/src/com/android/car/settings/qc/NavigationVolumeSliderWorker.java
new file mode 100644
index 0000000..4df2bbf
--- /dev/null
+++ b/src/com/android/car/settings/qc/NavigationVolumeSliderWorker.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.media.AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Background worker for the {@link NavigationVolumeSlider} QCItem.
+ */
+public class NavigationVolumeSliderWorker extends BaseVolumeSliderWorker<NavigationVolumeSlider> {
+ public NavigationVolumeSliderWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+
+ @Override
+ protected int[] getUsages() {
+ return new int[]{USAGE_ASSISTANCE_NAVIGATION_GUIDANCE};
+ }
+}
diff --git a/src/com/android/car/settings/qc/PairedBluetoothDevices.java b/src/com/android/car/settings/qc/PairedBluetoothDevices.java
new file mode 100644
index 0000000..7348168
--- /dev/null
+++ b/src/com/android/car/settings/qc/PairedBluetoothDevices.java
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.qc.QCItem.QC_TYPE_ACTION_TOGGLE;
+
+import android.app.PendingIntent;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.UserManager;
+
+import androidx.annotation.DrawableRes;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.bluetooth.BluetoothUtils;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.HidProfile;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * QCItem for showing paired bluetooth devices.
+ */
+public class PairedBluetoothDevices extends SettingsQCItem {
+ @VisibleForTesting
+ static final String EXTRA_DEVICE_KEY = "BT_EXTRA_DEVICE_KEY";
+ @VisibleForTesting
+ static final String EXTRA_BUTTON_TYPE = "BT_EXTRA_BUTTON_TYPE";
+ @VisibleForTesting
+ static final String BLUETOOTH_BUTTON = "BLUETOOTH_BUTTON";
+ @VisibleForTesting
+ static final String PHONE_BUTTON = "PHONE_BUTTON";
+ @VisibleForTesting
+ static final String MEDIA_BUTTON = "MEDIA_BUTTON";
+ private static final Logger LOG = new Logger(PairedBluetoothDevices.class);
+
+ private final LocalBluetoothManager mBluetoothManager;
+ private final UserManager mUserManager;
+ private final int mDeviceLimit;
+
+ public PairedBluetoothDevices(Context context) {
+ super(context);
+ mBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */ null);
+ mUserManager = UserManager.get(context);
+ mDeviceLimit = context.getResources().getInteger(
+ R.integer.config_qc_bluetooth_device_limit);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
+ || mUserManager.hasUserRestriction(DISALLOW_BLUETOOTH)
+ || mDeviceLimit == 0) {
+ return null;
+ }
+
+ QCList.Builder listBuilder = new QCList.Builder();
+
+ if (!BluetoothAdapter.getDefaultAdapter().isEnabled()) {
+ listBuilder.addRow(new QCRow.Builder()
+ .setIcon(Icon.createWithResource(getContext(),
+ R.drawable.ic_settings_bluetooth_disabled))
+ .setTitle(getContext().getString(R.string.qc_bluetooth_off_devices_info))
+ .build());
+ return listBuilder.build();
+ }
+
+ Collection<CachedBluetoothDevice> cachedDevices =
+ mBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy();
+
+ //TODO(b/198339129): Use BluetoothDeviceFilter.BONDED_DEVICE_FILTER
+ Set<BluetoothDevice> bondedDevices = mBluetoothManager.getBluetoothAdapter()
+ .getBondedDevices();
+
+ List<CachedBluetoothDevice> filteredDevices = new ArrayList<>();
+ for (CachedBluetoothDevice cachedDevice : cachedDevices) {
+ if (bondedDevices != null && bondedDevices.contains(cachedDevice.getDevice())) {
+ filteredDevices.add(cachedDevice);
+ }
+ }
+ filteredDevices.sort(Comparator.naturalOrder());
+
+ if (filteredDevices.isEmpty()) {
+ listBuilder.addRow(new QCRow.Builder()
+ .setIcon(Icon.createWithResource(getContext(),
+ R.drawable.ic_settings_bluetooth))
+ .setTitle(getContext().getString(R.string.qc_bluetooth_on_no_devices_info))
+ .build());
+ return listBuilder.build();
+ }
+
+ int i = 0;
+ int deviceLimit = mDeviceLimit >= 0 ? Math.min(mDeviceLimit, filteredDevices.size())
+ : filteredDevices.size();
+ for (int j = 0; j < deviceLimit; j++) {
+ CachedBluetoothDevice cachedDevice = filteredDevices.get(j);
+ listBuilder.addRow(new QCRow.Builder()
+ .setTitle(cachedDevice.getName())
+ .setSubtitle(getSubtitle(cachedDevice))
+ .setIcon(Icon.createWithResource(getContext(), getIconRes(cachedDevice)))
+ .addEndItem(createBluetoothButton(cachedDevice, i++))
+ .addEndItem(createPhoneButton(cachedDevice, i++))
+ .addEndItem(createMediaButton(cachedDevice, i++))
+ .build()
+ );
+ }
+
+ return listBuilder.build();
+ }
+
+ @Override
+ Uri getUri() {
+ return SettingsQCRegistry.PAIRED_BLUETOOTH_DEVICES_URI;
+ }
+
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ String deviceKey = intent.getStringExtra(EXTRA_DEVICE_KEY);
+ if (deviceKey == null) {
+ return;
+ }
+ CachedBluetoothDevice device = null;
+ Collection<CachedBluetoothDevice> cachedDevices =
+ mBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy();
+ for (CachedBluetoothDevice cachedDevice : cachedDevices) {
+ if (cachedDevice.getAddress().equals(deviceKey)) {
+ device = cachedDevice;
+ break;
+ }
+ }
+ if (device == null) {
+ return;
+ }
+
+ String buttonType = intent.getStringExtra(EXTRA_BUTTON_TYPE);
+ boolean newState = intent.getBooleanExtra(QC_ACTION_TOGGLE_STATE, true);
+ if (BLUETOOTH_BUTTON.equals(buttonType)) {
+ if (newState) {
+ LocalBluetoothProfile phoneProfile = getProfile(device,
+ BluetoothProfile.HEADSET_CLIENT);
+ LocalBluetoothProfile mediaProfile = getProfile(device, BluetoothProfile.A2DP_SINK);
+ // If trying to connect and both phone and media are disabled, connecting will
+ // always fail. In this case force both profiles on.
+ if (phoneProfile != null && mediaProfile != null
+ && !phoneProfile.isEnabled(device.getDevice())
+ && !mediaProfile.isEnabled(device.getDevice())) {
+ phoneProfile.setEnabled(device.getDevice(), true);
+ mediaProfile.setEnabled(device.getDevice(), true);
+ }
+ device.connect();
+ } else if (device.isConnected()) {
+ device.disconnect();
+ }
+ } else if (PHONE_BUTTON.equals(buttonType)) {
+ LocalBluetoothProfile profile = getProfile(device, BluetoothProfile.HEADSET_CLIENT);
+ if (profile != null) {
+ profile.setEnabled(device.getDevice(), newState);
+ }
+ } else if (MEDIA_BUTTON.equals(buttonType)) {
+ LocalBluetoothProfile profile = getProfile(device, BluetoothProfile.A2DP_SINK);
+ if (profile != null) {
+ profile.setEnabled(device.getDevice(), newState);
+ }
+ } else {
+ LOG.d("Unknown button type: " + buttonType);
+ }
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return PairedBluetoothDevicesWorker.class;
+ }
+
+ private String getSubtitle(CachedBluetoothDevice device) {
+ if (device.isConnected()) {
+ return getContext().getString(BluetoothUtils
+ .getConnectionStateSummary(BluetoothProfile.STATE_CONNECTED),
+ /* appended text= */ "");
+ }
+ return device.getCarConnectionSummary();
+ }
+
+ @DrawableRes
+ private int getIconRes(CachedBluetoothDevice device) {
+ BluetoothClass btClass = device.getBtClass();
+ if (btClass != null) {
+ switch (btClass.getMajorDeviceClass()) {
+ case BluetoothClass.Device.Major.COMPUTER:
+ return com.android.internal.R.drawable.ic_bt_laptop;
+ case BluetoothClass.Device.Major.PHONE:
+ return com.android.internal.R.drawable.ic_phone;
+ case BluetoothClass.Device.Major.PERIPHERAL:
+ return HidProfile.getHidClassDrawable(btClass);
+ case BluetoothClass.Device.Major.IMAGING:
+ return com.android.internal.R.drawable.ic_settings_print;
+ default:
+ // unrecognized device class; continue
+ }
+ }
+
+ List<LocalBluetoothProfile> profiles = device.getProfiles();
+ for (LocalBluetoothProfile profile : profiles) {
+ int resId = profile.getDrawableResource(btClass);
+ if (resId != 0) {
+ return resId;
+ }
+ }
+ if (btClass != null) {
+ if (btClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) {
+ return com.android.internal.R.drawable.ic_bt_headset_hfp;
+ }
+ if (btClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) {
+ return com.android.internal.R.drawable.ic_bt_headphones_a2dp;
+ }
+ }
+ return com.android.internal.R.drawable.ic_settings_bluetooth;
+ }
+
+ private QCActionItem createBluetoothButton(CachedBluetoothDevice device, int requestCode) {
+ return createBluetoothDeviceToggle(device, requestCode, BLUETOOTH_BUTTON,
+ Icon.createWithResource(getContext(), R.drawable.ic_qc_bluetooth), true,
+ !device.isBusy(), device.isConnected());
+ }
+
+ private QCActionItem createPhoneButton(CachedBluetoothDevice device, int requestCode) {
+ BluetoothProfileToggleState phoneState = getBluetoothProfileToggleState(device,
+ BluetoothProfile.HEADSET_CLIENT);
+ int iconRes = phoneState.mIsAvailable ? R.drawable.ic_qc_bluetooth_phone
+ : R.drawable.ic_qc_bluetooth_phone_unavailable;
+ return createBluetoothDeviceToggle(device, requestCode, PHONE_BUTTON,
+ Icon.createWithResource(getContext(), iconRes),
+ phoneState.mIsAvailable, phoneState.mIsEnabled, phoneState.mIsChecked);
+ }
+
+ private QCActionItem createMediaButton(CachedBluetoothDevice device, int requestCode) {
+ BluetoothProfileToggleState mediaState = getBluetoothProfileToggleState(device,
+ BluetoothProfile.A2DP_SINK);
+ int iconRes = mediaState.mIsAvailable ? R.drawable.ic_qc_bluetooth_media
+ : R.drawable.ic_qc_bluetooth_media_unavailable;
+ return createBluetoothDeviceToggle(device, requestCode, MEDIA_BUTTON,
+ Icon.createWithResource(getContext(), iconRes),
+ mediaState.mIsAvailable, mediaState.mIsEnabled, mediaState.mIsChecked);
+ }
+
+ private QCActionItem createBluetoothDeviceToggle(CachedBluetoothDevice device, int requestCode,
+ String buttonType, Icon icon, boolean available, boolean enabled, boolean checked) {
+ Bundle extras = new Bundle();
+ extras.putString(EXTRA_BUTTON_TYPE, buttonType);
+ extras.putString(EXTRA_DEVICE_KEY, device.getAddress());
+ PendingIntent action = getBroadcastIntent(extras, requestCode);
+
+ return new QCActionItem.Builder(QC_TYPE_ACTION_TOGGLE)
+ .setAvailable(available)
+ .setChecked(checked)
+ .setEnabled(enabled)
+ .setAction(action)
+ .setIcon(icon)
+ .build();
+ }
+
+ private LocalBluetoothProfile getProfile(CachedBluetoothDevice device, int profileId) {
+ for (LocalBluetoothProfile profile : device.getProfiles()) {
+ if (profile.getProfileId() == profileId) {
+ return profile;
+ }
+ }
+ return null;
+ }
+
+ private BluetoothProfileToggleState getBluetoothProfileToggleState(CachedBluetoothDevice device,
+ int profileId) {
+ LocalBluetoothProfile profile = getProfile(device, profileId);
+ if (!device.isConnected() || profile == null) {
+ return new BluetoothProfileToggleState(false, false, false);
+ }
+ return new BluetoothProfileToggleState(true, !device.isBusy(),
+ profile.isEnabled(device.getDevice()));
+ }
+
+ private static class BluetoothProfileToggleState {
+ final boolean mIsAvailable;
+ final boolean mIsEnabled;
+ final boolean mIsChecked;
+
+ BluetoothProfileToggleState(boolean isAvailable, boolean isEnabled, boolean isChecked) {
+ mIsAvailable = isAvailable;
+ mIsEnabled = isEnabled;
+ mIsChecked = isChecked;
+ }
+ }
+}
diff --git a/src/com/android/car/settings/qc/PairedBluetoothDevicesWorker.java b/src/com/android/car/settings/qc/PairedBluetoothDevicesWorker.java
new file mode 100644
index 0000000..8130e2b
--- /dev/null
+++ b/src/com/android/car/settings/qc/PairedBluetoothDevicesWorker.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import java.io.IOException;
+
+/**
+ * Background worker for the {@link PairedBluetoothDevices} QCItem.
+ */
+public class PairedBluetoothDevicesWorker
+ extends SettingsQCBackgroundWorker<PairedBluetoothDevices>
+ implements BluetoothCallback {
+
+ private final LocalBluetoothManager mBluetoothManager;
+
+ public PairedBluetoothDevicesWorker(Context context, Uri uri) {
+ super(context, uri);
+ mBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */ null);
+ }
+
+ @Override
+ protected void onQCItemSubscribe() {
+ mBluetoothManager.getEventManager().registerCallback(this);
+ }
+
+ @Override
+ protected void onQCItemUnsubscribe() {
+ mBluetoothManager.getEventManager().unregisterCallback(this);
+ }
+
+ @Override
+ public void close() throws IOException {
+ mBluetoothManager.getEventManager().unregisterCallback(this);
+ }
+
+ @Override
+ public void onBluetoothStateChanged(int bluetoothState) {
+ notifyQCItemChange();
+ }
+
+ @Override
+ public void onDeviceAdded(CachedBluetoothDevice cachedDevice) {
+ notifyQCItemChange();
+ }
+
+ @Override
+ public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) {
+ notifyQCItemChange();
+ }
+
+ @Override
+ public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
+ notifyQCItemChange();
+ }
+
+ @Override
+ public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) {
+ notifyQCItemChange();
+ }
+
+ @Override
+ public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
+ notifyQCItemChange();
+ }
+
+ @Override
+ public void onProfileConnectionStateChanged(CachedBluetoothDevice cachedDevice,
+ int state, int bluetoothProfile) {
+ notifyQCItemChange();
+ }
+}
diff --git a/src/com/android/car/settings/qc/SettingsQCBackgroundWorker.java b/src/com/android/car/settings/qc/SettingsQCBackgroundWorker.java
new file mode 100644
index 0000000..2c4ed49
--- /dev/null
+++ b/src/com/android/car/settings/qc/SettingsQCBackgroundWorker.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.annotation.MainThread;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+import android.os.SystemClock;
+import android.util.ArrayMap;
+
+import com.android.car.settings.common.Logger;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Base background worker class to allow for CarSetting Quick Control items to work with data that
+ * can change continuously.
+ * @param <E> {@link SettingsQCItem} class that the worker is operating on.
+ */
+public abstract class SettingsQCBackgroundWorker<E extends SettingsQCItem> implements Closeable {
+
+ private static final Logger LOG = new Logger(SettingsQCBackgroundWorker.class);
+
+ private static final long QC_UPDATE_THROTTLE_INTERVAL = 300L;
+
+ private static final Map<Uri, SettingsQCBackgroundWorker> LIVE_WORKERS = new ArrayMap<>();
+
+ private final Context mContext;
+ private final Uri mUri;
+ private SettingsQCItem mQCItem;
+
+ protected SettingsQCBackgroundWorker(Context context, Uri uri) {
+ mContext = context;
+ mUri = uri;
+ }
+
+ protected Uri getUri() {
+ return mUri;
+ }
+
+ protected Context getContext() {
+ return mContext;
+ }
+
+ protected E getQCItem() {
+ return (E) mQCItem;
+ }
+
+ void setQCItem(SettingsQCItem item) {
+ mQCItem = item;
+ }
+
+ /**
+ * Returns the singleton instance of {@link SettingsQCBackgroundWorker} for specified
+ * {@link Uri} if exists
+ */
+ @Nullable
+ public static <T extends SettingsQCBackgroundWorker> T getInstance(Uri uri) {
+ return (T) LIVE_WORKERS.get(uri);
+ }
+
+ /**
+ * Returns the singleton instance of {@link SettingsQCBackgroundWorker} for specified {@link
+ * SettingsQCItem}
+ */
+ static SettingsQCBackgroundWorker getInstance(Context context, SettingsQCItem qcItem, Uri uri) {
+ SettingsQCBackgroundWorker worker = getInstance(uri);
+ if (worker == null) {
+ Class<? extends SettingsQCBackgroundWorker> workerClass =
+ qcItem.getBackgroundWorkerClass();
+ worker = createInstance(context.getApplicationContext(), uri, workerClass);
+ LIVE_WORKERS.put(uri, worker);
+ }
+ worker.setQCItem(qcItem);
+ return worker;
+ }
+
+ private static SettingsQCBackgroundWorker createInstance(Context context, Uri uri,
+ Class<? extends SettingsQCBackgroundWorker> clazz) {
+ LOG.d("create instance: " + clazz);
+ try {
+ return clazz.getConstructor(Context.class, Uri.class).newInstance(context, uri);
+ } catch (NoSuchMethodException | IllegalAccessException | InstantiationException
+ | InvocationTargetException e) {
+ throw new IllegalStateException(
+ "Invalid qc background worker: " + clazz, e);
+ }
+ }
+
+ static void shutdown() {
+ for (SettingsQCBackgroundWorker worker : LIVE_WORKERS.values()) {
+ try {
+ worker.close();
+ } catch (IOException e) {
+ LOG.w("Shutting down worker failed", e);
+ }
+ }
+ LIVE_WORKERS.clear();
+ }
+
+ static void shutdown(Uri uri) {
+ SettingsQCBackgroundWorker worker = LIVE_WORKERS.get(uri);
+ if (worker != null) {
+ try {
+ worker.close();
+ } catch (IOException e) {
+ LOG.w("Shutting down worker failed", e);
+ }
+ LIVE_WORKERS.remove(uri);
+ }
+ }
+
+ /**
+ * Called when the QCItem is subscribed to. This is the place to register callbacks or
+ * initialize scan tasks.
+ */
+ @MainThread
+ protected abstract void onQCItemSubscribe();
+
+ /**
+ * Called when the QCItem is unsubscribed from. This is the place to unregister callbacks or
+ * perform any final cleanup.
+ */
+ @MainThread
+ protected abstract void onQCItemUnsubscribe();
+
+ /**
+ * Notify that data was updated and attempt to sync changes to the QCItem.
+ */
+ protected final void notifyQCItemChange() {
+ NotifyQCItemChangeHandler.getInstance().updateQCItem(this);
+ }
+
+ void subscribe() {
+ onQCItemSubscribe();
+ }
+
+ void unsubscribe() {
+ onQCItemUnsubscribe();
+ NotifyQCItemChangeHandler.getInstance().cancelQCItemUpdate(this);
+ }
+
+ private static class NotifyQCItemChangeHandler extends Handler {
+
+ private static final int MSG_UPDATE_QCITEM = 1000;
+ private static NotifyQCItemChangeHandler sHandler;
+ private final Map<Uri, Long> mLastUpdateTimeLookup = Collections.synchronizedMap(
+ new ArrayMap<>());
+
+ private static NotifyQCItemChangeHandler getInstance() {
+ if (sHandler == null) {
+ HandlerThread workerThread = new HandlerThread("NotifyQCItemChangeHandler",
+ Process.THREAD_PRIORITY_BACKGROUND);
+ workerThread.start();
+ sHandler = new NotifyQCItemChangeHandler(workerThread.getLooper());
+ }
+ return sHandler;
+ }
+
+ private NotifyQCItemChangeHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what != MSG_UPDATE_QCITEM) {
+ return;
+ }
+
+ SettingsQCBackgroundWorker worker = (SettingsQCBackgroundWorker) msg.obj;
+ Uri uri = worker.getUri();
+ Context context = worker.getContext();
+ mLastUpdateTimeLookup.put(uri, SystemClock.uptimeMillis());
+ context.getContentResolver().notifyChange(uri, /* observer= */ null);
+ }
+
+ private void updateQCItem(SettingsQCBackgroundWorker worker) {
+ if (hasMessages(MSG_UPDATE_QCITEM, worker)) {
+ return;
+ }
+
+ Message message = obtainMessage(MSG_UPDATE_QCITEM, worker);
+ long lastUpdateTime = mLastUpdateTimeLookup.getOrDefault(worker.getUri(), 0L);
+ if (lastUpdateTime == 0L) {
+ // Postpone the first update triggering by onQCItemSubscribe() to avoid being too
+ // close to the first QCItem bind.
+ sendMessageDelayed(message, QC_UPDATE_THROTTLE_INTERVAL);
+ } else if (SystemClock.uptimeMillis() - lastUpdateTime
+ > QC_UPDATE_THROTTLE_INTERVAL) {
+ sendMessage(message);
+ } else {
+ sendMessageAtTime(message, lastUpdateTime + QC_UPDATE_THROTTLE_INTERVAL);
+ }
+ }
+
+ private void cancelQCItemUpdate(SettingsQCBackgroundWorker worker) {
+ removeMessages(MSG_UPDATE_QCITEM, worker);
+ mLastUpdateTimeLookup.remove(worker.getUri());
+ }
+ };
+}
diff --git a/src/com/android/car/settings/qc/SettingsQCBroadcastReceiver.java b/src/com/android/car/settings/qc/SettingsQCBroadcastReceiver.java
new file mode 100644
index 0000000..ea2b165
--- /dev/null
+++ b/src/com/android/car/settings/qc/SettingsQCBroadcastReceiver.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+
+import androidx.annotation.VisibleForTesting;
+
+/**
+ * Responds to actions performed by Quick Controls provided by CarSettings and notifies of
+ * any changes.
+ */
+public class SettingsQCBroadcastReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent i) {
+ String action = i.getAction();
+ if (SettingsQCRegistry.isValidAction(action)) {
+ SettingsQCItem qcItem = createQCItemInstance(context,
+ SettingsQCRegistry.getQCClassByUri(Uri.parse(action)));
+ qcItem.onNotifyChange(i);
+ }
+ }
+
+ @VisibleForTesting
+ SettingsQCItem createQCItemInstance(Context context, Class<? extends SettingsQCItem> qcItem) {
+ return SettingsQCItem.createInstance(context, qcItem);
+ }
+}
diff --git a/src/com/android/car/settings/qc/SettingsQCItem.java b/src/com/android/car/settings/qc/SettingsQCItem.java
new file mode 100644
index 0000000..98430f5
--- /dev/null
+++ b/src/com/android/car/settings/qc/SettingsQCItem.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+
+import com.android.car.qc.QCItem;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * Base class for QCItems provided by CarSettings.
+ */
+public abstract class SettingsQCItem {
+
+ private final Context mContext;
+
+ public SettingsQCItem(Context context) {
+ mContext = context;
+ }
+
+ /**
+ * @return an complete instance of the {@link QCItem}.
+ */
+ abstract QCItem getQCItem();
+
+ /**
+ * @return a {@link android.content.ContentResolver#SCHEME_CONTENT content} {@link Uri} which
+ * backs the {@link QCItem} returned by {@link #getQCItem()}.
+ */
+ abstract Uri getUri();
+
+ /**
+ * @return the context for the {@link SettingsQCItem}.
+ */
+ protected Context getContext() {
+ return mContext;
+ }
+
+ /**
+ * Handles the actions sent by the {@link Intent intents} bound to the {@link QCItem} returned
+ * by {@link #getQCItem()}.
+ *
+ * @param intent which has the action taken on a {@link QCItem}.
+ */
+ void onNotifyChange(Intent intent) {}
+
+ /**
+ * Standardize the primary intent for the QCItem.
+ */
+ PendingIntent getActivityIntent(Intent intent) {
+ return PendingIntent.getActivity(getContext(),
+ 0 /* requestCode */, intent,
+ PendingIntent.FLAG_IMMUTABLE);
+ }
+
+ /**
+ * See {@link #getBroadcastIntent(Bundle, int)}
+ */
+ PendingIntent getBroadcastIntent() {
+ return getBroadcastIntent(/* extras= */ null);
+ }
+
+ /**
+ * See {@link #getBroadcastIntent(Bundle, int)}
+ */
+ PendingIntent getBroadcastIntent(Bundle extras) {
+ return getBroadcastIntent(extras, /* requestCode= */ 0);
+ }
+
+ /**
+ * Standardize the intents returned to indicate actions by the QCItem.
+ * <p>
+ * The {@link PendingIntent} is linked to {@link SettingsQCBroadcastReceiver} where the
+ * Intent Action is found by {@code getUri().toString()}.
+ *
+ * @return a {@link PendingIntent} linked to {@link SettingsQCBroadcastReceiver}.
+ */
+ PendingIntent getBroadcastIntent(Bundle extras, int requestCode) {
+ Intent intent = new Intent(getUri().toString())
+ .setData(getUri())
+ .setClass(getContext(), SettingsQCBroadcastReceiver.class)
+ .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ if (extras != null) {
+ intent.putExtras(extras);
+ }
+ return PendingIntent.getBroadcast(getContext(), requestCode, intent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
+ }
+
+ /**
+ * Build an instance of a {@link SettingsQCItem} which has a {@link Context}-only constructor.
+ */
+ static SettingsQCItem createInstance(Context context,
+ Class<? extends SettingsQCItem> qcItem) {
+ try {
+ Constructor<? extends SettingsQCItem> constructor =
+ qcItem.getConstructor(Context.class);
+ Object[] params = new Object[]{context.getApplicationContext()};
+ return constructor.newInstance(params);
+ } catch (NoSuchMethodException | InstantiationException | IllegalArgumentException
+ | InvocationTargetException | IllegalAccessException e) {
+ throw new IllegalStateException(
+ "Invalid SettingsQCItem class: " + qcItem, e);
+ }
+ }
+
+ /**
+ * Settings QCItems which require background work, such as updating lists should implement a
+ * {@link SettingsQCBackgroundWorker} and return it here. An example of background work is
+ * updating a list of Wifi networks available in the area.
+ *
+ * @return a {@link Class<? extends SettingsQCBackgroundWorker>} to perform background work for
+ * the QCItem.
+ */
+ Class<? extends SettingsQCBackgroundWorker> getBackgroundWorkerClass() {
+ return null;
+ }
+}
diff --git a/src/com/android/car/settings/qc/SettingsQCProvider.java b/src/com/android/car/settings/qc/SettingsQCProvider.java
new file mode 100644
index 0000000..f2c1146
--- /dev/null
+++ b/src/com/android/car/settings/qc/SettingsQCProvider.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.Uri;
+import android.util.ArrayMap;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.provider.BaseQCProvider;
+import com.android.car.settings.R;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Remote Quick Control provider for CarSettings.
+ */
+public class SettingsQCProvider extends BaseQCProvider {
+ private final Map<Uri, SettingsQCItem> mSubscribedItems = new ArrayMap<>();
+ @VisibleForTesting
+ final Map<Uri, SettingsQCBackgroundWorker> mSubscribedWorkers = new ArrayMap<>();
+
+ private Set<String> mAllowListedPackages;
+
+ @Override
+ public boolean onCreate() {
+ boolean returnVal = super.onCreate();
+ mAllowListedPackages = Set.of(getContext().getResources().getStringArray(
+ R.array.settings_qc_provider_package_allowlist));
+ return returnVal;
+ }
+
+ @Override
+ public QCItem onBind(Uri uri) {
+ if (SettingsQCRegistry.isValidUri(uri)) {
+ Context context = getContext();
+ return getQCItemFromUri(context, uri).getQCItem();
+ }
+ throw new IllegalArgumentException("Unrecognized uri: " + uri);
+ }
+
+ @Override
+ public void onSubscribed(Uri uri) {
+ if (SettingsQCRegistry.isValidUri(uri)) {
+ Context context = getContext();
+ SettingsQCItem qcItem = getQCItemFromUri(context, uri);
+ ThreadUtils.postOnMainThread(() -> startBackgroundWorker(qcItem, uri));
+ }
+ }
+
+ @Override
+ public void onUnsubscribed(Uri uri) {
+ ThreadUtils.postOnMainThread(() -> stopBackgroundWorker(uri));
+ }
+
+ @Override
+ public void onDestroy(Uri uri) {
+ ThreadUtils.postOnMainThread(() -> SettingsQCBackgroundWorker.shutdown(uri));
+ }
+
+ @Override
+ public void shutdown() {
+ ThreadUtils.postOnMainThread(SettingsQCBackgroundWorker::shutdown);
+ }
+
+ private SettingsQCItem getQCItemFromUri(Context context, Uri uri) {
+ if (mSubscribedItems.containsKey(uri)) {
+ return mSubscribedItems.get(uri);
+ }
+ Uri newUri = SettingsQCRegistry.removeParameterFromUri(uri);
+ Class clazz = SettingsQCRegistry.getQCClassByUri(newUri);
+ if (clazz == null) {
+ throw new IllegalArgumentException("No QCItem found for uri: " + uri);
+ }
+
+ return SettingsQCItem.createInstance(context, clazz);
+ }
+
+ private void startBackgroundWorker(SettingsQCItem qcItem, Uri uri) {
+ Class workerClass = qcItem.getBackgroundWorkerClass();
+ if (workerClass == null) {
+ return;
+ }
+
+ if (mSubscribedWorkers.containsKey(uri)) {
+ return;
+ }
+
+ SettingsQCBackgroundWorker worker = SettingsQCBackgroundWorker.getInstance(
+ getContext(), qcItem, uri);
+ mSubscribedWorkers.put(uri, worker);
+ worker.subscribe();
+ mSubscribedItems.put(uri, qcItem);
+ }
+
+ private void stopBackgroundWorker(Uri uri) {
+ SettingsQCBackgroundWorker worker = mSubscribedWorkers.get(uri);
+ if (worker != null) {
+ worker.unsubscribe();
+ mSubscribedWorkers.remove(uri);
+ mSubscribedItems.remove(uri);
+ }
+ }
+
+ @NonNull
+ @Override
+ protected Set<String> getAllowlistedPackages() {
+ return mAllowListedPackages;
+ }
+}
diff --git a/src/com/android/car/settings/qc/SettingsQCRegistry.java b/src/com/android/car/settings/qc/SettingsQCRegistry.java
new file mode 100644
index 0000000..1e2cf92
--- /dev/null
+++ b/src/com/android/car/settings/qc/SettingsQCRegistry.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.ContentResolver;
+import android.net.Uri;
+import android.util.ArrayMap;
+
+import androidx.annotation.VisibleForTesting;
+
+import java.util.Map;
+
+/**
+ * Registry of valid Quick Control Uris provided by CarSettings.
+ */
+public class SettingsQCRegistry {
+ public static final String AUTHORITY = "com.android.car.settings.qc";
+
+ // Start Uris
+ public static final Uri BLUETOOTH_SWITCH_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("bluetooth_switch")
+ .build();
+
+ public static final Uri PAIRED_BLUETOOTH_DEVICES_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("paired_bluetooth_devices")
+ .build();
+
+ public static final Uri WIFI_TILE_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("wifi_tile")
+ .build();
+
+ public static final Uri HOTSPOT_TILE_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("hotspot_tile")
+ .build();
+
+ public static final Uri MOBILE_DATA_TILE_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("mobile_data_tile")
+ .build();
+
+ public static final Uri WIFI_ROW_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("wifi_row")
+ .build();
+
+ public static final Uri HOTSPOT_ROW_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("hotspot_row")
+ .build();
+
+ public static final Uri MOBILE_DATA_ROW_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("mobile_data_row")
+ .build();
+
+ public static final Uri BRIGHTNESS_SLIDER_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("brightness_slider")
+ .build();
+
+ public static final Uri BRIGHTNESS_SLIDER_WITH_ICON_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("brightness_slider_with_icon")
+ .build();
+
+ public static final Uri ADAPTIVE_BRIGHTNESS_SWITCH_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("adaptive_brightness_switch")
+ .build();
+
+ public static final Uri MEDIA_VOLUME_SLIDER_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("media_volume_slider")
+ .build();
+
+ public static final Uri CALL_VOLUME_SLIDER_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("call_volume_slider")
+ .build();
+
+ public static final Uri NAVIGATION_VOLUME_SLIDER_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath("navigation_volume_slider")
+ .build();
+ // End Uris
+
+ @VisibleForTesting
+ static final Map<Uri, Class<? extends SettingsQCItem>> sUriToQC = createUriToQCMap();
+
+ private static Map<Uri, Class<? extends SettingsQCItem>> createUriToQCMap() {
+ Map<Uri, Class<? extends SettingsQCItem>> map = new ArrayMap<>();
+
+ map.put(BLUETOOTH_SWITCH_URI, BluetoothSwitch.class);
+ map.put(PAIRED_BLUETOOTH_DEVICES_URI, PairedBluetoothDevices.class);
+ map.put(WIFI_TILE_URI, WifiTile.class);
+ map.put(HOTSPOT_TILE_URI, HotspotTile.class);
+ map.put(MOBILE_DATA_TILE_URI, MobileDataTile.class);
+ map.put(WIFI_ROW_URI, WifiRow.class);
+ map.put(HOTSPOT_ROW_URI, HotspotRow.class);
+ map.put(MOBILE_DATA_ROW_URI, MobileDataRow.class);
+ map.put(BRIGHTNESS_SLIDER_URI, BrightnessSlider.class);
+ map.put(BRIGHTNESS_SLIDER_WITH_ICON_URI, BrightnessSliderWithIcon.class);
+ map.put(ADAPTIVE_BRIGHTNESS_SWITCH_URI, AdaptiveBrightnessSwitch.class);
+ map.put(MEDIA_VOLUME_SLIDER_URI, MediaVolumeSlider.class);
+ map.put(CALL_VOLUME_SLIDER_URI, CallVolumeSlider.class);
+ map.put(NAVIGATION_VOLUME_SLIDER_URI, NavigationVolumeSlider.class);
+
+ return map;
+ }
+
+ /**
+ * Returns the relevant {@link SettingsQCItem} class that corresponds to the provided uri.
+ */
+ public static Class<? extends SettingsQCItem> getQCClassByUri(Uri uri) {
+ return sUriToQC.get(removeParameterFromUri(uri));
+ }
+
+ /**
+ * Returns a uri without its parameters (or null if the provided uri is null).
+ */
+ public static Uri removeParameterFromUri(Uri uri) {
+ return uri != null ? uri.buildUpon().clearQuery().build() : null;
+ }
+
+ /**
+ * Returns {@code true} if the provided uri is a valid QCItem Uri handled by
+ * {@link SettingsQCRegistry}.
+ */
+ public static boolean isValidUri(Uri uri) {
+ return sUriToQC.containsKey(removeParameterFromUri(uri));
+ }
+
+ /**
+ * Returns {@code true} if the provided action is a valid intent action handled by
+ * {@link SettingsQCRegistry}.
+ */
+ public static boolean isValidAction(String action) {
+ return isValidUri(Uri.parse(action));
+ }
+}
diff --git a/src/com/android/car/settings/qc/WifiBaseWorker.java b/src/com/android/car/settings/qc/WifiBaseWorker.java
new file mode 100644
index 0000000..e2cdb6f
--- /dev/null
+++ b/src/com/android/car/settings/qc/WifiBaseWorker.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Process;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleRegistry;
+
+import com.android.car.settings.wifi.WifiUtil;
+import com.android.wifitrackerlib.WifiPickerTracker;
+
+import java.io.IOException;
+
+/**
+ * Background worker for Wifi QCItems.
+ * @param <E> The {@link SettingsQCItem} the background worker is associated with.
+ */
+public class WifiBaseWorker<E extends SettingsQCItem> extends SettingsQCBackgroundWorker<E>
+ implements LifecycleOwner, WifiPickerTracker.WifiPickerTrackerCallback {
+
+ private final LifecycleRegistry mLifecycleRegistry;
+ private final WifiPickerTracker mWifiPickerTracker;
+ private final HandlerThread mWorkerThread;
+
+ protected WifiBaseWorker(Context context, Uri uri) {
+ super(context, uri);
+ mLifecycleRegistry = new LifecycleRegistry(/* provider= */ this);
+
+ mWorkerThread = new HandlerThread(getClass().getSimpleName()
+ + "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
+ Process.THREAD_PRIORITY_BACKGROUND);
+ mWorkerThread.start();
+ mWifiPickerTracker = WifiUtil.createWifiPickerTracker(mLifecycleRegistry, context,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(), /* listener= */ this);
+
+ mLifecycleRegistry.setCurrentState(Lifecycle.State.CREATED);
+ }
+
+ @Override
+ protected void onQCItemSubscribe() {
+ mLifecycleRegistry.setCurrentState(Lifecycle.State.RESUMED);
+ }
+
+ @Override
+ protected void onQCItemUnsubscribe() {
+ mLifecycleRegistry.setCurrentState(Lifecycle.State.CREATED);
+ }
+
+ @Override
+ public void close() throws IOException {
+ mWorkerThread.quit();
+ mLifecycleRegistry.setCurrentState(Lifecycle.State.DESTROYED);
+ }
+
+ @NonNull
+ @Override
+ public Lifecycle getLifecycle() {
+ return mLifecycleRegistry;
+ }
+
+ @Override
+ public void onWifiStateChanged() {
+ notifyQCItemChange();
+ }
+
+ @Override
+ public void onWifiEntriesChanged() {
+ notifyQCItemChange();
+ }
+
+ @Override
+ public void onNumSavedNetworksChanged() {
+ }
+
+ @Override
+ public void onNumSavedSubscriptionsChanged() {
+ }
+}
diff --git a/src/com/android/car/settings/qc/WifiQCUtils.java b/src/com/android/car/settings/qc/WifiQCUtils.java
new file mode 100644
index 0000000..17c6699
--- /dev/null
+++ b/src/com/android/car/settings/qc/WifiQCUtils.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+
+import androidx.annotation.DrawableRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.wifi.WifiUtil;
+
+/**
+ * Helper methods for Wifi-related quick controls.
+ */
+public class WifiQCUtils {
+ private WifiQCUtils() {
+ }
+
+ /**
+ * Returns the subtitle string based on the current wifi state.
+ */
+ public static String getSubtitle(Context context, WifiManager wifiManager) {
+ int wifiState = wifiManager.getWifiState();
+ int stringId = WifiUtil.getStateDesc(wifiState);
+ if (stringId != 0) {
+ return context.getString(stringId);
+ }
+ if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
+ String wifiName = wifiManager.getConnectionInfo().getSSID();
+ if (wifiName.equals(WifiManager.UNKNOWN_SSID)) {
+ return context.getString(R.string.wifi_disconnected);
+ }
+ return WifiInfo.sanitizeSsid(wifiName);
+ }
+ return context.getString(R.string.wifi_disabled);
+ }
+
+ /**
+ * Returns the icon resource for the current wifi state.
+ */
+ @DrawableRes
+ public static int getIcon(WifiManager wifiManager) {
+ if (!wifiManager.isWifiEnabled()) {
+ return R.drawable.ic_qc_wifi_disabled;
+ }
+ WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+ if (wifiInfo.getNetworkId() == -1) {
+ return R.drawable.ic_qc_wifi_disconnected;
+ }
+ int rssi = wifiInfo.getRssi();
+ if (rssi == WifiInfo.INVALID_RSSI) {
+ return R.drawable.ic_qc_wifi_disconnected;
+ }
+ int level = wifiManager.calculateSignalLevel(rssi);
+ switch (level) {
+ case 0:
+ return R.drawable.ic_qc_wifi_level_0;
+ case 1:
+ return R.drawable.ic_qc_wifi_level_1;
+ case 2:
+ return R.drawable.ic_qc_wifi_level_2;
+ case 3:
+ return R.drawable.ic_qc_wifi_level_3;
+ case 4:
+ default:
+ return R.drawable.ic_qc_wifi_level_4;
+ }
+ }
+}
diff --git a/src/com/android/car/settings/qc/WifiRow.java b/src/com/android/car/settings/qc/WifiRow.java
new file mode 100644
index 0000000..4b8fd18
--- /dev/null
+++ b/src/com/android/car/settings/qc/WifiRow.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
+import static com.android.car.settings.qc.SettingsQCRegistry.WIFI_ROW_URI;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+/**
+ * QCItem for showing a wifi row element.
+ * The row contains a wifi icon, the status or the currently connected wifi SSID, and a switch
+ * to enable/disable wifi.
+ */
+public class WifiRow extends SettingsQCItem {
+ private final WifiManager mWifiManager;
+
+ public WifiRow(Context context) {
+ super(context);
+ mWifiManager = context.getSystemService(WifiManager.class);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ boolean wifiEnabled = mWifiManager.isWifiEnabled();
+ Icon icon = Icon.createWithResource(getContext(), WifiQCUtils.getIcon(mWifiManager));
+
+ QCActionItem wifiToggle = new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH)
+ .setChecked(wifiEnabled)
+ .setAction(getBroadcastIntent())
+ .build();
+
+ QCRow wifiRow = new QCRow.Builder()
+ .setIcon(icon)
+ .setTitle(getContext().getString(R.string.wifi_settings))
+ .setSubtitle(WifiQCUtils.getSubtitle(getContext(), mWifiManager))
+ .addEndItem(wifiToggle)
+ .build();
+
+ return new QCList.Builder()
+ .addRow(wifiRow)
+ .build();
+ }
+
+ @Override
+ Uri getUri() {
+ return WIFI_ROW_URI;
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ boolean newState = intent.getBooleanExtra(QC_ACTION_TOGGLE_STATE,
+ !mWifiManager.isWifiEnabled());
+ mWifiManager.setWifiEnabled(newState);
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return WifiRowWorker.class;
+ }
+}
diff --git a/src/com/android/car/settings/qc/WifiRowWorker.java b/src/com/android/car/settings/qc/WifiRowWorker.java
new file mode 100644
index 0000000..6304a50
--- /dev/null
+++ b/src/com/android/car/settings/qc/WifiRowWorker.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Background worker for the {@link WifiRow} QCItem.
+ */
+public class WifiRowWorker extends WifiBaseWorker<WifiRow> {
+ public WifiRowWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+}
diff --git a/src/com/android/car/settings/qc/WifiTile.java b/src/com/android/car/settings/qc/WifiTile.java
new file mode 100644
index 0000000..c79a7ae
--- /dev/null
+++ b/src/com/android/car/settings/qc/WifiTile.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.settings.qc.SettingsQCRegistry.WIFI_TILE_URI;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCTile;
+
+/**
+ * QCItem for showing a wifi toggle.
+ */
+public class WifiTile extends SettingsQCItem {
+ private final WifiManager mWifiManager;
+
+ public WifiTile(Context context) {
+ super(context);
+ mWifiManager = context.getSystemService(WifiManager.class);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ boolean wifiEnabled = mWifiManager.isWifiEnabled();
+ Icon icon = Icon.createWithResource(getContext(), WifiQCUtils.getIcon(mWifiManager));
+
+ return new QCTile.Builder()
+ .setIcon(icon)
+ .setChecked(wifiEnabled)
+ .setAction(getBroadcastIntent())
+ .setSubtitle(WifiQCUtils.getSubtitle(getContext(), mWifiManager))
+ .build();
+ }
+
+ @Override
+ Uri getUri() {
+ return WIFI_TILE_URI;
+ }
+
+ @Override
+ void onNotifyChange(Intent intent) {
+ boolean newState = intent.getBooleanExtra(QC_ACTION_TOGGLE_STATE,
+ !mWifiManager.isWifiEnabled());
+ mWifiManager.setWifiEnabled(newState);
+ }
+
+ @Override
+ Class getBackgroundWorkerClass() {
+ return WifiTileWorker.class;
+ }
+}
diff --git a/src/com/android/car/settings/qc/WifiTileWorker.java b/src/com/android/car/settings/qc/WifiTileWorker.java
new file mode 100644
index 0000000..7249bd4
--- /dev/null
+++ b/src/com/android/car/settings/qc/WifiTileWorker.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * Background worker for the {@link WifiTile} QCItem.
+ */
+public class WifiTileWorker extends WifiBaseWorker<WifiTile> {
+ public WifiTileWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+}
diff --git a/src/com/android/car/settings/quicksettings/QuickSettingFragment.java b/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
index c3ca24b..50b228d 100644
--- a/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
+++ b/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
@@ -34,13 +34,13 @@
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.RecyclerView;
import com.android.car.settings.R;
import com.android.car.settings.common.BaseFragment;
import com.android.car.settings.common.CarSettingActivities;
import com.android.car.settings.profiles.ProfileIconProvider;
import com.android.car.settings.profiles.ProfileSwitcherActivity;
+import com.android.car.ui.recyclerview.CarUiRecyclerView;
import com.android.car.ui.toolbar.MenuItem;
import com.android.car.ui.toolbar.NavButtonMode;
@@ -58,7 +58,7 @@
private UserManager mUserManager;
private ProfileIconProvider mProfileIconProvider;
private QuickSettingGridAdapter mGridAdapter;
- private RecyclerView mListView;
+ private CarUiRecyclerView mListView;
private MenuItem mFullSettingsBtn;
private MenuItem mProfileSwitcherBtn;
private TextView mBuildInfo;
diff --git a/src/com/android/car/settings/security/CarLockPatternView.java b/src/com/android/car/settings/security/CarLockPatternView.java
new file mode 100644
index 0000000..559327f
--- /dev/null
+++ b/src/com/android/car/settings/security/CarLockPatternView.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.R;
+import com.android.internal.widget.LockPatternView;
+
+/** A LockPatternView that shows a toast when focused. */
+public class CarLockPatternView extends LockPatternView {
+
+ public CarLockPatternView(Context context) {
+ super(context);
+ }
+
+ public CarLockPatternView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFocusChanged(boolean gainFocus, @FocusDirection int direction,
+ @android.annotation.Nullable Rect previouslyFocusedRect) {
+ super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
+ if (gainFocus) {
+ Toast.makeText(getContext(),
+ getContext().getString(R.string.lockpattern_does_not_support_rotary),
+ Toast.LENGTH_LONG)
+ .show();
+ }
+ }
+}
diff --git a/src/com/android/car/settings/security/CredentialStorageActivity.java b/src/com/android/car/settings/security/CredentialStorageActivity.java
index eabfd40..9e533d8 100644
--- a/src/com/android/car/settings/security/CredentialStorageActivity.java
+++ b/src/com/android/car/settings/security/CredentialStorageActivity.java
@@ -95,6 +95,11 @@
.setMessage(R.string.credentials_reset_hint)
.setPositiveButton(android.R.string.ok, arguments -> onResetConfirmed())
.setNegativeButton(android.R.string.cancel, arguments -> finish())
+ .setDismissListener((arguments, positiveResult) -> {
+ if (!positiveResult) {
+ finish();
+ }
+ })
.build();
dialog.show(getSupportFragmentManager(), DIALOG_TAG);
}
diff --git a/src/com/android/car/settings/security/PinPadView.java b/src/com/android/car/settings/security/PinPadView.java
index ee7b5b1..b8a98a3 100644
--- a/src/com/android/car/settings/security/PinPadView.java
+++ b/src/com/android/car/settings/security/PinPadView.java
@@ -20,6 +20,7 @@
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.util.AttributeSet;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -161,6 +162,23 @@
return false;
}
});
+ backspace.setOnKeyListener((v, code, event) -> {
+ if (code != KeyEvent.KEYCODE_DPAD_CENTER) {
+ return false;
+ }
+ switch (event.getAction()) {
+ case KeyEvent.ACTION_DOWN:
+ getHandler().post(mOnBackspaceLongClick);
+ // Must return false so that ripple can show
+ return false;
+ case KeyEvent.ACTION_UP:
+ getHandler().removeCallbacks(mOnBackspaceLongClick);
+ // Must return false so that ripple can show
+ return false;
+ default:
+ return false;
+ }
+ });
mPinKeys.add(backspace);
mEnterKey = findViewById(R.id.key_enter);
diff --git a/src/com/android/car/settings/sound/RingtonePickerPreferenceController.java b/src/com/android/car/settings/sound/RingtonePickerPreferenceController.java
index 90d4e99..27caff5 100644
--- a/src/com/android/car/settings/sound/RingtonePickerPreferenceController.java
+++ b/src/com/android/car/settings/sound/RingtonePickerPreferenceController.java
@@ -130,14 +130,8 @@
}
@Override
- protected void onStopInternal() {
- stopAnyPlayingRingtone();
- clearSelection();
- }
-
- @Override
- protected void updateState(PreferenceGroup preference) {
- populateRingtones(preference);
+ protected void onStartInternal() {
+ populateRingtones(getPreference());
clearSelection();
Uri currentRingtoneUri =
@@ -145,6 +139,12 @@
initSelection(currentRingtoneUri);
}
+ @Override
+ protected void onStopInternal() {
+ stopAnyPlayingRingtone();
+ clearSelection();
+ }
+
private void populateRingtones(PreferenceGroup preference) {
preference.removeAll();
diff --git a/src/com/android/car/settings/sound/RingtonePreferenceController.java b/src/com/android/car/settings/sound/RingtonePreferenceController.java
index ca576b6..07c44ec 100644
--- a/src/com/android/car/settings/sound/RingtonePreferenceController.java
+++ b/src/com/android/car/settings/sound/RingtonePreferenceController.java
@@ -16,6 +16,7 @@
package com.android.car.settings.sound;
+import android.annotation.WorkerThread;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.media.AudioAttributes;
@@ -28,6 +29,7 @@
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.utils.ThreadUtils;
/** Business logic for changing the default ringtone. */
public class RingtonePreferenceController extends PreferenceController<RingtonePreference> {
@@ -52,15 +54,9 @@
}
@Override
- protected void updateState(RingtonePreference preference) {
- Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(getContext(),
- getPreference().getRingtoneType());
- // If this URI cannot be found by the ringtone manager, set the URI to be null.
- if (mRingtoneManager.getRingtonePosition(ringtoneUri) < 0) {
- ringtoneUri = null;
- }
- preference.setSummary(Ringtone.getTitle(getContext(), ringtoneUri,
- /* followSettingsUri= */ false, /* allowRemote= */ true));
+ public void onStartInternal() {
+ super.onStartInternal();
+ ThreadUtils.postOnBackgroundThread(() -> updateSummary(getPreference()));
}
@Override
@@ -69,6 +65,15 @@
return true;
}
+ @WorkerThread
+ private void updateSummary(RingtonePreference preference) {
+ Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(getContext(),
+ preference.getRingtoneType());
+ String summary = Ringtone.getTitle(getContext(), ringtoneUri,
+ /* followSettingsUri= */ false, /* allowRemote= */ true);
+ ThreadUtils.postOnMainThread(() -> preference.setSummary(summary));
+ }
+
/**
* Prepares the fragment to launch the ringtone picker. This can be modified
* to adjust the parameters of the ringtone picker.
diff --git a/src/com/android/car/settings/sound/VolumeItemParser.java b/src/com/android/car/settings/sound/VolumeItemParser.java
index 562d200..29af8a1 100644
--- a/src/com/android/car/settings/sound/VolumeItemParser.java
+++ b/src/com/android/car/settings/sound/VolumeItemParser.java
@@ -79,7 +79,8 @@
volumeItems.put(usage, new VolumeItemParser.VolumeItem(
usage, rank,
item.getResourceId(R.styleable.carVolumeItems_item_titleText, 0),
- item.getResourceId(R.styleable.carVolumeItems_item_icon, 0)));
+ item.getResourceId(R.styleable.carVolumeItems_item_icon, 0),
+ item.getResourceId(R.styleable.carVolumeItems_item_mute_icon, 0)));
rank++;
}
item.recycle();
@@ -102,14 +103,17 @@
private final int mTitle;
@DrawableRes
private final int mIcon;
+ @DrawableRes
+ private final int mMuteIcon;
/** Constructs the VolumeItem container with the given values. */
public VolumeItem(@AudioAttributes.AttributeUsage int usage, int rank,
- @StringRes int title, @DrawableRes int icon) {
+ @StringRes int title, @DrawableRes int icon, @DrawableRes int muteIcon) {
mUsage = usage;
mRank = rank;
mTitle = title;
mIcon = icon;
+ mMuteIcon = muteIcon;
}
/**
@@ -138,5 +142,10 @@
public int getIcon() {
return mIcon;
}
+
+ /** Icon which should be used for the seek bar preference when muted. */
+ public int getMuteIcon() {
+ return mMuteIcon;
+ }
}
}
diff --git a/src/com/android/car/settings/sound/VolumeSeekBarPreference.java b/src/com/android/car/settings/sound/VolumeSeekBarPreference.java
new file mode 100644
index 0000000..3ce14c4
--- /dev/null
+++ b/src/com/android/car/settings/sound/VolumeSeekBarPreference.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.sound;
+
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.View.BaseSavedState;
+
+import com.android.car.settings.common.SeekBarPreference;
+
+final class VolumeSeekBarPreference extends SeekBarPreference {
+ private Drawable mMutedIcon;
+ private Drawable mUnMutedIcon;
+ private boolean mIsMuted = false;
+
+ VolumeSeekBarPreference(Context context) {
+ super(context);
+ }
+
+ Drawable getUnMutedIcon() {
+ return mUnMutedIcon;
+ }
+
+ void setUnMutedIcon(Drawable unMutedIcon) {
+ mUnMutedIcon = unMutedIcon;
+ if (mIsMuted) {
+ return;
+ }
+ setIcon(unMutedIcon);
+ }
+
+ Drawable getMutedIcon() {
+ return mMutedIcon;
+ }
+
+ void setMutedIcon(Drawable mutedIcon) {
+ mMutedIcon = mutedIcon;
+ if (!mIsMuted) {
+ return;
+ }
+ setIcon(mutedIcon);
+ }
+
+ void setIsMuted(boolean isMuted) {
+ mIsMuted = isMuted;
+ if (isMuted) {
+ setIcon(mMutedIcon);
+ } else {
+ setIcon(mUnMutedIcon);
+ }
+ }
+
+ public boolean isMuted() {
+ return mIsMuted;
+ }
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ final Parcelable superState = super.onSaveInstanceState();
+ if (isPersistent()) {
+ // No need to save instance state since it's persistent
+ return superState;
+ }
+
+ // Save the instance state
+ final SavedVolumeState myState = new SavedVolumeState(superState);
+ myState.setIsMuted(mIsMuted);
+ return myState;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ if (!state.getClass().equals(SavedVolumeState.class)) {
+ // Didn't save state for us in onSaveInstanceState
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ // Restore the instance state
+ SavedVolumeState myState = (SavedVolumeState) state;
+ super.onRestoreInstanceState(myState.getSuperState());
+ setIsMuted(myState.isMuted());
+ notifyChanged();
+ }
+
+ /**
+ * SavedVolumeState, a subclass of {@link BaseSavedState}, will store the state
+ * of volume seek bar preferences, a subclass of SeekBarPreference.
+ * <p>
+ * It is important to always call through to super methods.
+ */
+ public static class SavedVolumeState extends BaseSavedState {
+
+ private boolean mIsMuted;
+
+ public boolean isMuted() {
+ return mIsMuted;
+ }
+
+ public void setIsMuted(boolean muted) {
+ mIsMuted = muted;
+ }
+
+ SavedVolumeState(Parcel source) {
+ super(source);
+
+ mIsMuted = source.readBoolean();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+
+ dest.writeBoolean(mIsMuted);
+ }
+
+ private SavedVolumeState(Parcelable superState) {
+ super(superState);
+ }
+
+ @SuppressWarnings("unused")
+ public static final Parcelable.Creator<SavedVolumeState> CREATOR =
+ new Parcelable.Creator<SavedVolumeState>() {
+ @Override
+ public SavedVolumeState createFromParcel(Parcel in) {
+ return new SavedVolumeState(in);
+ }
+
+ @Override
+ public SavedVolumeState[] newArray(int size) {
+ return new SavedVolumeState[size];
+ }
+ };
+ }
+}
diff --git a/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java b/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java
index 5ea34a5..984cae4 100644
--- a/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java
+++ b/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java
@@ -16,6 +16,13 @@
package com.android.car.settings.sound;
+import static android.car.media.CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING;
+import static android.car.media.CarAudioManager.PRIMARY_AUDIO_ZONE;
+import static android.os.UserManager.DISALLOW_ADJUST_VOLUME;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
import static com.android.car.settings.sound.VolumeItemParser.VolumeItem;
import android.car.Car;
@@ -27,6 +34,7 @@
import android.os.Handler;
import android.os.Looper;
import android.util.SparseArray;
+import android.widget.Toast;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
@@ -34,12 +42,12 @@
import androidx.annotation.XmlRes;
import androidx.preference.PreferenceGroup;
-import com.android.car.apps.common.util.Themes;
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.common.SeekBarPreference;
+import com.android.car.settings.enterprise.EnterpriseUtils;
import java.util.ArrayList;
import java.util.List;
@@ -57,7 +65,7 @@
private static final String VOLUME_USAGE_KEY = "volume_usage_key";
private final SparseArray<VolumeItem> mVolumeItems;
- private final List<SeekBarPreference> mVolumePreferences = new ArrayList<>();
+ private final List<VolumeSeekBarPreference> mVolumePreferences = new ArrayList<>();
private final VolumeSettingsRingtoneManager mRingtoneManager;
private final Handler mUiHandler;
@@ -67,33 +75,19 @@
new CarAudioManager.CarVolumeCallback() {
@Override
public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {
- if (mCarAudioManager != null) {
- int value = mCarAudioManager.getGroupVolume(groupId);
-
- for (SeekBarPreference volumePreference : mVolumePreferences) {
- Bundle extras = volumePreference.getExtras();
- if (extras.getInt(VOLUME_GROUP_KEY) == groupId) {
- // Only setValue if the value is different, since changing the
- // seekbar of the volume directly will trigger CarVolumeCallback as
- // well, causing janky movement.
- if (volumePreference.getValue() != value) {
- // CarVolumeCallback is run on a binder thread. In order to
- // make updates to the SeekBarPreference, we need to switch
- // over to the UI thread.
- mUiHandler.post(() -> {
- volumePreference.setValue(value);
- });
- }
- break;
- }
- }
- }
+ updateVolumeAndMute(zoneId, groupId);
}
@Override
public void onMasterMuteChanged(int zoneId, int flags) {
+
// Mute is not being used yet
}
+
+ @Override
+ public void onGroupMuteChanged(int zoneId, int groupId, int flags) {
+ updateVolumeAndMute(zoneId, groupId);
+ }
};
private Car mCar;
@@ -125,9 +119,18 @@
for (int groupId = 0; groupId < volumeGroupCount; groupId++) {
VolumeItem volumeItem = getVolumeItemForUsages(
mCarAudioManager.getUsagesForVolumeGroupId(groupId));
- SeekBarPreference volumePreference = createVolumeSeekBarPreference(
+ VolumeSeekBarPreference volumePreference = createVolumeSeekBarPreference(
groupId, volumeItem.getUsage(), volumeItem.getIcon(),
- volumeItem.getTitle());
+ volumeItem.getMuteIcon(), volumeItem.getTitle());
+ setClickableWhileDisabled(volumePreference, /* clickable= */ true, p -> {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_ADJUST_VOLUME)) {
+ showActionDisabledByAdminDialog();
+ } else {
+ Toast.makeText(getContext(),
+ getContext().getString(R.string.action_unavailable),
+ Toast.LENGTH_LONG).show();
+ }
+ });
mVolumePreferences.add(volumePreference);
}
mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
@@ -162,18 +165,25 @@
return R.xml.car_volume_items;
}
- private SeekBarPreference createVolumeSeekBarPreference(
- int volumeGroupId, int usage, @DrawableRes int iconResId,
- @StringRes int titleId) {
- SeekBarPreference preference = new SeekBarPreference(getContext());
+ private VolumeSeekBarPreference createVolumeSeekBarPreference(
+ int volumeGroupId, int usage, @DrawableRes int primaryIconResId,
+ @DrawableRes int secondaryIconResId, @StringRes int titleId) {
+ VolumeSeekBarPreference preference = new VolumeSeekBarPreference(getContext());
preference.setTitle(getContext().getString(titleId));
- preference.setIcon(getContext().getDrawable(iconResId));
- preference.getIcon().setTintList(
- Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+ preference.setUnMutedIcon(getContext().getDrawable(primaryIconResId));
+ preference.getUnMutedIcon().setTintList(
+ getContext().getColorStateList(R.color.icon_color_default));
+ preference.setMutedIcon(getContext().getDrawable(secondaryIconResId));
+ preference.getMutedIcon().setTintList(
+ getContext().getColorStateList(R.color.icon_color_default));
try {
preference.setValue(mCarAudioManager.getGroupVolume(volumeGroupId));
preference.setMin(mCarAudioManager.getGroupMinVolume(volumeGroupId));
preference.setMax(mCarAudioManager.getGroupMaxVolume(volumeGroupId));
+ if (mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_VOLUME_GROUP_MUTING)) {
+ preference.setIsMuted(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE,
+ volumeGroupId));
+ }
} catch (CarNotConnectedException e) {
LOG.e("Car is not connected!", e);
}
@@ -193,6 +203,32 @@
return preference;
}
+ private void updateVolumeAndMute(int zoneId, int groupId) {
+ // Settings only handles primary zone changes
+ if (zoneId != PRIMARY_AUDIO_ZONE) {
+ return;
+ }
+ if (mCarAudioManager != null) {
+ boolean isMuted =
+ mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
+ int value = mCarAudioManager.getGroupVolume(groupId);
+
+ for (VolumeSeekBarPreference volumePreference : mVolumePreferences) {
+ Bundle extras = volumePreference.getExtras();
+ if (extras.getInt(VOLUME_GROUP_KEY) == groupId) {
+ if (volumePreference.isMuted() != isMuted
+ || value != volumePreference.getValue()) {
+ mUiHandler.post(() -> {
+ volumePreference.setIsMuted(isMuted);
+ volumePreference.setValue(value);
+ });
+ }
+ break;
+ }
+ }
+ }
+ }
+
private void setGroupVolume(int volumeGroupId, int newVolume) {
try {
mCarAudioManager.setGroupVolume(volumeGroupId, newVolume, /* flags= */ 0);
@@ -224,4 +260,20 @@
}
return result;
}
+
+ @Override
+ public int getAvailabilityStatus() {
+ if (hasUserRestrictionByUm(getContext(), DISALLOW_ADJUST_VOLUME)
+ || hasUserRestrictionByDpm(getContext(), DISALLOW_ADJUST_VOLUME)) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
+ }
+
+ private void showActionDisabledByAdminDialog() {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ DISALLOW_ADJUST_VOLUME),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
}
diff --git a/src/com/android/car/settings/sound/VolumeSettingsRingtoneManager.java b/src/com/android/car/settings/sound/VolumeSettingsRingtoneManager.java
index a6c406b..cb7788b 100644
--- a/src/com/android/car/settings/sound/VolumeSettingsRingtoneManager.java
+++ b/src/com/android/car/settings/sound/VolumeSettingsRingtoneManager.java
@@ -93,13 +93,15 @@
mUiHandler.removeCallbacksAndMessages(null);
mCurrentRingtone = nextRingtone;
- mCurrentRingtone.play();
- mUiHandler.postDelayed(() -> {
- if (mCurrentRingtone.isPlaying()) {
- mCurrentRingtone.stop();
- mCurrentRingtone = null;
- }
- }, AUDIO_FEEDBACK_DURATION_MS);
+ if (mCurrentRingtone != null) {
+ mCurrentRingtone.play();
+ mUiHandler.postDelayed(() -> {
+ if (mCurrentRingtone.isPlaying()) {
+ mCurrentRingtone.stop();
+ mCurrentRingtone = null;
+ }
+ }, AUDIO_FEEDBACK_DURATION_MS);
+ }
}
/** Stop playing the current ringtone. */
@@ -113,6 +115,9 @@
private Ringtone lazyLoadRingtone(int group, int usage) {
if (!mGroupToRingtoneMap.containsKey(group)) {
Ringtone ringtone = RingtoneManager.getRingtone(mContext, getRingtoneUri(usage));
+ if (ringtone == null) {
+ return null;
+ }
ringtone.setAudioAttributes(new AudioAttributes.Builder().setUsage(usage).build());
mGroupToRingtoneMap.put(group, ringtone);
}
diff --git a/src/com/android/car/settings/storage/StorageAsyncLoader.java b/src/com/android/car/settings/storage/StorageAsyncLoader.java
index 5d71d99..d65b5b3 100644
--- a/src/com/android/car/settings/storage/StorageAsyncLoader.java
+++ b/src/com/android/car/settings/storage/StorageAsyncLoader.java
@@ -30,6 +30,8 @@
import android.util.ArraySet;
import android.util.SparseArray;
+import androidx.annotation.VisibleForTesting;
+
import com.android.car.settings.common.AsyncLoader;
import com.android.car.settings.common.Logger;
import com.android.car.settings.profiles.ProfileHelper;
@@ -53,10 +55,16 @@
private final ProfileHelper mProfileHelper;
public StorageAsyncLoader(Context context, StorageStatsSource source) {
+ this(context, source, context.getPackageManager(), ProfileHelper.getInstance(context));
+ }
+
+ @VisibleForTesting
+ StorageAsyncLoader(Context context, StorageStatsSource source,
+ PackageManager packageManager, ProfileHelper profileHelper) {
super(context);
mStatsManager = source;
- mPackageManager = context.getPackageManager();
- mProfileHelper = ProfileHelper.getInstance(context);
+ mPackageManager = packageManager;
+ mProfileHelper = profileHelper;
}
@Override
diff --git a/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java b/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java
index b417458..2a5ba6b 100644
--- a/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java
+++ b/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java
@@ -23,6 +23,8 @@
import android.os.storage.StorageManager;
import android.util.SparseArray;
+import androidx.annotation.VisibleForTesting;
+
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.ProgressBarPreference;
@@ -41,9 +43,16 @@
public StorageFileCategoryPreferenceController(Context context,
String preferenceKey, FragmentController fragmentController,
CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions,
+ new StorageManagerVolumeProvider(context.getSystemService(StorageManager.class)));
+ }
+
+ @VisibleForTesting
+ StorageFileCategoryPreferenceController(Context context,
+ String preferenceKey, FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions, StorageVolumeProvider storageVolumeProvider) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- StorageManager sm = context.getSystemService(StorageManager.class);
- mStorageVolumeProvider = new StorageManagerVolumeProvider(sm);
+ mStorageVolumeProvider = storageVolumeProvider;
}
@Override
diff --git a/src/com/android/car/settings/system/BuildNumberPreferenceController.java b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
index 689bbc4..ad4b797 100644
--- a/src/com/android/car/settings/system/BuildNumberPreferenceController.java
+++ b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
@@ -28,6 +28,7 @@
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.development.DevelopmentSettingsUtil;
+import com.android.settingslib.utils.StringUtil;
/** Updates the build number entry summary with the build number. */
public class BuildNumberPreferenceController extends PreferenceController<Preference> {
@@ -80,9 +81,8 @@
DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), true);
showToast(getContext().getString(R.string.show_dev_on), Toast.LENGTH_LONG);
} else if (mDevHitCountdown <= getTapsToBecomeDeveloper() - getTapsToShowToast()) {
- showToast(getContext().getResources().getQuantityString(
- R.plurals.show_dev_countdown, mDevHitCountdown, mDevHitCountdown),
- Toast.LENGTH_SHORT);
+ showToast(StringUtil.getIcuPluralsString(getContext(), mDevHitCountdown,
+ R.string.show_dev_countdown), Toast.LENGTH_SHORT);
}
} else if (mDevHitCountdown < 0) {
showToast(getContext().getString(R.string.show_dev_already), Toast.LENGTH_LONG);
diff --git a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
index 07bdf46..ae3219a 100644
--- a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
@@ -16,54 +16,86 @@
package com.android.car.settings.system;
+import static android.os.UserManager.DISALLOW_DEBUGGING_FEATURES;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.os.UserManager;
-import androidx.preference.Preference;
-
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.development.DevelopmentSettingsUtil;
+import com.android.car.settings.enterprise.EnterpriseUtils;
+import com.android.car.ui.preference.CarUiPreference;
+
/** Controls the visibility of the developer options setting. */
-public class DeveloperOptionsEntryPreferenceController extends PreferenceController<Preference> {
+public class DeveloperOptionsEntryPreferenceController
+ extends PreferenceController<CarUiPreference> {
private static final Logger LOG = new Logger(DeveloperOptionsEntryPreferenceController.class);
- private UserManager mUserManager;
public DeveloperOptionsEntryPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mUserManager = UserManager.get(context);
}
@Override
- protected Class<Preference> getPreferenceType() {
- return Preference.class;
+ protected Class<CarUiPreference> getPreferenceType() {
+ return CarUiPreference.class;
}
@Override
protected int getAvailabilityStatus() {
- return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(), mUserManager)
- ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ if (DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
+ getContext().getSystemService(UserManager.class))) {
+ return AVAILABLE;
+ }
+
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_DEBUGGING_FEATURES)) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+
+ return CONDITIONALLY_UNAVAILABLE;
}
@Override
- protected boolean handlePreferenceClicked(Preference preference) {
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_DEBUGGING_FEATURES)) {
+ showActionDisabledByAdminDialog();
+ }
+ });
+ }
+
+ @Override
+ protected boolean handlePreferenceClicked(CarUiPreference preference) {
// We need to make sure the developer options module is enabled for the following reasons:
// - To enable developer options by default on eng builds
// - To enable developer options for all admin users when any admin user enables it
// This is because on first launch per user, the developer options module may be disabled
// while the setting is enabled, so we need to enable the module
+ LOG.d("handlePreferenceClicked");
if (!DevelopmentSettingsUtil.isDeveloperOptionsModuleEnabled(getContext())) {
LOG.i("Inconsistent state: developer options enabled, but developer options module "
+ "disabled. Enabling module...");
DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), /* enable= */
true);
}
+
getContext().startActivity(preference.getIntent());
return true;
}
+
+ private void showActionDisabledByAdminDialog() {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ DISALLOW_DEBUGGING_FEATURES),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
}
diff --git a/src/com/android/car/settings/system/FactoryResetEntryPreferenceController.java b/src/com/android/car/settings/system/FactoryResetEntryPreferenceController.java
index 2c814d2..ecc9ba8 100644
--- a/src/com/android/car/settings/system/FactoryResetEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/FactoryResetEntryPreferenceController.java
@@ -19,73 +19,69 @@
import static android.os.UserManager.DISALLOW_FACTORY_RESET;
import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
-import android.os.UserHandle;
-import android.os.UserManager;
import android.widget.Toast;
+import androidx.preference.Preference;
+
import com.android.car.settings.R;
-import com.android.car.settings.common.ClickableWhileDisabledPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
-import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.enterprise.EnterpriseUtils;
/**
* Controller which determines if factory clear (aka "factory reset") should be displayed based on
* user status.
*/
public class FactoryResetEntryPreferenceController
- extends PreferenceController<ClickableWhileDisabledPreference> {
-
- private final UserManager mUserManager;
+ extends PreferenceController<Preference> {
public FactoryResetEntryPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mUserManager = UserManager.get(context);
}
@Override
- protected Class<ClickableWhileDisabledPreference> getPreferenceType() {
- return ClickableWhileDisabledPreference.class;
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
}
@Override
protected void onCreateInternal() {
super.onCreateInternal();
- getPreference().setDisabledClickListener(p ->
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_FACTORY_RESET)) {
+ showActionDisabledByAdminDialog();
+ } else {
Toast.makeText(getContext(), getContext().getString(R.string.action_unavailable),
- Toast.LENGTH_LONG).show());
- }
-
- @Override
- protected boolean handlePreferenceClicked(ClickableWhileDisabledPreference preference) {
- if (mUserManager.hasUserRestriction(DISALLOW_FACTORY_RESET)) {
- getFragmentController().showDialog(ActionDisabledByAdminDialogFragment.newInstance(
- DISALLOW_FACTORY_RESET, UserHandle.USER_SYSTEM),
- DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
- return true;
- }
- return super.handlePreferenceClicked(preference);
+ Toast.LENGTH_LONG).show();
+ }
+ });
}
@Override
public int getAvailabilityStatus() {
- return shouldDisable() ? AVAILABLE_FOR_VIEWING : AVAILABLE;
- }
-
- private boolean shouldDisable() {
- if (!mUserManager.isAdminUser() && !isDemoUser()) {
- // Disable for non-admin and non-demo users.
- return true;
+ if (!isAlwaysAvailableForUser()
+ || hasUserRestrictionByUm(getContext(), DISALLOW_FACTORY_RESET)
+ || hasUserRestrictionByDpm(getContext(), DISALLOW_FACTORY_RESET)) {
+ return AVAILABLE_FOR_VIEWING;
}
- UserHandle userHandle = UserHandle.of(getContext().getUserId());
- return mUserManager.hasBaseUserRestriction(DISALLOW_FACTORY_RESET, userHandle);
+ return AVAILABLE;
}
- private boolean isDemoUser() {
- return UserManager.isDeviceInDemoMode(getContext()) && mUserManager.isDemoUser();
+ private boolean isAlwaysAvailableForUser() {
+ return EnterpriseUtils.isAdminUser(getContext())
+ || EnterpriseUtils.isDemoUser(getContext());
+ }
+
+ private void showActionDisabledByAdminDialog() {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ DISALLOW_FACTORY_RESET),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
}
}
diff --git a/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java b/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
index bf8b9fd..803c21c 100644
--- a/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
@@ -18,24 +18,27 @@
import static android.os.UserManager.DISALLOW_NETWORK_RESET;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
+
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
-import android.os.UserManager;
+import android.widget.Toast;
import androidx.preference.Preference;
+import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.enterprise.EnterpriseUtils;
/** Controller which determines if network reset should be displayed based on user status. */
public class ResetNetworkEntryPreferenceController extends PreferenceController<Preference> {
- private final UserManager mUserManager;
-
public ResetNetworkEntryPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mUserManager = UserManager.get(context);
}
@Override
@@ -44,12 +47,41 @@
}
@Override
- public int getAvailabilityStatus() {
- return isUserRestricted() ? DISABLED_FOR_PROFILE : AVAILABLE;
+ protected void onCreateInternal() {
+ super.onCreateInternal();
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_NETWORK_RESET)) {
+ showActionDisabledByAdminDialog();
+ } else {
+ // Currently, there is no use case when AVAILABLE_FOR_VIEWING other than restricted
+ // by DPM
+ Toast.makeText(getContext(), getContext().getString(R.string.action_unavailable),
+ Toast.LENGTH_LONG).show();
+ }
+ });
}
- private boolean isUserRestricted() {
- return !mUserManager.isAdminUser()
- || mUserManager.hasUserRestriction(DISALLOW_NETWORK_RESET);
+ @Override
+ public int getAvailabilityStatus() {
+ if (!isAlwaysAvailableForUser()
+ || hasUserRestrictionByUm(getContext(), DISALLOW_NETWORK_RESET)) {
+ return DISABLED_FOR_PROFILE;
+ }
+
+ if (hasUserRestrictionByDpm(getContext(), DISALLOW_NETWORK_RESET)) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
+ }
+
+ private boolean isAlwaysAvailableForUser() {
+ return EnterpriseUtils.isAdminUser(getContext());
+ }
+
+ private void showActionDisabledByAdminDialog() {
+ getFragmentController().showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(getContext(),
+ DISALLOW_NETWORK_RESET),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
}
}
diff --git a/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceController.java b/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceController.java
index 83358bf..87e1cb8 100644
--- a/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceController.java
+++ b/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceController.java
@@ -22,6 +22,8 @@
import android.speech.tts.TextToSpeech;
import android.speech.tts.TtsEngines;
+import androidx.annotation.VisibleForTesting;
+
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PreferenceController;
@@ -36,8 +38,15 @@
public PreferredEngineEntryPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions, new TtsEngines(context));
+ }
+
+ @VisibleForTesting
+ public PreferredEngineEntryPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ TtsEngines enginesHelper) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mEnginesHelper = new TtsEngines(context);
+ mEnginesHelper = enginesHelper;
}
@Override
diff --git a/src/com/android/car/settings/tts/TtsPlaybackPreferenceController.java b/src/com/android/car/settings/tts/TtsPlaybackPreferenceController.java
index a0ebfe2..ba3ca8d 100644
--- a/src/com/android/car/settings/tts/TtsPlaybackPreferenceController.java
+++ b/src/com/android/car/settings/tts/TtsPlaybackPreferenceController.java
@@ -89,7 +89,8 @@
/** True if initialized with no errors. */
private boolean mTtsInitialized = false;
- private final TextToSpeech.OnInitListener mOnInitListener = status -> {
+ @VisibleForTesting
+ final TextToSpeech.OnInitListener mOnInitListener = status -> {
if (status == TextToSpeech.SUCCESS) {
mTtsInitialized = true;
mTtsPlaybackManager = new TtsPlaybackSettingsManager(getContext(), mTts,
@@ -108,8 +109,15 @@
public TtsPlaybackPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ this(context, preferenceKey, fragmentController, uxRestrictions, new TtsEngines(context));
+ }
+
+ @VisibleForTesting
+ TtsPlaybackPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ TtsEngines enginesHelper) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mEnginesHelper = new TtsEngines(context);
+ mEnginesHelper = enginesHelper;
}
@Override
@@ -129,7 +137,7 @@
mBackgroundHandlerThread.start();
mBackgroundHandler = new Handler(mBackgroundHandlerThread.getLooper());
- mTts = new TextToSpeech(getContext(), mOnInitListener);
+ mTts = createTts();
}
@Override
@@ -339,6 +347,11 @@
}
@VisibleForTesting
+ TextToSpeech createTts() {
+ return new TextToSpeech(getContext(), mOnInitListener);
+ }
+
+ @VisibleForTesting
String getSampleText() {
return mSampleText;
}
diff --git a/src/com/android/car/settings/tts/TtsPlaybackSettingsManager.java b/src/com/android/car/settings/tts/TtsPlaybackSettingsManager.java
index 7ff45b1..9e04104 100644
--- a/src/com/android/car/settings/tts/TtsPlaybackSettingsManager.java
+++ b/src/com/android/car/settings/tts/TtsPlaybackSettingsManager.java
@@ -24,6 +24,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import com.android.car.settings.R;
import com.android.car.settings.common.Logger;
@@ -159,11 +160,16 @@
}
private void displayNetworkAlert() {
- AlertDialog dialog = new AlertDialogBuilder(mContext)
+ AlertDialog dialog = createNetworkAlertDialog();
+ dialog.show();
+ }
+
+ @VisibleForTesting
+ AlertDialog createNetworkAlertDialog() {
+ return new AlertDialogBuilder(mContext)
.setTitle(android.R.string.dialog_alert_title)
.setMessage(R.string.tts_engine_network_required)
.setCancelable(false)
.setPositiveButton(android.R.string.ok, null).create();
- dialog.show();
}
}
diff --git a/src/com/android/car/settings/units/CarUnitsManager.java b/src/com/android/car/settings/units/CarUnitsManager.java
index af60a99..e4f77f6 100644
--- a/src/com/android/car/settings/units/CarUnitsManager.java
+++ b/src/com/android/car/settings/units/CarUnitsManager.java
@@ -94,6 +94,12 @@
return null;
}
+ // Checks if the property is read-write property
+ if (configs.get(0).getAccess()
+ != CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ_WRITE) {
+ return null;
+ }
+
availableUnitsId = configs.get(0).getConfigArray();
Unit[] result = new Unit[availableUnitsId.size()];
diff --git a/src/com/android/car/settings/wifi/WifiBasePreferenceController.java b/src/com/android/car/settings/wifi/WifiBasePreferenceController.java
index 72f1548..2c74f3b 100644
--- a/src/com/android/car/settings/wifi/WifiBasePreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiBasePreferenceController.java
@@ -42,8 +42,13 @@
@Override
protected void onCreateInternal() {
+ super.onCreateInternal();
mCarWifiManager = new CarWifiManager(getContext(),
getFragmentController().getSettingsLifecycle());
+
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ WifiUtil.runClickableWhileDisabled(getContext(), getFragmentController());
+ });
}
@Override
@@ -58,7 +63,7 @@
@Override
public int getAvailabilityStatus() {
- return WifiUtil.isWifiAvailable(getContext()) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return WifiUtil.getAvailabilityStatus(getContext());
}
@Override
diff --git a/src/com/android/car/settings/wifi/WifiEntryGroupPreferenceController.java b/src/com/android/car/settings/wifi/WifiEntryGroupPreferenceController.java
index ff0078e..fc05a43 100644
--- a/src/com/android/car/settings/wifi/WifiEntryGroupPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiEntryGroupPreferenceController.java
@@ -22,12 +22,12 @@
import androidx.preference.PreferenceGroup;
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceController;
/**
* Controller for displaying a group of {@link com.android.wifitrackerlib.WifiEntry} information
*/
-public class WifiEntryGroupPreferenceController extends PreferenceController<PreferenceGroup> {
+public class WifiEntryGroupPreferenceController
+ extends WifiBasePreferenceController<PreferenceGroup> {
public WifiEntryGroupPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -40,7 +40,7 @@
}
@Override
- protected int getAvailabilityStatus() {
- return WifiUtil.isWifiAvailable(getContext()) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ public void onWifiStateChanged(int state) {
+ // do nothing.
}
}
diff --git a/src/com/android/car/settings/wifi/WifiEntryListPreferenceController.java b/src/com/android/car/settings/wifi/WifiEntryListPreferenceController.java
index f81f5c7..bade200 100644
--- a/src/com/android/car/settings/wifi/WifiEntryListPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiEntryListPreferenceController.java
@@ -28,7 +28,6 @@
import androidx.preference.PreferenceGroup;
import com.android.car.settings.R;
-import com.android.car.settings.common.CarUxRestrictionsHelper;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
import com.android.car.settings.wifi.details.WifiDetailsFragment;
@@ -135,7 +134,7 @@
* @return List of wifi entries that should be displayed
*/
protected List<WifiEntry> fetchWifiEntries() {
- List<WifiEntry> wifiEntries = CarUxRestrictionsHelper.isNoSetup(getUxRestrictions())
+ List<WifiEntry> wifiEntries = shouldApplyUxRestrictions(getUxRestrictions())
? getCarWifiManager().getSavedWifiEntries()
: getCarWifiManager().getAllWifiEntries();
diff --git a/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java b/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java
index 268eacc..7a9a7c8 100644
--- a/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java
+++ b/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java
@@ -26,7 +26,6 @@
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.os.Bundle;
-import android.text.TextUtils;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentActivity;
@@ -94,9 +93,8 @@
};
@VisibleForTesting
- final ConfirmationDialogFragment.DismissListener mDismissListener = arguments -> {
- finish();
- };
+ final ConfirmationDialogFragment.DismissListener mDismissListener =
+ (arguments, positiveResult) -> finish();
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -107,18 +105,12 @@
setResult(Activity.RESULT_CANCELED);
- String packageName = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
- if (TextUtils.isEmpty(packageName)) {
- finish();
- return;
- }
-
try {
- ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
- packageName, /* flags= */ 0);
- mAppLabel = applicationInfo.loadSafeLabel(getPackageManager());
+ PackageManager pm = getPackageManager();
+ ApplicationInfo ai = pm.getApplicationInfo(getCallingPackage(), /* flags= */ 0);
+ mAppLabel = pm.getApplicationLabel(ai);
} catch (PackageManager.NameNotFoundException e) {
- LOG.e("Couldn't find app with package name " + packageName);
+ LOG.e("Couldn't find app with package name " + getCallingPackage());
finish();
return;
}
diff --git a/src/com/android/car/settings/wifi/WifiStateSwitchPreferenceController.java b/src/com/android/car/settings/wifi/WifiStateSwitchPreferenceController.java
index d783d61..bc4cfdb 100644
--- a/src/com/android/car/settings/wifi/WifiStateSwitchPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiStateSwitchPreferenceController.java
@@ -26,67 +26,73 @@
import androidx.annotation.VisibleForTesting;
import com.android.car.settings.R;
-import com.android.car.settings.common.ClickableWhileDisabledSwitchPreference;
+import com.android.car.settings.common.ColoredSwitchPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PowerPolicyListener;
-import com.android.car.settings.common.PreferenceController;
/**
- * Enables/disables Wifi state via SwitchPreference.
+ * Enables/disables Wifi state via ColoredSwitchPreference.
*/
public class WifiStateSwitchPreferenceController extends
- PreferenceController<ClickableWhileDisabledSwitchPreference>
- implements CarWifiManager.Listener {
-
- private final CarWifiManager mCarWifiManager;
+ WifiBasePreferenceController<ColoredSwitchPreference> {
@VisibleForTesting
final PowerPolicyListener mPowerPolicyListener;
+ private boolean mIsPowerPolicyOn = true;
+ private boolean mIsWifiEnabled;
+
public WifiStateSwitchPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController,
CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mPowerPolicyListener = new PowerPolicyListener(context, WIFI,
- isOn -> {
- enableSwitchPreference(getPreference(), isOn);
- });
- mCarWifiManager = new CarWifiManager(context,
- getFragmentController().getSettingsLifecycle());
+ mPowerPolicyListener = new PowerPolicyListener(context, WIFI, isOn -> {
+ // refresh power state
+ mIsPowerPolicyOn = isOn;
+ refreshUi();
+ });
}
@Override
- protected Class<ClickableWhileDisabledSwitchPreference> getPreferenceType() {
- return ClickableWhileDisabledSwitchPreference.class;
+ protected Class<ColoredSwitchPreference> getPreferenceType() {
+ return ColoredSwitchPreference.class;
}
@Override
- protected void updateState(ClickableWhileDisabledSwitchPreference preference) {
- updateSwitchPreference(preference, mCarWifiManager.isWifiEnabled());
+ protected void updateState(ColoredSwitchPreference preference) {
+ updateSwitchPreference();
}
@Override
- protected boolean handlePreferenceChanged(ClickableWhileDisabledSwitchPreference preference,
+ protected boolean handlePreferenceChanged(ColoredSwitchPreference preference,
Object newValue) {
boolean wifiEnabled = (Boolean) newValue;
- mCarWifiManager.setWifiEnabled(wifiEnabled);
+ getCarWifiManager().setWifiEnabled(wifiEnabled);
return true;
}
@Override
protected void onCreateInternal() {
+ super.onCreateInternal();
getPreference().setContentDescription(
getContext().getString(R.string.wifi_state_switch_content_description));
- getPreference().setDisabledClickListener(p ->
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ if (mIsPowerPolicyOn) {
+ // ActionDisabledByAdminDialog will be shown if DISALLOW_CONFIG_WIFI
+ // is set by a device admin; otherwise, a default Toast will be shown
+ WifiUtil.runClickableWhileDisabled(getContext(), getFragmentController());
+ } else {
Toast.makeText(getContext(),
getContext().getString(R.string.power_component_disabled),
- Toast.LENGTH_LONG).show());
+ Toast.LENGTH_LONG).show();
+ }
+ });
}
@Override
protected void onStartInternal() {
- mCarWifiManager.addListener(this);
- onWifiStateChanged(mCarWifiManager.getWifiState());
+ super.onStartInternal();
+ onWifiStateChanged(getCarWifiManager().getWifiState());
}
@Override
@@ -95,11 +101,6 @@
}
@Override
- protected void onStopInternal() {
- mCarWifiManager.removeListener(this);
- }
-
- @Override
protected void onDestroyInternal() {
mPowerPolicyListener.release();
}
@@ -111,17 +112,20 @@
@Override
public void onWifiStateChanged(int state) {
- updateSwitchPreference(getPreference(), state == WifiManager.WIFI_STATE_ENABLED
+ mIsWifiEnabled = (state == WifiManager.WIFI_STATE_ENABLED
|| state == WifiManager.WIFI_STATE_ENABLING);
+ refreshUi();
}
- private void updateSwitchPreference(ClickableWhileDisabledSwitchPreference preference,
- boolean enabled) {
- preference.setChecked(enabled);
+ private void updateSwitchPreference() {
+ getPreference().setChecked(mIsWifiEnabled);
}
- private void enableSwitchPreference(ClickableWhileDisabledSwitchPreference preference,
- boolean enabled) {
- preference.setEnabled(enabled);
+ @Override
+ public int getAvailabilityStatus() {
+ if (mIsPowerPolicyOn) {
+ return WifiUtil.getAvailabilityStatus(getContext());
+ }
+ return AVAILABLE_FOR_VIEWING;
}
}
diff --git a/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java
index 05d6638..b7910a7 100644
--- a/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java
@@ -57,6 +57,10 @@
protected void onCreateInternal() {
mCarWifiManager = new CarWifiManager(getContext(),
getFragmentController().getSettingsLifecycle());
+ // ActionDisabledByAdminDialog will be shown if DISALLOW_CONFIG_WIFI
+ // is set by a device admin; otherwise, a default Toast will be shown
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p ->
+ WifiUtil.runClickableWhileDisabled(getContext(), getFragmentController()));
}
@Override
@@ -78,6 +82,15 @@
}
}
+ @Override
+ protected int getAvailabilityStatus() {
+ if (WifiUtil.isConfigWifiRestrictedByUm(getContext())
+ || WifiUtil.isConfigWifiRestrictedByDpm(getContext())) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
+ }
+
protected SoftApConfiguration getCarSoftApConfig() {
return mCarWifiManager.getSoftApConfig();
}
diff --git a/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java
index dca9200..fe5638d 100644
--- a/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java
@@ -72,6 +72,9 @@
getPreference().setOnSecondaryActionClickListener(isChecked -> {
mWifiTetheringHandler.updateWifiTetheringState(isChecked);
});
+ setClickableWhileDisabled(getPreference(), /* clickable= */ true, p -> {
+ WifiUtil.runClickableWhileDisabled(getContext(), getFragmentController());
+ });
}
@Override
@@ -94,7 +97,14 @@
if (!mReceivedTetheringEventCallback) {
return AVAILABLE_FOR_VIEWING;
}
- return mIsTetheringSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ if (!mIsTetheringSupported) {
+ return UNSUPPORTED_ON_DEVICE;
+ }
+ if (WifiUtil.isConfigWifiRestrictedByUm(getContext())
+ || WifiUtil.isConfigWifiRestrictedByDpm(getContext())) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
}
@Override
diff --git a/src/com/android/car/settings/wifi/WifiUtil.java b/src/com/android/car/settings/wifi/WifiUtil.java
index 6e73fe5..96258b1 100644
--- a/src/com/android/car/settings/wifi/WifiUtil.java
+++ b/src/com/android/car/settings/wifi/WifiUtil.java
@@ -16,6 +16,14 @@
package com.android.car.settings.wifi;
import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED;
+import static android.os.UserManager.DISALLOW_CONFIG_WIFI;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
import android.annotation.DrawableRes;
import android.annotation.Nullable;
@@ -34,13 +42,16 @@
import android.os.SimpleClock;
import android.provider.Settings;
import android.text.TextUtils;
+import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.lifecycle.Lifecycle;
import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
+import com.android.car.settings.enterprise.EnterpriseUtils;
import com.android.wifitrackerlib.NetworkDetailsTracker;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -111,13 +122,41 @@
}
/**
- * Returns {@Code true} if wifi is available on this device.
+ * Returns {@code true} if wifi is available on this device.
*/
public static boolean isWifiAvailable(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI);
}
/**
+ * Returns {@code true} if configuring wifi is allowed by user manager.
+ */
+ public static boolean isConfigWifiRestrictedByUm(Context context) {
+ return hasUserRestrictionByUm(context, DISALLOW_CONFIG_WIFI);
+ }
+
+ /**
+ * Returns {@code true} if configuring wifi is allowed by device policy manager.
+ */
+ public static boolean isConfigWifiRestrictedByDpm(Context context) {
+ return hasUserRestrictionByDpm(context, DISALLOW_CONFIG_WIFI);
+ }
+
+ /**
+ * Returns Preference's availability status.
+ */
+ public static int getAvailabilityStatus(Context context) {
+ if (!isWifiAvailable(context)) {
+ return UNSUPPORTED_ON_DEVICE;
+ }
+ if (isConfigWifiRestrictedByUm(context)
+ || isConfigWifiRestrictedByDpm(context)) {
+ return AVAILABLE_FOR_VIEWING;
+ }
+ return AVAILABLE;
+ }
+
+ /**
* Gets a unique key for a {@link WifiEntry}.
*/
public static String getKey(WifiEntry wifiEntry) {
@@ -385,4 +424,35 @@
maxScanAgeMillis, scanIntervalMillis,
key);
}
+
+ /**
+ * Shows {@code ActionDisabledByAdminDialog} when the action is disallowed by
+ * a device owner or a profile owner. Otherwise, a {@code Toast} will be shwon to inform the
+ * user that the action is disabled.
+ */
+ // TODO(b/186905050): add unit tests for this class and {@code PreferenceController} that uses
+ // this method.
+ public static void runClickableWhileDisabled(Context context,
+ FragmentController fragmentController) {
+ if (hasUserRestrictionByDpm(context, DISALLOW_CONFIG_WIFI)) {
+ showActionDisabledByAdminDialog(context, fragmentController);
+ } else {
+ Toast.makeText(context, context.getString(R.string.action_unavailable),
+ Toast.LENGTH_LONG).show();
+ }
+ }
+
+ /**
+ * Shows ActionDisabledByAdminDialog when there is user restriction set by device policy
+ * manager.
+ */
+ // TODO(b/186905050): add unit tests for this class and {@code PreferenceController} that uses
+ // this method.
+ public static void showActionDisabledByAdminDialog(Context context,
+ FragmentController fragmentController) {
+ fragmentController.showDialog(
+ EnterpriseUtils.getActionDisabledByAdminDialog(context,
+ DISALLOW_CONFIG_WIFI),
+ DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG);
+ }
}
diff --git a/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceController.java
index 6818e4b..0c40a6e 100644
--- a/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceController.java
+++ b/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceController.java
@@ -41,7 +41,6 @@
protected void updateState(WifiDetailsPreference preference) {
int linkSpeedMbps = getWifiInfoProvider().getWifiInfo().getLinkSpeed();
preference.setVisible(linkSpeedMbps >= 0);
- preference.setDetailText(getContext().getString(
- R.string.link_speed, getWifiInfoProvider().getWifiInfo().getLinkSpeed()));
+ preference.setDetailText(getContext().getString(R.string.link_speed, linkSpeedMbps));
}
}
diff --git a/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java b/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java
index b0d8849..0356cb4 100644
--- a/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java
+++ b/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java
@@ -16,7 +16,6 @@
package com.android.car.settings.wifi.preferences;
-import android.app.Service;
import android.car.drivingstate.CarUxRestrictions;
import android.content.ActivityNotFoundException;
import android.content.Context;
@@ -74,7 +73,7 @@
public WifiWakeupTogglePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
- mLocationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE);
+ mLocationManager = context.getSystemService(LocationManager.class);
mWifiManager = context.getSystemService(WifiManager.class);
}
diff --git a/tests/robotests/res/values/internal_resources.xml b/tests/robotests/res/values/internal_resources.xml
index 90c541e..a995452 100644
--- a/tests/robotests/res/values/internal_resources.xml
+++ b/tests/robotests/res/values/internal_resources.xml
@@ -21,5 +21,4 @@
<!-- Progress bar preference resources -->
<color name="config_progress_background_tint">@android:color/white</color>
- <color name="white_disabled_material">@android:color/white</color>
</resources>
diff --git a/tests/robotests/src/com/android/car/settings/accessibility/CaptionSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accessibility/CaptionSettingsPreferenceControllerTest.java
new file mode 100644
index 0000000..e8267e3
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accessibility/CaptionSettingsPreferenceControllerTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class CaptionSettingsPreferenceControllerTest {
+
+ private Context mContext;
+
+ private PreferenceControllerTestHelper<CaptionSettingsPreferenceController>
+ mPreferenceControllerHelper;
+ private Preference mPreference;
+
+ @Before
+ public void setup() {
+ mContext = RuntimeEnvironment.application;
+ mPreference = new Preference(mContext);
+ mPreferenceControllerHelper =
+ new PreferenceControllerTestHelper<>(mContext,
+ CaptionSettingsPreferenceController.class, mPreference);
+ mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+ }
+
+ @After
+ public void tearDown() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0);
+ }
+
+ @Test
+ public void testRefreshUi_captionsDisabled_summarySetToOff() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0);
+
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(mPreference.getSummary()).isEqualTo(
+ mContext.getString(R.string.captions_settings_off));
+ }
+
+ @Test
+ public void testRefreshUi_captionsEnabled_summarySetToOn() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 1);
+
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(mPreference.getSummary()).isEqualTo(
+ mContext.getString(R.string.captions_settings_on));
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accessibility/CaptionsTextSizeListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accessibility/CaptionsTextSizeListPreferenceControllerTest.java
new file mode 100644
index 0000000..78c5c14
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accessibility/CaptionsTextSizeListPreferenceControllerTest.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.Arrays;
+
+@RunWith(RobolectricTestRunner.class)
+public class CaptionsTextSizeListPreferenceControllerTest {
+
+ private Context mContext;
+ private PreferenceControllerTestHelper<CaptionsTextSizeListPreferenceController>
+ mPreferenceControllerHelper;
+ private ListPreference mListPreference;
+ private String[] mFontSizeTitles;
+
+ @Before
+ public void setup() {
+ mContext = RuntimeEnvironment.application;
+ mListPreference = new ListPreference(mContext);
+ mPreferenceControllerHelper =
+ new PreferenceControllerTestHelper<>(mContext,
+ CaptionsTextSizeListPreferenceController.class, mListPreference);
+
+ mFontSizeTitles = mPreferenceControllerHelper.getController().mFontSizeTitles;
+ mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+ }
+
+ @After
+ public void tearDown() {
+ Settings.Secure.putFloat(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE, 1.0F);
+ }
+
+ @Test
+ public void testUpdateUi_includesAllTextSizeOptions() {
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(Arrays.asList(mListPreference.getEntries())).containsExactlyElementsIn(
+ mFontSizeTitles);
+ }
+
+ @Test
+ public void testUpdateUi_selectsCurrentFontSize() {
+ Settings.Secure.putFloat(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE, 1.5F);
+
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(mListPreference.getValue()).isEqualTo("1.5");
+ assertThat(mListPreference.getSummary()).isEqualTo(mFontSizeTitles[3]);
+ }
+
+ @Test
+ public void testUpdateUi_noKnownValueSelected_selectsDefaultFontSize() {
+ Settings.Secure.putFloat(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE, 100.0F);
+
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(mListPreference.getValue()).isEqualTo("1.0");
+ assertThat(mListPreference.getSummary()).isEqualTo(mFontSizeTitles[2]);
+ }
+
+ @Test
+ public void testFontSizeSelected_updatesFontSizeConstant() {
+ mListPreference.getOnPreferenceChangeListener().onPreferenceChange(
+ mListPreference, "1.5");
+
+ assertThat(Settings.Secure.getFloat(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE, 1.0F)).isEqualTo(1.5F);
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accessibility/CaptionsTextStyleListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accessibility/CaptionsTextStyleListPreferenceControllerTest.java
new file mode 100644
index 0000000..d3838ce
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accessibility/CaptionsTextStyleListPreferenceControllerTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.Arrays;
+
+@RunWith(RobolectricTestRunner.class)
+public class CaptionsTextStyleListPreferenceControllerTest {
+
+ private Context mContext;
+ private PreferenceControllerTestHelper<CaptionsTextStyleListPreferenceController>
+ mPreferenceControllerHelper;
+ private ListPreference mListPreference;
+ private String[] mFontStyleTitles;
+
+ @Before
+ public void setup() {
+ mContext = RuntimeEnvironment.application;
+ mListPreference = new ListPreference(mContext);
+ mPreferenceControllerHelper =
+ new PreferenceControllerTestHelper<>(mContext,
+ CaptionsTextStyleListPreferenceController.class, mListPreference);
+ mFontStyleTitles = mPreferenceControllerHelper.getController().mFontStyleTitles;
+ mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+ }
+
+ @After
+ public void tearDown() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, 4);
+ }
+
+ @Test
+ public void testUpdateUi_includesAllTextStyleOptions() {
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(Arrays.asList(mListPreference.getEntries())).containsExactlyElementsIn(
+ mFontStyleTitles);
+ }
+
+ @Test
+ public void testUpdateUi_selectsCurrentFontStylePreset() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, 0);
+
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(mListPreference.getValue()).isEqualTo("0");
+ assertThat(mListPreference.getSummary()).isEqualTo(mFontStyleTitles[1]);
+ }
+
+ @Test
+ public void testUpdateUi_noKnownValueSelected_selectsDefaultFontStylePreset() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, 50);
+
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(mListPreference.getValue()).isEqualTo("4");
+ assertThat(mListPreference.getSummary()).isEqualTo(mFontStyleTitles[0]);
+ }
+
+ @Test
+ public void testFontSizeSelected_updatesFontSizeConstant() {
+ mListPreference.getOnPreferenceChangeListener().onPreferenceChange(
+ mListPreference, "1");
+
+ assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, 4)).isEqualTo(1);
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accessibility/ShowCaptionsSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accessibility/ShowCaptionsSwitchPreferenceControllerTest.java
new file mode 100644
index 0000000..fcd12aa
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accessibility/ShowCaptionsSwitchPreferenceControllerTest.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.common.ColoredSwitchPreference;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class ShowCaptionsSwitchPreferenceControllerTest {
+
+ private Context mContext;
+ private PreferenceControllerTestHelper<ShowCaptionsSwitchPreferenceController>
+ mPreferenceControllerHelper;
+ private ColoredSwitchPreference mColoredSwitchPreference;
+
+ @Before
+ public void setup() {
+ mContext = RuntimeEnvironment.application;
+ mColoredSwitchPreference = new ColoredSwitchPreference(mContext);
+ mPreferenceControllerHelper =
+ new PreferenceControllerTestHelper<>(mContext,
+ ShowCaptionsSwitchPreferenceController.class, mColoredSwitchPreference);
+ mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+ }
+
+ @After
+ public void tearDown() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0);
+ }
+
+ @Test
+ public void testRefreshUi_captionsDisabled_switchSetToOff() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0);
+
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(mColoredSwitchPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void testRefreshUi_captionsEnabled_switchSetToOn() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 1);
+
+ mPreferenceControllerHelper.getController().refreshUi();
+
+ assertThat(mColoredSwitchPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void testSwitchedSetOn_setsSystemCaptionSettingsEnabled() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0);
+
+ mColoredSwitchPreference.getOnPreferenceChangeListener().onPreferenceChange(
+ mColoredSwitchPreference, true);
+
+ assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0)).isEqualTo(1);
+ }
+
+ @Test
+ public void testSwitchedSetOff_setsSystemCaptionSettingsDisabled() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 1);
+
+ mColoredSwitchPreference.getOnPreferenceChangeListener().onPreferenceChange(
+ mColoredSwitchPreference, false);
+
+ assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, -1)).isEqualTo(0);
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java
deleted file mode 100644
index a509fc6..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * 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.car.settings.applications.assist;
-
-import static com.android.car.settings.common.PreferenceController.AVAILABLE;
-import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.ComponentName;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.UserHandle;
-import android.provider.Settings;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.SwitchPreference;
-import androidx.preference.TwoStatePreference;
-
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowSecureSettings;
-
-import com.google.common.collect.Iterables;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowContentResolver;
-
-import java.util.Collections;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowSecureSettings.class})
-public class AssistConfigBasePreferenceControllerTest {
-
- private static class TestAssistConfigBasePreferenceController extends
- AssistConfigBasePreferenceController {
-
- private int mNumCallsToUpdateState;
-
- TestAssistConfigBasePreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
- super(context, preferenceKey, fragmentController, uxRestrictions);
- mNumCallsToUpdateState = 0;
- }
-
- public int getNumCallsToUpdateState() {
- return mNumCallsToUpdateState;
- }
-
- @Override
- protected void updateState(TwoStatePreference preference) {
- mNumCallsToUpdateState++;
- }
-
- @Override
- protected List<Uri> getSettingUris() {
- return Collections.singletonList(
- Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED));
- }
- }
-
- private static final String TEST_PACKAGE_NAME = "com.test.package";
- private static final String TEST_SERVICE = "TestService";
- private final int mUserId = UserHandle.myUserId();
-
- private Context mContext;
- private TwoStatePreference mTwoStatePreference;
- private PreferenceControllerTestHelper<TestAssistConfigBasePreferenceController>
- mControllerHelper;
- private TestAssistConfigBasePreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mTwoStatePreference = new SwitchPreference(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- TestAssistConfigBasePreferenceController.class, mTwoStatePreference);
- mController = mControllerHelper.getController();
- }
-
- @After
- public void tearDown() {
- ShadowSecureSettings.reset();
- }
-
- @Test
- public void getAvailabilityStatus_hasAssistComponent_isAvailable() {
- String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
- Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
- key, mUserId);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_noAssistComponent_conditionallyUnavailable() {
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void onStart_registersObserver() {
- String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
- Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
- key, mUserId);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ASSISTANT))).isNotEmpty();
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED))).isNotEmpty();
- }
-
- @Test
- public void onStop_unregistersObserver() {
- String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
- Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
- key, mUserId);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ASSISTANT))).isEmpty();
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED))).isEmpty();
- }
-
- @Test
- public void onChange_changeRegisteredSetting_callsRefreshUi() {
- String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
- Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
- key, mUserId);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- int currentCount = mController.getNumCallsToUpdateState();
-
- ContentObserver observer = Iterables.get(getShadowContentResolver().getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED)), 0);
- observer.onChange(/* selfChange= */ false,
- Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED));
-
- assertThat(mController.getNumCallsToUpdateState()).isEqualTo(currentCount + 1);
- }
-
- private ShadowContentResolver getShadowContentResolver() {
- return (ShadowContentResolver) Shadows.shadowOf(mContext.getContentResolver());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java
deleted file mode 100644
index b07e350..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * 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.car.settings.applications.assist;
-
-import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.database.ContentObserver;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.service.voice.VoiceInteractionServiceInfo;
-
-import androidx.lifecycle.Lifecycle;
-
-import com.android.car.settings.common.PreferenceController;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowSecureSettings;
-import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
-import com.android.car.ui.preference.CarUiTwoActionIconPreference;
-import com.android.settingslib.applications.DefaultAppInfo;
-
-import com.google.common.collect.Iterables;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowApplicationPackageManager;
-import org.robolectric.shadows.ShadowContentResolver;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowSecureSettings.class, ShadowVoiceInteractionServiceInfo.class})
-public class DefaultVoiceInputPickerEntryPreferenceControllerTest {
-
- private static final String TEST_PACKAGE = "com.android.car.settings.testutils";
- private static final String TEST_ASSIST = "TestAssistService";
- private static final String TEST_VOICE = "TestVoiceService";
- private static final String TEST_SETTINGS_CLASS = "TestSettingsActivity";
- private final int mUserId = UserHandle.myUserId();
-
- private Context mContext;
- private DefaultVoiceInputPickerEntryPreferenceController mController;
- private PreferenceControllerTestHelper<DefaultVoiceInputPickerEntryPreferenceController>
- mControllerHelper;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- DefaultVoiceInputPickerEntryPreferenceController.class,
- new CarUiTwoActionIconPreference(mContext));
- mController = mControllerHelper.getController();
- }
-
- @After
- public void tearDown() {
- ShadowSecureSettings.reset();
- ShadowVoiceInteractionServiceInfo.reset();
- }
-
- @Test
- public void getAvailabilityStatus_sameComponents_returnsConditionallyUnavailable() {
- setCurrentAssistant(new ComponentName(TEST_PACKAGE, TEST_VOICE));
- setCurrentVoiceService(new ComponentName(TEST_PACKAGE, TEST_VOICE));
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_bothNull_returnsConditionallyUnavailable() {
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_differentComponents_returnsAvailable() {
- setCurrentAssistant(new ComponentName(TEST_PACKAGE, TEST_ASSIST));
- setCurrentVoiceService(new ComponentName(TEST_PACKAGE, TEST_VOICE));
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- PreferenceController.AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_assistNull_returnsAvailable() {
- setCurrentVoiceService(new ComponentName(TEST_PACKAGE, TEST_VOICE));
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- PreferenceController.AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_voiceInputNull_returnsAvailable() {
- setCurrentAssistant(new ComponentName(TEST_PACKAGE, TEST_ASSIST));
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- PreferenceController.AVAILABLE);
- }
-
- @Test
- public void onStart_registersObserver() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ASSISTANT))).isNotEmpty();
- }
-
- @Test
- public void onStop_unregistersObserver() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ASSISTANT))).isEmpty();
- }
-
- @Test
- public void onChange_changeRegisteredSetting_callsRefreshUi() {
- setCurrentVoiceService(new ComponentName(TEST_PACKAGE, TEST_VOICE));
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(PreferenceController.AVAILABLE);
-
- setCurrentAssistant(new ComponentName(TEST_PACKAGE, TEST_VOICE));
- ContentObserver observer = Iterables.get(getShadowContentResolver().getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ASSISTANT)), 0);
- observer.onChange(/* selfChange= */ false,
- Settings.Secure.getUriFor(Settings.Secure.ASSISTANT));
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- PreferenceController.CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void getCurrentDefaultAppInfo_providerHasCurrentService_returnsValidDefaultAppInfo() {
- // This is used so tht the VoiceInputInfoProvider returns a valid service.
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.serviceInfo = new ServiceInfo();
- resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
- resolveInfo.serviceInfo.name = TEST_VOICE;
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, resolveInfo);
-
- // Create new controller to rerun the constructor with the new shadow package manager.
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- DefaultVoiceInputPickerEntryPreferenceController.class,
- new CarUiTwoActionIconPreference(mContext));
- mController = mControllerHelper.getController();
-
- ComponentName voiceService = new ComponentName(TEST_PACKAGE, TEST_VOICE);
- setCurrentVoiceService(voiceService);
-
- assertThat(mController.getCurrentDefaultAppInfo()).isNotNull();
- }
-
- @Test
- public void getCurrentDefaultAppInfo_providerHasNoService_returnsNull() {
- assertThat(mController.getCurrentDefaultAppInfo()).isNull();
- }
-
- @Test
- public void getSettingIntent_nullInput_returnsNull() {
- assertThat(mController.getSettingIntent(null)).isEqualTo(null);
- }
-
- @Test
- public void getSettingIntent_inputIsWrongType_returnsNull() {
- DefaultAppInfo info = mock(DefaultAppInfo.class);
- assertThat(mController.getSettingIntent(info)).isEqualTo(null);
- }
-
- @Test
- public void getSettingIntent_validInput_returnsIntent() {
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.serviceInfo = new ServiceInfo();
- resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
- resolveInfo.serviceInfo.name = TEST_VOICE;
-
- ShadowVoiceInteractionServiceInfo.setSettingsActivity(resolveInfo.serviceInfo,
- TEST_SETTINGS_CLASS);
- VoiceInteractionServiceInfo interactionServiceInfo = new VoiceInteractionServiceInfo(
- mContext.getPackageManager(), resolveInfo.serviceInfo);
- VoiceInputInfoProvider.VoiceInputInfo info =
- new VoiceInputInfoProvider.VoiceInteractionInfo(mContext, interactionServiceInfo);
-
- DefaultVoiceInputServiceInfo serviceInfo = new DefaultVoiceInputServiceInfo(mContext,
- mContext.getPackageManager(), mUserId, info, true);
- Intent settingIntent = mController.getSettingIntent(serviceInfo);
-
- assertThat(settingIntent.getAction()).isEqualTo(Intent.ACTION_MAIN);
- assertThat(settingIntent.getComponent()).isEqualTo(
- new ComponentName(TEST_PACKAGE, TEST_SETTINGS_CLASS));
- }
-
- private void setCurrentVoiceService(ComponentName service) {
- Settings.Secure.putString(mContext.getContentResolver(),
- Settings.Secure.VOICE_INTERACTION_SERVICE, service.flattenToString());
- }
-
- private void setCurrentAssistant(ComponentName assist) {
- Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
- assist.flattenToString(), mUserId);
- }
-
- private ShadowApplicationPackageManager getShadowPackageManager() {
- return Shadow.extract(mContext.getPackageManager());
- }
-
- private ShadowContentResolver getShadowContentResolver() {
- return (ShadowContentResolver) Shadows.shadowOf(mContext.getContentResolver());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java
deleted file mode 100644
index 4e2ce95..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * 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.car.settings.applications.assist;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.os.UserHandle;
-import android.provider.Settings;
-
-import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowSecureSettings;
-import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
-import com.android.settingslib.applications.DefaultAppInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowApplicationPackageManager;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowSecureSettings.class, ShadowVoiceInteractionServiceInfo.class})
-public class DefaultVoiceInputPickerPreferenceControllerTest {
-
- private static final String TEST_PACKAGE_NAME = "com.test.package";
- private static final String TEST_SERVICE = "TestService";
- private static final String TEST_OTHER_SERVICE = "TestOtherService";
- private static final String TEST_RECOGNIZER = "TestRecognizer";
- private final int mUserId = UserHandle.myUserId();
-
- private Context mContext;
- private PreferenceControllerTestHelper<DefaultVoiceInputPickerPreferenceController>
- mControllerHelper;
- private DefaultVoiceInputPickerPreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- }
-
- @After
- public void tearDown() {
- ShadowSecureSettings.reset();
- ShadowVoiceInteractionServiceInfo.reset();
- }
-
- @Test
- public void getCandidates_voiceInteractionService_hasOneElement() {
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.serviceInfo = new ServiceInfo();
- resolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
- resolveInfo.serviceInfo.name = TEST_SERVICE;
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, resolveInfo);
- setupController();
-
- assertThat(mController.getCandidates()).hasSize(1);
- }
-
- @Test
- public void getCandidates_voiceRecognitionService_hasOneElement() {
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.serviceInfo = new ServiceInfo();
- resolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
- resolveInfo.serviceInfo.name = TEST_RECOGNIZER;
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_RECOGNITION_SERVICE_TAG, resolveInfo);
- setupController();
-
- assertThat(mController.getCandidates()).hasSize(1);
- }
-
- @Test
- public void getCandidates_oneIsSameAsAssistant_hasTwoElements() {
- ResolveInfo interactionInfo = new ResolveInfo();
- interactionInfo.serviceInfo = new ServiceInfo();
- interactionInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
- interactionInfo.serviceInfo.name = TEST_SERVICE;
- interactionInfo.serviceInfo.applicationInfo = new ApplicationInfo();
- interactionInfo.serviceInfo.applicationInfo.nonLocalizedLabel = "1";
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo);
-
- ResolveInfo interactionInfo2 = new ResolveInfo();
- interactionInfo2.serviceInfo = new ServiceInfo();
- interactionInfo2.serviceInfo.packageName = TEST_PACKAGE_NAME;
- interactionInfo2.serviceInfo.name = TEST_OTHER_SERVICE;
- interactionInfo2.serviceInfo.applicationInfo = new ApplicationInfo();
- interactionInfo2.serviceInfo.applicationInfo.nonLocalizedLabel = "2";
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo2);
-
- ComponentName voiceInteraction = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
- setCurrentAssistant(voiceInteraction);
- setCurrentVoiceInteractionService(voiceInteraction);
-
- setupController();
-
- assertThat(mController.getCandidates()).hasSize(2);
- }
-
- @Test
- public void getCandidates_oneIsSameAsAssistant_sameOneIsEnabled() {
- ResolveInfo interactionInfo = new ResolveInfo();
- interactionInfo.serviceInfo = new ServiceInfo();
- interactionInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
- interactionInfo.serviceInfo.name = TEST_SERVICE;
- interactionInfo.serviceInfo.applicationInfo = new ApplicationInfo();
- interactionInfo.serviceInfo.applicationInfo.nonLocalizedLabel = "1";
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo);
-
- ResolveInfo interactionInfo2 = new ResolveInfo();
- interactionInfo2.serviceInfo = new ServiceInfo();
- interactionInfo2.serviceInfo.packageName = TEST_PACKAGE_NAME;
- interactionInfo2.serviceInfo.name = TEST_OTHER_SERVICE;
- interactionInfo2.serviceInfo.applicationInfo = new ApplicationInfo();
- interactionInfo2.serviceInfo.applicationInfo.nonLocalizedLabel = "2";
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo2);
-
- ComponentName voiceInteraction = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
- setCurrentAssistant(voiceInteraction);
- setCurrentVoiceInteractionService(voiceInteraction);
-
- setupController();
-
- DefaultAppInfo defaultAppInfo = null;
- for (DefaultAppInfo info : mController.getCandidates()) {
- if (info.componentName.equals(new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE))) {
- defaultAppInfo = info;
- }
- }
- assertThat(defaultAppInfo).isNotNull();
- assertThat(defaultAppInfo.enabled).isTrue();
- }
-
- @Test
- public void getCandidates_oneIsSameAsAssistant_differentOneIsDisabled() {
- ResolveInfo interactionInfo = new ResolveInfo();
- interactionInfo.serviceInfo = new ServiceInfo();
- interactionInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
- interactionInfo.serviceInfo.name = TEST_SERVICE;
- interactionInfo.serviceInfo.applicationInfo = new ApplicationInfo();
- interactionInfo.serviceInfo.applicationInfo.nonLocalizedLabel = "1";
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo);
-
- ResolveInfo interactionInfo2 = new ResolveInfo();
- interactionInfo2.serviceInfo = new ServiceInfo();
- interactionInfo2.serviceInfo.packageName = TEST_PACKAGE_NAME;
- interactionInfo2.serviceInfo.name = TEST_OTHER_SERVICE;
- interactionInfo2.serviceInfo.applicationInfo = new ApplicationInfo();
- interactionInfo2.serviceInfo.applicationInfo.nonLocalizedLabel = "2";
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo2);
-
- ComponentName voiceInteraction = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
- setCurrentAssistant(voiceInteraction);
- setCurrentVoiceInteractionService(voiceInteraction);
-
- setupController();
-
- DefaultAppInfo defaultAppInfo = null;
- for (DefaultAppInfo info : mController.getCandidates()) {
- if (info.componentName.equals(
- new ComponentName(TEST_PACKAGE_NAME, TEST_OTHER_SERVICE))) {
- defaultAppInfo = info;
- }
- }
- assertThat(defaultAppInfo).isNotNull();
- assertThat(defaultAppInfo.enabled).isFalse();
- }
-
- @Test
- public void getCurrentDefaultKey_defaultIsNull_returnsNull() {
- setupController();
-
- assertThat(mController.getCurrentDefaultKey()).isNull();
- }
-
- @Test
- public void getCurrentDefaultKey_defaultExists_returnsComponentName() {
- setupController();
-
- ComponentName cn = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
- setCurrentVoiceInteractionService(cn);
-
- assertThat(mController.getCurrentDefaultKey()).isEqualTo(cn.flattenToString());
- }
-
- @Test
- public void setCurrentDefault_typeVoiceInteractionInfo_setsServices() {
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.serviceInfo = new ServiceInfo();
- resolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
- resolveInfo.serviceInfo.name = TEST_SERVICE;
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, resolveInfo);
- ShadowVoiceInteractionServiceInfo.setRecognitionService(resolveInfo.serviceInfo,
- TEST_RECOGNIZER);
- setupController();
-
- String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
- String recognizer = new ComponentName(TEST_PACKAGE_NAME, TEST_RECOGNIZER).flattenToString();
- mController.setCurrentDefault(key);
-
- assertThat(Settings.Secure.getString(mContext.getContentResolver(),
- Settings.Secure.VOICE_INTERACTION_SERVICE)).isEqualTo(key);
- assertThat(Settings.Secure.getString(mContext.getContentResolver(),
- Settings.Secure.VOICE_RECOGNITION_SERVICE)).isEqualTo(recognizer);
- }
-
- @Test
- public void setCurrentDefault_typeVoiceRecognitionInfo_setsRecognitionService() {
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.serviceInfo = new ServiceInfo();
- resolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
- resolveInfo.serviceInfo.name = TEST_RECOGNIZER;
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_RECOGNITION_SERVICE_TAG, resolveInfo);
- setupController();
-
- String key = new ComponentName(TEST_PACKAGE_NAME, TEST_RECOGNIZER).flattenToString();
- mController.setCurrentDefault(key);
-
- assertThat(Settings.Secure.getString(mContext.getContentResolver(),
- Settings.Secure.VOICE_INTERACTION_SERVICE)).isEmpty();
- assertThat(Settings.Secure.getString(mContext.getContentResolver(),
- Settings.Secure.VOICE_RECOGNITION_SERVICE)).isEqualTo(key);
- }
-
- private void setupController() {
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- DefaultVoiceInputPickerPreferenceController.class,
- new LogicalPreferenceGroup(mContext));
- mController = mControllerHelper.getController();
- }
-
- private void setCurrentVoiceInteractionService(ComponentName service) {
- Settings.Secure.putString(mContext.getContentResolver(),
- Settings.Secure.VOICE_INTERACTION_SERVICE, service.flattenToString());
- }
-
- private void setCurrentAssistant(ComponentName assist) {
- Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
- assist.flattenToString(), mUserId);
- }
-
- private ShadowApplicationPackageManager getShadowPackageManager() {
- return Shadow.extract(mContext.getPackageManager());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java
deleted file mode 100644
index 4ef47f6..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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.car.settings.applications.assist;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.os.UserHandle;
-import android.provider.Settings;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.SwitchPreference;
-import androidx.preference.TwoStatePreference;
-
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class ScreenshotContextPreferenceControllerTest {
-
- private static final String TEST_PACKAGE_NAME = "com.test.package";
- private static final String TEST_SERVICE = "TestService";
- private final int mUserId = UserHandle.myUserId();
-
- private Context mContext;
- private TwoStatePreference mTwoStatePreference;
- private PreferenceControllerTestHelper<ScreenshotContextPreferenceController>
- mControllerHelper;
- private ScreenshotContextPreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mTwoStatePreference = new SwitchPreference(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- ScreenshotContextPreferenceController.class, mTwoStatePreference);
- mController = mControllerHelper.getController();
-
- String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
- Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
- key, mUserId);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- }
-
- @Test
- public void refreshUi_screenshotEnabled_preferenceChecked() {
- mTwoStatePreference.setChecked(false);
-
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1);
- mController.refreshUi();
-
- assertThat(mTwoStatePreference.isChecked()).isTrue();
- }
-
- @Test
- public void refreshUi_screenshotDisabled_preferenceUnchecked() {
- mTwoStatePreference.setChecked(true);
-
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0);
- mController.refreshUi();
-
- assertThat(mTwoStatePreference.isChecked()).isFalse();
- }
-
- @Test
- public void refreshUi_structureEnabled_preferenceEnabled() {
- mTwoStatePreference.setEnabled(false);
-
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1);
- mController.refreshUi();
-
- assertThat(mTwoStatePreference.isEnabled()).isTrue();
- }
-
- @Test
- public void refreshUi_structureDisabled_preferenceDisabled() {
- mTwoStatePreference.setEnabled(true);
-
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0);
- mController.refreshUi();
-
- assertThat(mTwoStatePreference.isEnabled()).isFalse();
- }
-
- @Test
- public void callChangeListener_toggleTrue_screenshotEnabled() {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0);
- mTwoStatePreference.callChangeListener(true);
-
- assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0)).isEqualTo(1);
- }
-
- @Test
- public void callChangeListener_toggleFalse_screenshotDisabled() {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1);
- mTwoStatePreference.callChangeListener(false);
-
- assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1)).isEqualTo(0);
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java
deleted file mode 100644
index 2a1e7ac..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.car.settings.applications.assist;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.os.UserHandle;
-import android.provider.Settings;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.SwitchPreference;
-import androidx.preference.TwoStatePreference;
-
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class TextContextPreferenceControllerTest {
-
- private static final String TEST_PACKAGE_NAME = "com.test.package";
- private static final String TEST_SERVICE = "TestService";
- private final int mUserId = UserHandle.myUserId();
-
- private Context mContext;
- private TwoStatePreference mTwoStatePreference;
- private PreferenceControllerTestHelper<TextContextPreferenceController>
- mControllerHelper;
- private TextContextPreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mTwoStatePreference = new SwitchPreference(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- TextContextPreferenceController.class, mTwoStatePreference);
- mController = mControllerHelper.getController();
-
- String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
- Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
- key, mUserId);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- }
-
- @Test
- public void refreshUi_contextEnabled_preferenceChecked() {
- mTwoStatePreference.setChecked(false);
-
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1);
- mController.refreshUi();
-
- assertThat(mTwoStatePreference.isChecked()).isTrue();
- }
-
- @Test
- public void refreshUi_contextDisabled_preferenceUnchecked() {
- mTwoStatePreference.setChecked(true);
-
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0);
- mController.refreshUi();
-
- assertThat(mTwoStatePreference.isChecked()).isFalse();
- }
-
- @Test
- public void callChangeListener_toggleTrue_contextEnabled() {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0);
- mTwoStatePreference.callChangeListener(true);
-
- assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0)).isEqualTo(1);
- }
-
- @Test
- public void callChangeListener_toggleFalse_contextDisabled() {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1);
- mTwoStatePreference.callChangeListener(false);
-
- assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1)).isEqualTo(0);
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java
deleted file mode 100644
index 4ded50e..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.car.settings.applications.assist;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-
-import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowApplicationPackageManager;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class, ShadowVoiceInteractionServiceInfo.class})
-public class VoiceInputInfoProviderTest {
-
- private static final String TEST_PACKAGE = "test.package";
- private static final String TEST_CLASS = "Class1";
- private static final String TEST_RECOGNITION_SERVICE = "Recognition1";
-
- private Context mContext;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- }
-
- @After
- public void tearDown() {
- ShadowVoiceInteractionServiceInfo.reset();
- }
-
- @Test
- public void getInteractionInfoList_hasElement() {
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.serviceInfo = new ServiceInfo();
- resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
- resolveInfo.serviceInfo.name = TEST_CLASS;
- ShadowVoiceInteractionServiceInfo.setRecognitionService(resolveInfo.serviceInfo,
- TEST_RECOGNITION_SERVICE);
-
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, resolveInfo);
-
- VoiceInputInfoProvider provider = new VoiceInputInfoProvider(mContext);
- assertThat(provider.getVoiceInteractionInfoList()).hasSize(1);
- }
-
- @Test
- public void getRecognitionInfoList_hasElement() {
- ResolveInfo otherInfo = new ResolveInfo();
- otherInfo.serviceInfo = new ServiceInfo();
- otherInfo.serviceInfo.packageName = TEST_PACKAGE;
- otherInfo.serviceInfo.name = TEST_RECOGNITION_SERVICE;
-
- getShadowPackageManager().addResolveInfoForIntent(
- VoiceInputInfoProvider.VOICE_RECOGNITION_SERVICE_TAG, otherInfo);
-
- VoiceInputInfoProvider provider = new VoiceInputInfoProvider(mContext);
- assertThat(provider.getVoiceRecognitionInfoList()).hasSize(1);
- }
-
- private ShadowApplicationPackageManager getShadowPackageManager() {
- return Shadow.extract(mContext.getPackageManager());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java
deleted file mode 100644
index 6ecf0d0..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * 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.car.settings.applications.managedomainurls;
-
-import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
-import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
-import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ResolveInfo;
-import android.os.UserHandle;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.ListPreference;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-import com.android.settingslib.applications.ApplicationsState;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-
-import java.util.Arrays;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class})
-public class AppLinkStatePreferenceControllerTest {
-
- private static final String TEST_PACKAGE_NAME = "com.example.test";
- private static final int TEST_PACKAGE_ID = 1;
- private static final String TEST_PATH = "TEST_PATH";
- private final int mUserId = UserHandle.myUserId();
-
- private Context mContext;
- private ListPreference mPreference;
- private PreferenceControllerTestHelper<AppLinkStatePreferenceController> mControllerHelper;
- private AppLinkStatePreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mPreference = new ListPreference(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- AppLinkStatePreferenceController.class);
- mController = mControllerHelper.getController();
- }
-
- @After
- public void tearDown() {
- ShadowApplicationPackageManager.reset();
- }
-
- @Test
- public void refreshUi_isBrowserApp_isDisabled() {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
-
- setupIsBrowserApp(true);
-
- mController.setAppEntry(entry);
- mControllerHelper.setPreference(mPreference);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- mController.refreshUi();
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void refreshUi_isNotBrowserApp_noDomainUrls_isDisabled() {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- info.privateFlags = 0;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
-
- setupIsBrowserApp(false);
-
- mController.setAppEntry(entry);
- mControllerHelper.setPreference(mPreference);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- mController.refreshUi();
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void refreshUi_isNotBrowserApp_hasDomainUrls_isEnabled() {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
-
- setupIsBrowserApp(false);
-
- mController.setAppEntry(entry);
- mControllerHelper.setPreference(mPreference);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- mController.refreshUi();
-
- assertThat(mPreference.isEnabled()).isTrue();
- }
-
- @Test
- public void refreshUi_isNotBrowserApp_hasDomainUrls_defaultState_entrySetToAsk() {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
-
- setupIsBrowserApp(false);
-
- mController.setAppEntry(entry);
- mControllerHelper.setPreference(mPreference);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- mController.refreshUi();
-
- assertThat(mPreference.getEntry()).isEqualTo(
- mContext.getString(R.string.app_link_open_ask));
- }
-
- @Test
- public void refreshUi_isNotBrowserApp_hasDomainUrls_askState_entrySetToAsk() {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
-
- setupIsBrowserApp(false);
- mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
- INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, mUserId);
-
- mController.setAppEntry(entry);
- mControllerHelper.setPreference(mPreference);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- mController.refreshUi();
-
- assertThat(mPreference.getEntry()).isEqualTo(
- mContext.getString(R.string.app_link_open_ask));
- }
-
- @Test
- public void refreshUi_isNotBrowserApp_hasDomainUrls_alwaysState_entrySetToAlways() {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
-
- setupIsBrowserApp(false);
- mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
- INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS, mUserId);
-
- mController.setAppEntry(entry);
- mControllerHelper.setPreference(mPreference);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- mController.refreshUi();
-
- assertThat(mPreference.getEntry()).isEqualTo(
- mContext.getString(R.string.app_link_open_always));
- }
-
- @Test
- public void refreshUi_isNotBrowserApp_hasDomainUrls_neverState_entrySetToNever() {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
-
- setupIsBrowserApp(false);
- mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
- INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER, mUserId);
-
- mController.setAppEntry(entry);
- mControllerHelper.setPreference(mPreference);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- mController.refreshUi();
-
- assertThat(mPreference.getEntry()).isEqualTo(
- mContext.getString(R.string.app_link_open_never));
- }
-
- private void setupIsBrowserApp(boolean isBrowserApp) {
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.activityInfo = new ActivityInfo();
- resolveInfo.handleAllWebDataURI = isBrowserApp;
- AppLaunchSettingsBasePreferenceController.sBrowserIntent.setPackage(TEST_PACKAGE_NAME);
- getShadowPackageManager().addResolveInfoForIntent(
- AppLaunchSettingsBasePreferenceController.sBrowserIntent,
- Arrays.asList(resolveInfo));
- }
-
- private ShadowApplicationPackageManager getShadowPackageManager() {
- return Shadow.extract(mContext.getPackageManager());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java
deleted file mode 100644
index 44d7063..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * 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.car.settings.applications.managedomainurls;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.hardware.usb.IUsbManager;
-import android.os.RemoteException;
-import android.os.UserHandle;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.Preference;
-
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-import com.android.car.settings.testutils.ShadowIUsbManager;
-import com.android.settingslib.applications.AppUtils;
-import com.android.settingslib.applications.ApplicationsState;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class, ShadowIUsbManager.class})
-public class ClearDefaultsPreferenceControllerTest {
-
- private static final String TEST_PACKAGE_NAME = "com.example.test";
- private static final int TEST_PACKAGE_ID = 1;
- private static final String TEST_PATH = "TEST_PATH";
- private static final String TEST_ACTIVITY = "TestActivity";
- private final int mUserId = UserHandle.myUserId();
-
- private Context mContext;
- private Preference mPreference;
- private PreferenceControllerTestHelper<ClearDefaultsPreferenceController> mControllerHelper;
- private ClearDefaultsPreferenceController mController;
- @Mock
- private IUsbManager mIUsbManager;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- ShadowIUsbManager.setInstance(mIUsbManager);
-
- mContext = RuntimeEnvironment.application;
- mPreference = new Preference(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- ClearDefaultsPreferenceController.class);
- mController = mControllerHelper.getController();
-
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
-
- mController.setAppEntry(entry);
- mControllerHelper.setPreference(mPreference);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- }
-
- @After
- public void tearDown() {
- ShadowIUsbManager.reset();
- ShadowApplicationPackageManager.reset();
- }
-
- @Test
- public void refreshUi_hasPreferredActivities_hasSummary() {
- IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
- filter.addCategory(Intent.CATEGORY_HOME);
- ComponentName name = new ComponentName(TEST_PACKAGE_NAME, TEST_ACTIVITY);
- getShadowPackageManager().addPreferredActivity(filter, 0, null, name);
-
- mController.refreshUi();
-
- assertThat(mPreference.getSummary().toString()).isNotEmpty();
- }
-
- @Test
- public void refreshUi_isDefaultBrowser_hasSummary() {
- mContext.getPackageManager().setDefaultBrowserPackageNameAsUser(TEST_PACKAGE_NAME, mUserId);
- mController.refreshUi();
-
- assertThat(mPreference.getSummary().toString()).isNotEmpty();
- }
-
- @Test
- public void refreshUi_hasUsbDefaults_hasSummary() throws RemoteException {
- when(mIUsbManager.hasDefaults(TEST_PACKAGE_NAME, mUserId)).thenReturn(true);
- mController.refreshUi();
-
- assertThat(mPreference.getSummary().toString()).isNotEmpty();
- }
-
- @Test
- public void refreshUi_autoLaunchDisabled_hasNoSummary() {
- mController.refreshUi();
-
- assertThat(mPreference.getSummary()).isNull();
- }
-
- @Test
- public void performClick_hasUsbManager_hasPreferredActivities_clearsPreferredActivities() {
- IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
- filter.addCategory(Intent.CATEGORY_HOME);
- ComponentName name = new ComponentName(TEST_PACKAGE_NAME, TEST_ACTIVITY);
- getShadowPackageManager().addPreferredActivity(filter, 0, null, name);
- assertThat(AppUtils.hasPreferredActivities(mContext.getPackageManager(),
- TEST_PACKAGE_NAME)).isTrue();
- mController.refreshUi();
- mPreference.performClick();
-
- assertThat(AppUtils.hasPreferredActivities(mContext.getPackageManager(),
- TEST_PACKAGE_NAME)).isFalse();
- }
-
- @Test
- public void performClick_hasUsbManager_isDefaultBrowser_clearsDefaultBrowser() {
- mContext.getPackageManager().setDefaultBrowserPackageNameAsUser(TEST_PACKAGE_NAME, mUserId);
- assertThat(mContext.getPackageManager().getDefaultBrowserPackageNameAsUser(
- mUserId)).isNotNull();
- mController.refreshUi();
- mPreference.performClick();
-
- assertThat(
- mContext.getPackageManager().getDefaultBrowserPackageNameAsUser(mUserId)).isNull();
- }
-
- @Test
- public void performClick_hasUsbDefaults_clearsUsbDefaults() throws RemoteException {
- when(mIUsbManager.hasDefaults(TEST_PACKAGE_NAME, mUserId)).thenReturn(true);
- mController.refreshUi();
- mPreference.performClick();
-
- verify(mIUsbManager).clearDefaults(TEST_PACKAGE_NAME, mUserId);
- }
-
- private ShadowApplicationPackageManager getShadowPackageManager() {
- return Shadow.extract(mContext.getPackageManager());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
deleted file mode 100644
index 179abe4..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * 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.car.settings.applications.managedomainurls;
-
-import static android.content.pm.UserInfo.FLAG_ADMIN;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.testng.Assert.assertThrows;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.os.UserHandle;
-import android.os.UserManager;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
-
-import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowApplicationsState;
-import com.android.car.settings.testutils.ShadowIconDrawableFactory;
-import com.android.settingslib.applications.ApplicationsState;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowUserManager;
-
-import java.util.ArrayList;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowIconDrawableFactory.class, ShadowApplicationsState.class})
-public class DomainAppPreferenceControllerTest {
-
- private static final String TEST_PACKAGE_NAME = "com.android.test.package";
- private static final int TEST_PACKAGE_ID = 1;
- private static final String TEST_LABEL = "Test App";
- private static final String TEST_PATH = "TEST_PATH";
- private final int mUserId = UserHandle.myUserId();
-
- private Context mContext;
- private PreferenceGroup mPreferenceGroup;
- private PreferenceControllerTestHelper<DomainAppPreferenceController> mControllerHelper;
- private DomainAppPreferenceController mController;
- private Lifecycle mLifecycle;
- @Mock
- private ApplicationsState mApplicationsState;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- ShadowApplicationsState.setInstance(mApplicationsState);
-
- mContext = RuntimeEnvironment.application;
- getShadowUserManager().addProfile(mUserId, mUserId, "Test Name", /* profileFlags= */
- FLAG_ADMIN);
-
- when(mApplicationsState.newSession(any(), any())).thenReturn(
- mock(ApplicationsState.Session.class));
-
- mPreferenceGroup = new LogicalPreferenceGroup(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- DomainAppPreferenceController.class);
- mController = mControllerHelper.getController();
-
- LifecycleOwner lifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(lifecycleOwner);
- mController.setLifecycle(mLifecycle);
-
- mControllerHelper.setPreference(mPreferenceGroup);
- }
-
- @After
- public void tearDown() {
- ShadowApplicationsState.reset();
- }
-
- @Test
- public void checkInitialized_noLifecycle_throwsError() {
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- DomainAppPreferenceController.class);
-
- assertThrows(IllegalStateException.class,
- () -> mControllerHelper.setPreference(mPreferenceGroup));
- }
-
- @Test
- public void onRebuildComplete_sessionLoadsValues_preferenceGroupHasValues() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
- entry.label = TEST_LABEL;
- apps.add(entry);
- mController.mApplicationStateCallbacks.onRebuildComplete(apps);
-
- assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
- }
-
- @Test
- public void performClick_startsApplicationLaunchSettingsFragmentWithPackageName() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = TEST_PACKAGE_NAME;
- info.uid = TEST_PACKAGE_ID;
- info.sourceDir = TEST_PATH;
- ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
- TEST_PACKAGE_ID);
- entry.label = TEST_LABEL;
- apps.add(entry);
- mController.mApplicationStateCallbacks.onRebuildComplete(apps);
-
- Preference preference = mPreferenceGroup.getPreference(0);
- preference.performClick();
-
- ArgumentCaptor<ApplicationLaunchSettingsFragment> captor = ArgumentCaptor.forClass(
- ApplicationLaunchSettingsFragment.class);
- verify(mControllerHelper.getMockFragmentController()).launchFragment(captor.capture());
-
- String pkgName = captor.getValue().getArguments().getString(
- ApplicationLaunchSettingsFragment.ARG_PACKAGE_NAME);
- assertThat(pkgName).isEqualTo(TEST_PACKAGE_NAME);
- }
-
- private ShadowUserManager getShadowUserManager() {
- return Shadows.shadowOf(UserManager.get(mContext));
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java
deleted file mode 100644
index 7aa4185..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * 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.car.settings.applications.managedomainurls;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.IntentFilterVerificationInfo;
-import android.content.pm.PackageManager;
-import android.util.ArraySet;
-
-import com.android.car.settings.R;
-import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.Arrays;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class})
-public class DomainUrlsUtilsTest {
-
- private static final String TEST_PACKAGE = "com.test.android.Package";
- private static final int USER_ID = 10;
-
- private Context mContext;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- }
-
- @Test
- public void getDomainsSummary_domainStatusSetToNever_showNoneText() {
- mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE,
- PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER, USER_ID);
-
- assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
- new ArraySet<>())).isEqualTo(mContext.getString(R.string.domain_urls_summary_none));
- }
-
- @Test
- public void getDomainsSummary_domainStatusSet_noDomains_showNoneText() {
- mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE,
- PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, USER_ID);
-
- assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
- new ArraySet<>())).isEqualTo(mContext.getString(R.string.domain_urls_summary_none));
- }
-
- @Test
- public void getDomainsSummary_domainStatusSet_oneDomain_showSingleDomain() {
- mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE,
- PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, USER_ID);
- ArraySet<String> domains = new ArraySet<>();
- domains.add("test.domain.com");
-
- assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
- domains)).isEqualTo(
- mContext.getString(R.string.domain_urls_summary_one, domains.valueAt(0)));
- }
-
- @Test
- public void getDomainsSummary_domainStatusSet_multipleDomain_showMultipleDomains() {
- mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE,
- PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, USER_ID);
- ArraySet<String> domains = new ArraySet<>();
- domains.add("test.domain.com");
- domains.add("test.domain2.com");
-
- assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
- domains)).isEqualTo(
- mContext.getString(R.string.domain_urls_summary_some, domains.valueAt(0)));
- }
-
- @Test
- public void getHandledDomains_includeIntentFilterVerificationInfoDomains() {
- PackageManager pm = mock(PackageManager.class);
- String domain = "test.domain.com";
- ArraySet<String> domains = new ArraySet<>();
- domains.add(domain);
- IntentFilterVerificationInfo info = new IntentFilterVerificationInfo(TEST_PACKAGE, domains);
- when(pm.getIntentFilterVerifications(TEST_PACKAGE)).thenReturn(Arrays.asList(info));
-
- assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).hasSize(1);
- assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).contains(domain);
- }
-
- @Test
- public void getHandledDomains_includeBrowsableIntentFiltersWithHttpDataScheme() {
- PackageManager pm = mock(PackageManager.class);
- String domain = "test.domain.com";
- String port = "80";
- IntentFilter filter = new IntentFilter();
- filter.addCategory(Intent.CATEGORY_BROWSABLE);
- filter.addDataScheme(IntentFilter.SCHEME_HTTP);
- filter.addDataAuthority(new IntentFilter.AuthorityEntry(domain, port));
- when(pm.getAllIntentFilters(TEST_PACKAGE)).thenReturn(Arrays.asList(filter));
-
- assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).hasSize(1);
- assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).contains(domain);
- }
-
- @Test
- public void getHandledDomains_includeBrowsableIntentFiltersWithHttpsDataScheme() {
- PackageManager pm = mock(PackageManager.class);
- String domain = "test.domain.com";
- String port = "80";
- IntentFilter filter = new IntentFilter();
- filter.addCategory(Intent.CATEGORY_BROWSABLE);
- filter.addDataScheme(IntentFilter.SCHEME_HTTPS);
- filter.addDataAuthority(new IntentFilter.AuthorityEntry(domain, port));
- when(pm.getAllIntentFilters(TEST_PACKAGE)).thenReturn(Arrays.asList(filter));
-
- assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).hasSize(1);
- assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).contains(domain);
- }
-
- @Test
- public void getHandledDomains_excludeBrowsableIntentFiltersWithOtherDataScheme() {
- PackageManager pm = mock(PackageManager.class);
- String domain = "test.domain.com";
- String port = "80";
- IntentFilter filter = new IntentFilter();
- filter.addCategory(Intent.CATEGORY_BROWSABLE);
- filter.addDataAuthority(new IntentFilter.AuthorityEntry(domain, port));
- when(pm.getAllIntentFilters(TEST_PACKAGE)).thenReturn(Arrays.asList(filter));
-
- assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).isEmpty();
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java
deleted file mode 100644
index e686d92..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.applications.specialaccess;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.os.Looper;
-
-import com.android.car.settings.testutils.ShadowApplicationsState;
-import com.android.settingslib.applications.ApplicationsState;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** Unit test for {@link AppEntryListManager}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationsState.class})
-public class AppEntryListManagerTest {
-
- @Mock
- private ApplicationsState mApplicationsState;
- @Mock
- private ApplicationsState.Session mSession;
- @Mock
- private AppEntryListManager.ExtraInfoBridge mExtraInfoBridge;
- @Mock
- private AppEntryListManager.AppFilterProvider mFilterProvider;
- @Mock
- private AppEntryListManager.Callback mCallback;
- @Captor
- private ArgumentCaptor<ApplicationsState.Callbacks> mSessionCallbacksCaptor;
- @Captor
- private ArgumentCaptor<List<AppEntry>> mEntriesCaptor;
-
- private AppEntryListManager mAppEntryListManager;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- ShadowApplicationsState.setInstance(mApplicationsState);
- when(mApplicationsState.newSession(mSessionCallbacksCaptor.capture())).thenReturn(mSession);
- when(mApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
-
- mAppEntryListManager = new AppEntryListManager(RuntimeEnvironment.application);
- mAppEntryListManager.init(mExtraInfoBridge, mFilterProvider, mCallback);
- }
-
- @After
- public void tearDown() {
- ShadowApplicationsState.reset();
- }
-
- @Test
- public void start_resumesSession() {
- mAppEntryListManager.start();
-
- verify(mSession).onResume();
- }
-
- @Test
- public void onPackageListChanged_loadsExtraInfo() {
- mSessionCallbacksCaptor.getValue().onPackageListChanged();
-
- verify(mExtraInfoBridge).loadExtraInfo(any());
- }
-
- @Test
- public void onLoadEntriesComplete_loadsExtraInfo() {
- mSessionCallbacksCaptor.getValue().onLoadEntriesCompleted();
-
- verify(mExtraInfoBridge).loadExtraInfo(any());
- }
-
- @Test
- public void stop_pausesSession() {
- mAppEntryListManager.stop();
-
- verify(mSession).onPause();
- }
-
- @Test
- public void destroy_destroysSession() {
- mAppEntryListManager.destroy();
-
- verify(mSession).onDestroy();
- }
-
- @Test
- public void forceUpdate_loadsExtraInfo() {
- ArrayList<AppEntry> entries = new ArrayList<>();
- entries.add(mock(AppEntry.class));
- when(mSession.getAllApps()).thenReturn(entries);
-
- mAppEntryListManager.forceUpdate();
-
- verify(mExtraInfoBridge).loadExtraInfo(entries);
- }
-
- @Test
- public void forceUpdate_forEntry_loadsExtraInfo() {
- AppEntry entry = mock(AppEntry.class);
-
- mAppEntryListManager.forceUpdate(entry);
-
- verify(mExtraInfoBridge).loadExtraInfo(mEntriesCaptor.capture());
- assertThat(mEntriesCaptor.getValue()).containsExactly(entry);
- }
-
- @Test
- public void loadingFinished_rebuildsSession() {
- ApplicationsState.AppFilter appFilter = mock(ApplicationsState.AppFilter.class);
- when(mFilterProvider.getAppFilter()).thenReturn(appFilter);
-
- mSessionCallbacksCaptor.getValue().onLoadEntriesCompleted();
-
- verify(mSession).rebuild(eq(appFilter),
- eq(ApplicationsState.ALPHA_COMPARATOR), /* foreground= */ eq(false));
- }
-
- @Test
- public void onRebuildComplete_callsCallback() {
- ArrayList<AppEntry> entries = new ArrayList<>();
- entries.add(mock(AppEntry.class));
-
- mSessionCallbacksCaptor.getValue().onRebuildComplete(entries);
-
- verify(mCallback).onAppEntryListChanged(entries);
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java
deleted file mode 100644
index a356d32..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.applications.specialaccess;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.testng.Assert.assertThrows;
-
-import android.Manifest;
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.os.Looper;
-import android.os.RemoteException;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.PreferenceGroup;
-import androidx.preference.TwoStatePreference;
-
-import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowAppOpsManager;
-import com.android.car.settings.testutils.ShadowApplicationsState;
-import com.android.settingslib.applications.ApplicationsState;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/** Unit test for {@link AppOpsPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowAppOpsManager.class, ShadowApplicationsState.class})
-public class AppOpsPreferenceControllerTest {
-
- private static final int APP_OP_CODE = AppOpsManager.OP_WRITE_SETTINGS;
- private static final String PERMISSION = Manifest.permission.WRITE_SETTINGS;
- private static final int NEGATIVE_MODE = AppOpsManager.MODE_ERRORED;
-
- @Mock
- private AppEntryListManager mAppEntryListManager;
- @Mock
- private ApplicationsState mApplicationsState;
- @Captor
- private ArgumentCaptor<AppEntryListManager.Callback> mCallbackCaptor;
-
- private Context mContext;
- private PreferenceGroup mPreferenceGroup;
- private PreferenceControllerTestHelper<AppOpsPreferenceController> mControllerHelper;
- private AppOpsPreferenceController mController;
-
- @Before
- public void setUp() throws RemoteException {
- MockitoAnnotations.initMocks(this);
- ShadowApplicationsState.setInstance(mApplicationsState);
- when(mApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
-
- mContext = RuntimeEnvironment.application;
- mPreferenceGroup = new LogicalPreferenceGroup(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- AppOpsPreferenceController.class);
- mController = mControllerHelper.getController();
- mController.init(APP_OP_CODE, PERMISSION, NEGATIVE_MODE);
- mController.mAppEntryListManager = mAppEntryListManager;
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.CREATED);
- verify(mAppEntryListManager).init(any(AppStateAppOpsBridge.class), any(),
- mCallbackCaptor.capture());
- }
-
- @After
- public void tearDown() {
- ShadowApplicationsState.reset();
- }
-
- @Test
- public void checkInitialized_noOpCode_throwsIllegalStateException() {
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- AppOpsPreferenceController.class);
- mController = mControllerHelper.getController();
-
- mController.init(AppOpsManager.OP_NONE, PERMISSION, NEGATIVE_MODE);
-
- assertThrows(IllegalStateException.class,
- () -> mControllerHelper.setPreference(mPreferenceGroup));
- }
-
- @Test
- public void checkInitialized_noPermission_throwsIllegalStateException() {
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- AppOpsPreferenceController.class);
- mController = mControllerHelper.getController();
-
- mController.init(APP_OP_CODE, /* permission= */ null, NEGATIVE_MODE);
-
- assertThrows(IllegalStateException.class,
- () -> mControllerHelper.setPreference(mPreferenceGroup));
- }
-
- @Test
- public void checkInitialized_noNegativeOpMode_throwsIllegalStateException() {
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- AppOpsPreferenceController.class);
- mController = mControllerHelper.getController();
-
- mController.init(APP_OP_CODE, PERMISSION, AppOpsManager.MODE_DEFAULT);
-
- assertThrows(IllegalStateException.class,
- () -> mControllerHelper.setPreference(mPreferenceGroup));
- }
-
- @Test
- public void onStart_startsListManager() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- verify(mAppEntryListManager).start();
- }
-
- @Test
- public void onStop_stopsListManager() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
-
- verify(mAppEntryListManager).stop();
- }
-
- @Test
- public void onDestroy_destroysListManager() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
-
- verify(mAppEntryListManager).destroy();
- }
-
- @Test
- public void onAppEntryListChanged_addsPreferencesForEntries() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- List<AppEntry> entries = Arrays.asList(
- createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */ true),
- createAppEntry("another.test.package", /* uid= */ 2, /* isOpPermissible= */ false));
-
- mCallbackCaptor.getValue().onAppEntryListChanged(entries);
-
- assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
- assertThat(((TwoStatePreference) mPreferenceGroup.getPreference(0)).isChecked()).isTrue();
- assertThat(((TwoStatePreference) mPreferenceGroup.getPreference(1)).isChecked()).isFalse();
- }
-
- @Test
- public void onPreferenceChange_checkedState_setsAppOpModeAllowed() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- String packageName = "test.package";
- int uid = 1;
- List<AppEntry> entries = Collections.singletonList(
- createAppEntry(packageName, uid, /* isOpPermissible= */ false));
- mCallbackCaptor.getValue().onAppEntryListChanged(entries);
- TwoStatePreference appPref = (TwoStatePreference) mPreferenceGroup.getPreference(0);
-
- appPref.performClick();
-
- assertThat(getShadowAppOpsManager().getMode(APP_OP_CODE, uid, packageName)).isEqualTo(
- AppOpsManager.MODE_ALLOWED);
- }
-
- @Test
- public void onPreferenceChange_uncheckedState_setsNegativeAppOpMode() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- String packageName = "test.package";
- int uid = 1;
- List<AppEntry> entries = Collections.singletonList(
- createAppEntry(packageName, uid, /* isOpPermissible= */ true));
- mCallbackCaptor.getValue().onAppEntryListChanged(entries);
- TwoStatePreference appPref = (TwoStatePreference) mPreferenceGroup.getPreference(0);
-
- appPref.performClick();
-
- assertThat(getShadowAppOpsManager().getMode(APP_OP_CODE, uid, packageName)).isEqualTo(
- NEGATIVE_MODE);
- }
-
- @Test
- public void onPreferenceChange_updatesEntry() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- List<AppEntry> entries = Collections.singletonList(
- createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */ false));
- mCallbackCaptor.getValue().onAppEntryListChanged(entries);
- TwoStatePreference appPref = (TwoStatePreference) mPreferenceGroup.getPreference(0);
-
- appPref.performClick();
-
- verify(mAppEntryListManager).forceUpdate(entries.get(0));
- }
-
- @Test
- public void showSystem_updatesEntries() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
-
- mController.setShowSystem(true);
-
- verify(mAppEntryListManager).forceUpdate();
- }
-
- @Test
- public void appFilter_showingSystemApps_keepsSystemEntries() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- mController.setShowSystem(true);
- ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
- ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
- verify(mAppEntryListManager).init(any(), filterCaptor.capture(), any());
- ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
-
- AppEntry systemApp = createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */
- false);
- systemApp.info.flags |= ApplicationInfo.FLAG_SYSTEM;
-
- assertThat(filter.filterApp(systemApp)).isTrue();
- }
-
- @Test
- public void appFilter_notShowingSystemApps_removesSystemEntries() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- // Not showing system by default.
- ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
- ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
- verify(mAppEntryListManager).init(any(), filterCaptor.capture(), any());
- ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
-
- AppEntry systemApp = createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */
- false);
- systemApp.info.flags |= ApplicationInfo.FLAG_SYSTEM;
-
- assertThat(filter.filterApp(systemApp)).isFalse();
- }
-
- @Test
- public void appFilter_removesNullExtraInfoEntries() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
- ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
- verify(mAppEntryListManager).init(any(), filterCaptor.capture(), any());
- ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
-
- AppEntry appEntry = createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */
- false);
- appEntry.extraInfo = null;
-
- assertThat(filter.filterApp(appEntry)).isFalse();
- }
-
- private AppEntry createAppEntry(String packageName, int uid, boolean isOpPermissible) {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = packageName;
- info.uid = uid;
-
- AppStateAppOpsBridge.PermissionState extraInfo = mock(
- AppStateAppOpsBridge.PermissionState.class);
- when(extraInfo.isPermissible()).thenReturn(isOpPermissible);
-
- AppEntry appEntry = mock(AppEntry.class);
- appEntry.info = info;
- appEntry.label = packageName;
- appEntry.extraInfo = extraInfo;
-
- return appEntry;
- }
-
- private ShadowAppOpsManager getShadowAppOpsManager() {
- return Shadow.extract(mContext.getSystemService(Context.APP_OPS_SERVICE));
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java
deleted file mode 100644
index b3d6791..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.applications.specialaccess;
-
-import static com.android.car.settings.common.PreferenceController.AVAILABLE;
-import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ResolveInfo;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.Preference;
-
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowApplication;
-
-import java.util.Collections;
-
-/** Unit test for {@link MoreSpecialAccessPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class})
-public class MoreSpecialAccessPreferenceControllerTest {
-
- private static final String PACKAGE = "test.package";
-
- private Context mContext;
- private Preference mPreference;
- private Intent mIntent;
- private ResolveInfo mResolveInfo;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- mPreference = new Preference(mContext);
- mIntent = new Intent(Intent.ACTION_MANAGE_SPECIAL_APP_ACCESSES);
- mIntent.setPackage(PACKAGE);
-
- ApplicationInfo applicationInfo = new ApplicationInfo();
- applicationInfo.packageName = PACKAGE;
- applicationInfo.name = "TestClass";
- ActivityInfo activityInfo = new ActivityInfo();
- activityInfo.applicationInfo = applicationInfo;
-
- mResolveInfo = new ResolveInfo();
- mResolveInfo.activityInfo = activityInfo;
- }
-
- @After
- public void tearDown() {
- ShadowApplicationPackageManager.reset();
- }
-
- @Test
- public void getAvailabilityStatus_noPermissionController_returnsUnsupportedOnDevice() {
- PreferenceControllerTestHelper<MoreSpecialAccessPreferenceController> controllerHelper =
- new PreferenceControllerTestHelper<>(mContext,
- MoreSpecialAccessPreferenceController.class, mPreference);
-
- assertThat(controllerHelper.getController().getAvailabilityStatus()).isEqualTo(
- UNSUPPORTED_ON_DEVICE);
- }
-
- @Test
- public void getAvailabilityStatus_noResolvedActivity_returnsUnsupportedOnDevice() {
- getShadowApplicationPackageManager().setPermissionControllerPackageName(PACKAGE);
-
- PreferenceControllerTestHelper<MoreSpecialAccessPreferenceController> controllerHelper =
- new PreferenceControllerTestHelper<>(mContext,
- MoreSpecialAccessPreferenceController.class, mPreference);
-
- assertThat(controllerHelper.getController().getAvailabilityStatus()).isEqualTo(
- UNSUPPORTED_ON_DEVICE);
- }
-
- @Test
- public void getAvailabilityStatus_resolvedActivity_returnsAvailable() {
- getShadowApplicationPackageManager().setPermissionControllerPackageName(PACKAGE);
- getShadowApplicationPackageManager().setResolveInfosForIntent(mIntent,
- Collections.singletonList(mResolveInfo));
-
- PreferenceControllerTestHelper<MoreSpecialAccessPreferenceController> controllerHelper =
- new PreferenceControllerTestHelper<>(mContext,
- MoreSpecialAccessPreferenceController.class, mPreference);
-
- assertThat(controllerHelper.getController().getAvailabilityStatus()).isEqualTo(
- AVAILABLE);
- }
-
- @Test
- public void preferenceClicked_startsResolvedActivity() {
- getShadowApplicationPackageManager().setPermissionControllerPackageName(PACKAGE);
- getShadowApplicationPackageManager().setResolveInfosForIntent(mIntent,
- Collections.singletonList(mResolveInfo));
-
- PreferenceControllerTestHelper<MoreSpecialAccessPreferenceController> controllerHelper =
- new PreferenceControllerTestHelper<>(mContext,
- MoreSpecialAccessPreferenceController.class, mPreference);
- controllerHelper.markState(Lifecycle.State.STARTED);
-
- mPreference.performClick();
-
- Intent started = ShadowApplication.getInstance().getNextStartedActivity();
- assertThat(started.getAction()).isEqualTo(Intent.ACTION_MANAGE_SPECIAL_APP_ACCESSES);
- assertThat(started.getPackage()).isEqualTo(PACKAGE);
- }
-
- private ShadowApplicationPackageManager getShadowApplicationPackageManager() {
- return Shadow.extract(mContext.getPackageManager());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java
deleted file mode 100644
index faf45de..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.applications.specialaccess;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.Manifest;
-import android.app.AutomaticZenRule;
-import android.app.NotificationManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.service.notification.NotificationListenerService;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.PreferenceGroup;
-import androidx.preference.TwoStatePreference;
-
-import com.android.car.settings.common.ConfirmationDialogFragment;
-import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-import com.android.car.settings.testutils.ShadowNotificationManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-
-/** Unit test for {@link NotificationAccessPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class, ShadowNotificationManager.class})
-public class NotificationAccessPreferenceControllerTest {
-
- private Context mContext;
- private PreferenceGroup mPreferenceGroup;
- private PreferenceControllerTestHelper<NotificationAccessPreferenceController>
- mControllerHelper;
- private NotificationAccessPreferenceController mController;
-
- private ServiceInfo mListenerServiceInfo;
- private ComponentName mListenerComponent;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- mPreferenceGroup = new LogicalPreferenceGroup(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- NotificationAccessPreferenceController.class, mPreferenceGroup);
- mController = mControllerHelper.getController();
-
- mListenerServiceInfo = new ServiceInfo();
- mListenerServiceInfo.permission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
- mListenerServiceInfo.packageName = "com.android.test.package";
- mListenerServiceInfo.name = "SomeListenerService";
- mListenerServiceInfo.nonLocalizedLabel = "label";
- ApplicationInfo applicationInfo = new ApplicationInfo();
- applicationInfo.uid = 123;
- mListenerServiceInfo.applicationInfo = applicationInfo;
-
- mListenerComponent = new ComponentName(mListenerServiceInfo.packageName,
- mListenerServiceInfo.name);
- }
-
- @After
- public void tearDown() {
- ShadowApplicationPackageManager.reset();
- }
-
- @Test
- public void onStart_loadsListenerServices() {
- addNotificationListenerService(mListenerServiceInfo);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
- }
-
- @Test
- public void onStart_serviceAccessGranted_setsPreferenceChecked() {
- addNotificationListenerService(mListenerServiceInfo);
- mContext.getSystemService(NotificationManager.class).setNotificationListenerAccessGranted(
- mListenerComponent, /* granted= */ true);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
- assertThat(preference.isChecked()).isTrue();
- }
-
- @Test
- public void onStart_serviceAccessNotGranted_setsPreferenceUnchecked() {
- addNotificationListenerService(mListenerServiceInfo);
- mContext.getSystemService(NotificationManager.class).setNotificationListenerAccessGranted(
- mListenerComponent, /* granted= */ false);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
- assertThat(preference.isChecked()).isFalse();
- }
-
- @Test
- public void preferenceClicked_serviceAccessGranted_showsRevokeConfirmDialog() {
- addNotificationListenerService(mListenerServiceInfo);
- mContext.getSystemService(NotificationManager.class).setNotificationListenerAccessGranted(
- mListenerComponent, /* granted= */ true);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
-
- preference.performClick();
-
- verify(mControllerHelper.getMockFragmentController()).showDialog(any(
- ConfirmationDialogFragment.class),
- eq(NotificationAccessPreferenceController.REVOKE_CONFIRM_DIALOG_TAG));
- }
-
- @Test
- public void preferenceClicked_serviceAccessNotGranted_showsGrantConfirmDialog() {
- addNotificationListenerService(mListenerServiceInfo);
- mContext.getSystemService(NotificationManager.class).setNotificationListenerAccessGranted(
- mListenerComponent, /* granted= */ false);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
-
- preference.performClick();
-
- verify(mControllerHelper.getMockFragmentController()).showDialog(any(
- ConfirmationDialogFragment.class),
- eq(NotificationAccessPreferenceController.GRANT_CONFIRM_DIALOG_TAG));
- }
-
- @Test
- public void revokeConfirmed_revokesNotificationAccess() {
- addNotificationListenerService(mListenerServiceInfo);
- NotificationManager notificationManager = mContext.getSystemService(
- NotificationManager.class);
- notificationManager.setNotificationListenerAccessGranted(
- mListenerComponent, /* granted= */ true);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
- preference.performClick();
-
- ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
- ConfirmationDialogFragment.class);
- verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
- eq(NotificationAccessPreferenceController.REVOKE_CONFIRM_DIALOG_TAG));
- ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
-
- dialogFragment.onClick(/* dialog= */ null, DialogInterface.BUTTON_POSITIVE);
-
- assertThat(notificationManager.isNotificationListenerAccessGranted(
- mListenerComponent)).isFalse();
- }
-
- @Test
- public void revokeConfirmed_notificationPolicyAccessNotGranted_removesAutomaticZenRules() {
- addNotificationListenerService(mListenerServiceInfo);
- NotificationManager notificationManager = mContext.getSystemService(
- NotificationManager.class);
- notificationManager.setNotificationListenerAccessGranted(
- mListenerComponent, /* granted= */ true);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
- preference.performClick();
-
- ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
- ConfirmationDialogFragment.class);
- verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
- eq(NotificationAccessPreferenceController.REVOKE_CONFIRM_DIALOG_TAG));
- ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
-
- // Add a rule to be removed on access revoke.
- notificationManager.addAutomaticZenRule(mock(AutomaticZenRule.class));
- assertThat(notificationManager.getAutomaticZenRules()).isNotEmpty();
-
- notificationManager.setNotificationPolicyAccessGranted(
- mListenerServiceInfo.packageName, /* granted= */ false);
- dialogFragment.onClick(/* dialog= */ null, DialogInterface.BUTTON_POSITIVE);
-
- Robolectric.flushBackgroundThreadScheduler();
- Robolectric.flushForegroundThreadScheduler();
-
- assertThat(notificationManager.getAutomaticZenRules()).isEmpty();
- }
-
- @Test
- public void grantConfirmed_grantsNotificationAccess() {
- addNotificationListenerService(mListenerServiceInfo);
- NotificationManager notificationManager = mContext.getSystemService(
- NotificationManager.class);
- notificationManager.setNotificationListenerAccessGranted(
- mListenerComponent, /* granted= */ false);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
- preference.performClick();
-
- ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
- ConfirmationDialogFragment.class);
- verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
- eq(NotificationAccessPreferenceController.GRANT_CONFIRM_DIALOG_TAG));
- ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
-
- dialogFragment.onClick(/* dialog= */ null, DialogInterface.BUTTON_POSITIVE);
-
- assertThat(notificationManager.isNotificationListenerAccessGranted(
- mListenerComponent)).isTrue();
- }
-
- private void addNotificationListenerService(ServiceInfo serviceInfo) {
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.serviceInfo = serviceInfo;
- getShadowPackageManager().addResolveInfoForIntent(
- new Intent(NotificationListenerService.SERVICE_INTERFACE), resolveInfo);
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = serviceInfo.packageName;
- packageInfo.applicationInfo = serviceInfo.applicationInfo;
- getShadowPackageManager().addPackage(packageInfo);
- }
-
- private ShadowApplicationPackageManager getShadowPackageManager() {
- return Shadow.extract(mContext.getPackageManager());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java
deleted file mode 100644
index 0ff2f54..0000000
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.applications.specialaccess;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.telephony.SmsManager;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.ListPreference;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
-
-import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowApplicationsState;
-import com.android.car.settings.testutils.ShadowSmsManager;
-import com.android.settingslib.applications.ApplicationsState;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/** Unit test for {@link PremiumSmsAccessPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationsState.class, ShadowSmsManager.class})
-public class PremiumSmsAccessPreferenceControllerTest {
-
- @Mock
- private AppEntryListManager mAppEntryListManager;
- @Mock
- private ApplicationsState mApplicationsState;
- @Mock
- private SmsManager mSmsManager;
- @Captor
- private ArgumentCaptor<AppEntryListManager.Callback> mCallbackCaptor;
-
- private PreferenceGroup mPreferenceGroup;
- private PreferenceControllerTestHelper<PremiumSmsAccessPreferenceController> mControllerHelper;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- ShadowApplicationsState.setInstance(mApplicationsState);
- when(mApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
- ShadowSmsManager.setDefault(mSmsManager);
-
- Context context = RuntimeEnvironment.application;
- mPreferenceGroup = new LogicalPreferenceGroup(context);
- mControllerHelper = new PreferenceControllerTestHelper<>(context,
- PremiumSmsAccessPreferenceController.class, mPreferenceGroup);
- mControllerHelper.getController().mAppEntryListManager = mAppEntryListManager;
- mControllerHelper.markState(Lifecycle.State.CREATED);
- verify(mAppEntryListManager).init(any(AppStatePremiumSmsBridge.class), any(),
- mCallbackCaptor.capture());
- }
-
- @After
- public void tearDown() {
- ShadowApplicationsState.reset();
- ShadowSmsManager.reset();
- }
-
- @Test
- public void onStart_startsListManager() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- verify(mAppEntryListManager).start();
- }
-
- @Test
- public void onStop_stopsListManager() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
-
- verify(mAppEntryListManager).stop();
- }
-
- @Test
- public void onDestroy_destroysListManager() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
-
- verify(mAppEntryListManager).destroy();
- }
-
- @Test
- public void onAppEntryListChanged_addsPreferencesForEntries() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- List<AppEntry> entries = Arrays.asList(
- createAppEntry("test.package", /* uid= */ 1,
- SmsManager.PREMIUM_SMS_CONSENT_ALWAYS_ALLOW),
- createAppEntry("another.test.package", /* uid= */ 2,
- SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
-
- mCallbackCaptor.getValue().onAppEntryListChanged(entries);
-
- assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
- assertThat(((ListPreference) mPreferenceGroup.getPreference(0)).getValue()).isEqualTo(
- String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_ALWAYS_ALLOW));
- assertThat(((ListPreference) mPreferenceGroup.getPreference(1)).getValue()).isEqualTo(
- String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
- }
-
- @Test
- public void onPreferenceChange_setsPremiumSmsPermission() throws RemoteException {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- String packageName = "test.package";
- List<AppEntry> entries = Collections.singletonList(
- createAppEntry(packageName, /* uid= */ 1,
- SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
- mCallbackCaptor.getValue().onAppEntryListChanged(entries);
- Preference appPref = mPreferenceGroup.getPreference(0);
- int updatedValue = SmsManager.PREMIUM_SMS_CONSENT_ASK_USER;
-
- appPref.getOnPreferenceChangeListener().onPreferenceChange(appPref,
- String.valueOf(updatedValue));
-
- verify(mSmsManager).setPremiumSmsConsent(packageName, updatedValue);
- }
-
- @Test
- public void onPreferenceChange_updatesEntry() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- List<AppEntry> entries = Collections.singletonList(
- createAppEntry("test.package", /* uid= */ 1,
- SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
- mCallbackCaptor.getValue().onAppEntryListChanged(entries);
- Preference appPref = mPreferenceGroup.getPreference(0);
-
- appPref.getOnPreferenceChangeListener().onPreferenceChange(appPref,
- String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_ASK_USER));
-
- verify(mAppEntryListManager).forceUpdate(entries.get(0));
- }
-
- @Test
- public void appFilter_removesUnknownStates() {
- mControllerHelper.markState(Lifecycle.State.STARTED);
- ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
- ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
- verify(mAppEntryListManager).init(any(), filterCaptor.capture(), any());
- ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
- AppEntry unknownStateApp = createAppEntry("test.package", /* uid= */ 1,
- SmsManager.PREMIUM_SMS_CONSENT_UNKNOWN);
-
- assertThat(filter.filterApp(unknownStateApp)).isFalse();
- }
-
- private AppEntry createAppEntry(String packageName, int uid, int smsState) {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = packageName;
- info.uid = uid;
-
- AppEntry appEntry = mock(AppEntry.class);
- appEntry.info = info;
- appEntry.label = packageName;
- appEntry.extraInfo = smsState;
-
- return appEntry;
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java
deleted file mode 100644
index c4ce83d..0000000
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.bluetooth;
-
-import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.testng.Assert.assertThrows;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothDevicePicker;
-import android.bluetooth.BluetoothUuid;
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.os.IBinder;
-import android.os.ParcelUuid;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.PreferenceGroup;
-
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowBluetoothAdapter;
-import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
-import com.android.settingslib.bluetooth.LocalBluetoothManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.Arrays;
-
-/** Unit test for {@link BluetoothDevicePickerPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
-public class BluetoothDevicePickerPreferenceControllerTest {
- private static final String ALLOWED_LAUNCH_PKG = "com.android.car.settings.tests.robotests";
- private static final String DEFAULT_LAUNCH_PKG = "test.package";
- private static final String DEFAULT_LAUNCH_CLASS = "TestClass";
-
- @Mock
- private CachedBluetoothDevice mUnbondedCachedDevice;
- @Mock
- private BluetoothDevice mUnbondedDevice;
- @Mock
- private CachedBluetoothDevice mBondedCachedDevice;
- @Mock
- private BluetoothDevice mBondedDevice;
- @Mock
- private CachedBluetoothDeviceManager mCachedDeviceManager;
- private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
- private LocalBluetoothManager mLocalBluetoothManager;
- private PreferenceGroup mPreferenceGroup;
- private PreferenceControllerTestHelper<TestBluetoothDevicePickerPreferenceController>
- mControllerHelper;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- Context context = RuntimeEnvironment.application;
-
- mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
- null);
- mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
- ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
- mCachedDeviceManager);
-
- when(mUnbondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
- when(mUnbondedCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
- when(mUnbondedCachedDevice.getDevice()).thenReturn(mUnbondedDevice);
- when(mBondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
- when(mBondedCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
- when(mBondedCachedDevice.getDevice()).thenReturn(mBondedDevice);
- when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
- Arrays.asList(mUnbondedCachedDevice, mBondedCachedDevice));
- // Make bonded device appear first in the list.
- when(mBondedCachedDevice.compareTo(mUnbondedCachedDevice)).thenReturn(-1);
- when(mUnbondedCachedDevice.compareTo(mBondedCachedDevice)).thenReturn(1);
-
- // Make sure controller is available.
- Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
- FEATURE_BLUETOOTH, /* supported= */ true);
- BluetoothAdapter.getDefaultAdapter().enable();
- getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
-
- mPreferenceGroup = new LogicalPreferenceGroup(context);
- mControllerHelper = new PreferenceControllerTestHelper<>(context,
- TestBluetoothDevicePickerPreferenceController.class);
- }
-
- @After
- public void tearDown() {
- ShadowBluetoothAdapter.reset();
- ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
- mSaveRealCachedDeviceManager);
- }
-
- @Test
- public void checkInitialized_noLaunchIntentSet_throwsIllegalStateException() {
- assertThrows(IllegalStateException.class,
- () -> mControllerHelper.setPreference(mPreferenceGroup));
- }
-
- @Test
- public void onStart_appliesFilterType() {
- // Setup device to pass the filter.
- when(mBondedDevice.getUuids()).thenReturn(new ParcelUuid[]{BluetoothUuid.A2DP_SINK});
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ false,
- BluetoothDevicePicker.FILTER_TYPE_AUDIO, DEFAULT_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
- assertThat(((BluetoothDevicePreference) mPreferenceGroup.getPreference(
- 0)).getCachedDevice()).isEqualTo(mBondedCachedDevice);
- }
-
- @Test
- public void onDeviceClicked_callingPackageEqualToLaunchPackage_setsClassName() {
- ComponentName component = new ComponentName(ALLOWED_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
- BluetoothDevicePicker.FILTER_TYPE_ALL, component.getPackageName(),
- component.getClassName());
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.STARTED);
- BluetoothDevicePreference devicePreference =
- (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
-
- devicePreference.performClick();
-
- assertThat(ShadowApplication.getInstance().getBroadcastIntents()).hasSize(1);
- Intent pickedIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
- assertThat(pickedIntent.getAction()).isEqualTo(
- BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
- assertThat(pickedIntent.getComponent()).isEqualTo(component);
- assertThat((BluetoothDevice) pickedIntent.getParcelableExtra(
- BluetoothDevice.EXTRA_DEVICE)).isEqualTo(mBondedDevice);
- }
-
- @Test
- public void onDeviceClicked_callingPackageNotEqualToLaunchPackage_doesNotSetClassName() {
- ComponentName component = new ComponentName(DEFAULT_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
- BluetoothDevicePicker.FILTER_TYPE_ALL, component.getPackageName(),
- component.getClassName());
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.STARTED);
- BluetoothDevicePreference devicePreference =
- (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
-
- devicePreference.performClick();
-
- assertThat(ShadowApplication.getInstance().getBroadcastIntents()).hasSize(1);
- Intent pickedIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
- assertThat(pickedIntent.getAction()).isEqualTo(
- BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
- assertThat(pickedIntent.getComponent()).isNull();
- assertThat((BluetoothDevice) pickedIntent.getParcelableExtra(
- BluetoothDevice.EXTRA_DEVICE)).isEqualTo(mBondedDevice);
- }
-
- @Test
- public void onDeviceClicked_bondedDevice_goesBack() {
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
- BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.STARTED);
- BluetoothDevicePreference devicePreference =
- (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
-
- devicePreference.performClick();
-
- verify(mControllerHelper.getMockFragmentController()).goBack();
- }
-
- @Test
- public void onDeviceClicked_unbondedDevice_doesNotNeedAuth_sendsPickedIntent() {
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ false,
- BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.STARTED);
- BluetoothDevicePreference devicePreference =
- (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
-
- devicePreference.performClick();
-
- Intent pickedIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
- assertThat(pickedIntent.getAction()).isEqualTo(
- BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
- }
-
- @Test
- public void onDeviceClicked_unbondedDevice_needsAuth_startsPairing() {
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
- BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.STARTED);
- BluetoothDevicePreference devicePreference =
- (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
-
- devicePreference.performClick();
-
- verify(mUnbondedCachedDevice).startPairing();
- }
-
- @Test
- public void onDeviceClicked_unbondedDevice_needsAuth_pairingStartFails_resumesScanning() {
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
- BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.STARTED);
- BluetoothDevicePreference devicePreference =
- (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
- when(mUnbondedCachedDevice.startPairing()).thenReturn(false);
- assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
-
- devicePreference.performClick();
-
- assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
- }
-
- @Test
- public void onDeviceBondStateChanged_selectedDeviceBonded_sendsPickedIntent() {
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
- BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.STARTED);
- BluetoothDevicePreference devicePreference =
- (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
-
- // Select device.
- devicePreference.performClick();
- // Device bonds.
- mControllerHelper.getController().onDeviceBondStateChanged(
- devicePreference.getCachedDevice(), BluetoothDevice.BOND_BONDED);
-
- Intent pickedIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
- assertThat(pickedIntent.getAction()).isEqualTo(
- BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
- }
-
- @Test
- public void onDeviceBondStateChanged_selectedDeviceBonded_goesBack() {
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
- BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.STARTED);
- BluetoothDevicePreference devicePreference =
- (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
-
- // Select device.
- devicePreference.performClick();
- // Device bonds.
- mControllerHelper.getController().onDeviceBondStateChanged(
- devicePreference.getCachedDevice(), BluetoothDevice.BOND_BONDED);
-
- verify(mControllerHelper.getMockFragmentController()).goBack();
- }
-
- @Test
- public void onDestroy_noDeviceSelected_sendsNullPickedIntent() {
- Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
- BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PKG, DEFAULT_LAUNCH_CLASS);
- mControllerHelper.getController().setLaunchIntent(launchIntent);
- mControllerHelper.setPreference(mPreferenceGroup);
- mControllerHelper.markState(Lifecycle.State.STARTED);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
-
- Intent pickedIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
- assertThat(pickedIntent.getAction()).isEqualTo(
- BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
- assertThat((BluetoothDevice) pickedIntent.getParcelableExtra(
- BluetoothDevice.EXTRA_DEVICE)).isNull();
- }
-
- private Intent createLaunchIntent(boolean needAuth, int filterType, String packageName,
- String className) {
- Intent intent = new Intent(BluetoothDevicePicker.ACTION_LAUNCH);
- intent.putExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, needAuth);
- intent.putExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE, filterType);
- intent.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE, packageName);
- intent.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS, className);
- return intent;
- }
-
- private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
- return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
- }
-
- private static class TestBluetoothDevicePickerPreferenceController
- extends BluetoothDevicePickerPreferenceController {
-
- TestBluetoothDevicePickerPreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController,
- CarUxRestrictions uxRestrictions) {
- super(context, preferenceKey, fragmentController, uxRestrictions);
- }
-
- @Override
- String getCallingAppPackageName(IBinder activityToken) {
- return ALLOWED_LAUNCH_PKG;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java
deleted file mode 100644
index 6d8c026..0000000
--- a/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import static android.net.TrafficStats.UID_TETHERING;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.net.NetworkStats;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.test.core.app.ApplicationProvider;
-
-import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.common.ProgressBarPreference;
-import com.android.car.settings.testutils.ShadowUidDetailProvider;
-import com.android.car.settings.testutils.ShadowUserManager;
-import com.android.settingslib.net.UidDetail;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-
-/** Unit test for {@link AppDataUsagePreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowUidDetailProvider.class, ShadowUserManager.class})
-public class AppDataUsagePreferenceControllerTest {
-
- private Context mContext;
- private LogicalPreferenceGroup mLogicalPreferenceGroup;
- private AppDataUsagePreferenceController mController;
- private PreferenceControllerTestHelper<AppDataUsagePreferenceController>
- mPreferenceControllerHelper;
-
- @Mock
- private UidDetail mUidDetail;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = ApplicationProvider.getApplicationContext();
- mLogicalPreferenceGroup = new LogicalPreferenceGroup(mContext);
- mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- AppDataUsagePreferenceController.class, mLogicalPreferenceGroup);
- mController = mPreferenceControllerHelper.getController();
-
- mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
- }
-
- @After
- public void tearDown() {
- ShadowUidDetailProvider.reset();
- }
-
- @Test
- public void defaultInitialize_hasNoPreference() {
- assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(0);
- }
-
- @Test
- public void onDataLoaded_dataNotLoaded_hasNoPreference() {
- mController.onDataLoaded(null, new int[0]);
-
- assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(0);
- }
-
- @Test
- public void onDataLoaded_statsSizeZero_hasNoPreference() {
- NetworkStats networkStats = new NetworkStats(0, 0);
-
- mController.onDataLoaded(networkStats, new int[0]);
-
- assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(0);
- }
-
- @Test
- public void onDataLoaded_statsLoaded_hasTwoPreference() {
- NetworkStats networkStats = new NetworkStats(0, 0);
- NetworkStats.Entry entry1 = new NetworkStats.Entry();
- entry1.rxBytes = 100;
- NetworkStats.Entry entry2 = new NetworkStats.Entry();
- entry2.uid = UID_TETHERING;
- entry2.rxBytes = 200;
-
- mController.onDataLoaded(networkStats.addEntry(entry1).addEntry(entry2), new int[0]);
-
- assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(2);
- }
-
- @Test
- public void onDataLoaded_statsLoaded_hasOnePreference() {
- ShadowUidDetailProvider.setUidDetail(mUidDetail);
- NetworkStats networkStats = new NetworkStats(0, 0);
- NetworkStats.Entry entry1 = new NetworkStats.Entry();
- entry1.rxBytes = 100;
- NetworkStats.Entry entry2 = new NetworkStats.Entry();
- entry2.uid = UID_TETHERING;
- entry2.rxBytes = 200;
-
- mController.onDataLoaded(networkStats.addEntry(entry1).addEntry(entry2), new int[0]);
-
- ProgressBarPreference preference1 =
- (ProgressBarPreference) mLogicalPreferenceGroup.getPreference(0);
- ProgressBarPreference preference2 =
- (ProgressBarPreference) mLogicalPreferenceGroup.getPreference(1);
- assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(2);
- assertThat(preference1.getProgress()).isEqualTo(100);
- assertThat(preference2.getProgress()).isEqualTo(50);
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java
deleted file mode 100644
index bd1cb1c..0000000
--- a/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.net.NetworkTemplate;
-
-import androidx.fragment.app.Fragment;
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.Preference;
-
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.FragmentController;
-import com.android.settingslib.NetworkPolicyEditor;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class CycleResetDayOfMonthPickerPreferenceControllerTest {
-
- private Preference mPreference;
- private PreferenceControllerTestHelper<CycleResetDayOfMonthPickerPreferenceController>
- mControllerHelper;
- @Mock
- private NetworkPolicyEditor mPolicyEditor;
- @Mock
- private NetworkTemplate mNetworkTemplate;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- Context context = RuntimeEnvironment.application;
-
- mPreference = new Preference(context);
- mControllerHelper = new PreferenceControllerTestHelper<>(context,
- CycleResetDayOfMonthPickerPreferenceController.class, mPreference);
-
- mControllerHelper.getController().setNetworkPolicyEditor(mPolicyEditor);
- mControllerHelper.getController().setNetworkTemplate(mNetworkTemplate);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- }
-
- @Test
- public void performClick_startsDialogWithStartingValue() {
- int startingValue = 15;
- when(mPolicyEditor.getPolicyCycleDay(mNetworkTemplate)).thenReturn(startingValue);
- mControllerHelper.getController().refreshUi();
- mPreference.performClick();
-
- ArgumentCaptor<UsageCycleResetDayOfMonthPickerDialog> dialogCaptor =
- ArgumentCaptor.forClass(UsageCycleResetDayOfMonthPickerDialog.class);
- verify(mControllerHelper.getMockFragmentController()).showDialog(
- dialogCaptor.capture(), anyString());
-
- UsageCycleResetDayOfMonthPickerDialog dialog = dialogCaptor.getValue();
-
- // Dialog was never started because FragmentController is mocked.
- FragmentController<Fragment> fragmentController = FragmentController.of(new Fragment());
- Fragment testFragment = fragmentController.setup();
- dialog.show(testFragment.getFragmentManager(), null);
-
- assertThat(dialog.getSelectedDayOfMonth()).isEqualTo(startingValue);
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java
deleted file mode 100644
index f66b7f3..0000000
--- a/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import static android.net.NetworkPolicy.LIMIT_DISABLED;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.net.NetworkTemplate;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
-import androidx.preference.SwitchPreference;
-import androidx.preference.TwoStatePreference;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.ConfirmationDialogFragment;
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.settingslib.NetworkPolicyEditor;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class DataLimitPreferenceControllerTest {
-
- private static final long GIB_IN_BYTES = 1024 * 1024 * 1024;
- private static final long EPSILON = 100;
-
- private TwoStatePreference mEnablePreference;
- private Preference mLimitPreference;
- private DataLimitPreferenceController mController;
- private FragmentController mFragmentController;
- @Mock
- private NetworkPolicyEditor mPolicyEditor;
- @Mock
- private NetworkTemplate mNetworkTemplate;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- Context context = RuntimeEnvironment.application;
-
- PreferenceGroup preferenceGroup = new LogicalPreferenceGroup(context);
- PreferenceControllerTestHelper<DataLimitPreferenceController> controllerHelper =
- new PreferenceControllerTestHelper<>(context,
- DataLimitPreferenceController.class, preferenceGroup);
- mController = controllerHelper.getController();
- mFragmentController = controllerHelper.getMockFragmentController();
-
- mEnablePreference = new SwitchPreference(context);
- mEnablePreference.setKey(context.getString(R.string.pk_data_set_limit));
- preferenceGroup.addPreference(mEnablePreference);
- mLimitPreference = new Preference(context);
- mLimitPreference.setKey(context.getString(R.string.pk_data_limit));
- preferenceGroup.addPreference(mLimitPreference);
-
- mController.setNetworkPolicyEditor(mPolicyEditor);
- mController.setNetworkTemplate(mNetworkTemplate);
- controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- }
-
- @Test
- public void refreshUi_limitDisabled_summaryEmpty() {
- when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(LIMIT_DISABLED);
- mController.refreshUi();
-
- assertThat(mLimitPreference.getSummary()).isNull();
- }
-
- @Test
- public void refreshUi_limitDisabled_preferenceDisabled() {
- when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(LIMIT_DISABLED);
- mController.refreshUi();
-
- assertThat(mLimitPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void refreshUi_limitDisabled_switchUnchecked() {
- when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(LIMIT_DISABLED);
- mController.refreshUi();
-
- assertThat(mEnablePreference.isChecked()).isFalse();
- }
-
- @Test
- public void refreshUi_limitEnabled_summaryPopulated() {
- when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(5 * GIB_IN_BYTES);
- mController.refreshUi();
-
- assertThat(mLimitPreference.getSummary().toString()).isNotEmpty();
- }
-
- @Test
- public void refreshUi_limitEnabled_preferenceEnabled() {
- when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(5 * GIB_IN_BYTES);
- mController.refreshUi();
-
- assertThat(mLimitPreference.isEnabled()).isTrue();
- }
-
- @Test
- public void refreshUi_limitEnabled_switchChecked() {
- when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(5 * GIB_IN_BYTES);
- mController.refreshUi();
-
- assertThat(mEnablePreference.isChecked()).isTrue();
- }
-
- @Test
- public void onPreferenceChanged_toggleFalse_limitBytesDisabled() {
- mEnablePreference.callChangeListener(false);
- verify(mPolicyEditor).setPolicyLimitBytes(mNetworkTemplate, LIMIT_DISABLED);
- }
-
- @Test
- public void onPreferenceChanged_toggleTrue_showsDialog() {
- mEnablePreference.callChangeListener(true);
-
- verify(mFragmentController).showDialog(any(ConfirmationDialogFragment.class),
- eq(ConfirmationDialogFragment.TAG));
- }
-
- @Test
- public void onDialogConfirm_noWarningThreshold_setsLimitTo5GB() {
- mController.onConfirm(null);
-
- verify(mPolicyEditor).setPolicyLimitBytes(mNetworkTemplate, 5 * GIB_IN_BYTES);
- }
-
- @Test
- public void onDialogConfirm_hasWarningThreshold_setsLimitToWithMultiplier() {
- when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(5 * GIB_IN_BYTES);
- mController.onConfirm(null);
-
- ArgumentCaptor<Long> setLimit = ArgumentCaptor.forClass(Long.class);
- verify(mPolicyEditor).setPolicyLimitBytes(eq(mNetworkTemplate), setLimit.capture());
-
- long setValue = setLimit.getValue();
- // Due to precision errors, add and subtract a small epsilon.
- assertThat(setValue).isGreaterThan(
- (long) (5 * GIB_IN_BYTES * DataLimitPreferenceController.LIMIT_BYTES_MULTIPLIER)
- - EPSILON);
- assertThat(setValue).isLessThan(
- (long) (5 * GIB_IN_BYTES * DataLimitPreferenceController.LIMIT_BYTES_MULTIPLIER)
- + EPSILON);
- }
-
- @Test
- public void onPreferenceClicked_showsPickerDialog() {
- mLimitPreference.performClick();
-
- verify(mFragmentController).showDialog(any(UsageBytesThresholdPickerDialog.class),
- eq(UsageBytesThresholdPickerDialog.TAG));
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java
deleted file mode 100644
index 8955ea8..0000000
--- a/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import static com.android.car.settings.common.PreferenceController.AVAILABLE;
-import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-import static org.robolectric.shadow.api.Shadow.extract;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkCapabilities;
-import android.telephony.SubscriptionManager;
-import android.telephony.SubscriptionPlan;
-import android.util.RecurrenceRule;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.Preference;
-
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowConnectivityManager;
-import com.android.car.settings.testutils.ShadowSubscriptionManager;
-
-import com.google.android.collect.Lists;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowNetwork;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowConnectivityManager.class, ShadowSubscriptionManager.class})
-public class DataUsageEntryPreferenceControllerTest {
-
- private static final int SUBSCRIPTION_ID = 1;
-
- private Context mContext;
- private Preference mPreference;
- private DataUsageEntryPreferenceController mController;
- @Mock
- private NetworkCapabilities mNetworkCapabilities;
- @Mock
- private SubscriptionPlan mSubscriptionPlan;
- @Mock
- private RecurrenceRule mRecurrenceRule;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mPreference = new Preference(mContext);
- PreferenceControllerTestHelper<DataUsageEntryPreferenceController> controllerHelper =
- new PreferenceControllerTestHelper<>(mContext,
- DataUsageEntryPreferenceController.class, mPreference);
- mController = controllerHelper.getController();
-
- // Setup to always make preference available.
- getShadowConnectivityManager().clearAllNetworks();
- getShadowConnectivityManager().addNetworkCapabilities(
- ShadowNetwork.newInstance(ConnectivityManager.TYPE_MOBILE), mNetworkCapabilities);
- when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
- true);
-
- controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- }
-
- @After
- public void tearDown() {
- ShadowConnectivityManager.reset();
- ShadowSubscriptionManager.reset();
- }
-
- @Test
- public void getAvailabilityStatus_noMobileNetwork_isUnsupported() {
- when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
- false);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
- }
-
- @Test
- public void getAvailabilityStatus_hasMobileNetwork_isAvailable() {
- when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
- true);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void refreshUi_noDefaultSubscriptionId_noSummarySet() {
- ShadowSubscriptionManager.setDefaultSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
- mController.refreshUi();
- assertThat(mPreference.getSummary()).isNull();
- }
-
- @Test
- public void refreshUi_noPrimaryPlan_noSummarySet() {
- ShadowSubscriptionManager.setDefaultSubscriptionId(SUBSCRIPTION_ID);
- getShadowSubscriptionManager().setSubscriptionPlans(Lists.newArrayList());
-
- mController.refreshUi();
- assertThat(mPreference.getSummary()).isNull();
- }
-
- @Test
- public void refreshUi_hasPrimaryPlan_setsSummary() {
- ShadowSubscriptionManager.setDefaultSubscriptionId(SUBSCRIPTION_ID);
- getShadowSubscriptionManager().setSubscriptionPlans(Lists.newArrayList(mSubscriptionPlan));
- when(mSubscriptionPlan.getDataLimitBytes()).thenReturn(100L);
- when(mSubscriptionPlan.getDataUsageBytes()).thenReturn(10L);
- when(mSubscriptionPlan.getCycleRule()).thenReturn(mRecurrenceRule);
-
- mController.refreshUi();
- assertThat(mPreference.getSummary().length()).isGreaterThan(0);
- }
-
- private ShadowConnectivityManager getShadowConnectivityManager() {
- return (ShadowConnectivityManager) extract(
- mContext.getSystemService(ConnectivityManager.class));
- }
-
- private ShadowSubscriptionManager getShadowSubscriptionManager() {
- return (ShadowSubscriptionManager) extract(
- mContext.getSystemService(SubscriptionManager.class));
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
deleted file mode 100644
index e08ef91..0000000
--- a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import static com.android.car.settings.common.PreferenceController.AVAILABLE;
-import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.robolectric.shadow.api.Shadow.extract;
-
-import android.content.Context;
-import android.net.NetworkTemplate;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.SubscriptionPlan;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.text.format.Formatter;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.test.core.app.ApplicationProvider;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowDataUsageController;
-import com.android.car.settings.testutils.ShadowSubscriptionManager;
-import com.android.car.settings.testutils.ShadowTelephonyManager;
-import com.android.settingslib.net.DataUsageController;
-
-import com.google.android.collect.Lists;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-
-import java.time.Period;
-import java.time.ZonedDateTime;
-import java.util.concurrent.TimeUnit;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowTelephonyManager.class, ShadowSubscriptionManager.class,
- ShadowDataUsageController.class})
-public class DataUsageSummaryPreferenceControllerTest {
-
- private static final CharSequence TEST_CARRIER_NAME = "TEST_CARRIER_NAME";
-
- private Context mContext;
- private DataUsageSummaryPreference mDataUsageSummaryPreference;
- private DataUsageSummaryPreferenceController mController;
- private PreferenceControllerTestHelper<DataUsageSummaryPreferenceController> mControllerHelper;
- private NetworkTemplate mNetworkTemplate;
- @Mock
- private DataUsageController mDataUsageController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- SubscriptionInfo info = mock(SubscriptionInfo.class);
- when(info.getSubscriptionId()).thenReturn(1);
- ShadowSubscriptionManager.setDefaultDataSubscriptionInfo(info);
- ShadowDataUsageController.setInstance(mDataUsageController);
-
- mContext = ApplicationProvider.getApplicationContext();
- mDataUsageSummaryPreference = new DataUsageSummaryPreference(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- DataUsageSummaryPreferenceController.class, mDataUsageSummaryPreference);
- mController = mControllerHelper.getController();
-
- mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(
- mContext.getSystemService(TelephonyManager.class),
- DataUsageUtils.getDefaultSubscriptionId(
- mContext.getSystemService(SubscriptionManager.class)));
- }
-
- @After
- public void tearDown() {
- ShadowTelephonyManager.reset();
- ShadowSubscriptionManager.reset();
- ShadowDataUsageController.reset();
- }
-
- @Test
- public void getAvailabilityStatus_hasSim_isAvailable() {
- getShadowTelephonyManager().setSimState(TelephonyManager.SIM_STATE_LOADED);
- assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_noSim_isConditionallyUnavailable() {
- getShadowTelephonyManager().setSimState(TelephonyManager.SIM_STATE_UNKNOWN);
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void refreshUi_hasUsage_titleSet() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- String usedValueString = Formatter.formatBytes(mContext.getResources(), info.usageLevel,
- Formatter.FLAG_CALCULATE_ROUNDED | Formatter.FLAG_IEC_UNITS).value;
- assertThat(mDataUsageSummaryPreference.getTitle().toString()).contains(usedValueString);
- }
-
- @Test
- public void refreshUi_noLimits_doesntSetDataLimitText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- info.limitLevel = -1;
- info.warningLevel = -1;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getDataLimitText()).isNull();
- }
-
- @Test
- public void refreshUi_hasLimit_setsDataLimitText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- info.limitLevel = 100000;
- info.warningLevel = -1;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getDataLimitText().toString()).isEqualTo(
- TextUtils.expandTemplate(mContext.getText(R.string.cell_data_limit),
- DataUsageUtils.bytesToIecUnits(mContext, info.limitLevel)).toString());
- }
-
- @Test
- public void refreshUi_hasWarning_setsDataLimitText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- info.limitLevel = -1;
- info.warningLevel = 50000;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getDataLimitText().toString()).isEqualTo(
- TextUtils.expandTemplate(mContext.getText(R.string.cell_data_warning),
- DataUsageUtils.bytesToIecUnits(mContext, info.warningLevel)).toString());
- }
-
- @Test
- public void refreshUi_hasWarningAndLimit_setsDataLimitText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- info.limitLevel = 100000;
- info.warningLevel = 50000;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getDataLimitText().toString()).isEqualTo(
- TextUtils.expandTemplate(mContext.getText(R.string.cell_data_warning_and_limit),
- DataUsageUtils.bytesToIecUnits(mContext, info.warningLevel),
- DataUsageUtils.bytesToIecUnits(mContext, info.limitLevel)).toString());
- }
-
- @Test
- public void refreshUi_endTimeIsGreaterThanOneDay_setsBillingCycleText() {
- int numDays = 20;
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- // Add an extra hour to account for the difference in time when the test calls
- // System.currentTimeMillis() vs when the code calls it.
- info.cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(numDays)
- + TimeUnit.HOURS.toMillis(1);
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getRemainingBillingCycleText().toString())
- .isEqualTo(
- mContext.getResources().getQuantityString(R.plurals.billing_cycle_days_left,
- numDays, numDays));
- }
-
- @Test
- public void refreshUi_endTimeIsLessThanOneDay_setsBillingCycleText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.cycleEnd = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(22);
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getRemainingBillingCycleText().toString())
- .isEqualTo(
- mContext.getString(R.string.billing_cycle_less_than_one_day_left));
- }
-
- @Test
- public void refreshUi_endTimeIsNow_setsBillingCycleText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.cycleEnd = System.currentTimeMillis();
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getRemainingBillingCycleText().toString())
- .isEqualTo(
- mContext.getString(R.string.billing_cycle_none_left));
- }
-
- @Test
- public void refreshUi_hasCarrierName_hasRecentUpdate_setsCarrierInfoText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- setCarrierName(TEST_CARRIER_NAME);
- setSubscriptionPlan(/* usageBytes= */ 1000L, System.currentTimeMillis());
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getCarrierInfoText()).isEqualTo(
- TextUtils.expandTemplate(mContext.getText(R.string.carrier_and_update_now_text),
- TEST_CARRIER_NAME));
- }
-
- @Test
- public void refreshUi_hasCarrierName_hasOldUpdate_setsCarrierInfoText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- int numDays = 15;
- setCarrierName(TEST_CARRIER_NAME);
- setSubscriptionPlan(/* usageBytes= */ 1000L,
- System.currentTimeMillis() - TimeUnit.DAYS.toMillis(numDays));
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getCarrierInfoText()).isEqualTo(
- TextUtils.expandTemplate(mContext.getText(R.string.carrier_and_update_text),
- TEST_CARRIER_NAME, numDays + " days"));
- }
-
- @Test
- public void refreshUi_noCarrierName_hasRecentUpdate_setsCarrierInfoText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- setSubscriptionPlan(/* usageBytes= */ 1000L, System.currentTimeMillis());
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getCarrierInfoText().toString()).isEqualTo(
- mContext.getString(R.string.no_carrier_update_now_text));
- }
-
- @Test
- public void refreshUi_noCarrierName_hasOldUpdate_setsCarrierInfoText() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- int numDays = 15;
- setSubscriptionPlan(/* usageBytes= */ 1000L,
- System.currentTimeMillis() - TimeUnit.DAYS.toMillis(numDays));
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getCarrierInfoText()).isEqualTo(
- TextUtils.expandTemplate(mContext.getText(R.string.no_carrier_update_text),
- null, numDays + " days"));
- }
-
- @Test
- public void refreshUi_hasUpdateTimeOlderThanWarning_setsCarrierInfoStyle() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
-
- // Subtract an extra hour to account fo the difference in calls to
- // System.currentTimeMillis().
- setSubscriptionPlan(/* usageBytes= */ 1000L,
- System.currentTimeMillis() - DataUsageSummaryPreferenceController.WARNING_AGE
- - TimeUnit.HOURS.toMillis(1));
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getCarrierInfoTextStyle()).isEqualTo(
- R.style.DataUsageSummaryCarrierInfoWarningTextAppearance);
- }
-
- @Test
- public void refreshUi_hasUpdateTimeYoungerThanWarning_setsCarrierInfoStyle() {
- DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
- info.usageLevel = 10000;
- when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
-
- // Subtract an extra hour to account fo the difference in calls to
- // System.currentTimeMillis().
- setSubscriptionPlan(/* usageBytes= */ 1000L,
- System.currentTimeMillis() - DataUsageSummaryPreferenceController.WARNING_AGE
- + TimeUnit.HOURS.toMillis(1));
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mController.refreshUi();
-
- assertThat(mDataUsageSummaryPreference.getCarrierInfoTextStyle()).isEqualTo(
- R.style.DataUsageSummaryCarrierInfoTextAppearance);
- }
-
- private ShadowTelephonyManager getShadowTelephonyManager() {
- return (ShadowTelephonyManager) extract(
- mContext.getSystemService(TelephonyManager.class));
- }
-
- private ShadowSubscriptionManager getShadowSubscriptionManager() {
- return Shadow.extract(mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE));
- }
-
- private void setCarrierName(CharSequence name) {
- SubscriptionInfo subInfo = new SubscriptionInfo(/* id= */ 0, /* iccId= */ "",
- /* simSlotIndex= */ 0, /* displayName= */ "", name,
- /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
- /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
- /* countryIso= */ "", /* isEmbedded= */ false,
- /* accessRules= */ null, /* cardString= */ "");
- ShadowSubscriptionManager.setDefaultDataSubscriptionInfo(subInfo);
- }
-
- private void setSubscriptionPlan(long usageBytes, long snapshotMillis) {
- ZonedDateTime start = ZonedDateTime.now();
- ZonedDateTime end = ZonedDateTime.now().plusDays(30);
- SubscriptionPlan plan = new SubscriptionPlan.Builder(start, end, Period.ofMonths(1))
- .setDataLimit(/* dataLimitBytes= */ 5000000000L,
- SubscriptionPlan.LIMIT_BEHAVIOR_DISABLED)
- .setDataUsage(usageBytes, snapshotMillis)
- .build();
- getShadowSubscriptionManager().setSubscriptionPlans(Lists.newArrayList(plan));
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java
deleted file mode 100644
index 52a46cb..0000000
--- a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.content.Intent;
-import android.view.View;
-import android.widget.Button;
-import android.widget.TextView;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.car.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowApplication;
-
-@RunWith(RobolectricTestRunner.class)
-public class DataUsageSummaryPreferenceTest {
- private static final String TEST_LABEL = "TEST_LABEL";
- private static final Intent TEST_INTENT = new Intent("test_action");
-
- private Context mContext;
- private PreferenceViewHolder mViewHolder;
- private DataUsageSummaryPreference mDataUsageSummaryPreference;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- View rootView = View.inflate(mContext, R.layout.data_usage_summary_preference,
- /* root= */ null);
- mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
- mDataUsageSummaryPreference = new DataUsageSummaryPreference(mContext);
- }
-
- @Test
- public void onBindViewHolder_noDataUsageText_isGone() {
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(getDataUsageText().getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void onBindViewHolder_hasDataUsageText_isVisible() {
- mDataUsageSummaryPreference.setDataLimitText(TEST_LABEL);
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(getDataUsageText().getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void onBindViewHolder_hasDataUsageText_setsText() {
- mDataUsageSummaryPreference.setDataLimitText(TEST_LABEL);
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(mDataUsageSummaryPreference.getDataLimitText().toString()).isEqualTo(TEST_LABEL);
- }
-
- @Test
- public void onBindViewHolder_noRemainingBillingCycleText_isGone() {
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(getRemainingBillingCycleText().getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void onBindViewHolder_hasRemainingBillingCycleText_isVisible() {
- mDataUsageSummaryPreference.setRemainingBillingCycleText(TEST_LABEL);
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(getRemainingBillingCycleText().getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void onBindViewHolder_hasRemainingBillingCycleText_setsText() {
- mDataUsageSummaryPreference.setRemainingBillingCycleText(TEST_LABEL);
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(mDataUsageSummaryPreference.getRemainingBillingCycleText().toString()).isEqualTo(
- TEST_LABEL);
- }
-
- @Test
- public void onBindViewHolder_noCarrierInfoText_isGone() {
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(getCarrierInfoText().getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void onBindViewHolder_hasCarrierInfoText_isVisible() {
- mDataUsageSummaryPreference.setCarrierInfoText(TEST_LABEL);
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(getCarrierInfoText().getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void onBindViewHolder_hasCarrierInfoText_setsText() {
- mDataUsageSummaryPreference.setCarrierInfoText(TEST_LABEL);
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(mDataUsageSummaryPreference.getCarrierInfoText().toString()).isEqualTo(
- TEST_LABEL);
- }
-
- @Test
- public void onBindViewHolder_noManagePlanIntent_isGone() {
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(getManageSubscriptionButton().getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void onBindViewHolder_hasManagePlanIntent_isVisible() {
- mDataUsageSummaryPreference.setManageSubscriptionIntent(TEST_INTENT);
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
-
- assertThat(getManageSubscriptionButton().getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void onButtonClick_hasManagePlanIntent_startsActivity() {
- mDataUsageSummaryPreference.setManageSubscriptionIntent(TEST_INTENT);
- mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
- getManageSubscriptionButton().performClick();
-
- Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
- assertThat(actual.getAction()).isEqualTo(TEST_INTENT.getAction());
- }
-
- private TextView getDataUsageText() {
- return (TextView) mViewHolder.findViewById(R.id.data_limit_text);
- }
-
- private TextView getRemainingBillingCycleText() {
- return (TextView) mViewHolder.findViewById(R.id.remaining_billing_cycle_time_text);
- }
-
- private TextView getCarrierInfoText() {
- return (TextView) mViewHolder.findViewById(R.id.carrier_info_text);
- }
-
- private Button getManageSubscriptionButton() {
- return (Button) mViewHolder.findViewById(R.id.manage_subscription_button);
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java b/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java
deleted file mode 100644
index d2e6bee..0000000
--- a/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-
-import androidx.fragment.app.Fragment;
-
-import com.android.car.settings.R;
-import com.android.car.settings.testutils.FragmentController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.shadows.ShadowDialog;
-
-@RunWith(RobolectricTestRunner.class)
-public class UsageBytesThresholdPickerDialogTest {
-
- private Fragment mFragment;
- @Mock
- private UsageBytesThresholdPickerDialog.BytesThresholdPickedListener
- mBytesThresholdPickedListener;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mFragment = FragmentController.of(new Fragment()).setup();
- }
-
- @Test
- public void dialogInit_validValue_showsCurrentValue() {
- long twoGB = 2 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
- UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
- R.string.data_usage_limit_editor_title, twoGB);
- dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
- assertThat(dialog.getCurrentThreshold()).isEqualTo(twoGB);
- }
-
- @Test
- public void dialogInit_lowInvalidValue_showsLowestPossibleValue() {
- UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
- R.string.data_usage_limit_editor_title, -1);
- dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
- assertThat(dialog.getCurrentThreshold()).isEqualTo(0);
- }
-
- @Test
- public void positiveButtonClick_noChangeInValue_dialogListenerNotCalled() {
- long twoGB = 2 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
- UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
- R.string.data_usage_limit_editor_title, twoGB);
- dialog.setBytesThresholdPickedListener(mBytesThresholdPickedListener);
- dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
-
- AlertDialog alertDialog = (AlertDialog) ShadowDialog.getLatestDialog();
- alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
- verify(mBytesThresholdPickedListener, never()).onThresholdPicked(anyLong());
- }
-
- @Test
- public void positiveButtonClick_changeInValue_dialogListenerCalled() {
- long twoGB = 2 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
- UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
- R.string.data_usage_limit_editor_title, twoGB);
- dialog.setBytesThresholdPickedListener(mBytesThresholdPickedListener);
- dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
-
- long threeGB = 3 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
- dialog.setThresholdEditor(threeGB);
-
- AlertDialog alertDialog = (AlertDialog) ShadowDialog.getLatestDialog();
- alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
- verify(mBytesThresholdPickedListener).onThresholdPicked(threeGB);
- }
-
- @Test
- public void getCurrentThreshold_aboveLimit_returnLimit() {
- long limitGBTimesTwo = 2 * UsageBytesThresholdPickerDialog.MAX_DATA_LIMIT_BYTES;
- UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
- R.string.data_usage_limit_editor_title, limitGBTimesTwo);
- dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
-
- assertThat(dialog.getCurrentThreshold()).isEqualTo(
- UsageBytesThresholdPickerDialog.MAX_DATA_LIMIT_BYTES);
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java b/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java
deleted file mode 100644
index 7e6df95..0000000
--- a/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.car.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-
-import androidx.fragment.app.Fragment;
-
-import com.android.car.settings.testutils.FragmentController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.shadows.ShadowDialog;
-
-@RunWith(RobolectricTestRunner.class)
-public class UsageCycleResetDayOfMonthPickerDialogTest {
-
- private Fragment mFragment;
- @Mock
- private UsageCycleResetDayOfMonthPickerDialog.ResetDayOfMonthPickedListener
- mResetDayOfMonthPickedListener;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mFragment = FragmentController.of(new Fragment()).setup();
- }
-
- @Test
- public void dialogInit_validValue_showsCurrentValue() {
- int setDate = 15;
- UsageCycleResetDayOfMonthPickerDialog dialog =
- UsageCycleResetDayOfMonthPickerDialog.newInstance(setDate);
- dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
- assertThat(dialog.getSelectedDayOfMonth()).isEqualTo(setDate);
- }
-
- @Test
- public void dialogInit_lowInvalidValue_showsLowestPossibleValue() {
- UsageCycleResetDayOfMonthPickerDialog dialog =
- UsageCycleResetDayOfMonthPickerDialog.newInstance(0);
- dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
- assertThat(dialog.getSelectedDayOfMonth()).isEqualTo(1);
- }
-
- @Test
- public void dialogInit_highInvalidValue_showsHighestPossibleValue() {
- UsageCycleResetDayOfMonthPickerDialog dialog =
- UsageCycleResetDayOfMonthPickerDialog.newInstance(32);
- dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
- assertThat(dialog.getSelectedDayOfMonth()).isEqualTo(31);
- }
-
- @Test
- public void dialogListenerCalled() {
- int setDate = 15;
- UsageCycleResetDayOfMonthPickerDialog dialog =
- UsageCycleResetDayOfMonthPickerDialog.newInstance(setDate);
- dialog.setResetDayOfMonthPickedListener(mResetDayOfMonthPickedListener);
- dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
-
- AlertDialog alertDialog = (AlertDialog) ShadowDialog.getLatestDialog();
- alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
- verify(mResetDayOfMonthPickedListener).onDayOfMonthPicked(setDate);
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java
deleted file mode 100644
index a988343..0000000
--- a/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.language;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.Context;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
-
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowLocalePicker;
-import com.android.car.settings.testutils.ShadowLocaleStore;
-import com.android.internal.app.LocaleStore;
-import com.android.internal.app.SuggestedLocaleAdapter;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.Locale;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowLocalePicker.class, ShadowLocaleStore.class})
-public class LanguageBasePreferenceControllerTest {
-
- private static final LocaleStore.LocaleInfo TEST_LOCALE_INFO = LocaleStore.getLocaleInfo(
- Locale.FRENCH);
- private static final Locale HAS_MULTIPLE_CHILD_LOCALE = Locale.ENGLISH;
- private static final Locale HAS_CHILD_LOCALE = Locale.KOREAN;
- private static final Locale NO_CHILD_LOCALE = Locale.FRANCE;
-
- private static class TestLanguageBasePreferenceController extends
- LanguageBasePreferenceController {
-
- private SuggestedLocaleAdapter mAdapter;
-
- TestLanguageBasePreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
- super(context, preferenceKey, fragmentController, uxRestrictions);
- }
-
- public void setAdapter(SuggestedLocaleAdapter adapter) {
- mAdapter = adapter;
- }
-
- @Override
- protected LocalePreferenceProvider defineLocaleProvider() {
- return new LocalePreferenceProvider(getContext(), mAdapter);
- }
- }
-
- private TestLanguageBasePreferenceController mController;
- private Context mContext;
- private PreferenceGroup mPreferenceGroup;
- private FragmentController mFragmentController;
- @Mock
- private SuggestedLocaleAdapter mSuggestedLocaleAdapter;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mPreferenceGroup = new LogicalPreferenceGroup(mContext);
- PreferenceControllerTestHelper<TestLanguageBasePreferenceController>
- preferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- TestLanguageBasePreferenceController.class, mPreferenceGroup);
- mController = preferenceControllerHelper.getController();
- mController.setAdapter(mSuggestedLocaleAdapter);
- mFragmentController = preferenceControllerHelper.getMockFragmentController();
- preferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- // Note that ENGLISH has 2 child locales.
- ShadowLocaleStore.addLocaleRelationship(Locale.ENGLISH, Locale.CANADA);
- ShadowLocaleStore.addLocaleRelationship(Locale.ENGLISH, Locale.US);
-
- // Note that KOREAN has 1 child locale.
- ShadowLocaleStore.addLocaleRelationship(Locale.KOREAN, Locale.KOREA);
- }
-
- @After
- public void tearDown() {
- ShadowLocaleStore.reset();
- ShadowLocalePicker.reset();
- }
-
- @Test
- public void testRefreshUi_groupConstructed() {
- when(mSuggestedLocaleAdapter.getCount()).thenReturn(1);
- when(mSuggestedLocaleAdapter.getItemViewType(0)).thenReturn(
- LocalePreferenceProvider.TYPE_LOCALE);
- when(mSuggestedLocaleAdapter.getItem(0)).thenReturn(TEST_LOCALE_INFO);
- mController.refreshUi();
- assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
- }
-
- @Test
- public void testOnPreferenceClick_noLocale_returnsFalse() {
- assertThat(mController.onPreferenceClick(new Preference(mContext))).isFalse();
- }
-
- @Test
- public void testOnPreferenceClick_hasMultipleChildLocales_returnsTrue() {
- LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_MULTIPLE_CHILD_LOCALE);
- Preference preference = new Preference(mContext);
- LocaleUtil.setLocaleArgument(preference, localeInfo);
- assertThat(mController.onPreferenceClick(preference)).isTrue();
- }
-
- @Test
- public void testOnPreferenceClick_hasMultipleChildLocales_localeNotUpdated() {
- LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_MULTIPLE_CHILD_LOCALE);
- Preference preference = new Preference(mContext);
- LocaleUtil.setLocaleArgument(preference, localeInfo);
- mController.onPreferenceClick(preference);
- assertThat(ShadowLocalePicker.localeWasUpdated()).isFalse();
- }
-
- @Test
- public void testOnPreferenceClick_hasMultipleChildLocales_neverCallsGoBack() {
- LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_MULTIPLE_CHILD_LOCALE);
- Preference preference = new Preference(mContext);
- LocaleUtil.setLocaleArgument(preference, localeInfo);
- mController.onPreferenceClick(preference);
- verify(mFragmentController, never()).goBack();
- }
-
- @Test
- public void testOnPreferenceClick_hasSingleChildLocale_returnsTrue() {
- LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_CHILD_LOCALE);
- Preference preference = new Preference(mContext);
- LocaleUtil.setLocaleArgument(preference, localeInfo);
- assertThat(mController.onPreferenceClick(preference)).isTrue();
- }
-
- @Test
- public void testOnPreferenceClick_hasSingleChildLocale_localeUpdated() {
- LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_CHILD_LOCALE);
- Preference preference = new Preference(mContext);
- LocaleUtil.setLocaleArgument(preference, localeInfo);
- mController.onPreferenceClick(preference);
- assertThat(ShadowLocalePicker.localeWasUpdated()).isTrue();
- }
-
- @Test
- public void testOnPreferenceClick_hasSingleChildLocale_callsGoBack() {
- LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_CHILD_LOCALE);
- Preference preference = new Preference(mContext);
- LocaleUtil.setLocaleArgument(preference, localeInfo);
- mController.onPreferenceClick(preference);
- verify(mFragmentController).goBack();
- }
-
- @Test
- public void testOnPreferenceClick_noChildLocale_returnsTrue() {
- LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(NO_CHILD_LOCALE);
- Preference preference = new Preference(mContext);
- LocaleUtil.setLocaleArgument(preference, localeInfo);
- assertThat(mController.onPreferenceClick(preference)).isTrue();
- }
-
- @Test
- public void testOnPreferenceClick_noChildLocale_localeUpdated() {
- LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(NO_CHILD_LOCALE);
- Preference preference = new Preference(mContext);
- LocaleUtil.setLocaleArgument(preference, localeInfo);
- mController.onPreferenceClick(preference);
- assertThat(ShadowLocalePicker.localeWasUpdated()).isTrue();
- }
-
- @Test
- public void testOnPreferenceClick_noChildLocale_callsGoBack() {
- LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(NO_CHILD_LOCALE);
- Preference preference = new Preference(mContext);
- LocaleUtil.setLocaleArgument(preference, localeInfo);
- mController.onPreferenceClick(preference);
- verify(mFragmentController).goBack();
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java
deleted file mode 100644
index 42507d5..0000000
--- a/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * 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.car.settings.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.provider.Settings;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.SwitchPreference;
-import androidx.preference.TwoStatePreference;
-
-import com.android.car.settings.common.ConfirmationDialogFragment;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.BaseTestActivity;
-import com.android.car.settings.testutils.ShadowSubscriptionManager;
-import com.android.car.settings.testutils.ShadowTelephonyManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowContentResolver;
-import org.robolectric.shadows.ShadowDialog;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowTelephonyManager.class, ShadowSubscriptionManager.class})
-public class MobileDataTogglePreferenceControllerTest {
-
- private static final int SUB_ID = 1;
-
- private Context mContext;
- private TwoStatePreference mPreference;
- private PreferenceControllerTestHelper<MobileDataTogglePreferenceController>
- mControllerHelper;
- private MobileDataTogglePreferenceController mController;
- private TelephonyManager mTelephonyManager;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- MobileDataTogglePreferenceController.class);
- mController = mControllerHelper.getController();
- mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
- mTelephonyManager.setDataEnabled(false);
-
- getShadowTelephonyManager().setTelephonyManagerForSubscriptionId(SUB_ID, mTelephonyManager);
- mController.setSubId(SUB_ID);
-
- mPreference = new SwitchPreference(mContext);
- mControllerHelper.setPreference(mPreference);
-
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- }
-
- @After
- public void tearDown() {
- ShadowTelephonyManager.reset();
- ShadowSubscriptionManager.reset();
- }
-
- @Test
- public void onStart_singleSim_registersObserver() {
- ShadowTelephonyManager.setSimCount(1);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Global.getUriFor(Settings.Global.MOBILE_DATA))).isNotEmpty();
- }
-
- @Test
- public void onStart_multiSim_registersObserver() {
- ShadowTelephonyManager.setSimCount(2);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + SUB_ID))).isNotEmpty();
- }
-
- @Test
- public void onStop_singleSim_unregistersObserver() {
- ShadowTelephonyManager.setSimCount(1);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Global.getUriFor(Settings.Global.MOBILE_DATA))).isEmpty();
- }
-
- @Test
- public void refreshUi_isOpportunistic_isDisabled() {
- getShadowSubscriptionManager().setActiveSubscriptionInfos(
- createSubscriptionInfo(SUB_ID, /* isOpportunistic= */ true));
- mController.refreshUi();
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void refreshUi_isNotOpportunistic_isEnabled() {
- getShadowSubscriptionManager().setActiveSubscriptionInfos(
- createSubscriptionInfo(SUB_ID, /* isOpportunistic= */ false));
- mController.refreshUi();
-
- assertThat(mPreference.isEnabled()).isTrue();
- }
-
- @Test
- public void refreshUi_dataEnabled_setChecked() {
- mTelephonyManager.setDataEnabled(true);
- mController.refreshUi();
-
- assertThat(mPreference.isChecked()).isTrue();
- }
-
- @Test
- public void refreshUi_dataDisabled_setUnchecked() {
- mTelephonyManager.setDataEnabled(false);
- mController.refreshUi();
-
- assertThat(mPreference.isChecked()).isFalse();
- }
-
- @Test
- public void handlePreferenceChanged_setFalse_isSingleSim_opensDialog() {
- ShadowTelephonyManager.setSimCount(1);
- mPreference.callChangeListener(false);
-
- verify(mControllerHelper.getMockFragmentController()).showDialog(
- any(ConfirmationDialogFragment.class),
- eq(MobileDataTogglePreferenceController.DISABLE_DIALOG_TAG));
- }
-
- @Test
- public void handlePreferenceChanged_setFalse_isMultiSim_disablesData() {
- mPreference.setChecked(true);
- mTelephonyManager.setDataEnabled(true);
- ShadowTelephonyManager.setSimCount(2);
- mPreference.callChangeListener(false);
-
- assertThat(mTelephonyManager.isDataEnabled()).isFalse();
- }
-
- @Test
- public void handlePreferenceChanged_setFalse_isMultiSim_setsUnchecked() {
- mPreference.setChecked(true);
- mTelephonyManager.setDataEnabled(true);
- ShadowTelephonyManager.setSimCount(2);
- mPreference.callChangeListener(false);
-
- assertThat(mPreference.isChecked()).isFalse();
- }
-
- @Test
- public void handlePreferenceChanged_setTrue_isSingleSim_enablesData() {
- mPreference.setChecked(false);
- mTelephonyManager.setDataEnabled(false);
- ShadowTelephonyManager.setSimCount(1);
- mPreference.callChangeListener(true);
-
- assertThat(mTelephonyManager.isDataEnabled()).isTrue();
- }
-
- @Test
- public void handlePreferenceChanged_setTrue_isSingleSim_setsChecked() {
- mPreference.setChecked(false);
- mTelephonyManager.setDataEnabled(false);
- ShadowTelephonyManager.setSimCount(1);
- mPreference.callChangeListener(true);
-
- assertThat(mPreference.isChecked()).isTrue();
- }
-
- @Test
- public void handlePreferenceChanged_setTrue_isMultiSim_noOtherSimActive_enablesData() {
- mPreference.setChecked(false);
- mTelephonyManager.setDataEnabled(false);
- ShadowTelephonyManager.setSimCount(2);
- ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID);
- getShadowSubscriptionManager().setCurrentActiveSubscriptionId(SUB_ID);
- mPreference.callChangeListener(true);
-
- assertThat(mTelephonyManager.isDataEnabled()).isTrue();
- }
-
- @Test
- public void handlePreferenceChanged_setTrue_isMultiSim_noOtherSimActive_setsChecked() {
- mPreference.setChecked(false);
- mTelephonyManager.setDataEnabled(false);
- ShadowTelephonyManager.setSimCount(2);
- ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID);
- getShadowSubscriptionManager().setCurrentActiveSubscriptionId(SUB_ID);
- mPreference.callChangeListener(true);
-
- assertThat(mPreference.isChecked()).isTrue();
- }
-
- @Test
- public void handlePreferenceChanged_setTrue_isMultiSim_otherSimActive_opensDialog() {
- int otherSubId = SUB_ID + 1;
- mPreference.setChecked(false);
- mTelephonyManager.setDataEnabled(false);
- ShadowTelephonyManager.setSimCount(2);
- ShadowSubscriptionManager.setDefaultDataSubscriptionId(otherSubId);
- getShadowSubscriptionManager().setCurrentActiveSubscriptionId(otherSubId);
- mPreference.callChangeListener(true);
-
- verify(mControllerHelper.getMockFragmentController()).showDialog(
- any(ConfirmationDialogFragment.class),
- eq(MobileDataTogglePreferenceController.ENABLE_MULTISIM_DIALOG_TAG));
- }
-
- @Test
- public void disableSingleSimDialog_onConfirm_disablesData() {
- mPreference.setChecked(true);
- mTelephonyManager.setDataEnabled(true);
- ShadowTelephonyManager.setSimCount(1);
- mPreference.callChangeListener(false);
-
- ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
- ConfirmationDialogFragment.class);
- verify(mControllerHelper.getMockFragmentController()).showDialog(
- dialogCaptor.capture(),
- eq(MobileDataTogglePreferenceController.DISABLE_DIALOG_TAG));
-
- ConfirmationDialogFragment dialog = dialogCaptor.getValue();
- assertThat(dialogCaptor).isNotNull();
- AlertDialog alertDialog = showDialog(dialog);
- alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
- assertThat(mTelephonyManager.isDataEnabled()).isFalse();
- }
-
- @Test
- public void disableSingleSimDialog_onConfirm_setsUnchecked() {
- mPreference.setChecked(true);
- mTelephonyManager.setDataEnabled(true);
- ShadowTelephonyManager.setSimCount(1);
- mPreference.callChangeListener(false);
-
- ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
- ConfirmationDialogFragment.class);
- verify(mControllerHelper.getMockFragmentController()).showDialog(
- dialogCaptor.capture(),
- eq(MobileDataTogglePreferenceController.DISABLE_DIALOG_TAG));
-
- ConfirmationDialogFragment dialog = dialogCaptor.getValue();
- assertThat(dialogCaptor).isNotNull();
- AlertDialog alertDialog = showDialog(dialog);
- alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
- assertThat(mPreference.isChecked()).isFalse();
- }
-
- @Test
- public void enableMutliSimDialog_onConfirm_enablesData() {
- int otherSubId = SUB_ID + 1;
- mPreference.setChecked(false);
- mTelephonyManager.setDataEnabled(false);
- ShadowTelephonyManager.setSimCount(2);
- ShadowSubscriptionManager.setDefaultDataSubscriptionId(otherSubId);
- getShadowSubscriptionManager().setCurrentActiveSubscriptionId(otherSubId);
- mPreference.callChangeListener(true);
-
- ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
- ConfirmationDialogFragment.class);
- verify(mControllerHelper.getMockFragmentController()).showDialog(
- dialogCaptor.capture(),
- eq(MobileDataTogglePreferenceController.ENABLE_MULTISIM_DIALOG_TAG));
-
- ConfirmationDialogFragment dialog = dialogCaptor.getValue();
- assertThat(dialogCaptor).isNotNull();
- AlertDialog alertDialog = showDialog(dialog);
- alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
- assertThat(mTelephonyManager.isDataEnabled()).isTrue();
- }
-
- @Test
- public void enableMutliSimDialog_onConfirm_setsChecked() {
- int otherSubId = SUB_ID + 1;
- mPreference.setChecked(false);
- mTelephonyManager.setDataEnabled(false);
- ShadowTelephonyManager.setSimCount(2);
- ShadowSubscriptionManager.setDefaultDataSubscriptionId(otherSubId);
- getShadowSubscriptionManager().setCurrentActiveSubscriptionId(otherSubId);
- mPreference.callChangeListener(true);
-
- ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
- ConfirmationDialogFragment.class);
- verify(mControllerHelper.getMockFragmentController()).showDialog(
- dialogCaptor.capture(),
- eq(MobileDataTogglePreferenceController.ENABLE_MULTISIM_DIALOG_TAG));
-
- ConfirmationDialogFragment dialog = dialogCaptor.getValue();
- assertThat(dialogCaptor).isNotNull();
- AlertDialog alertDialog = showDialog(dialog);
- alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
- assertThat(mPreference.isChecked()).isTrue();
- }
-
- private ShadowTelephonyManager getShadowTelephonyManager() {
- return (ShadowTelephonyManager) Shadows.shadowOf(mTelephonyManager);
- }
-
- private ShadowContentResolver getShadowContentResolver() {
- return (ShadowContentResolver) Shadows.shadowOf(mContext.getContentResolver());
- }
-
- private ShadowSubscriptionManager getShadowSubscriptionManager() {
- return Shadow.extract(mContext.getSystemService(SubscriptionManager.class));
- }
-
- private SubscriptionInfo createSubscriptionInfo(int subId, boolean isOpportunistic) {
- SubscriptionInfo subInfo = new SubscriptionInfo(subId, /* iccId= */ "",
- /* simSlotIndex= */ 0, /* displayName= */ "", /* carrierName= */ "",
- /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
- /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
- /* countryIso= */ "", /* isEmbedded= */ false,
- /* accessRules= */ null, /* cardString= */ "", isOpportunistic,
- /* groupUUID= */ null, /* carrierId= */ 0, /* profileClass= */ 0);
- return subInfo;
- }
-
- private AlertDialog showDialog(ConfirmationDialogFragment dialog) {
- BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
- dialog.show(activity.getSupportFragmentManager(), /* tag= */ null);
- return (AlertDialog) ShadowDialog.getLatestDialog();
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java
deleted file mode 100644
index 02fe695..0000000
--- a/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * 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.car.settings.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-
-import com.android.car.settings.testutils.BaseTestActivity;
-import com.android.car.settings.testutils.ShadowSubscriptionManager;
-import com.android.internal.telephony.TelephonyIntents;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.android.controller.ActivityController;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowApplication;
-
-import java.util.Collections;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowSubscriptionManager.class})
-public class MobileNetworkUpdateManagerTest {
-
- private static final int SUB_ID = 1;
-
- private Context mContext;
- private ActivityController<BaseTestActivity> mActivityController;
- private BaseTestActivity mActivity;
- private MobileNetworkUpdateManager mMobileNetworkUpdateManager;
-
- @Mock
- private MobileNetworkUpdateManager.MobileNetworkUpdateListener mMobileNetworkUpdateListener;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mActivity = new BaseTestActivity();
- mActivityController = ActivityController.of(mActivity);
- }
-
- @Test
- public void onStart_receiverRegistered() {
- setupMobileNetworkUpdateManager(SUB_ID);
- mActivityController.create().start().visible();
-
- assertThat(ShadowApplication.getInstance().getRegisteredReceivers().size()).isGreaterThan(
- 0);
-
- boolean hasMatch = false;
- for (ShadowApplication.Wrapper wrapper :
- ShadowApplication.getInstance().getRegisteredReceivers()) {
- if (wrapper.getIntentFilter().matchAction(
- TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED)) {
- hasMatch = true;
- }
- }
- assertThat(hasMatch).isTrue();
- }
-
- @Test
- public void onStop_receiverUnregistered() {
- setupMobileNetworkUpdateManager(SUB_ID);
- mActivityController.create().start().visible();
- int prevSize = ShadowApplication.getInstance().getRegisteredReceivers().size();
-
- mActivityController.stop();
- assertThat(ShadowApplication.getInstance().getRegisteredReceivers().size()).isLessThan(
- prevSize);
-
- boolean hasMatch = false;
- for (ShadowApplication.Wrapper wrapper :
- ShadowApplication.getInstance().getRegisteredReceivers()) {
- if (wrapper.getIntentFilter().matchAction(
- TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED)) {
- hasMatch = true;
- }
- }
- assertThat(hasMatch).isFalse();
- }
-
- @Test
- public void onStart_subscriptionListenerRegistered() {
- setupMobileNetworkUpdateManager(SUB_ID);
- assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
- mActivityController.create().start().visible();
-
- assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isNotEmpty();
- }
-
- @Test
- public void onStop_subscriptionListenerUnregistered() {
- setupMobileNetworkUpdateManager(SUB_ID);
- assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
- mActivityController.create().start().visible();
- assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isNotEmpty();
- mActivityController.stop();
-
- assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
- }
-
- @Test
- public void onMobileNetworkUpdated_withInitialSubId_pickSubId() {
- setupMobileNetworkUpdateManager(SUB_ID);
- getShadowSubscriptionManager().setActiveSubscriptionInfos(
- createSubscriptionInfo(SUB_ID + 1), createSubscriptionInfo(SUB_ID + 2));
- mActivityController.setup();
-
- verify(mMobileNetworkUpdateListener).onMobileNetworkUpdated(SUB_ID);
- }
-
- @Test
- public void onMobileNetworkUpdated_withoutInitialSubId_pickDefaultSubId() {
- setupMobileNetworkUpdateManager(MobileNetworkUpdateManager.SUB_ID_NULL);
- getShadowSubscriptionManager().setActiveSubscriptionInfos(
- createSubscriptionInfo(SUB_ID + 1), createSubscriptionInfo(SUB_ID + 2));
- mActivityController.setup();
-
- verify(mMobileNetworkUpdateListener).onMobileNetworkUpdated(SUB_ID + 1);
- }
-
- private void setupMobileNetworkUpdateManager(int subId) {
- mMobileNetworkUpdateManager = new MobileNetworkUpdateManager(mContext, subId);
- mActivity.getLifecycle().addObserver(mMobileNetworkUpdateManager);
- mMobileNetworkUpdateManager.registerListener(mMobileNetworkUpdateListener);
-
- getShadowSubscriptionManager().setSelectableSubscriptionInfoList(
- Collections.singletonList(createSubscriptionInfo(subId)));
- }
-
- private ShadowSubscriptionManager getShadowSubscriptionManager() {
- return Shadow.extract(mContext.getSystemService(SubscriptionManager.class));
- }
-
- private SubscriptionInfo createSubscriptionInfo(int subId) {
- SubscriptionInfo subInfo = new SubscriptionInfo(/* id= */ subId, /* iccId= */ "",
- /* simSlotIndex= */ 0, /* displayName= */ "", /* carrierName= */ "",
- /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
- /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
- /* countryIso= */ "", /* isEmbedded= */ false,
- /* accessRules= */ null, /* cardString= */ "");
- return subInfo;
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java
deleted file mode 100644
index 4117b72..0000000
--- a/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * 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.car.settings.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.PersistableBundle;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.preference.SwitchPreference;
-import androidx.preference.TwoStatePreference;
-
-import com.android.car.settings.common.ConfirmationDialogFragment;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.BaseTestActivity;
-import com.android.car.settings.testutils.ShadowCarrierConfigManager;
-import com.android.car.settings.testutils.ShadowTelephonyManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowContentResolver;
-import org.robolectric.shadows.ShadowDialog;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowTelephonyManager.class, ShadowCarrierConfigManager.class})
-public class RoamingPreferenceControllerTest {
-
- private static final int SUB_ID = 1;
-
- private Context mContext;
- private TwoStatePreference mPreference;
- private PreferenceControllerTestHelper<RoamingPreferenceController> mControllerHelper;
- private RoamingPreferenceController mController;
- private TelephonyManager mTelephonyManager;
- private CarrierConfigManager mCarrierConfigManager;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- RoamingPreferenceController.class);
- mController = mControllerHelper.getController();
- mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
- mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
- getShadowTelephonyManager().setTelephonyManagerForSubscriptionId(SUB_ID, mTelephonyManager);
- mController.setSubId(SUB_ID);
-
- mPreference = new SwitchPreference(mContext);
- mControllerHelper.setPreference(mPreference);
- }
-
- @After
- public void tearDown() {
- ShadowTelephonyManager.reset();
- }
-
- @Test
- public void onStart_registerObserver() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Global.getUriFor(Settings.Global.DATA_ROAMING))).isNotEmpty();
- }
-
- @Test
- public void onStart_registerObserver_additionalSubId() {
- ShadowTelephonyManager.setSimCount(2);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Global.getUriFor(Settings.Global.DATA_ROAMING + SUB_ID))).isNotEmpty();
- }
-
- @Test
- public void onStop_unregisterObserver() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
-
- assertThat(getShadowContentResolver().getContentObservers(
- Settings.Global.getUriFor(Settings.Global.DATA_ROAMING))).isEmpty();
- }
-
- @Test
- public void refreshUi_invalidSubId_isDisabled() {
- getShadowTelephonyManager().setTelephonyManagerForSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID, mTelephonyManager);
- mController.setSubId(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- mController.refreshUi();
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void refreshUi_validSubId_isEnabled() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- mController.refreshUi();
-
- assertThat(mPreference.isEnabled()).isTrue();
- }
-
- @Test
- public void refreshUi_roamingEnabled_setChecked() {
- mTelephonyManager.setDataRoamingEnabled(true);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- mController.refreshUi();
-
- assertThat(mPreference.isChecked()).isTrue();
- }
-
- @Test
- public void refreshUi_roamingDisabled_setUnchecked() {
- mTelephonyManager.setDataRoamingEnabled(false);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
- mController.refreshUi();
-
- assertThat(mPreference.isChecked()).isFalse();
- }
-
- @Test
- public void callChangeListener_toggleFalse_turnOffRoaming() {
- mPreference.setChecked(true);
- mTelephonyManager.setDataRoamingEnabled(true);
-
- mPreference.callChangeListener(false);
-
- assertThat(mTelephonyManager.isDataRoamingEnabled()).isFalse();
- }
-
- @Test
- public void callChangeListener_toggleTrue_needsDialog_showDialog() {
- mPreference.setChecked(false);
- mTelephonyManager.setDataRoamingEnabled(false);
- PersistableBundle bundle = new PersistableBundle();
- bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
- getShadowCarrierConfigManager().setConfigForSubId(SUB_ID, bundle);
-
- mPreference.callChangeListener(true);
-
- verify(mControllerHelper.getMockFragmentController()).showDialog(
- any(ConfirmationDialogFragment.class), eq(ConfirmationDialogFragment.TAG));
- }
-
- @Test
- public void confirmDialog_turnOnRoaming() {
- mPreference.setChecked(false);
- mTelephonyManager.setDataRoamingEnabled(false);
- PersistableBundle bundle = new PersistableBundle();
- bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
- getShadowCarrierConfigManager().setConfigForSubId(SUB_ID, bundle);
-
- mPreference.callChangeListener(true);
-
- // Capture the dialog that is shown on toggle.
- ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
- ConfirmationDialogFragment.class);
- verify(mControllerHelper.getMockFragmentController()).showDialog(
- dialogCaptor.capture(), eq(ConfirmationDialogFragment.TAG));
-
- // Show the captured dialog on press the confirmation button.
- ConfirmationDialogFragment dialog = dialogCaptor.getValue();
- assertThat(dialogCaptor).isNotNull();
- AlertDialog alertDialog = showDialog(dialog);
- alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
- assertThat(mTelephonyManager.isDataRoamingEnabled()).isTrue();
- }
-
- @Test
- public void callChangeListener_toggleTrue_doesntNeedDialog_turnOnRoaming() {
- mPreference.setChecked(false);
- mTelephonyManager.setDataRoamingEnabled(false);
- PersistableBundle bundle = new PersistableBundle();
- bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, true);
- getShadowCarrierConfigManager().setConfigForSubId(SUB_ID, bundle);
-
- mPreference.callChangeListener(true);
-
- assertThat(mTelephonyManager.isDataRoamingEnabled()).isTrue();
- }
-
- private ShadowContentResolver getShadowContentResolver() {
- return (ShadowContentResolver) Shadows.shadowOf(mContext.getContentResolver());
- }
-
- private ShadowTelephonyManager getShadowTelephonyManager() {
- return (ShadowTelephonyManager) Shadows.shadowOf(mTelephonyManager);
- }
-
- private ShadowCarrierConfigManager getShadowCarrierConfigManager() {
- return (ShadowCarrierConfigManager) Shadow.extract(mCarrierConfigManager);
- }
-
- private AlertDialog showDialog(ConfirmationDialogFragment dialog) {
- BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
- dialog.show(activity.getSupportFragmentManager(), /* tag= */ null);
- return (AlertDialog) ShadowDialog.getLatestDialog();
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java b/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java
deleted file mode 100644
index 2baef00..0000000
--- a/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.car.settings.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.Intent;
-import android.telephony.SubscriptionManager;
-
-import com.android.car.settings.testutils.ShadowSubscriptionManager;
-import com.android.internal.telephony.TelephonyIntents;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowApplication;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowSubscriptionManager.class})
-public class SubscriptionsChangeListenerTest {
-
- private Context mContext;
- private SubscriptionsChangeListener mSubscriptionsChangeListener;
- @Mock
- private SubscriptionsChangeListener.SubscriptionsChangeAction mSubscriptionsChangeAction;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mSubscriptionsChangeListener = new SubscriptionsChangeListener(mContext,
- mSubscriptionsChangeAction);
- }
-
- @After
- public void tearDown() {
- ShadowSubscriptionManager.reset();
- }
-
- @Test
- public void start_registersListener() {
- assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
- mSubscriptionsChangeListener.start();
- assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isNotEmpty();
- }
-
- @Test
- public void onSubscriptionChange_triggersAction() {
- mSubscriptionsChangeListener.start();
- // This is a way to trigger subscription change on the shadows.
- getShadowSubscriptionManager().setActiveSubscriptionInfoList(null);
-
- verify(mSubscriptionsChangeAction).onSubscriptionsChanged();
- }
-
- @Test
- public void stop_unregistersListener() {
- mSubscriptionsChangeListener.start();
- mSubscriptionsChangeListener.stop();
- assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
- }
-
- @Test
- public void start_registersReceiver() {
- mSubscriptionsChangeListener.start();
-
- boolean hasMatch = false;
- for (ShadowApplication.Wrapper wrapper :
- ShadowApplication.getInstance().getRegisteredReceivers()) {
- if (wrapper.getIntentFilter().matchAction(
- TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED)) {
- hasMatch = true;
- }
- }
- assertThat(hasMatch).isTrue();
- }
-
- @Test
- public void onReceive_triggersAction() {
- mSubscriptionsChangeListener.start();
- mContext.sendBroadcast(new Intent(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED));
-
- verify(mSubscriptionsChangeAction).onSubscriptionsChanged();
- }
-
- @Test
- public void stop_unregistersReceiver() {
- mSubscriptionsChangeListener.start();
- mSubscriptionsChangeListener.stop();
-
- boolean hasMatch = false;
- for (ShadowApplication.Wrapper wrapper :
- ShadowApplication.getInstance().getRegisteredReceivers()) {
- if (wrapper.getIntentFilter().matchAction(
- TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED)) {
- hasMatch = true;
- }
- }
- assertThat(hasMatch).isFalse();
- }
-
- private ShadowSubscriptionManager getShadowSubscriptionManager() {
- return Shadow.extract(mContext.getSystemService(SubscriptionManager.class));
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java
deleted file mode 100644
index c4351b7..0000000
--- a/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * 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.car.settings.storage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.when;
-
-import android.app.usage.StorageStats;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.UserInfo;
-import android.net.TrafficStats;
-import android.os.UserHandle;
-import android.util.SparseArray;
-
-import com.android.car.settings.profiles.ProfileHelper;
-import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-import com.android.car.settings.testutils.ShadowUserHelper;
-import com.android.settingslib.applications.StorageStatsSource;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** Unit test for {@link StorageAsyncLoader}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class, ShadowUserHelper.class})
-public class StorageAsyncLoaderTest {
- private static final int PRIMARY_USER_ID = 0;
- private static final int SECONDARY_USER_ID = 10;
- private static final String PACKAGE_NAME_1 = "com.blah.test";
- private static final String PACKAGE_NAME_2 = "com.blah.test2";
- private static final String DEFAULT_PACKAGE_NAME = "com.android.car.settings";
- private static final long DEFAULT_QUOTA = 64 * TrafficStats.MB_IN_BYTES;
-
- @Mock
- private StorageStatsSource mSource;
- @Mock
- private ProfileHelper mProfileHelper;
-
- private Context mContext;
- private List<ApplicationInfo> mInfo = new ArrayList<>();
- private List<UserInfo> mUsers;
-
- private StorageAsyncLoader mLoader;
-
- @Before
- public void setUp() throws Exception {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mInfo = new ArrayList<>();
- mLoader = new StorageAsyncLoader(mContext, mSource);
- UserInfo info = new UserInfo();
- mUsers = new ArrayList<>();
- mUsers.add(info);
- ShadowUserHelper.setInstance(mProfileHelper);
- when(mProfileHelper.getAllProfiles()).thenReturn(mUsers);
- when(mSource.getCacheQuotaBytes(any(), anyInt())).thenReturn(DEFAULT_QUOTA);
- // there is always a "com.android.car.settings" package added by default with category
- // otherAppsSize lets remove it first for testing.
- getShadowApplicationManager().removePackage(DEFAULT_PACKAGE_NAME);
- }
-
- @After
- public void tearDown() {
- ShadowApplicationPackageManager.reset();
- }
-
- @Test
- public void testLoadingApps() throws Exception {
- addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
- addPackage(PACKAGE_NAME_2, 0, 100, 1000, ApplicationInfo.CATEGORY_UNDEFINED);
-
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- assertThat(result.size()).isEqualTo(1);
- assertThat(result.get(PRIMARY_USER_ID).getGamesSize()).isEqualTo(0L);
- assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(2200L);
- }
-
- @Test
- public void testGamesAreFiltered() throws Exception {
- addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_GAME);
-
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- assertThat(result.size()).isEqualTo(1);
- assertThat(result.get(PRIMARY_USER_ID).getGamesSize()).isEqualTo(11L);
- assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(0L);
- }
-
- @Test
- public void testLegacyGamesAreFiltered() throws Exception {
- ApplicationInfo info =
- addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
- info.flags = ApplicationInfo.FLAG_IS_GAME;
-
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- assertThat(result.size()).isEqualTo(1);
- assertThat(result.get(PRIMARY_USER_ID).getGamesSize()).isEqualTo(11L);
- assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(0L);
- }
-
- @Test
- public void testCacheIsNotIgnored() throws Exception {
- addPackage(PACKAGE_NAME_1, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
-
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- assertThat(result.size()).isEqualTo(1);
- assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(111L);
- }
-
- @Test
- public void testMultipleUsers() throws Exception {
- UserInfo info = new UserInfo();
- info.id = SECONDARY_USER_ID;
- mUsers.add(info);
- when(mSource.getExternalStorageStats(any(), eq(UserHandle.SYSTEM)))
- .thenReturn(new StorageStatsSource.ExternalStorageStats(9, 2, 3, 4, 0));
- when(mSource.getExternalStorageStats(any(), eq(new UserHandle(SECONDARY_USER_ID))))
- .thenReturn(new StorageStatsSource.ExternalStorageStats(10, 3, 3, 4, 0));
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- assertThat(result.size()).isEqualTo(2);
- assertThat(result.get(PRIMARY_USER_ID).getExternalStats().totalBytes).isEqualTo(9L);
- assertThat(result.get(SECONDARY_USER_ID).getExternalStats().totalBytes).isEqualTo(10L);
- }
-
- @Test
- public void testUpdatedSystemAppCodeSizeIsCounted() throws Exception {
- ApplicationInfo systemApp =
- addPackage(PACKAGE_NAME_1, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
- systemApp.flags = ApplicationInfo.FLAG_SYSTEM & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
-
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- assertThat(result.size()).isEqualTo(1);
- assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(111L);
- }
-
- @Test
- public void testVideoAppsAreFiltered() throws Exception {
- addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_VIDEO);
-
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- assertThat(result.size()).isEqualTo(1);
- assertThat(result.get(PRIMARY_USER_ID).getVideoAppsSize()).isEqualTo(11L);
- assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(0L);
- }
-
- @Test
- public void testRemovedPackageDoesNotCrash() throws Exception {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = PACKAGE_NAME_1;
- info.category = ApplicationInfo.CATEGORY_UNDEFINED;
- mInfo.add(info);
- when(mSource.getStatsForPackage(any(), anyString(), any(UserHandle.class)))
- .thenThrow(new NameNotFoundException());
-
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- // Should not crash.
- }
-
- @Test
- public void testPackageIsNotDoubleCounted() throws Exception {
- UserInfo info = new UserInfo();
- info.id = SECONDARY_USER_ID;
- mUsers.add(info);
- when(mSource.getExternalStorageStats(anyString(), eq(UserHandle.SYSTEM)))
- .thenReturn(new StorageStatsSource.ExternalStorageStats(9, 2, 3, 4, 0));
- when(mSource.getExternalStorageStats(anyString(), eq(new UserHandle(SECONDARY_USER_ID))))
- .thenReturn(new StorageStatsSource.ExternalStorageStats(10, 3, 3, 4, 0));
- addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_VIDEO);
- ArrayList<ApplicationInfo> secondaryUserApps = new ArrayList<>();
- ApplicationInfo appInfo = new ApplicationInfo();
- appInfo.packageName = PACKAGE_NAME_1;
- appInfo.category = ApplicationInfo.CATEGORY_VIDEO;
- secondaryUserApps.add(appInfo);
-
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- assertThat(result.size()).isEqualTo(2);
- assertThat(result.get(PRIMARY_USER_ID).getVideoAppsSize()).isEqualTo(11L);
- // No code size for the second user.
- assertThat(result.get(SECONDARY_USER_ID).getVideoAppsSize()).isEqualTo(10L);
- }
-
- @Test
- public void testCacheOveragesAreCountedAsFree() throws Exception {
- addPackage(PACKAGE_NAME_1, DEFAULT_QUOTA + 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
-
- SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
- assertThat(result.size()).isEqualTo(1);
- assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(DEFAULT_QUOTA + 11);
- }
-
- private ApplicationInfo addPackage(String packageName, long cacheSize, long codeSize,
- long dataSize, int category) throws Exception {
- StorageStats stats = new StorageStats();
- stats.codeBytes = codeSize;
- stats.dataBytes = dataSize + cacheSize;
- stats.cacheBytes = cacheSize;
- StorageStatsSource.AppStorageStats storageStats =
- new StorageStatsSource.AppStorageStatsImpl(stats);
-
- when(mSource.getStatsForPackage(any(), anyString(), any(UserHandle.class)))
- .thenReturn(storageStats);
-
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = packageName;
- info.category = category;
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.applicationInfo = info;
- packageInfo.packageName = packageName;
- getShadowApplicationManager().addPackage(packageInfo);
- return info;
- }
-
- private ShadowApplicationPackageManager getShadowApplicationManager() {
- return Shadow.extract(mContext.getPackageManager());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java
deleted file mode 100644
index 1a17aa3..0000000
--- a/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * 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.car.settings.storage;
-
-import static android.os.storage.VolumeInfo.MOUNT_FLAG_PRIMARY;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ResolveInfo;
-import android.os.storage.VolumeInfo;
-
-import androidx.lifecycle.Lifecycle;
-
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.common.ProgressBarPreference;
-import com.android.car.settings.testutils.ShadowStorageManagerVolumeProvider;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.shadows.ShadowApplicationPackageManager;
-
-/** Unit test for {@link StorageFileCategoryPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowStorageManagerVolumeProvider.class})
-public class StorageFileCategoryPreferenceControllerTest {
-
-
- private Context mContext;
- private ProgressBarPreference mProgressBarPreference;
- private PreferenceControllerTestHelper<StorageFileCategoryPreferenceController>
- mPreferenceControllerHelper;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mProgressBarPreference = new ProgressBarPreference(mContext);
- mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- StorageFileCategoryPreferenceController.class, mProgressBarPreference);
- }
-
- @After
- public void tearDown() {
- ShadowStorageManagerVolumeProvider.reset();
- ShadowApplicationPackageManager.reset();
- }
-
- @Test
- public void onCreate_nonResolvableIntent_notSelectable() {
- VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_EMULATED, null, "id");
- volumeInfo.mountFlags = MOUNT_FLAG_PRIMARY;
- ShadowStorageManagerVolumeProvider.setVolumeInfo(volumeInfo);
-
- mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- assertThat(mProgressBarPreference.isSelectable()).isFalse();
- }
-
- @Test
- public void onCreate_resolvableIntent_selectable() {
- VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_EMULATED, null, "id");
- volumeInfo.mountFlags = MOUNT_FLAG_PRIMARY;
- Intent browseIntent = volumeInfo.buildBrowseIntent();
- ShadowStorageManagerVolumeProvider.setVolumeInfo(volumeInfo);
-
- ActivityInfo activityInfo = new ActivityInfo();
- activityInfo.packageName = "com.test.package.name";
- activityInfo.name = "ClassName";
- activityInfo.applicationInfo = new ApplicationInfo();
- activityInfo.applicationInfo.packageName = "com.test.package.name";
-
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.system = true;
- resolveInfo.activityInfo = activityInfo;
- getShadowPackageManager().addResolveInfoForIntent(browseIntent, resolveInfo);
-
- mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
- assertThat(mProgressBarPreference.isSelectable()).isTrue();
- }
-
- @Test
- public void handlePreferenceClicked_currentUserAndNoActivityToHandleIntent_doesNotThrow() {
- VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_EMULATED, null, "id");
- volumeInfo.mountFlags = MOUNT_FLAG_PRIMARY;
- ShadowStorageManagerVolumeProvider.setVolumeInfo(volumeInfo);
-
- mProgressBarPreference.performClick();
-
- assertThat(ShadowApplication.getInstance().getNextStartedActivity()).isNull();
- }
-
- @Test
- public void handlePreferenceClicked_currentUserAndActivityToHandleIntent_startsNewActivity() {
- VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_EMULATED, null, "id");
- volumeInfo.mountFlags = MOUNT_FLAG_PRIMARY;
- Intent browseIntent = volumeInfo.buildBrowseIntent();
- ShadowStorageManagerVolumeProvider.setVolumeInfo(volumeInfo);
-
- ActivityInfo activityInfo = new ActivityInfo();
- activityInfo.packageName = "com.test.package.name";
- activityInfo.name = "ClassName";
- activityInfo.applicationInfo = new ApplicationInfo();
- activityInfo.applicationInfo.packageName = "com.test.package.name";
-
- ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.system = true;
- resolveInfo.activityInfo = activityInfo;
- getShadowPackageManager().addResolveInfoForIntent(browseIntent, resolveInfo);
-
- mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- mProgressBarPreference.performClick();
-
- Intent intent = ShadowApplication.getInstance().getNextStartedActivity();
- assertThat(intent.getAction()).isEqualTo(browseIntent.getAction());
- assertThat(intent.getData()).isEqualTo(browseIntent.getData());
- }
-
- private ShadowApplicationPackageManager getShadowPackageManager() {
- return (ShadowApplicationPackageManager) Shadows.shadowOf(mContext.getPackageManager());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java
deleted file mode 100644
index b6a538a..0000000
--- a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.car.settings.storage;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import androidx.lifecycle.Lifecycle;
-
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.common.ProgressBarPreference;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-/** Unit test for {@link StorageMediaCategoryPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-public class StorageMediaCategoryPreferenceControllerTest {
-
- @Test
- public void handlePreferenceClicked_shouldLaunchAccountSyncDetailsFragment() {
- Context context = RuntimeEnvironment.application;
- ProgressBarPreference progressBarPreference = new ProgressBarPreference(context);
- PreferenceControllerTestHelper<StorageMediaCategoryPreferenceController> helper =
- new PreferenceControllerTestHelper<>(context,
- StorageMediaCategoryPreferenceController.class, progressBarPreference);
- FragmentController mMockFragmentController = helper.getMockFragmentController();
- helper.markState(Lifecycle.State.CREATED);
-
- progressBarPreference.performClick();
-
- verify(mMockFragmentController).launchFragment(
- any(StorageMediaCategoryDetailFragment.class));
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java
deleted file mode 100644
index ff815ab..0000000
--- a/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * 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.car.settings.storage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-import android.app.usage.StorageStats;
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.Context;
-
-import androidx.lifecycle.Lifecycle;
-
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.settingslib.applications.StorageStatsSource;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-/** Unit test for {@link StorageSizeBasePreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-public class StorageSizeBasePreferenceControllerTest {
-
- private StorageAppDetailPreference mStorageAppDetailPreference;
- private TestStorageSizeBasePreferenceController mController;
- private PreferenceControllerTestHelper<TestStorageSizeBasePreferenceController>
- mPreferenceControllerHelper;
-
- @Mock
- private AppsStorageStatsManager mAppsStorageStatsManager;
-
- private static class TestStorageSizeBasePreferenceController extends
- StorageSizeBasePreferenceController {
-
- TestStorageSizeBasePreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
- super(context, preferenceKey, fragmentController, uxRestrictions);
- }
-
- @Override
- protected long getSize() {
- return 1_000_000_000;
- }
- }
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- Context context = RuntimeEnvironment.application;
- mStorageAppDetailPreference = new StorageAppDetailPreference(context);
- mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
- TestStorageSizeBasePreferenceController.class, mStorageAppDetailPreference);
- mController = mPreferenceControllerHelper.getController();
- }
-
- @Test
- public void refreshUi_defaultState_nothingIsSet() {
- assertThat(mStorageAppDetailPreference.getDetailText()).isNull();
- assertThat(mController.isCachedCleared()).isFalse();
- assertThat(mController.isDataCleared()).isFalse();
- assertThat(mController.getAppStorageStats()).isNull();
- }
-
- @Test
- public void setAppsStorageStatsManager_shouldRegisterController() {
- mController.setAppsStorageStatsManager(mAppsStorageStatsManager);
- mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
-
- verify(mAppsStorageStatsManager).registerListener(mController);
- }
-
- @Test
- public void onDataLoaded_shouldUpdateCachedAndDataClearedState() {
- mController.onDataLoaded(null, true, true);
-
- assertThat(mController.isCachedCleared()).isTrue();
- assertThat(mController.isDataCleared()).isTrue();
- }
-
- @Test
- public void onDataLoaded_appStorageStatsNotSet_shouldNotUpdateDetailText() {
- mController.onDataLoaded(null, true, true);
-
- assertThat(mController.getAppStorageStats()).isNull();
- assertThat(mStorageAppDetailPreference.getDetailText()).isNull();
- }
-
- @Test
- public void onDataLoaded_appStorageStatsSet_shouldUpdateDetailText() {
- mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
-
- StorageStats stats = new StorageStats();
- StorageStatsSource.AppStorageStats storageStats =
- new StorageStatsSource.AppStorageStatsImpl(stats);
- mController.setAppStorageStats(storageStats);
- mController.onDataLoaded(null, true, true);
-
- assertThat(mController.getAppStorageStats()).isNotNull();
- assertThat(mStorageAppDetailPreference.getDetailText()).isEqualTo("1.00 GB");
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java
deleted file mode 100644
index 4711fb0..0000000
--- a/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.car.settings.storage;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import androidx.lifecycle.Lifecycle;
-
-import com.android.car.settings.common.ConfirmationDialogFragment;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.common.ProgressBarPreference;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-/** Unit test for {@link StorageSystemCategoryPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
-public class StorageSystemCategoryPreferenceControllerTest {
-
- @Test
- public void handlePreferenceClicked_openAlertDialog() {
- Context context = RuntimeEnvironment.application;
- ProgressBarPreference progressBarPreference = new ProgressBarPreference(context);
- PreferenceControllerTestHelper<StorageSystemCategoryPreferenceController>
- preferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
- StorageSystemCategoryPreferenceController.class, progressBarPreference);
- preferenceControllerHelper.markState(Lifecycle.State.CREATED);
- progressBarPreference.performClick();
-
- verify(preferenceControllerHelper.getMockFragmentController()).showDialog(
- any(ConfirmationDialogFragment.class), anyString());
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalePicker.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalePicker.java
deleted file mode 100644
index ed59177..0000000
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalePicker.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.testutils;
-
-import com.android.internal.app.LocalePicker;
-
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-import org.robolectric.annotation.Resetter;
-
-import java.util.Locale;
-
-@Implements(LocalePicker.class)
-public class ShadowLocalePicker {
-
- private static boolean sLocaleUpdated = false;
-
- @Resetter
- public static void reset() {
- sLocaleUpdated = false;
- }
-
- @Implementation
- protected static void updateLocale(Locale locale) {
- sLocaleUpdated = true;
- }
-
- public static boolean localeWasUpdated() {
- return sLocaleUpdated;
- }
-}
diff --git a/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java
deleted file mode 100644
index ee5ebc2..0000000
--- a/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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.car.settings.tts;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.Intent;
-import android.speech.tts.TextToSpeech;
-import android.speech.tts.TtsEngines;
-
-import androidx.lifecycle.Lifecycle;
-
-import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowTtsEngines;
-import com.android.car.ui.preference.CarUiTwoActionIconPreference;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowTtsEngines.class})
-public class PreferredEngineEntryPreferenceControllerTest {
-
- private static final TextToSpeech.EngineInfo ENGINE_INFO = new TextToSpeech.EngineInfo();
- private static final String INTENT_ACTION = "test_action";
-
- static {
- ENGINE_INFO.label = "Test Engine";
- ENGINE_INFO.name = "com.android.car.settings.tts.test.Engine";
- }
-
- private CarUiTwoActionIconPreference mPreference;
- @Mock
- private TtsEngines mEnginesHelper;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- ShadowTtsEngines.setInstance(mEnginesHelper);
- Context context = RuntimeEnvironment.application;
-
- mPreference = new CarUiTwoActionIconPreference(context);
- PreferenceControllerTestHelper<PreferredEngineEntryPreferenceController> controllerHelper =
- new PreferenceControllerTestHelper<>(context,
- PreferredEngineEntryPreferenceController.class, mPreference);
-
- Intent intent = new Intent(INTENT_ACTION);
- when(mEnginesHelper.getSettingsIntent(ENGINE_INFO.name)).thenReturn(intent);
- when(mEnginesHelper.getEngineInfo(ENGINE_INFO.name)).thenReturn(
- ENGINE_INFO);
- when(mEnginesHelper.getDefaultEngine()).thenReturn(ENGINE_INFO.name);
-
- controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- }
-
- @After
- public void tearDown() {
- ShadowTtsEngines.reset();
- }
-
- @Test
- public void performButtonClick_navigateToNextActivity() {
- mPreference.performSecondaryActionClick();
-
- Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
- assertThat(actual.getAction()).isEqualTo(INTENT_ACTION);
- }
-}
diff --git a/tests/unit/AndroidManifest.xml b/tests/unit/AndroidManifest.xml
index c5a9566..7a41be2 100644
--- a/tests/unit/AndroidManifest.xml
+++ b/tests/unit/AndroidManifest.xml
@@ -130,6 +130,19 @@
<meta-data android:name="distractionOptimized" android:value="true"/>
</activity>
+ <activity android:name="com.android.car.settings.notifications.NotificationAccessConfirmationActivity"
+ android:taskAffinity="com.android.car.settings.notifications.NotificationAccessConfirmationActivity"
+ android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.Alert" />
+
+ <activity android:name="com.android.car.settings.notifications.NotificationAccessConfirmationActivityTest$TestActivity"
+ android:taskAffinity="com.android.car.settings.notifications.NotificationAccessConfirmationActivity"
+ android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.Alert" />
+
+ <activity
+ android:name="com.android.car.settings.enterprise.ActionDisabledByAdminActivity"
+ android:theme="@style/ActionDialogTheme">
+ </activity>
+
<activity
android:name="com.android.car.settings.system.RegulatoryInfoDisplayActivity"
android:theme="@style/CarSettingTheme"
diff --git a/tests/unit/res/values/arrays.xml b/tests/unit/res/values/arrays.xml
index ba74b45..7627dc0 100644
--- a/tests/unit/res/values/arrays.xml
+++ b/tests/unit/res/values/arrays.xml
@@ -27,4 +27,8 @@
<item>beta</item>
<item>charlie</item>
</string-array>
+
+ <string-array name="settings_qc_provider_package_allowlist">
+ <item>com.android.car.settings.test.unit</item>
+ </string-array>
</resources>
diff --git a/tests/unit/res/values/config.xml b/tests/unit/res/values/config.xml
index 834bc95..c6a04bf 100644
--- a/tests/unit/res/values/config.xml
+++ b/tests/unit/res/values/config.xml
@@ -19,4 +19,9 @@
<bool name="config_show_settings_root_exit_icon">true</bool>
<!-- Whether the root fragment should actually be root -->
<bool name="config_is_root_fragment_root">true</bool>
+ <!--
+ Maximum number of devices to show for paired bluetooth device quick control.
+ Set to -1 for unlimited.
+ -->
+ <integer name="config_qc_bluetooth_device_limit">3</integer>
</resources>
\ No newline at end of file
diff --git a/tests/unit/res/values/strings.xml b/tests/unit/res/values/strings.xml
index 554e09b..8b74724 100644
--- a/tests/unit/res/values/strings.xml
+++ b/tests/unit/res/values/strings.xml
@@ -28,4 +28,5 @@
<string name="test_volume_call" translatable="false">Call Volume</string>
<string name="test_volume_music" translatable="false">Music Volume</string>
+ <string name="test_volume_navigation" translatable="false">Navigation Volume</string>
</resources>
diff --git a/tests/unit/res/xml/test_car_volume_items.xml b/tests/unit/res/xml/test_car_volume_items.xml
index 3ac7903..83b0fd1 100644
--- a/tests/unit/res/xml/test_car_volume_items.xml
+++ b/tests/unit/res/xml/test_car_volume_items.xml
@@ -20,11 +20,18 @@
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
<item car:usage="voice_communication"
car:titleText="@string/test_volume_call"
- car:icon="@drawable/test_icon"/>
+ car:icon="@drawable/test_icon"
+ car:mute_icon="@drawable/test_icon" />
<item car:usage="voice_communication_signalling"
car:titleText="@string/test_volume_call"
- car:icon="@drawable/test_icon"/>
+ car:icon="@drawable/test_icon"
+ car:mute_icon="@drawable/test_icon" />
<item car:usage="media"
car:titleText="@string/test_volume_music"
- car:icon="@drawable/test_icon"/>
+ car:icon="@drawable/test_icon"
+ car:mute_icon="@drawable/test_icon" />
+ <item car:usage="assistance_navigation_guidance"
+ car:titleText="@string/test_volume_navigation"
+ car:icon="@drawable/test_icon"
+ car:mute_icon="@drawable/test_icon" />
</carVolumeItems>
diff --git a/tests/unit/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java
index ec6c234..0ed80a1 100644
--- a/tests/unit/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java
@@ -16,10 +16,13 @@
package com.android.car.settings.accounts;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -27,15 +30,19 @@
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.os.UserHandle;
+import android.os.UserManager;
import androidx.lifecycle.LifecycleOwner;
+import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
import com.android.car.settings.profiles.ProfileHelper;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.car.ui.preference.CarUiTwoActionIconPreference;
@@ -47,12 +54,14 @@
@RunWith(AndroidJUnit4.class)
public class AccountDetailsPreferenceControllerTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
private static final String ACCOUNT_NAME = "Name";
private static final String ACCOUNT_TYPE = "com.acct";
private final Account mAccount = new Account(ACCOUNT_NAME, ACCOUNT_TYPE);
private final UserHandle mUserHandle = new UserHandle(0);
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
private CarUiTwoActionIconPreference mPreference;
private AccountDetailsPreferenceController mPreferenceController;
@@ -62,6 +71,8 @@
private FragmentController mFragmentController;
@Mock
private ProfileHelper mMockProfileHelper;
+ @Mock
+ private UserManager mMockUserManager;
@Before
public void setUp() {
@@ -77,11 +88,13 @@
mPreferenceController.setAccount(mAccount);
mPreferenceController.setUserHandle(mUserHandle);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
}
@Test
- public void cannotModifyUsers_removeAccountButtonShouldNotBeVisible() {
+ public void cannotModifyUsers_demoOrGuestUser_removeAccountButtonShouldNotBeVisible() {
when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+ when(mMockProfileHelper.isDemoOrGuest()).thenReturn(true);
mPreferenceController.onCreate(mLifecycleOwner);
@@ -89,12 +102,46 @@
}
@Test
+ public void cannotModifyUsers_restrictedByUm_removeAccountButtonShouldNotBeVisible() {
+ when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mMockUserManager, TEST_RESTRICTION, true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isSecondaryActionVisible()).isFalse();
+ }
+
+ @Test
+ public void cannotModifyUsers_demoOrGuestAndRestrictedByUm_removeAccountButtonNotVisible() {
+ when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+ when(mMockProfileHelper.isDemoOrGuest()).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isSecondaryActionVisible()).isFalse();
+ }
+
+ @Test
+ public void cannotModifyUsers_restrictedByDpm_removeAccountButtonAvailableForViewing() {
+ when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isSecondaryActionVisible()).isTrue();
+ }
+
+ @Test
public void canModifyUsers_removeAccountButtonShouldBeVisible() {
when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
mPreferenceController.onCreate(mLifecycleOwner);
assertThat(mPreference.isSecondaryActionVisible()).isTrue();
+ assertThat(mPreference.isSecondaryActionEnabled()).isTrue();
}
@Test
@@ -109,6 +156,24 @@
eq(ConfirmationDialogFragment.TAG));
}
+ @Test
+ @UiThreadTest
+ public void onRemoveAccountButtonClicked_canModifyUsers_restrictedByDpm_showAdminDialog() {
+ when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreference.performSecondaryActionClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+
private class TestAccountDetailsPreferenceController
extends AccountDetailsPreferenceController {
diff --git a/tests/unit/src/com/android/car/settings/accounts/AccountGroupPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/accounts/AccountGroupPreferenceControllerTest.java
index 8bdfd95..6049bf9 100644
--- a/tests/unit/src/com/android/car/settings/accounts/AccountGroupPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/accounts/AccountGroupPreferenceControllerTest.java
@@ -19,6 +19,7 @@
import static android.content.pm.UserInfo.FLAG_INITIALIZED;
import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
import static com.google.common.truth.Truth.assertThat;
@@ -29,6 +30,7 @@
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.content.pm.UserInfo;
+import android.os.UserManager;
import androidx.lifecycle.LifecycleOwner;
import androidx.test.annotation.UiThreadTest;
@@ -39,6 +41,7 @@
import com.android.car.settings.common.LogicalPreferenceGroup;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.profiles.ProfileHelper;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
import org.junit.Before;
@@ -47,9 +50,12 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+// TODO(b/201465719) add unittest to show ActionDisabledByAdminDialog
@RunWith(AndroidJUnit4.class)
public class AccountGroupPreferenceControllerTest {
private static final String TEST_USERNAME = "Test Username";
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
@@ -61,6 +67,8 @@
private FragmentController mFragmentController;
@Mock
private ProfileHelper mMockProfileHelper;
+ @Mock
+ private UserManager mMockUserManager;
@Before
@UiThreadTest
@@ -68,6 +76,7 @@
MockitoAnnotations.initMocks(this);
mLifecycleOwner = new TestLifecycleOwner();
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
@@ -77,20 +86,7 @@
}
@Test
- public void getAvailabilityStatus_currentUser_cannotModifyAccounts_notAvailable() {
- UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, FLAG_INITIALIZED);
- when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
- when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
- mController.setUserInfo(userInfo);
- PreferenceControllerTestUtil.assignPreference(mController, mPreference);
-
- mController.onCreate(mLifecycleOwner);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
- }
-
- @Test
- public void getAvailabilityStatus_currentUser_canModifyAccounts_available() {
+ public void getAvailabilityStatus_currentUser_noRestriction_available() {
UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, FLAG_INITIALIZED);
when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
@@ -103,10 +99,9 @@
}
@Test
- public void getAvailabilityStatus_notCurrentUser_canModifyAccounts_notAvailable() {
+ public void getAvailabilityStatus_notCurrentUser_notAvailable() {
UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, FLAG_INITIALIZED);
when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
- when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
mController.setUserInfo(userInfo);
PreferenceControllerTestUtil.assignPreference(mController, mPreference);
@@ -116,11 +111,57 @@
}
@Test
- public void getAvailabilityStatus_notCurrentUser_cannotModifyAccounts_notAvailable() {
+ public void getAvailabilityStatus_currentUser_restricedByUserType_notAvailable() {
UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, FLAG_INITIALIZED);
- when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
- when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+ when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
mController.setUserInfo(userInfo);
+ when(mMockProfileHelper.isDemoOrGuest()).thenReturn(true);
+ PreferenceControllerTestUtil.assignPreference(mController, mPreference);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_currentUser_restrictedByUm_notAvailable() {
+ UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, FLAG_INITIALIZED);
+ when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+ mController.setUserInfo(userInfo);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mMockUserManager, TEST_RESTRICTION, true);
+ PreferenceControllerTestUtil.assignPreference(mController, mPreference);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_currentUser_restricedByDpm_availableForViewing() {
+ UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, FLAG_INITIALIZED);
+ when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+ mController.setUserInfo(userInfo);
+ when(mMockProfileHelper.isDemoOrGuest()).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mMockUserManager, TEST_RESTRICTION, false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+ PreferenceControllerTestUtil.assignPreference(mController, mPreference);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void getAvailabilityStatus_currentUser_restricedByUserTypeAndDpm_notAvailable() {
+ UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, FLAG_INITIALIZED);
+ when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+ mController.setUserInfo(userInfo);
+ when(mMockProfileHelper.isDemoOrGuest()).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
PreferenceControllerTestUtil.assignPreference(mController, mPreference);
mController.onCreate(mLifecycleOwner);
diff --git a/tests/unit/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java
index 16702d7..0beadcd 100644
--- a/tests/unit/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java
@@ -16,9 +16,14 @@
package com.android.car.settings.accounts;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;
@@ -29,6 +34,7 @@
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserHandle;
+import android.os.UserManager;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
@@ -43,6 +49,7 @@
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.profiles.ProfileHelper;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.ResourceTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.dx.mockito.inline.extended.ExtendedMockito;
@@ -64,13 +71,17 @@
import java.util.Map;
import java.util.Set;
+// TODO(b/201465719) add unittest to show ActionDisabledByAdminDialog
@RunWith(AndroidJUnit4.class)
public class AccountListPreferenceControllerTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
+
private static final int USER_ID = 0;
private static final String USER_NAME = "name";
private static final int NOT_THIS_USER_ID = 1;
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
private PreferenceCategory mPreference;
private CarUxRestrictions mCarUxRestrictions;
@@ -88,6 +99,8 @@
private ProfileHelper mMockProfileHelper;
@Mock
private AccountManager mMockAccountManager;
+ @Mock
+ private UserManager mMockUserManager;
@Before
@UiThreadTest
@@ -98,6 +111,8 @@
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+
PreferenceManager preferenceManager = new PreferenceManager(mContext);
PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
mPreference = new PreferenceCategory(mContext);
@@ -235,6 +250,7 @@
@Test
@UiThreadTest
public void onAccountPreferenceClicked_shouldLaunchAccountDetailsFragment() {
+ when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
addAccount(/* name= */ "Account1", /* type= */ "com.acct1");
mController.onCreate(mLifecycleOwner);
@@ -258,6 +274,56 @@
updateEnabledAccountTypes();
}
+ @Test
+ public void getAvailabilityStatus_demoOrGuest_notAvailable() {
+ when(mMockProfileHelper.isDemoOrGuest()).thenReturn(true);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_restrictedByUm_notAvailable() {
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_demoOrGuest_restrictedByDpm_notAvailable() {
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+ when(mMockProfileHelper.isDemoOrGuest()).thenReturn(true);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_restrictedByDpm_availableForViewing() {
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void getAvailabilityStatus_canModifyAccounts_available() {
+ when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
+ PreferenceControllerTestUtil.assignPreference(mController, mPreference);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
private void initMocks() {
mAccountTypeToLabelMap = new HashMap<String, String>() {
{
@@ -286,7 +352,6 @@
when(ProfileHelper.getInstance(mContext)).thenReturn(mMockProfileHelper);
UserInfo userInfo = new UserInfo(USER_ID, USER_NAME, 0);
when(mMockProfileHelper.getCurrentProcessUserInfo()).thenReturn(userInfo);
- when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
when(AccountManager.get(mContext)).thenReturn(mMockAccountManager);
when(mMockAccountManager.getAccountsByTypeAsUser(any(), any())).then(invocation -> {
diff --git a/tests/unit/src/com/android/car/settings/accounts/AddAccountPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/accounts/AddAccountPreferenceControllerTest.java
index 4df762f..005f385 100644
--- a/tests/unit/src/com/android/car/settings/accounts/AddAccountPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/accounts/AddAccountPreferenceControllerTest.java
@@ -17,11 +17,14 @@
package com.android.car.settings.accounts;
import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -30,17 +33,20 @@
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.content.Intent;
+import android.os.UserManager;
import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
import com.android.car.settings.profiles.ProfileHelper;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
import org.junit.Before;
import org.junit.Test;
@@ -54,9 +60,12 @@
@RunWith(AndroidJUnit4.class)
public class AddAccountPreferenceControllerTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
+
private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
- private Preference mPreference;
+ private CarUiPreference mPreference;
private CarUxRestrictions mCarUxRestrictions;
private AddAccountPreferenceController mController;
@@ -66,25 +75,61 @@
private ProfileHelper mMockProfileHelper;
@Mock
private AccountTypesHelper mMockAccountTypesHelper;
+ @Mock
+ private UserManager mMockUserManager;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+
mLifecycleOwner = new TestLifecycleOwner();
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mPreference = new Preference(mContext);
+ mPreference = new CarUiPreference(mContext);
mController = new TestAddAccountPreferenceController(mContext,
/* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
PreferenceControllerTestUtil.assignPreference(mController, mPreference);
+
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
doNothing().when(mContext).startActivity(any());
}
@Test
- public void cannotModifyUsers_addAccountButtonShouldBeDisabled() {
- when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+ public void cannotModifyUsers_restrictedByDpm_addAccountButtonShouldBeAvailableForViewing() {
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void cannotModifyUsers_restrictedByUm_addAccountButtonShouldBeDisabled() {
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void cannotModifyUsers_demoOrGuestAndRestricedByDpm_addAccountButtonShouldBeDisabled() {
+ when(mMockProfileHelper.isDemoOrGuest()).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void cannotModifyUsers_demoOrGuestUser_addAccountButtonShouldBeDisabled() {
+ when(mMockProfileHelper.isDemoOrGuest()).thenReturn(true);
mController.onCreate(mLifecycleOwner);
@@ -145,6 +190,24 @@
verify(mFragmentController).launchFragment(any(ChooseAccountFragment.class));
}
+ @Test
+ @UiThreadTest
+ public void disabledClick_restrictedByDpm_dialog() {
+ when(mMockProfileHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+ mController.onCreate(mLifecycleOwner);
+
+ mPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+
private class TestAddAccountPreferenceController extends AddAccountPreferenceController {
TestAddAccountPreferenceController(Context context, String preferenceKey,
diff --git a/tests/unit/src/com/android/car/settings/applications/ApplicationActionButtonsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/ApplicationActionButtonsPreferenceControllerTest.java
index be6ddae..95602c1 100644
--- a/tests/unit/src/com/android/car/settings/applications/ApplicationActionButtonsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/applications/ApplicationActionButtonsPreferenceControllerTest.java
@@ -18,6 +18,7 @@
import static com.android.car.settings.applications.ApplicationActionButtonsPreferenceController.DISABLE_CONFIRM_DIALOG_TAG;
import static com.android.car.settings.applications.ApplicationActionButtonsPreferenceController.FORCE_STOP_CONFIRM_DIALOG_TAG;
+import static com.android.car.settings.applications.ApplicationActionButtonsPreferenceController.UNINSTALL_DEVICE_ADMIN_REQUEST_CODE;
import static com.android.car.settings.applications.ApplicationActionButtonsPreferenceController.UNINSTALL_REQUEST_CODE;
import static com.android.car.settings.common.ActionButtonsPreference.ActionButtons;
import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
@@ -30,6 +31,7 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -66,6 +68,7 @@
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.enterprise.DeviceAdminAddActivity;
import com.android.car.settings.testutils.ResourceTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.settingslib.applications.ApplicationsState;
@@ -248,7 +251,7 @@
}
@Test
- public void onCreate_packageHasActiveAdmins_disablesUninstallButton() {
+ public void onCreate_packageHasActiveAdmins_doesNotDisableUninstallButton() {
setupAndAssignPreference();
setApplicationInfo(/* stopped= */ false, /* enabled= */ true, /* system= */ false);
@@ -256,7 +259,7 @@
mPreferenceController.onCreate(mLifecycleOwner);
- assertThat(getUninstallButton().isEnabled()).isFalse();
+ assertThat(getUninstallButton().isEnabled()).isTrue();
}
@Test
@@ -615,6 +618,23 @@
}
@Test
+ public void disableClicked_showsDisabledByDeviceAdminDialog() {
+ mockDisabledByDevicePolicyManagerRestriction(UserManager.DISALLOW_APPS_CONTROL);
+
+ setupAndAssignPreference();
+ setApplicationInfo(/* stopped= */ false, /* enabled= */ true, /* system= */ true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ getDisableButton().getOnClickListener().onClick(/* view= */ null);
+
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ verify(mMockPm, never()).setApplicationEnabledSetting(PACKAGE_NAME,
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, /* flags= */ 0);
+ }
+
+ @Test
public void enableClicked_enablesPackage() {
setupAndAssignPreference();
setApplicationInfo(/* stopped= */ false, /* enabled= */ false, /* system= */ true);
@@ -628,6 +648,47 @@
}
@Test
+ public void enableClicked_showsDisabledByDeviceAdminDialog() {
+ mockDisabledByDevicePolicyManagerRestriction(UserManager.DISALLOW_APPS_CONTROL);
+
+ setupAndAssignPreference();
+ setApplicationInfo(/* stopped= */ false, /* enabled= */ false, /* system= */ true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ getDisableButton().getOnClickListener().onClick(/* view= */ null);
+
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ verify(mMockPm, never()).setApplicationEnabledSetting(PACKAGE_NAME,
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, /* flags= */ 0);
+ }
+
+ @Test
+ public void uninstallClicked_packageHasActiveAdmins_startsDeviceAdminAddActivity() {
+ setupAndAssignPreference();
+ setApplicationInfo(/* stopped= */ false, /* enabled= */ true, /* system= */ false);
+ when(mMockDpm.packageHasActiveAdmins(PACKAGE_NAME)).thenReturn(true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ getUninstallButton().getOnClickListener().onClick(/* view= */ null);
+
+ ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(
+ Intent.class);
+
+ verify(mFragmentController).startActivityForResult(intentArgumentCaptor.capture(),
+ eq(UNINSTALL_DEVICE_ADMIN_REQUEST_CODE),
+ any(ApplicationActionButtonsPreferenceController.class));
+
+ Intent intent = intentArgumentCaptor.getValue();
+ assertThat(intent.getComponent().getClassName())
+ .isEqualTo(DeviceAdminAddActivity.class.getName());
+ assertThat(intent.getStringExtra(DeviceAdminAddActivity.EXTRA_DEVICE_ADMIN_PACKAGE_NAME))
+ .isEqualTo(PACKAGE_NAME);
+ }
+
+ @Test
public void uninstallClicked_startsUninstallActivity() {
setupAndAssignPreference();
setApplicationInfo(/* stopped= */ false, /* enabled= */ true, /* system= */ false);
@@ -685,6 +746,18 @@
verify(mFragmentController).goBack();
}
+ @Test
+ public void processActivityResult_uninstallDeviceAdmin_resultOk_goesBack() {
+ setupAndAssignPreference();
+ setApplicationInfo(/* stopped= */ false, /* enabled= */ true, /* system= */ false);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.processActivityResult(UNINSTALL_DEVICE_ADMIN_REQUEST_CODE,
+ Activity.RESULT_OK, /* data= */ null);
+
+ verify(mFragmentController).goBack();
+ }
+
private void setMocks() {
mPackageInfo = new PackageInfo();
mPackageInfo.packageName = PACKAGE_NAME;
diff --git a/tests/unit/src/com/android/car/settings/applications/HibernatedAppsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/HibernatedAppsPreferenceControllerTest.java
index 2f9a4d4..2aacc83 100644
--- a/tests/unit/src/com/android/car/settings/applications/HibernatedAppsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/applications/HibernatedAppsPreferenceControllerTest.java
@@ -23,26 +23,24 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.apphibernation.AppHibernationManager;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.content.res.Resources;
import android.provider.DeviceConfig;
import androidx.preference.Preference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.ui.preference.CarUiPreference;
+import com.android.settingslib.utils.StringUtil;
import org.junit.Before;
import org.junit.Test;
@@ -77,6 +75,7 @@
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getSystemService(AppHibernationManager.class))
.thenReturn(mAppHibernationManager);
+ mPreference = new CarUiPreference(mContext);
mController = new HibernatedAppsPreferenceController(mContext, KEY, mFragmentController,
mCarUxRestrictions);
}
@@ -100,13 +99,12 @@
@Test
public void onHibernatedAppsCountCallback_setsSummary() {
assignPreference();
- when(mContext.getResources()).thenReturn(mock(Resources.class));
int totalHibernated = 2;
mController.onHibernatedAppsCountLoaded(totalHibernated);
- verify(mContext.getResources()).getQuantityString(
- anyInt(), eq(totalHibernated), eq(totalHibernated));
+ assertThat(mPreference.getSummary()).isEqualTo(StringUtil.getIcuPluralsString(mContext,
+ totalHibernated, R.string.unused_apps_summary));
}
private void assignPreference() {
diff --git a/tests/unit/src/com/android/car/settings/applications/PeakPerformancePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/PrioritizeAppPerformancePreferenceControllerTest.java
similarity index 70%
rename from tests/unit/src/com/android/car/settings/applications/PeakPerformancePreferenceControllerTest.java
rename to tests/unit/src/com/android/car/settings/applications/PrioritizeAppPerformancePreferenceControllerTest.java
index 757166d..f1901c2 100644
--- a/tests/unit/src/com/android/car/settings/applications/PeakPerformancePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/applications/PrioritizeAppPerformancePreferenceControllerTest.java
@@ -16,6 +16,11 @@
package com.android.car.settings.applications;
+import static android.car.watchdog.PackageKillableState.KILLABLE_STATE_NEVER;
+import static android.car.watchdog.PackageKillableState.KILLABLE_STATE_NO;
+import static android.car.watchdog.PackageKillableState.KILLABLE_STATE_YES;
+
+import static com.android.car.settings.applications.PrioritizeAppPerformancePreferenceController.TURN_ON_PRIORITIZE_APP_PERFORMANCE_DIALOG_TAG;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.google.common.truth.Truth.assertThat;
@@ -34,7 +39,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.Bundle;
-import android.os.Process;
import android.os.UserHandle;
import androidx.lifecycle.LifecycleOwner;
@@ -62,16 +66,17 @@
import java.util.Collections;
@RunWith(AndroidJUnit4.class)
-public class PeakPerformancePreferenceControllerTest {
- private static final String PKG_NAME = "package.name";
- private static final int UID = Process.myUid();
+public class PrioritizeAppPerformancePreferenceControllerTest {
+ private static final String TEST_PKG_NAME = "test.package.name";
+ private static final int TEST_UID = 10012345;
+ private static final int TEST_USER_ID = 100;
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
private MockitoSession mMockingSession;
- private final Context mContext = ApplicationProvider.getApplicationContext();
private LifecycleOwner mLifecycleOwner;
private CarUxRestrictions mCarUxRestrictions;
- private UserHandle mUserHandle;
- private PeakPerformancePreferenceController mController;
+ private PrioritizeAppPerformancePreferenceController mController;
private TwoStatePreference mTwoStatePreference;
@Captor
@@ -94,14 +99,14 @@
.strictness(Strictness.LENIENT)
.startMocking();
mLifecycleOwner = new TestLifecycleOwner();
- mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
- CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mUserHandle = UserHandle.getUserHandleForUid(UID);
mTwoStatePreference = new SwitchPreference(mContext);
- mController = new PeakPerformancePreferenceController(mContext,
- /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ CarUxRestrictions restrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mController = new PrioritizeAppPerformancePreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, restrictions);
+
PreferenceControllerTestUtil.assignPreference(mController, mTwoStatePreference);
when(Car.createCar(any(), any(), anyLong(), mCarLifecycleCaptor.capture())).then(
@@ -113,12 +118,10 @@
when(mMockCar.getCarManager(Car.CAR_WATCHDOG_SERVICE)).thenReturn(mMockManager);
PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = PKG_NAME;
-
- ApplicationInfo applicationInfo = new ApplicationInfo();
- applicationInfo.packageName = PKG_NAME;
- packageInfo.applicationInfo = applicationInfo;
- packageInfo.applicationInfo.uid = UID;
+ packageInfo.packageName = TEST_PKG_NAME;
+ packageInfo.applicationInfo = new ApplicationInfo();
+ packageInfo.applicationInfo.uid = TEST_UID;
+ packageInfo.applicationInfo.packageName = TEST_PKG_NAME;
mController.setPackageInfo(packageInfo);
}
@@ -128,24 +131,10 @@
}
@Test
- public void onCreate_peakPerformance_withKillableStateYes() {
+ public void onCreate_prioritizeAppPerformance_withKillableStateYes() {
when(mMockManager.getPackageKillableStatesAsUser(any())).thenReturn(
Collections.singletonList(
- new PackageKillableState(PKG_NAME, mUserHandle.getIdentifier(),
- PackageKillableState.KILLABLE_STATE_YES)));
-
- mController.onCreate(mLifecycleOwner);
-
- assertThat(mTwoStatePreference.isChecked()).isTrue();
- assertThat(mTwoStatePreference.isEnabled()).isTrue();
- }
-
- @Test
- public void onCreate_peakPerformance_withKillableStateNo() {
- when(mMockManager.getPackageKillableStatesAsUser(any())).thenReturn(
- Collections.singletonList(
- new PackageKillableState(PKG_NAME, mUserHandle.getIdentifier(),
- PackageKillableState.KILLABLE_STATE_NO)));
+ new PackageKillableState(TEST_PKG_NAME, TEST_USER_ID, KILLABLE_STATE_YES)));
mController.onCreate(mLifecycleOwner);
@@ -154,11 +143,22 @@
}
@Test
- public void onCreate_peakPerformance_withKillableStateNever() {
+ public void onCreate_prioritizeAppPerformance_withKillableStateNo() {
when(mMockManager.getPackageKillableStatesAsUser(any())).thenReturn(
Collections.singletonList(
- new PackageKillableState(PKG_NAME, mUserHandle.getIdentifier(),
- PackageKillableState.KILLABLE_STATE_NEVER)));
+ new PackageKillableState(TEST_PKG_NAME, TEST_USER_ID, KILLABLE_STATE_NO)));
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mTwoStatePreference.isChecked()).isTrue();
+ assertThat(mTwoStatePreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void onCreate_prioritizeAppPerformance_withKillableStateNever() {
+ when(mMockManager.getPackageKillableStatesAsUser(any())).thenReturn(
+ Collections.singletonList(new PackageKillableState(
+ TEST_PKG_NAME, TEST_USER_ID, KILLABLE_STATE_NEVER)));
mController.onCreate(mLifecycleOwner);
@@ -167,38 +167,39 @@
}
@Test
- public void callChangeListener_enablingPeakPerformance() {
+ public void callChangeListener_turnOffPrioritizeAppPerformance() {
when(mMockManager.getPackageKillableStatesAsUser(any())).thenReturn(
Collections.singletonList(
- new PackageKillableState(PKG_NAME, mUserHandle.getIdentifier(),
- PackageKillableState.KILLABLE_STATE_NO)));
+ new PackageKillableState(TEST_PKG_NAME, TEST_USER_ID, KILLABLE_STATE_NO)));
+ mController.onCreate(mLifecycleOwner);
+ assertThat(mTwoStatePreference.isChecked()).isTrue();
+
+ mTwoStatePreference.performClick();
+
+ verify(mMockManager).setKillablePackageAsUser(
+ TEST_PKG_NAME, UserHandle.getUserHandleForUid(TEST_UID), true);
+ assertThat(mTwoStatePreference.isChecked()).isFalse();
+ assertThat(mTwoStatePreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void callChangeListener_turnOnPrioritizeAppPerformance() {
+ when(mMockManager.getPackageKillableStatesAsUser(any())).thenReturn(
+ Collections.singletonList(
+ new PackageKillableState(TEST_PKG_NAME, TEST_USER_ID, KILLABLE_STATE_YES)));
mController.onCreate(mLifecycleOwner);
assertThat(mTwoStatePreference.isChecked()).isFalse();
mTwoStatePreference.callChangeListener(true);
- verify(mMockManager).setKillablePackageAsUser(PKG_NAME, mUserHandle, true);
- assertThat(mTwoStatePreference.isChecked()).isTrue();
- assertThat(mTwoStatePreference.isEnabled()).isTrue();
- }
-
- @Test
- public void callChangeListener_disablingPeakPerformance() {
- when(mMockManager.getPackageKillableStatesAsUser(any())).thenReturn(
- Collections.singletonList(
- new PackageKillableState(PKG_NAME, mUserHandle.getIdentifier(),
- PackageKillableState.KILLABLE_STATE_YES)));
- mController.onCreate(mLifecycleOwner);
- assertThat(mTwoStatePreference.isChecked()).isTrue();
-
- mTwoStatePreference.callChangeListener(false);
- verify(mFragmentController).showDialog(mDialogFragment.capture(),
- eq(PeakPerformancePreferenceController.TURN_OFF_PEAK_PERFORMANCE_DIALOG_TAG));
+ verify(mFragmentController).showDialog(
+ mDialogFragment.capture(), eq(TURN_ON_PRIORITIZE_APP_PERFORMANCE_DIALOG_TAG));
mDialogFragment.getValue().getConfirmListener().onConfirm(new Bundle());
- verify(mMockManager).setKillablePackageAsUser(PKG_NAME, mUserHandle, false);
- assertThat(mTwoStatePreference.isChecked()).isFalse();
+ verify(mMockManager).setKillablePackageAsUser(
+ TEST_PKG_NAME, UserHandle.getUserHandleForUid(TEST_UID), false);
+ assertThat(mTwoStatePreference.isChecked()).isTrue();
assertThat(mTwoStatePreference.isEnabled()).isTrue();
}
}
diff --git a/tests/unit/src/com/android/car/settings/applications/StoragePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/StoragePreferenceControllerTest.java
new file mode 100644
index 0000000..4ffd88c
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/StoragePreferenceControllerTest.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.UserHandle;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class StoragePreferenceControllerTest {
+
+ private static final String PACKAGE_NAME = "Test Package Name";
+ private static final String SIZE_STR = "1.4Mb";
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private CarUiPreference mPreference;
+ private StoragePreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private ApplicationsState mMockApplicationsState;
+ @Mock
+ private ApplicationsState.AppEntry mMockAppEntry;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ mPreference = new CarUiPreference(mContext);
+ mPreferenceController = new StoragePreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController, mCarUxRestrictions);
+ }
+
+ @Test
+ public void testCheckInitialized_noApplicationsEntry_throwException() {
+ mPreferenceController.setAppState(mMockApplicationsState);
+ mPreferenceController.setPackageName(PACKAGE_NAME);
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mPreference));
+ }
+
+ @Test
+ public void testCheckInitialized_noApplicationsState_throwException() {
+ mPreferenceController.setAppEntry(mMockAppEntry);
+ mPreferenceController.setPackageName(PACKAGE_NAME);
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mPreference));
+ }
+
+ @Test
+ public void testCheckInitialized_noPackageName_throwException() {
+ mPreferenceController.setAppEntry(mMockAppEntry);
+ mPreferenceController.setAppState(mMockApplicationsState);
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mPreference));
+ }
+
+ @Test
+ public void onCreate_nullSize_calculatingSummary() {
+ when(mMockApplicationsState.getEntry(PACKAGE_NAME, UserHandle.myUserId()))
+ .thenReturn(mMockAppEntry);
+ mPreferenceController.setAppEntry(mMockAppEntry);
+ mPreferenceController.setAppState(mMockApplicationsState);
+ mPreferenceController.setPackageName(PACKAGE_NAME);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.memory_calculating_size));
+ }
+
+ @Test
+ public void onCreate_validApp_sizeSummary() {
+ when(mMockApplicationsState.getEntry(PACKAGE_NAME, UserHandle.myUserId()))
+ .thenReturn(mMockAppEntry);
+ mMockAppEntry.sizeStr = SIZE_STR;
+ mPreferenceController.setAppEntry(mMockAppEntry);
+ mPreferenceController.setAppState(mMockApplicationsState);
+ mPreferenceController.setPackageName(PACKAGE_NAME);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.storage_type_internal, SIZE_STR));
+ }
+
+ @Test
+ public void onCreate_lateAppLoad_updateSummary() {
+ when(mMockApplicationsState.getEntry(PACKAGE_NAME, UserHandle.myUserId()))
+ .thenReturn(mMockAppEntry);
+ mPreferenceController.setAppEntry(mMockAppEntry);
+ mPreferenceController.setAppState(mMockApplicationsState);
+ mPreferenceController.setPackageName(PACKAGE_NAME);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.memory_calculating_size));
+
+ mMockAppEntry.sizeStr = SIZE_STR;
+ mPreferenceController.mApplicationStateCallbacks.onAllSizesComputed();
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.storage_type_internal, SIZE_STR));
+ }
+
+ @Test
+ public void onCreate_packageSizeChange_updateSummary() {
+ when(mMockApplicationsState.getEntry(PACKAGE_NAME, UserHandle.myUserId()))
+ .thenReturn(mMockAppEntry);
+ mPreferenceController.setAppEntry(mMockAppEntry);
+ mPreferenceController.setAppState(mMockApplicationsState);
+ mPreferenceController.setPackageName(PACKAGE_NAME);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.memory_calculating_size));
+
+ mMockAppEntry.sizeStr = SIZE_STR;
+ mPreferenceController.mApplicationStateCallbacks.onPackageSizeChanged(PACKAGE_NAME);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.storage_type_internal, SIZE_STR));
+ }
+
+ @Test
+ public void onCreate_otherPackageSizeChange_doesNotUpdateSummary() {
+ when(mMockApplicationsState.getEntry(PACKAGE_NAME, UserHandle.myUserId()))
+ .thenReturn(mMockAppEntry);
+ mPreferenceController.setAppEntry(mMockAppEntry);
+ mPreferenceController.setAppState(mMockApplicationsState);
+ mPreferenceController.setPackageName(PACKAGE_NAME);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.memory_calculating_size));
+
+ mMockAppEntry.sizeStr = SIZE_STR;
+ mPreferenceController.mApplicationStateCallbacks.onPackageSizeChanged("other_package");
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.memory_calculating_size));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java
new file mode 100644
index 0000000..b5bea66
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.internal.app.AssistUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class AssistConfigBasePreferenceControllerTest {
+
+ private static final String TEST_PACKAGE_NAME = "com.test.package";
+ private static final String TEST_SERVICE = "TestService";
+ private final int mUserId = UserHandle.myUserId();
+ private static final Uri ASSIST_URI = Settings.Secure.getUriFor(Settings.Secure.ASSISTANT);
+ private static final Uri ASSIST_STRUCTURE_URI =
+ Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED);
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private TwoStatePreference mPreference;
+ private TestAssistConfigBasePreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private ComponentName mComponentName;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private AssistUtils mMockAssistUtils;
+ @Mock
+ private ContentResolver mMockContentResolver;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mComponentName = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
+
+ mPreference = new SwitchPreference(mContext);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new TestAssistConfigBasePreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockAssistUtils);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ }
+
+ @Test
+ public void getAvailabilityStatus_hasAssistComponent_isAvailable() {
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(mComponentName);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_noAssistComponent_conditionallyUnavailable() {
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(null);
+ assertThat(mPreferenceController.getAvailabilityStatus())
+ .isEqualTo(CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
+ public void onStart_registersObserver() {
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(mComponentName);
+ when(mContext.getContentResolver()).thenReturn(mMockContentResolver);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ verify(mMockContentResolver).registerContentObserver(eq(ASSIST_URI), eq(false),
+ any());
+ verify(mMockContentResolver).registerContentObserver(eq(ASSIST_STRUCTURE_URI),
+ eq(false), any());
+ }
+
+ @Test
+ public void onStop_unregistersObserver() {
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(mComponentName);
+ when(mContext.getContentResolver()).thenReturn(mMockContentResolver);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.onStop(mLifecycleOwner);
+
+ verify(mMockContentResolver).unregisterContentObserver(any());
+ }
+
+ @Test
+ public void onChange_changeRegisteredSetting_callsRefreshUi() {
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(mComponentName);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ int currentCount = mPreferenceController.getNumCallsToUpdateState();
+ mPreferenceController.mSettingObserver
+ .onChange(/* selfChange= */ false, ASSIST_STRUCTURE_URI);
+
+ assertThat(mPreferenceController.getNumCallsToUpdateState())
+ .isEqualTo(currentCount + 1);
+ }
+
+ private static class TestAssistConfigBasePreferenceController extends
+ AssistConfigBasePreferenceController {
+
+ private int mNumCallsToUpdateState;
+
+ TestAssistConfigBasePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions,
+ AssistUtils assistUtils) {
+ super(context, preferenceKey, fragmentController, uxRestrictions, assistUtils);
+ mNumCallsToUpdateState = 0;
+ }
+
+ public int getNumCallsToUpdateState() {
+ return mNumCallsToUpdateState;
+ }
+
+ @Override
+ protected void updateState(TwoStatePreference preference) {
+ mNumCallsToUpdateState++;
+ }
+
+ @Override
+ protected List<Uri> getSettingUris() {
+ return Collections.singletonList(ASSIST_STRUCTURE_URI);
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..da4f2d4
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiTwoActionIconPreference;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.internal.app.AssistUtils;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+@RunWith(AndroidJUnit4.class)
+public class DefaultVoiceInputPickerEntryPreferenceControllerTest {
+
+ private static final String TEST_PACKAGE = "com.android.car.settings.testutils";
+ private static final String TEST_ASSIST = "TestAssistService";
+ private static final String TEST_VOICE = "TestVoiceService";
+ private static final Uri ASSIST_URI = Settings.Secure.getUriFor(Settings.Secure.ASSISTANT);
+ private final int mUserId = UserHandle.myUserId();
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private CarUiTwoActionIconPreference mPreference;
+ private DefaultVoiceInputPickerEntryPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private MockitoSession mSession;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private AssistUtils mMockAssistUtils;
+ @Mock
+ private VoiceInputInfoProvider mMockVoiceInputInfoProvider;
+ @Mock
+ private VoiceInputInfoProvider.VoiceInputInfo mMockVoiceInputInfo;
+ @Mock
+ private ContentResolver mMockContentResolver;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mPreference = new CarUiTwoActionIconPreference(mContext);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new DefaultVoiceInputPickerEntryPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockVoiceInputInfoProvider, mMockAssistUtils);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+
+ mSession = ExtendedMockito.mockitoSession().mockStatic(
+ VoiceInputUtils.class, withSettings().lenient()).startMocking();
+
+ ExtendedMockito.when(VoiceInputUtils.getCurrentService(mContext)).thenReturn(
+ new ComponentName(TEST_PACKAGE, TEST_ASSIST));
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(
+ new ComponentName(TEST_PACKAGE, TEST_VOICE));
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void getAvailabilityStatus_sameComponents_returnsConditionallyUnavailable() {
+ ExtendedMockito.when(VoiceInputUtils.getCurrentService(mContext)).thenReturn(
+ new ComponentName(TEST_PACKAGE, TEST_VOICE));
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(
+ new ComponentName(TEST_PACKAGE, TEST_VOICE));
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
+ CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_bothNull_returnsConditionallyUnavailable() {
+ ExtendedMockito.when(VoiceInputUtils.getCurrentService(mContext)).thenReturn(null);
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(null);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
+ CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_differentComponents_returnsAvailable() {
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
+ PreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void onStart_registersObserver() {
+ when(mContext.getContentResolver()).thenReturn(mMockContentResolver);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ verify(mMockContentResolver).registerContentObserver(eq(ASSIST_URI), eq(false),
+ any());
+ }
+
+ @Test
+ public void onStop_unregistersObserver() {
+ when(mContext.getContentResolver()).thenReturn(mMockContentResolver);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.onStop(mLifecycleOwner);
+
+ verify(mMockContentResolver).unregisterContentObserver(any());
+ }
+
+ @Test
+ public void onChange_changeRegisteredSetting_callsRefreshUi() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus())
+ .isEqualTo(PreferenceController.AVAILABLE);
+
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(
+ new ComponentName(TEST_PACKAGE, TEST_ASSIST));
+ mPreferenceController.mSettingObserver.onChange(/* selfChange= */ false,
+ Settings.Secure.getUriFor(Settings.Secure.ASSISTANT));
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
+ PreferenceController.CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
+ public void getCurrentDefaultAppInfo_providerHasCurrentService_returnsValidDefaultAppInfo() {
+ when(mMockVoiceInputInfoProvider.getInfoForComponent(any()))
+ .thenReturn(mMockVoiceInputInfo);
+
+ assertThat(mPreferenceController.getCurrentDefaultAppInfo()).isNotNull();
+ }
+
+ @Test
+ public void getCurrentDefaultAppInfo_providerHasNoService_returnsNull() {
+ when(mMockVoiceInputInfoProvider.getInfoForComponent(any())).thenReturn(null);
+ assertThat(mPreferenceController.getCurrentDefaultAppInfo()).isNull();
+ }
+
+ @Test
+ public void getSettingIntent_nullInput_returnsNull() {
+ assertThat(mPreferenceController.getSettingIntent(null)).isEqualTo(null);
+ }
+
+ @Test
+ public void getSettingIntent_inputIsWrongType_returnsNull() {
+ DefaultAppInfo info = mock(DefaultAppInfo.class);
+ assertThat(mPreferenceController.getSettingIntent(info)).isEqualTo(null);
+ }
+
+ @Test
+ public void getSettingIntent_validInput_returnsIntent() {
+ Intent intent = new Intent();
+ DefaultVoiceInputServiceInfo info = mock(DefaultVoiceInputServiceInfo.class);
+ when(info.getSettingIntent()).thenReturn(intent);
+
+ assertThat(mPreferenceController.getSettingIntent(info)).isEqualTo(intent);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java
new file mode 100644
index 0000000..9b9aed3
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.internal.app.AssistUtils;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class DefaultVoiceInputPickerPreferenceControllerTest {
+
+ private static final String TEST_PACKAGE_NAME = "com.test.package";
+ private static final String TEST_SERVICE = "TestService";
+ private static final String TEST_OTHER_SERVICE = "TestOtherService";
+ private static final String TEST_RECOGNIZER = "TestRecognizer";
+ private final int mUserId = UserHandle.myUserId();
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LogicalPreferenceGroup mPreference;
+ private DefaultVoiceInputPickerPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private MockitoSession mSession;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private AssistUtils mMockAssistUtils;
+ @Mock
+ private VoiceInputInfoProvider mMockVoiceInputInfoProvider;
+ @Mock
+ private VoiceInputInfoProvider.VoiceInteractionInfo mMockVoiceInteractionInfo;
+ @Mock
+ private VoiceInputInfoProvider.VoiceRecognitionInfo mMockVoiceRecognitionInfo;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mSession = ExtendedMockito.mockitoSession().mockStatic(
+ VoiceInputUtils.class, withSettings().lenient()).startMocking();
+
+ ExtendedMockito.when(VoiceInputUtils.getCurrentService(mContext)).thenReturn(
+ new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE));
+ when(mMockAssistUtils.getAssistComponentForUser(mUserId)).thenReturn(
+ new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE));
+
+ mPreference = new LogicalPreferenceGroup(mContext);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new DefaultVoiceInputPickerPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockAssistUtils, mMockVoiceInputInfoProvider);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ }
+
+ @After
+ @UiThreadTest
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void getCandidates_voiceInteractionService_hasOneElement() {
+ when(mMockVoiceInputInfoProvider.getVoiceInteractionInfoList()).thenReturn(
+ Collections.singletonList(mMockVoiceInteractionInfo));
+ when(mMockVoiceInteractionInfo.getComponentName()).thenReturn(
+ new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE));
+ when(mMockVoiceInputInfoProvider.getVoiceRecognitionInfoList()).thenReturn(
+ Collections.emptyList());
+
+ assertThat(mPreferenceController.getCandidates()).hasSize(1);
+ }
+
+ @Test
+ public void getCandidates_voiceRecognitionService_hasOneElement() {
+ when(mMockVoiceInputInfoProvider.getVoiceInteractionInfoList()).thenReturn(
+ Collections.emptyList());
+ when(mMockVoiceInputInfoProvider.getVoiceRecognitionInfoList()).thenReturn(
+ Collections.singletonList(mMockVoiceRecognitionInfo));
+
+ assertThat(mPreferenceController.getCandidates()).hasSize(1);
+ }
+
+ @Test
+ public void getCandidates_oneIsSameAsAssistant_hasTwoElements() {
+ when(mMockVoiceInputInfoProvider.getVoiceInteractionInfoList()).thenReturn(
+ Collections.singletonList(mMockVoiceInteractionInfo));
+ when(mMockVoiceInteractionInfo.getComponentName()).thenReturn(
+ new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE));
+ when(mMockVoiceInputInfoProvider.getVoiceRecognitionInfoList()).thenReturn(
+ Collections.singletonList(mMockVoiceRecognitionInfo));
+
+ assertThat(mPreferenceController.getCandidates()).hasSize(2);
+ }
+
+ @Test
+ public void getCandidates_oneIsSameAsAssistant_sameOneIsEnabled() {
+ when(mMockVoiceInputInfoProvider.getVoiceInteractionInfoList()).thenReturn(
+ Collections.singletonList(mMockVoiceInteractionInfo));
+ when(mMockVoiceInteractionInfo.getComponentName()).thenReturn(
+ new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE));
+ when(mMockVoiceInputInfoProvider.getVoiceRecognitionInfoList()).thenReturn(
+ Collections.emptyList());
+
+ List<DefaultAppInfo> defaultAppInfo = mPreferenceController.getCandidates();
+ assertThat(defaultAppInfo).hasSize(1);
+
+ assertThat(defaultAppInfo.get(0)).isNotNull();
+ assertThat(defaultAppInfo.get(0).enabled).isTrue();
+ }
+
+ @Test
+ public void getCandidates_oneIsSameAsAssistant_differentOneIsDisabled() {
+ when(mMockVoiceInputInfoProvider.getVoiceInteractionInfoList()).thenReturn(
+ Collections.singletonList(mMockVoiceInteractionInfo));
+ when(mMockVoiceInteractionInfo.getComponentName()).thenReturn(
+ new ComponentName(TEST_PACKAGE_NAME, TEST_OTHER_SERVICE));
+ when(mMockVoiceInputInfoProvider.getVoiceRecognitionInfoList()).thenReturn(
+ Collections.emptyList());
+
+ List<DefaultAppInfo> defaultAppInfo = mPreferenceController.getCandidates();
+ assertThat(defaultAppInfo).hasSize(1);
+
+ assertThat(defaultAppInfo.get(0)).isNotNull();
+ assertThat(defaultAppInfo.get(0).enabled).isFalse();
+ }
+
+ @Test
+ public void getCandidates_voiceRecognitionInfo_IsEnabled() {
+ when(mMockVoiceInputInfoProvider.getVoiceInteractionInfoList()).thenReturn(
+ Collections.singletonList(mMockVoiceInteractionInfo));
+ when(mMockVoiceInteractionInfo.getComponentName()).thenReturn(
+ new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE));
+ when(mMockVoiceInputInfoProvider.getVoiceRecognitionInfoList()).thenReturn(
+ Collections.singletonList(mMockVoiceRecognitionInfo));
+ when(mMockVoiceRecognitionInfo.getComponentName()).thenReturn(
+ new ComponentName(TEST_PACKAGE_NAME, TEST_OTHER_SERVICE));
+
+ DefaultAppInfo defaultAppInfo = null;
+ for (DefaultAppInfo info : mPreferenceController.getCandidates()) {
+ if (info.componentName.equals(
+ new ComponentName(TEST_PACKAGE_NAME, TEST_OTHER_SERVICE))) {
+ defaultAppInfo = info;
+ }
+ }
+ assertThat(defaultAppInfo).isNotNull();
+ assertThat(defaultAppInfo.enabled).isTrue();
+ }
+
+ @Test
+ public void getCurrentDefaultKey_defaultIsNull_returnsNull() {
+ ExtendedMockito.when(VoiceInputUtils.getCurrentService(mContext)).thenReturn(null);
+
+ assertThat(mPreferenceController.getCurrentDefaultKey()).isNull();
+ }
+
+ @Test
+ public void getCurrentDefaultKey_defaultExists_returnsComponentName() {
+ ComponentName cn = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
+
+ assertThat(mPreferenceController.getCurrentDefaultKey()).isEqualTo(cn.flattenToString());
+ }
+
+ @Test
+ public void setCurrentDefault_typeVoiceInteractionInfo_setsServices() {
+ when(mMockVoiceInputInfoProvider.getInfoForComponent(any()))
+ .thenReturn(mMockVoiceInteractionInfo);
+ when(mMockVoiceInteractionInfo.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ when(mMockVoiceInteractionInfo.getRecognitionService()).thenReturn(TEST_RECOGNIZER);
+ String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+ String recognizer = new ComponentName(TEST_PACKAGE_NAME, TEST_RECOGNIZER).flattenToString();
+ mPreferenceController.setCurrentDefault(key);
+
+ assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+ Settings.Secure.VOICE_INTERACTION_SERVICE)).isEqualTo(key);
+ assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+ Settings.Secure.VOICE_RECOGNITION_SERVICE)).isEqualTo(recognizer);
+ }
+
+ @Test
+ public void setCurrentDefault_typeVoiceRecognitionInfo_setsRecognitionService() {
+ when(mMockVoiceInputInfoProvider.getInfoForComponent(any()))
+ .thenReturn(mMockVoiceRecognitionInfo);
+ String key = new ComponentName(TEST_PACKAGE_NAME, TEST_RECOGNIZER).flattenToString();
+ mPreferenceController.setCurrentDefault(key);
+
+ assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+ Settings.Secure.VOICE_INTERACTION_SERVICE)).isEmpty();
+ assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+ Settings.Secure.VOICE_RECOGNITION_SERVICE)).isEqualTo(key);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java
new file mode 100644
index 0000000..8f1c61d
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.TwoStatePreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiSwitchPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class ScreenshotContextPreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private TwoStatePreference mPreference;
+ private ScreenshotContextPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mPreference = new CarUiSwitchPreference(mContext);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new ScreenshotContextPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @Test
+ public void refreshUi_screenshotEnabled_preferenceChecked() {
+ mPreference.setChecked(false);
+
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void refreshUi_screenshotDisabled_preferenceUnchecked() {
+ mPreference.setChecked(true);
+
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void refreshUi_structureEnabled_preferenceEnabled() {
+ mPreference.setEnabled(false);
+
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void refreshUi_structureDisabled_preferenceDisabled() {
+ mPreference.setEnabled(true);
+
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void callChangeListener_toggleTrue_screenshotEnabled() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0);
+ mPreference.callChangeListener(true);
+
+ assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0)).isEqualTo(1);
+ }
+
+ @Test
+ public void callChangeListener_toggleFalse_screenshotDisabled() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1);
+ mPreference.callChangeListener(false);
+
+ assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1)).isEqualTo(0);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java
new file mode 100644
index 0000000..ce093a9
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.TwoStatePreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiSwitchPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class TextContextPreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private TwoStatePreference mPreference;
+ private TextContextPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mPreference = new CarUiSwitchPreference(mContext);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new TextContextPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @Test
+ public void refreshUi_contextEnabled_preferenceChecked() {
+ mPreference.setChecked(false);
+
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void refreshUi_contextDisabled_preferenceUnchecked() {
+ mPreference.setChecked(true);
+
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void callChangeListener_toggleTrue_contextEnabled() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0);
+ mPreference.callChangeListener(true);
+
+ assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0)).isEqualTo(1);
+ }
+
+ @Test
+ public void callChangeListener_toggleFalse_contextDisabled() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1);
+ mPreference.callChangeListener(false);
+
+ assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1)).isEqualTo(0);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java b/tests/unit/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java
new file mode 100644
index 0000000..8f69395
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+
+import static com.android.car.settings.applications.assist.VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG;
+import static com.android.car.settings.applications.assist.VoiceInputInfoProvider.VOICE_RECOGNITION_SERVICE_TAG;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.service.voice.VoiceInteractionServiceInfo;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class VoiceInputInfoProviderTest {
+
+ private static final String TEST_PACKAGE = "test.package";
+ private static final String TEST_CLASS = "Class1";
+ private static final String TEST_RECOGNITION_SERVICE = "Recognition1";
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private VoiceInputInfoProvider mVoiceInputInfoProvider;
+
+ @Mock
+ private PackageManager mMockPackageManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void getInteractionInfoList_hasElement() {
+ ResolveInfo resolveInfo = new ResolveInfo();
+ resolveInfo.serviceInfo = new ServiceInfo();
+ resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
+ resolveInfo.serviceInfo.name = TEST_CLASS;
+ resolveInfo.serviceInfo.permission = Manifest.permission.BIND_VOICE_INTERACTION;
+
+ List<ResolveInfo> resolveInfoList = new ArrayList<>();
+ resolveInfoList.add(resolveInfo);
+
+ when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockPackageManager.queryIntentServices(VOICE_INTERACTION_SERVICE_TAG,
+ PackageManager.GET_META_DATA)).thenReturn(resolveInfoList);
+
+ mVoiceInputInfoProvider = new TestVoiceInputInfoProvider(mContext);
+
+ assertThat(mVoiceInputInfoProvider.getVoiceInteractionInfoList()).hasSize(1);
+ }
+
+ @Test
+ public void getRecognitionInfoList_hasElement() {
+ ResolveInfo otherInfo = new ResolveInfo();
+ otherInfo.serviceInfo = new ServiceInfo();
+ otherInfo.serviceInfo.packageName = TEST_PACKAGE;
+ otherInfo.serviceInfo.name = TEST_RECOGNITION_SERVICE;
+
+ List<ResolveInfo> resolveInfoList = new ArrayList<>();
+ resolveInfoList.add(otherInfo);
+
+ when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockPackageManager.queryIntentServices(VOICE_RECOGNITION_SERVICE_TAG,
+ PackageManager.GET_META_DATA)).thenReturn(resolveInfoList);
+
+ mVoiceInputInfoProvider = new TestVoiceInputInfoProvider(mContext);
+
+ assertThat(mVoiceInputInfoProvider.getVoiceRecognitionInfoList()).hasSize(1);
+ }
+
+ private static class TestVoiceInputInfoProvider extends VoiceInputInfoProvider {
+
+ TestVoiceInputInfoProvider(Context context) {
+ super(context);
+ }
+
+ @Override
+ boolean hasParseError(VoiceInteractionServiceInfo voiceInteractionServiceInfo) {
+ return false;
+ }
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java b/tests/unit/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
similarity index 82%
rename from tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
rename to tests/unit/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
index 746c10d..2036e57 100644
--- a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
+++ b/tests/unit/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,38 +22,27 @@
import android.content.Context;
import android.provider.Settings;
-import com.android.car.settings.testutils.ShadowSecureSettings;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
-import org.junit.After;
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowSecureSettings.class})
+@RunWith(AndroidJUnit4.class)
public class VoiceInputUtilsTest {
private static final String TEST_PACKAGE = "test.package";
private static final String TEST_CLASS_1 = "Class1";
private static final String TEST_CLASS_2 = "Class2";
- private Context mContext;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- }
-
- @After
- public void tearDown() {
- ShadowSecureSettings.reset();
- }
+ private Context mContext = ApplicationProvider.getApplicationContext();
@Test
public void getCurrentService_nullInteraction_nullRecognition_returnsNull() {
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.VOICE_INTERACTION_SERVICE, null);
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.VOICE_RECOGNITION_SERVICE, null);
assertThat(VoiceInputUtils.getCurrentService(mContext)).isNull();
}
diff --git a/tests/unit/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java
index 45f2635..ca794e2 100644
--- a/tests/unit/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java
@@ -85,6 +85,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_noCandidates_hasSingleNoneElement() {
mController.setCurrentDefault("");
mController.onCreate(mLifecycleOwner);
@@ -100,6 +101,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_noCandidates_noNoneElement() {
mController.setCurrentDefault("");
mController.setIncludeNonePreference(false);
@@ -111,6 +113,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_hasAdditionalCandidate_hasTwoElements() {
String testKey = "testKey";
@@ -125,6 +128,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_hasAdditionalCandidateAsDefault_secondElementIsSelected() {
String testKey = "testKey";
@@ -141,6 +145,7 @@
}
@Test
+ @UiThreadTest
public void performClick_currentDefaultApp_nothingHappened() {
String testKey = "testKey";
@@ -169,6 +174,7 @@
}
@Test
+ @UiThreadTest
public void performClick_otherOptionNoMessage_otherOptionSelected() {
String testKey = "testKey";
@@ -198,6 +204,7 @@
}
@Test
+ @UiThreadTest
public void performClick_otherOptionHasMessage_dialogOpened() {
String testKey = "testKey";
@@ -225,6 +232,7 @@
}
@Test
+ @UiThreadTest
public void performClick_otherOptionNoMessage_newKeySet() {
String testKey = "testKey";
diff --git a/tests/unit/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java
new file mode 100644
index 0000000..402d8ca
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
+
+import static com.android.car.settings.applications.managedomainurls.AppLaunchSettingsBasePreferenceController.sBrowserIntent;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.UserHandle;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.ListPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+
+@RunWith(AndroidJUnit4.class)
+public class AppLinkStatePreferenceControllerTest {
+
+ private static final String TEST_PACKAGE_NAME = "com.example.test";
+ private static final int TEST_PACKAGE_ID = 1;
+ private static final String TEST_PATH = "TEST_PATH";
+ private final int mUserId = UserHandle.myUserId();
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private ListPreference mPreference;
+ private AppLinkStatePreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private PackageManager mMockPackageManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mPreference = new ListPreference(mContext);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new AppLinkStatePreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockPackageManager);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ }
+
+ @Test
+ public void onCreate_isBrowserApp_isDisabled() {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+
+ setupIsBrowserApp(true);
+
+ mPreferenceController.setAppEntry(entry);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void onCreate_isNotBrowserApp_noDomainUrls_isDisabled() {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ info.privateFlags = 0;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+
+ setupIsBrowserApp(false);
+
+ mPreferenceController.setAppEntry(entry);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void onCreate_isNotBrowserApp_hasDomainUrls_isEnabled() {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+
+ setupIsBrowserApp(false);
+
+ mPreferenceController.setAppEntry(entry);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void onCreate_isNotBrowserApp_hasDomainUrls_defaultState_entrySetToAsk() {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+
+ setupIsBrowserApp(false);
+ when(mMockPackageManager.getIntentVerificationStatusAsUser(TEST_PACKAGE_NAME, mUserId))
+ .thenReturn(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED);
+
+ mPreferenceController.setAppEntry(entry);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.getEntry()).isEqualTo(
+ mContext.getString(R.string.app_link_open_ask));
+ }
+
+ @Test
+ public void onCreate_isNotBrowserApp_hasDomainUrls_askState_entrySetToAsk() {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+
+ setupIsBrowserApp(false);
+ when(mMockPackageManager.getIntentVerificationStatusAsUser(TEST_PACKAGE_NAME, mUserId))
+ .thenReturn(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK);
+
+ mPreferenceController.setAppEntry(entry);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.getEntry()).isEqualTo(
+ mContext.getString(R.string.app_link_open_ask));
+ }
+
+ @Test
+ public void onCreate_isNotBrowserApp_hasDomainUrls_alwaysState_entrySetToAlways() {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+
+ setupIsBrowserApp(false);
+ when(mMockPackageManager.getIntentVerificationStatusAsUser(TEST_PACKAGE_NAME, mUserId))
+ .thenReturn(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
+
+ mPreferenceController.setAppEntry(entry);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.getEntry()).isEqualTo(
+ mContext.getString(R.string.app_link_open_always));
+ }
+
+ @Test
+ public void onCreate_isNotBrowserApp_hasDomainUrls_neverState_entrySetToNever() {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+
+ setupIsBrowserApp(false);
+ when(mMockPackageManager.getIntentVerificationStatusAsUser(TEST_PACKAGE_NAME, mUserId))
+ .thenReturn(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
+
+ mPreferenceController.setAppEntry(entry);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.getEntry()).isEqualTo(
+ mContext.getString(R.string.app_link_open_never));
+ }
+
+ private void setupIsBrowserApp(boolean isBrowserApp) {
+ ResolveInfo resolveInfo = new ResolveInfo();
+ resolveInfo.activityInfo = new ActivityInfo();
+ resolveInfo.handleAllWebDataURI = isBrowserApp;
+ sBrowserIntent.setPackage(TEST_PACKAGE_NAME);
+
+ when(mMockPackageManager.queryIntentActivitiesAsUser(sBrowserIntent,
+ PackageManager.MATCH_ALL, mUserId)).thenReturn(
+ Collections.singletonList(resolveInfo));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java
new file mode 100644
index 0000000..9b8779f
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.hardware.usb.IUsbManager;
+import android.os.RemoteException;
+import android.os.UserHandle;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.applications.AppUtils;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+@RunWith(AndroidJUnit4.class)
+public class ClearDefaultsPreferenceControllerTest {
+
+ private static final String TEST_PACKAGE_NAME = "com.example.test";
+ private static final String TEST_OTHER_PACKAGE_NAME = "com.example.other.test";
+ private static final int TEST_PACKAGE_ID = 1;
+ private static final String TEST_PATH = "TEST_PATH";
+ private final int mUserId = UserHandle.myUserId();
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private CarUiPreference mPreference;
+ private ClearDefaultsPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private MockitoSession mSession;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private PackageManager mMockPackageManager;
+ @Mock
+ private IUsbManager mMockIUsbManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mPreference = new CarUiPreference(mContext);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new ClearDefaultsPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockPackageManager, mMockIUsbManager);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+
+ mSession = ExtendedMockito.mockitoSession().mockStatic(
+ AppUtils.class, withSettings().lenient()).startMocking();
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void onCreate_hasPreferredActivities_hasSummary() {
+ ExtendedMockito.when(AppUtils.hasPreferredActivities(mMockPackageManager,
+ TEST_PACKAGE_NAME)).thenReturn(true);
+
+ setupPreferenceController();
+
+ assertThat(mPreference.getSummary().toString()).isNotEmpty();
+ }
+
+ @Test
+ public void onCreate_isDefaultBrowser_hasSummary() {
+ ExtendedMockito.when(AppUtils.hasPreferredActivities(mMockPackageManager,
+ TEST_PACKAGE_NAME)).thenReturn(false);
+ when(mMockPackageManager.getDefaultBrowserPackageNameAsUser(mUserId))
+ .thenReturn(TEST_PACKAGE_NAME);
+
+ setupPreferenceController();
+
+ assertThat(mPreference.getSummary().toString()).isNotEmpty();
+ }
+
+ @Test
+ public void onCreate_hasUsbDefaults_hasSummary() throws RemoteException {
+ ExtendedMockito.when(AppUtils.hasPreferredActivities(mMockPackageManager,
+ TEST_PACKAGE_NAME)).thenReturn(false);
+ when(mMockPackageManager.getDefaultBrowserPackageNameAsUser(mUserId))
+ .thenReturn(TEST_OTHER_PACKAGE_NAME);
+ when(mMockIUsbManager.hasDefaults(TEST_PACKAGE_NAME, mUserId)).thenReturn(true);
+
+ setupPreferenceController();
+
+ assertThat(mPreference.getSummary().toString()).isNotEmpty();
+ }
+
+ @Test
+ public void onCreate_autoLaunchDisabled_hasNoSummary() throws RemoteException {
+ ExtendedMockito.when(AppUtils.hasPreferredActivities(mMockPackageManager,
+ TEST_PACKAGE_NAME)).thenReturn(false);
+ when(mMockPackageManager.getDefaultBrowserPackageNameAsUser(mUserId))
+ .thenReturn(TEST_OTHER_PACKAGE_NAME);
+ when(mMockIUsbManager.hasDefaults(TEST_PACKAGE_NAME, mUserId)).thenReturn(false);
+
+ setupPreferenceController();
+
+ assertThat(mPreference.getSummary()).isNull();
+ }
+
+ @Test
+ public void performClick_hasUsbManager_hasPreferredActivities_clearsPreferredActivities() {
+ ExtendedMockito.when(AppUtils.hasPreferredActivities(mMockPackageManager,
+ TEST_PACKAGE_NAME)).thenReturn(true);
+ when(mMockPackageManager.getDefaultBrowserPackageNameAsUser(mUserId))
+ .thenReturn(TEST_OTHER_PACKAGE_NAME);
+
+ setupPreferenceController();
+ mPreference.performClick();
+
+ verify(mMockPackageManager).clearPackagePreferredActivities(TEST_PACKAGE_NAME);
+ }
+
+ @Test
+ public void performClick_hasUsbManager_isDefaultBrowser_clearsDefaultBrowser() {
+ ExtendedMockito.when(AppUtils.hasPreferredActivities(mMockPackageManager,
+ TEST_PACKAGE_NAME)).thenReturn(false);
+ when(mMockPackageManager.getDefaultBrowserPackageNameAsUser(mUserId))
+ .thenReturn(TEST_PACKAGE_NAME);
+
+ setupPreferenceController();
+ mPreference.performClick();
+
+ verify(mMockPackageManager).setDefaultBrowserPackageNameAsUser(/* packageName= */ null,
+ mUserId);
+ }
+
+ @Test
+ public void performClick_hasUsbDefaults_clearsUsbDefaults() throws RemoteException {
+ ExtendedMockito.when(AppUtils.hasPreferredActivities(mMockPackageManager,
+ TEST_PACKAGE_NAME)).thenReturn(false);
+ when(mMockPackageManager.getDefaultBrowserPackageNameAsUser(mUserId))
+ .thenReturn(TEST_OTHER_PACKAGE_NAME);
+ when(mMockIUsbManager.hasDefaults(TEST_PACKAGE_NAME, mUserId)).thenReturn(true);
+
+ setupPreferenceController();
+ mPreference.performClick();
+
+ verify(mMockIUsbManager).clearDefaults(TEST_PACKAGE_NAME, mUserId);
+ }
+
+ private void setupPreferenceController() {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+
+ mPreferenceController.setAppEntry(entry);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
new file mode 100644
index 0000000..1e10e01
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+
+@RunWith(AndroidJUnit4.class)
+public class DomainAppPreferenceControllerTest {
+
+ private static final String TEST_PACKAGE_NAME = "com.android.test.package";
+ private static final int TEST_PACKAGE_ID = 1;
+ private static final String TEST_LABEL = "Test App";
+ private static final String TEST_PATH = "TEST_PATH";
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private PreferenceGroup mPreferenceGroup;
+ private DomainAppPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private PackageManager mMockPackageManager;
+ @Mock
+ private ApplicationsState mMockApplicationsState;
+ @Mock
+ private ApplicationsState.Session mMockSession;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new DomainAppPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockApplicationsState, mMockPackageManager);
+ }
+
+ @Test
+ public void checkInitialized_noLifecycle_throwsError() {
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mPreferenceGroup));
+ }
+
+ @Test
+ public void onRebuildComplete_sessionLoadsValues_preferenceGroupHasValues() {
+ setupPreferenceController();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+ entry.label = TEST_LABEL;
+ apps.add(entry);
+ mPreferenceController.mApplicationStateCallbacks.onRebuildComplete(apps);
+
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+ }
+
+ @Test
+ @UiThreadTest
+ public void performClick_startsApplicationLaunchSettingsFragmentWithPackageName() {
+ setupPreferenceController();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = TEST_PACKAGE_NAME;
+ info.uid = TEST_PACKAGE_ID;
+ info.sourceDir = TEST_PATH;
+ ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+ TEST_PACKAGE_ID);
+ entry.label = TEST_LABEL;
+ apps.add(entry);
+ mPreferenceController.mApplicationStateCallbacks.onRebuildComplete(apps);
+
+ Preference preference = mPreferenceGroup.getPreference(0);
+ preference.performClick();
+
+ ArgumentCaptor<ApplicationLaunchSettingsFragment> captor = ArgumentCaptor.forClass(
+ ApplicationLaunchSettingsFragment.class);
+ verify(mMockFragmentController).launchFragment(captor.capture());
+
+ String pkgName = captor.getValue().getArguments().getString(
+ ApplicationLaunchSettingsFragment.ARG_PACKAGE_NAME);
+ assertThat(pkgName).isEqualTo(TEST_PACKAGE_NAME);
+ }
+
+ private void setupPreferenceController() {
+ when(mMockApplicationsState.newSession(any(), any())).thenReturn(mMockSession);
+ mPreferenceController.setLifecycle(mLifecycleOwner.getLifecycle());
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java b/tests/unit/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java
new file mode 100644
index 0000000..3689637
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.IntentFilterVerificationInfo;
+import android.content.pm.PackageManager;
+import android.util.ArraySet;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+
+@RunWith(AndroidJUnit4.class)
+public class DomainUrlsUtilsTest {
+
+ private static final String TEST_PACKAGE = "com.test.android.Package";
+ private static final int USER_ID = 10;
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+
+ @Mock
+ private PackageManager mMockPackageManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void getDomainsSummary_domainStatusSetToNever_showNoneText() {
+ when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockPackageManager.getIntentVerificationStatusAsUser(TEST_PACKAGE, USER_ID))
+ .thenReturn(PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
+
+ assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
+ new ArraySet<>())).isEqualTo(mContext.getString(R.string.domain_urls_summary_none));
+ }
+
+ @Test
+ public void getDomainsSummary_domainStatusSet_noDomains_showNoneText() {
+ when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockPackageManager.getIntentVerificationStatusAsUser(TEST_PACKAGE, USER_ID))
+ .thenReturn(PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK);
+
+ assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
+ new ArraySet<>())).isEqualTo(mContext.getString(R.string.domain_urls_summary_none));
+ }
+
+ @Test
+ public void getDomainsSummary_domainStatusSet_oneDomain_showSingleDomain() {
+ when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockPackageManager.getIntentVerificationStatusAsUser(TEST_PACKAGE, USER_ID))
+ .thenReturn(PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK);
+ ArraySet<String> domains = new ArraySet<>();
+ domains.add("test.domain.com");
+
+ assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
+ domains)).isEqualTo(
+ mContext.getString(R.string.domain_urls_summary_one, domains.valueAt(0)));
+ }
+
+ @Test
+ public void getDomainsSummary_domainStatusSet_multipleDomain_showMultipleDomains() {
+ when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockPackageManager.getIntentVerificationStatusAsUser(TEST_PACKAGE, USER_ID))
+ .thenReturn(PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK);
+ ArraySet<String> domains = new ArraySet<>();
+ domains.add("test.domain.com");
+ domains.add("test.domain2.com");
+
+ assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
+ domains)).isEqualTo(
+ mContext.getString(R.string.domain_urls_summary_some, domains.valueAt(0)));
+ }
+
+ @Test
+ public void getHandledDomains_includeIntentFilterVerificationInfoDomains() {
+ String domain = "test.domain.com";
+ ArraySet<String> domains = new ArraySet<>();
+ domains.add(domain);
+ IntentFilterVerificationInfo info = new IntentFilterVerificationInfo(TEST_PACKAGE, domains);
+ when(mMockPackageManager.getIntentFilterVerifications(TEST_PACKAGE))
+ .thenReturn(Arrays.asList(info));
+ when(mMockPackageManager.getAllIntentFilters(TEST_PACKAGE)).thenReturn(null);
+
+ assertThat(DomainUrlsUtils.getHandledDomains(mMockPackageManager, TEST_PACKAGE))
+ .hasSize(1);
+ assertThat(DomainUrlsUtils.getHandledDomains(mMockPackageManager, TEST_PACKAGE))
+ .contains(domain);
+ }
+
+ @Test
+ public void getHandledDomains_includeBrowsableIntentFiltersWithHttpDataScheme() {
+ String domain = "test.domain.com";
+ String port = "80";
+ IntentFilter filter = new IntentFilter();
+ filter.addCategory(Intent.CATEGORY_BROWSABLE);
+ filter.addDataScheme(IntentFilter.SCHEME_HTTP);
+ filter.addDataAuthority(new IntentFilter.AuthorityEntry(domain, port));
+ when(mMockPackageManager.getIntentFilterVerifications(TEST_PACKAGE))
+ .thenReturn(null);
+ when(mMockPackageManager.getAllIntentFilters(TEST_PACKAGE))
+ .thenReturn(Arrays.asList(filter));
+
+ assertThat(DomainUrlsUtils.getHandledDomains(mMockPackageManager, TEST_PACKAGE))
+ .hasSize(1);
+ assertThat(DomainUrlsUtils.getHandledDomains(mMockPackageManager, TEST_PACKAGE))
+ .contains(domain);
+ }
+
+ @Test
+ public void getHandledDomains_includeBrowsableIntentFiltersWithHttpsDataScheme() {
+ String domain = "test.domain.com";
+ String port = "80";
+ IntentFilter filter = new IntentFilter();
+ filter.addCategory(Intent.CATEGORY_BROWSABLE);
+ filter.addDataScheme(IntentFilter.SCHEME_HTTPS);
+ filter.addDataAuthority(new IntentFilter.AuthorityEntry(domain, port));
+ when(mMockPackageManager.getIntentFilterVerifications(TEST_PACKAGE))
+ .thenReturn(null);
+ when(mMockPackageManager.getAllIntentFilters(TEST_PACKAGE))
+ .thenReturn(Arrays.asList(filter));
+
+ assertThat(DomainUrlsUtils.getHandledDomains(mMockPackageManager, TEST_PACKAGE))
+ .hasSize(1);
+ assertThat(DomainUrlsUtils.getHandledDomains(mMockPackageManager, TEST_PACKAGE))
+ .contains(domain);
+ }
+
+ @Test
+ public void getHandledDomains_excludeBrowsableIntentFiltersWithOtherDataScheme() {
+ PackageManager pm = mock(PackageManager.class);
+ String domain = "test.domain.com";
+ String port = "80";
+ IntentFilter filter = new IntentFilter();
+ filter.addCategory(Intent.CATEGORY_BROWSABLE);
+ filter.addDataAuthority(new IntentFilter.AuthorityEntry(domain, port));
+ when(mMockPackageManager.getIntentFilterVerifications(TEST_PACKAGE))
+ .thenReturn(null);
+ when(mMockPackageManager.getAllIntentFilters(TEST_PACKAGE))
+ .thenReturn(Arrays.asList(filter));
+
+ assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).isEmpty();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java b/tests/unit/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java
new file mode 100644
index 0000000..10222bb
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.Looper;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class AppEntryListManagerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private AppEntryListManager mAppEntryListManager;
+
+ @Mock
+ private ApplicationsState mMockApplicationsState;
+ @Mock
+ private ApplicationsState.Session mMockSession;
+ @Mock
+ private AppEntryListManager.ExtraInfoBridge mMockExtraInfoBridge;
+ @Mock
+ private AppEntryListManager.AppFilterProvider mMockFilterProvider;
+ @Mock
+ private AppEntryListManager.Callback mMockCallback;
+ @Captor
+ private ArgumentCaptor<ApplicationsState.Callbacks> mSessionCallbacksCaptor;
+ @Captor
+ private ArgumentCaptor<List<ApplicationsState.AppEntry>> mEntriesCaptor;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mMockApplicationsState.newSession(mSessionCallbacksCaptor.capture()))
+ .thenReturn(mMockSession);
+ when(mMockApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
+
+ mAppEntryListManager = new AppEntryListManager(mContext, mMockApplicationsState);
+ mAppEntryListManager.init(mMockExtraInfoBridge, mMockFilterProvider, mMockCallback);
+ }
+
+ @Test
+ public void start_resumesSession() {
+ mAppEntryListManager.start();
+
+ verify(mMockSession).onResume();
+ }
+
+ @Test
+ public void onPackageListChanged_loadsExtraInfo() {
+ mSessionCallbacksCaptor.getValue().onPackageListChanged();
+
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ verify(mMockExtraInfoBridge).loadExtraInfo(any());
+ }
+
+ @Test
+ public void onLoadEntriesComplete_loadsExtraInfo() {
+ mSessionCallbacksCaptor.getValue().onLoadEntriesCompleted();
+
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ verify(mMockExtraInfoBridge).loadExtraInfo(any());
+ }
+
+ @Test
+ public void stop_pausesSession() {
+ mAppEntryListManager.stop();
+
+ verify(mMockSession).onPause();
+ }
+
+ @Test
+ public void destroy_destroysSession() {
+ mAppEntryListManager.destroy();
+
+ verify(mMockSession).onDestroy();
+ }
+
+ @Test
+ public void forceUpdate_loadsExtraInfo() {
+ ArrayList<ApplicationsState.AppEntry> entries = new ArrayList<>();
+ entries.add(mock(ApplicationsState.AppEntry.class));
+ when(mMockSession.getAllApps()).thenReturn(entries);
+
+ mAppEntryListManager.forceUpdate();
+
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ verify(mMockExtraInfoBridge).loadExtraInfo(entries);
+ }
+
+ @Test
+ public void forceUpdate_forEntry_loadsExtraInfo() {
+ ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class);
+
+ mAppEntryListManager.forceUpdate(entry);
+
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ verify(mMockExtraInfoBridge).loadExtraInfo(mEntriesCaptor.capture());
+ assertThat(mEntriesCaptor.getValue()).containsExactly(entry);
+ }
+
+ @Test
+ public void loadingFinished_rebuildsSession() {
+ ApplicationsState.AppFilter appFilter = mock(ApplicationsState.AppFilter.class);
+ when(mMockFilterProvider.getAppFilter()).thenReturn(appFilter);
+
+ mSessionCallbacksCaptor.getValue().onLoadEntriesCompleted();
+
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ verify(mMockSession).rebuild(eq(appFilter),
+ eq(ApplicationsState.ALPHA_COMPARATOR), /* foreground= */ eq(false));
+ }
+
+ @Test
+ public void onRebuildComplete_callsCallback() {
+ ArrayList<ApplicationsState.AppEntry> entries = new ArrayList<>();
+ entries.add(mock(ApplicationsState.AppEntry.class));
+
+ mSessionCallbacksCaptor.getValue().onRebuildComplete(entries);
+
+ verify(mMockCallback).onAppEntryListChanged(entries);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java
new file mode 100644
index 0000000..ff165db
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java
@@ -0,0 +1,305 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.Manifest;
+import android.app.AppOpsManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Looper;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class AppOpsPreferenceControllerTest {
+
+ private static final int APP_OP_CODE = AppOpsManager.OP_WRITE_SETTINGS;
+ private static final String PERMISSION = Manifest.permission.WRITE_SETTINGS;
+ private static final int NEGATIVE_MODE = AppOpsManager.MODE_ERRORED;
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private PreferenceGroup mPreferenceGroup;
+ private AppOpsPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private AppOpsManager mMockAppOpsManager;
+ @Mock
+ private AppEntryListManager mMockAppEntryListManager;
+ @Mock
+ private ApplicationsState mMockApplicationsState;
+ @Captor
+ private ArgumentCaptor<AppEntryListManager.Callback> mCallbackCaptor;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ when(mMockApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new AppOpsPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockAppOpsManager);
+ }
+
+ @Test
+ public void checkInitialized_noOpCode_throwsIllegalStateException() {
+ mPreferenceController.init(AppOpsManager.OP_NONE, PERMISSION, NEGATIVE_MODE);
+
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil
+ .assignPreference(mPreferenceController, mPreferenceGroup));
+ }
+
+ @Test
+ public void checkInitialized_noPermission_throwsIllegalStateException() {
+ mPreferenceController.init(APP_OP_CODE, /* permission= */ null, NEGATIVE_MODE);
+
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil
+ .assignPreference(mPreferenceController, mPreferenceGroup));
+ }
+
+ @Test
+ public void checkInitialized_noNegativeOpMode_throwsIllegalStateException() {
+ mPreferenceController.init(APP_OP_CODE, PERMISSION, /* negativeOpMode= */-1);
+
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil
+ .assignPreference(mPreferenceController, mPreferenceGroup));
+ }
+
+ @Test
+ public void onStart_startsListManager() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ verify(mMockAppEntryListManager).start();
+ }
+
+ @Test
+ public void onStop_stopsListManager() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.onStop(mLifecycleOwner);
+
+ verify(mMockAppEntryListManager).stop();
+ }
+
+ @Test
+ public void onDestroy_destroysListManager() {
+ setupPreferenceController();
+ mPreferenceController.onDestroy(mLifecycleOwner);
+
+ verify(mMockAppEntryListManager).destroy();
+ }
+
+ @Test
+ public void onAppEntryListChanged_addsPreferencesForEntries() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+ List<ApplicationsState.AppEntry> entries = Arrays.asList(
+ createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */ true),
+ createAppEntry("another.test.package", /* uid= */ 2, /* isOpPermissible= */ false));
+
+ mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+ assertThat(((TwoStatePreference) mPreferenceGroup.getPreference(0)).isChecked()).isTrue();
+ assertThat(((TwoStatePreference) mPreferenceGroup.getPreference(1)).isChecked()).isFalse();
+ }
+
+ @Test
+ public void onPreferenceChange_checkedState_setsAppOpModeAllowed() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+ String packageName = "test.package";
+ int uid = 1;
+ List<ApplicationsState.AppEntry> entries = Collections.singletonList(
+ createAppEntry(packageName, uid, /* isOpPermissible= */ false));
+ mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+ TwoStatePreference appPref = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+ appPref.performClick();
+
+ verify(mMockAppOpsManager).setMode(APP_OP_CODE, uid, packageName,
+ AppOpsManager.MODE_ALLOWED);
+ }
+
+ @Test
+ public void onPreferenceChange_uncheckedState_setsNegativeAppOpMode() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+ String packageName = "test.package";
+ int uid = 1;
+ List<ApplicationsState.AppEntry> entries = Collections.singletonList(
+ createAppEntry(packageName, uid, /* isOpPermissible= */ true));
+ mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+ TwoStatePreference appPref = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+ appPref.performClick();
+
+ verify(mMockAppOpsManager).setMode(APP_OP_CODE, uid, packageName,
+ NEGATIVE_MODE);
+ }
+
+ @Test
+ public void onPreferenceChange_updatesEntry() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+ List<ApplicationsState.AppEntry> entries = Collections.singletonList(
+ createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */ false));
+ mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+ TwoStatePreference appPref = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+ appPref.performClick();
+
+ verify(mMockAppEntryListManager).forceUpdate(entries.get(0));
+ }
+
+ @Test
+ public void showSystem_updatesEntries() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ mPreferenceController.setShowSystem(true);
+
+ verify(mMockAppEntryListManager).forceUpdate();
+ }
+
+ @Test
+ public void appFilter_showingSystemApps_keepsSystemEntries() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.setShowSystem(true);
+ ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
+ ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
+ verify(mMockAppEntryListManager).init(any(), filterCaptor.capture(), any());
+ ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
+
+ ApplicationsState.AppEntry systemApp = createAppEntry("test.package",
+ /* uid= */ 1, /* isOpPermissible= */false);
+ systemApp.info.flags |= ApplicationInfo.FLAG_SYSTEM;
+
+ assertThat(filter.filterApp(systemApp)).isTrue();
+ }
+
+ @Test
+ public void appFilter_notShowingSystemApps_removesSystemEntries() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+ // Not showing system by default.
+ ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
+ ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
+ verify(mMockAppEntryListManager).init(any(), filterCaptor.capture(), any());
+ ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
+
+ ApplicationsState.AppEntry systemApp = createAppEntry("test.package",
+ /* uid= */ 1, /* isOpPermissible= */false);
+ systemApp.info.flags |= ApplicationInfo.FLAG_SYSTEM;
+
+ assertThat(filter.filterApp(systemApp)).isFalse();
+ }
+
+ @Test
+ public void appFilter_removesNullExtraInfoEntries() {
+ setupPreferenceController();
+ mPreferenceController.onStart(mLifecycleOwner);
+ ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
+ ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
+ verify(mMockAppEntryListManager).init(any(), filterCaptor.capture(), any());
+ ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
+
+ ApplicationsState.AppEntry appEntry = createAppEntry("test.package",
+ /* uid= */ 1, /* isOpPermissible= */false);
+ appEntry.extraInfo = null;
+
+ assertThat(filter.filterApp(appEntry)).isFalse();
+ }
+
+ private ApplicationsState.AppEntry createAppEntry(String packageName, int uid,
+ boolean isOpPermissible) {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = packageName;
+ info.uid = uid;
+
+ AppStateAppOpsBridge.PermissionState extraInfo = mock(
+ AppStateAppOpsBridge.PermissionState.class);
+ when(extraInfo.isPermissible()).thenReturn(isOpPermissible);
+
+ ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
+ appEntry.info = info;
+ appEntry.label = packageName;
+ appEntry.extraInfo = extraInfo;
+
+ return appEntry;
+ }
+
+ private void setupPreferenceController() {
+ mPreferenceController.init(APP_OP_CODE, PERMISSION, NEGATIVE_MODE);
+ mPreferenceController.mAppEntryListManager = mMockAppEntryListManager;
+
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ verify(mMockAppEntryListManager).init(any(AppStateAppOpsBridge.class), any(),
+ mCallbackCaptor.capture());
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java b/tests/unit/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
similarity index 60%
rename from tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
rename to tests/unit/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
index d737f10..c50646e 100644
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
+++ b/tests/unit/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,9 +18,12 @@
import static com.google.common.truth.Truth.assertThat;
+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.when;
+import static org.mockito.Mockito.withSettings;
import android.Manifest;
import android.app.AppOpsManager;
@@ -32,73 +35,84 @@
import android.content.pm.ParceledListSlice;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.os.UserManager;
-import com.android.car.settings.applications.specialaccess.AppStateAppOpsBridge.PermissionState;
-import com.android.car.settings.testutils.ShadowAppOpsManager;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.AdditionalMatchers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowUserManager;
+import org.mockito.MockitoSession;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-/** Unit test for {@link AppStateAppOpsBridge}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowAppOpsManager.class})
+@RunWith(AndroidJUnit4.class)
public class AppStateAppOpsBridgeTest {
private static final int APP_OP_CODE = AppOpsManager.OP_WRITE_SETTINGS;
private static final String PERMISSION = Manifest.permission.WRITE_SETTINGS;
+ private static final int USER_ID1 = 1;
+ private static final int USER_ID2 = 2;
- @Mock
- private IPackageManager mIPackageManager;
- @Mock
- private ParceledListSlice<PackageInfo> mParceledPackages;
- @Mock
- private ParceledListSlice<PackageInfo> mParceledPackagesOtherProfile;
-
- private List<PackageInfo> mPackages;
-
- private Context mContext;
+ private Context mContext = ApplicationProvider.getApplicationContext();
private AppOpsManager mAppOpsManager;
private AppStateAppOpsBridge mBridge;
+ private ParceledListSlice<PackageInfo> mParceledListSlice1;
+ private ParceledListSlice<PackageInfo> mParceledListSlice2;
+ private List<PackageInfo> mPackages;
+ private MockitoSession mSession;
+
+ @Mock
+ private IPackageManager mMockIPackageManager;
+ @Mock
+ private AppOpsManager mMockAppOpsManager;
@Before
public void setUp() throws RemoteException {
MockitoAnnotations.initMocks(this);
mPackages = new ArrayList<>();
- when(mIPackageManager.getPackagesHoldingPermissions(
+ mParceledListSlice1 = new ParceledListSlice<>(mPackages);
+ when(mMockIPackageManager.getPackagesHoldingPermissions(
AdditionalMatchers.aryEq(new String[]{PERMISSION}),
eq(PackageManager.GET_PERMISSIONS),
- eq(UserHandle.myUserId())))
- .thenReturn(mParceledPackages);
- when(mParceledPackages.getList()).thenReturn(mPackages);
+ eq(USER_ID1)))
+ .thenReturn(mParceledListSlice1);
- mContext = RuntimeEnvironment.application;
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
- mBridge = new AppStateAppOpsBridge(mContext, APP_OP_CODE, PERMISSION, mIPackageManager);
+ UserHandle userHandle = UserHandle.of(USER_ID1);
+ mBridge = new AppStateAppOpsBridge(mContext, APP_OP_CODE, PERMISSION, mMockIPackageManager,
+ Collections.singletonList(userHandle), mMockAppOpsManager);
+
+ mSession = ExtendedMockito.mockitoSession().mockStatic(
+ UserHandle.class, withSettings().lenient()).startMocking();
+
+ ExtendedMockito.when(UserHandle.getUserId(USER_ID1)).thenReturn(USER_ID1);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
}
@Test
public void androidPackagesIgnored() throws RemoteException {
String packageName = "android";
- int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo = createPackageInfo(packageName, uid);
+ PackageInfo packageInfo = createPackageInfo(packageName, USER_ID1);
addPackageWithPermission(packageInfo, AppOpsManager.MODE_ALLOWED);
- AppEntry entry = createAppEntry(packageInfo);
+ ApplicationsState.AppEntry entry = createAppEntry(packageInfo);
mBridge.loadExtraInfo(Collections.singletonList(entry));
@@ -108,10 +122,9 @@
@Test
public void selfPackageIgnored() throws RemoteException {
String packageName = mContext.getPackageName();
- int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo = createPackageInfo(packageName, uid);
+ PackageInfo packageInfo = createPackageInfo(packageName, USER_ID1);
addPackageWithPermission(packageInfo, AppOpsManager.MODE_ALLOWED);
- AppEntry entry = createAppEntry(packageInfo);
+ ApplicationsState.AppEntry entry = createAppEntry(packageInfo);
mBridge.loadExtraInfo(Collections.singletonList(entry));
@@ -121,13 +134,12 @@
@Test
public void packagesNotRequestingPermissionIgnored() throws RemoteException {
String packageName = "test.package";
- int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo = createPackageInfo(packageName, uid);
+ PackageInfo packageInfo = createPackageInfo(packageName, USER_ID1);
packageInfo.requestedPermissions = null;
mPackages.add(packageInfo);
- when(mIPackageManager.isPackageAvailable(packageInfo.packageName,
- UserHandle.myUserId())).thenReturn(true);
- AppEntry entry = createAppEntry(packageInfo);
+ when(mMockIPackageManager.isPackageAvailable(packageInfo.packageName, USER_ID1))
+ .thenReturn(true);
+ ApplicationsState.AppEntry entry = createAppEntry(packageInfo);
mBridge.loadExtraInfo(Collections.singletonList(entry));
@@ -137,12 +149,11 @@
@Test
public void unavailablePackageIgnored() throws RemoteException {
String packageName = "test.package";
- int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo = createPackageInfo(packageName, uid);
+ PackageInfo packageInfo = createPackageInfo(packageName, USER_ID1);
addPackageWithPermission(packageInfo, AppOpsManager.MODE_ALLOWED);
- when(mIPackageManager.isPackageAvailable(packageInfo.packageName,
- UserHandle.myUserId())).thenReturn(false);
- AppEntry entry = createAppEntry(packageInfo);
+ when(mMockIPackageManager.isPackageAvailable(packageInfo.packageName, USER_ID1))
+ .thenReturn(false);
+ ApplicationsState.AppEntry entry = createAppEntry(packageInfo);
mBridge.loadExtraInfo(Collections.singletonList(entry));
@@ -152,61 +163,64 @@
@Test
public void loadsAppOpsExtraInfo_modeAllowed_isPermissible() throws RemoteException {
String packageName = "test.package";
- int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo = createPackageInfo(packageName, uid);
+ PackageInfo packageInfo = createPackageInfo(packageName, USER_ID1);
addPackageWithPermission(packageInfo, AppOpsManager.MODE_ALLOWED);
- AppEntry entry = createAppEntry(packageInfo);
+ ApplicationsState.AppEntry entry = createAppEntry(packageInfo);
assertThat(entry.extraInfo).isNull();
mBridge.loadExtraInfo(Collections.singletonList(entry));
assertThat(entry.extraInfo).isNotNull();
- assertThat(((PermissionState) entry.extraInfo).isPermissible()).isTrue();
+ assertThat(((AppStateAppOpsBridge.PermissionState) entry.extraInfo).isPermissible())
+ .isTrue();
}
@Test
public void loadsAppOpsExtraInfo_modeDefault_isPermissible() throws RemoteException {
String packageName = "test.package";
- int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo = createPackageInfo(packageName, uid);
+ PackageInfo packageInfo = createPackageInfo(packageName, USER_ID1);
addPackageWithPermission(packageInfo, AppOpsManager.MODE_DEFAULT);
- AppEntry entry = createAppEntry(packageInfo);
+ ApplicationsState.AppEntry entry = createAppEntry(packageInfo);
assertThat(entry.extraInfo).isNull();
mBridge.loadExtraInfo(Collections.singletonList(entry));
assertThat(entry.extraInfo).isNotNull();
- assertThat(((PermissionState) entry.extraInfo).isPermissible()).isTrue();
+ assertThat(((AppStateAppOpsBridge.PermissionState) entry.extraInfo).isPermissible())
+ .isTrue();
}
@Test
public void loadsAppOpsExtraInfo_modeIgnored_isNotPermissible() throws RemoteException {
+ ExtendedMockito.when(UserHandle.getUserId(anyInt())).thenReturn(USER_ID1);
+
String packageName = "test.package";
- int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo = createPackageInfo(packageName, uid);
+ PackageInfo packageInfo = createPackageInfo(packageName, USER_ID1);
addPackageWithPermission(packageInfo, AppOpsManager.MODE_IGNORED);
- AppEntry entry = createAppEntry(packageInfo);
+ ApplicationsState.AppEntry entry = createAppEntry(packageInfo);
assertThat(entry.extraInfo).isNull();
+ mockPackageOps(packageName, USER_ID1, AppOpsManager.MODE_IGNORED);
+
mBridge.loadExtraInfo(Collections.singletonList(entry));
assertThat(entry.extraInfo).isNotNull();
- assertThat(((PermissionState) entry.extraInfo).isPermissible()).isFalse();
+ assertThat(((AppStateAppOpsBridge.PermissionState) entry.extraInfo).isPermissible())
+ .isFalse();
}
@Test
public void loadsAppOpsExtraInfo_multipleApps() throws RemoteException {
String packageName1 = "test.package1";
- int uid1 = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo1 = createPackageInfo(packageName1, uid1);
+ PackageInfo packageInfo1 = createPackageInfo(packageName1, USER_ID1);
addPackageWithPermission(packageInfo1, AppOpsManager.MODE_ALLOWED);
- AppEntry entry1 = createAppEntry(packageInfo1);
+ ApplicationsState.AppEntry entry1 = createAppEntry(packageInfo1);
String packageName2 = "test.package2";
- int uid2 = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 2);
- PackageInfo packageInfo2 = createPackageInfo(packageName2, uid2);
+ PackageInfo packageInfo2 = createPackageInfo(packageName2, USER_ID2);
addPackageWithPermission(packageInfo2, AppOpsManager.MODE_ALLOWED);
- AppEntry entry2 = createAppEntry(packageInfo2);
+ ApplicationsState.AppEntry entry2 = createAppEntry(packageInfo2);
+ ExtendedMockito.when(UserHandle.getUserId(USER_ID2)).thenReturn(USER_ID1);
mBridge.loadExtraInfo(Arrays.asList(entry1, entry2));
@@ -217,33 +231,33 @@
@Test
public void loadsAppOpExtraInfo_multipleProfiles() throws RemoteException {
String packageName1 = "test.package1";
- int uid1 = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo1 = createPackageInfo(packageName1, uid1);
+ PackageInfo packageInfo1 = createPackageInfo(packageName1, USER_ID1);
addPackageWithPermission(packageInfo1, AppOpsManager.MODE_ALLOWED);
- AppEntry entry1 = createAppEntry(packageInfo1);
+ ApplicationsState.AppEntry entry1 = createAppEntry(packageInfo1);
// Add a package for another profile.
- int otherUserId = UserHandle.myUserId() + 1;
String packageName2 = "test.package2";
- int uid2 = UserHandle.getUid(otherUserId, /* appId= */ 2);
- PackageInfo packageInfo2 = createPackageInfo(packageName2, uid2);
- when(mIPackageManager.getPackagesHoldingPermissions(
+ PackageInfo packageInfo2 = createPackageInfo(packageName2, USER_ID2);
+ mParceledListSlice2 = new ParceledListSlice<>(Collections.singletonList(packageInfo2));
+ when(mMockIPackageManager.getPackagesHoldingPermissions(
AdditionalMatchers.aryEq(new String[]{PERMISSION}),
eq(PackageManager.GET_PERMISSIONS),
- eq(otherUserId)))
- .thenReturn(mParceledPackagesOtherProfile);
- when(mParceledPackagesOtherProfile.getList()).thenReturn(
- Collections.singletonList(packageInfo2));
- when(mIPackageManager.isPackageAvailable(packageInfo2.packageName,
- otherUserId)).thenReturn(true);
+ eq(USER_ID2)))
+ .thenReturn(mParceledListSlice2);
+ when(mMockIPackageManager.isPackageAvailable(packageInfo2.packageName,
+ USER_ID2)).thenReturn(true);
mAppOpsManager.setMode(APP_OP_CODE, packageInfo2.applicationInfo.uid,
packageInfo2.packageName, AppOpsManager.MODE_ALLOWED);
- AppEntry entry2 = createAppEntry(packageInfo2);
+ ApplicationsState.AppEntry entry2 = createAppEntry(packageInfo2);
+ ExtendedMockito.when(UserHandle.getUserId(USER_ID2)).thenReturn(USER_ID2);
- getShadowUserManager().addUserProfile(UserHandle.of(otherUserId));
// Recreate the bridge so it has all user profiles.
- mBridge = new AppStateAppOpsBridge(mContext, APP_OP_CODE, PERMISSION, mIPackageManager);
+ UserHandle userHandle1 = new UserHandle(USER_ID1);
+ UserHandle userHandle2 = new UserHandle(USER_ID2);
+ mBridge = new AppStateAppOpsBridge(mContext, APP_OP_CODE, PERMISSION, mMockIPackageManager,
+ Arrays.asList(userHandle1, userHandle2), mMockAppOpsManager);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
mBridge.loadExtraInfo(Arrays.asList(entry1, entry2));
assertThat(entry1.extraInfo).isNotNull();
@@ -253,9 +267,8 @@
@Test
public void appEntryNotIncluded_extraInfoCleared() {
String packageName = "test.package";
- int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
- PackageInfo packageInfo = createPackageInfo(packageName, uid);
- AppEntry entry = createAppEntry(packageInfo);
+ PackageInfo packageInfo = createPackageInfo(packageName, USER_ID1);
+ ApplicationsState.AppEntry entry = createAppEntry(packageInfo);
entry.extraInfo = new Object();
mBridge.loadExtraInfo(Collections.singletonList(entry));
@@ -279,19 +292,24 @@
private void addPackageWithPermission(PackageInfo packageInfo, int mode)
throws RemoteException {
mPackages.add(packageInfo);
- when(mIPackageManager.isPackageAvailable(packageInfo.packageName,
- UserHandle.myUserId())).thenReturn(true);
+ when(mMockIPackageManager.isPackageAvailable(packageInfo.packageName,
+ USER_ID1)).thenReturn(true);
mAppOpsManager.setMode(APP_OP_CODE, packageInfo.applicationInfo.uid,
packageInfo.packageName, mode);
}
- private AppEntry createAppEntry(PackageInfo packageInfo) {
- AppEntry appEntry = mock(AppEntry.class);
+ private ApplicationsState.AppEntry createAppEntry(PackageInfo packageInfo) {
+ ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
appEntry.info = packageInfo.applicationInfo;
return appEntry;
}
- private ShadowUserManager getShadowUserManager() {
- return Shadows.shadowOf(UserManager.get(mContext));
+ private void mockPackageOps(String packageName, int uid, int mode) {
+ AppOpsManager.OpEntry opEntry = mock(AppOpsManager.OpEntry.class);
+ when(opEntry.getMode()).thenReturn(mode);
+ AppOpsManager.PackageOps packageOps = new AppOpsManager.PackageOps(packageName, uid,
+ Collections.singletonList(opEntry));
+ List<AppOpsManager.PackageOps> packageOpsList = Collections.singletonList(packageOps);
+ when(mMockAppOpsManager.getPackagesForOps((int[]) any())).thenReturn(packageOpsList);
}
}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java b/tests/unit/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
similarity index 78%
rename from tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
rename to tests/unit/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
index 073de48..3aa4944 100644
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
+++ b/tests/unit/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,27 +22,27 @@
import static org.mockito.Mockito.when;
import android.content.pm.ApplicationInfo;
-import android.os.RemoteException;
import android.telephony.SmsManager;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
import java.util.Arrays;
-/** Unit test for {@link AppStatePremiumSmsBridge}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class AppStatePremiumSmsBridgeTest {
+ private AppStatePremiumSmsBridge mBridge;
+
@Mock
private SmsManager mSmsManager;
- private AppStatePremiumSmsBridge mBridge;
@Before
public void setUp() {
@@ -51,14 +51,14 @@
}
@Test
- public void loadExtraInfo() throws RemoteException {
+ public void loadExtraInfo() {
String package1 = "test.package1";
- AppEntry appEntry1 = createAppEntry(package1);
+ ApplicationsState.AppEntry appEntry1 = createAppEntry(package1);
int value1 = SmsManager.PREMIUM_SMS_CONSENT_ALWAYS_ALLOW;
when(mSmsManager.getPremiumSmsConsent(package1)).thenReturn(value1);
String package2 = "test.package2";
- AppEntry appEntry2 = createAppEntry(package2);
+ ApplicationsState.AppEntry appEntry2 = createAppEntry(package2);
int value2 = SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW;
when(mSmsManager.getPremiumSmsConsent(package2)).thenReturn(value2);
@@ -68,11 +68,11 @@
assertThat(appEntry2.extraInfo).isEqualTo(value2);
}
- private AppEntry createAppEntry(String packageName) {
+ private ApplicationsState.AppEntry createAppEntry(String packageName) {
ApplicationInfo info = new ApplicationInfo();
info.packageName = packageName;
- AppEntry appEntry = mock(AppEntry.class);
+ ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
appEntry.info = info;
appEntry.label = packageName;
diff --git a/tests/unit/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java
new file mode 100644
index 0000000..0469c2a
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class MoreSpecialAccessPreferenceControllerTest {
+
+ private static final String PACKAGE = "test.package";
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private CarUiPreference mPreference;
+ private Intent mIntent;
+ private ResolveInfo mResolveInfo;
+ private MoreSpecialAccessPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private PackageManager mMockPackageManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mIntent = new Intent(Intent.ACTION_MANAGE_SPECIAL_APP_ACCESSES);
+ mIntent.setPackage(PACKAGE);
+
+ ApplicationInfo applicationInfo = new ApplicationInfo();
+ applicationInfo.packageName = PACKAGE;
+ applicationInfo.name = "TestClass";
+ ActivityInfo activityInfo = new ActivityInfo();
+ activityInfo.applicationInfo = applicationInfo;
+
+ mResolveInfo = new ResolveInfo();
+ mResolveInfo.activityInfo = activityInfo;
+ }
+
+ @Test
+ public void getAvailabilityStatus_noPermissionController_returnsUnsupportedOnDevice() {
+ when(mMockPackageManager.getPermissionControllerPackageName()).thenReturn(null);
+ setUpPreferenceController();
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
+ UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_noResolvedActivity_returnsUnsupportedOnDevice() {
+ when(mMockPackageManager.getPermissionControllerPackageName()).thenReturn(PACKAGE);
+ when(mMockPackageManager.resolveActivity(any(), eq(PackageManager.MATCH_DEFAULT_ONLY)))
+ .thenReturn(null);
+ setUpPreferenceController();
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
+ UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_resolvedActivity_returnsAvailable() {
+ when(mMockPackageManager.getPermissionControllerPackageName()).thenReturn(PACKAGE);
+ when(mMockPackageManager.resolveActivity(any(), eq(PackageManager.MATCH_DEFAULT_ONLY)))
+ .thenReturn(mResolveInfo);
+ setUpPreferenceController();
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
+ AVAILABLE);
+ }
+
+ @Test
+ public void preferenceClicked_startsResolvedActivity() {
+ when(mMockPackageManager.getPermissionControllerPackageName()).thenReturn(PACKAGE);
+ when(mMockPackageManager.resolveActivity(any(), eq(PackageManager.MATCH_DEFAULT_ONLY)))
+ .thenReturn(mResolveInfo);
+ doNothing().when(mContext).startActivity(any());
+ setUpPreferenceController();
+
+ mPreference.performClick();
+
+
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).startActivity(captor.capture());
+ Intent intent = captor.getValue();
+ assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MANAGE_SPECIAL_APP_ACCESSES);
+ assertThat(intent.getPackage()).isEqualTo(PACKAGE);
+ }
+
+ private void setUpPreferenceController() {
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new MoreSpecialAccessPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockPackageManager);
+
+ mPreference = new CarUiPreference(mContext);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java
new file mode 100644
index 0000000..802216c
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.Manifest;
+import android.app.NotificationManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.os.AsyncTask;
+import android.os.UserHandle;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.PollingCheck;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+
+@RunWith(AndroidJUnit4.class)
+public class NotificationAccessPreferenceControllerTest {
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private PreferenceGroup mPreferenceGroup;
+ private NotificationAccessPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private ServiceInfo mListenerServiceInfo;
+ private ComponentName mListenerComponent;
+ private ApplicationInfo mApplicationInfo;
+ private NotificationManager mNotificationManager;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private PackageManager mMockPackageManager;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mNotificationManager = spy(mContext.getSystemService(NotificationManager.class));
+ mPreferenceController = new NotificationAccessPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mNotificationManager);
+
+ PreferenceControllerTestUtil
+ .assignPreference(mPreferenceController, mPreferenceGroup);
+
+ mListenerServiceInfo = new ServiceInfo();
+ mListenerServiceInfo.permission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
+ mListenerServiceInfo.packageName = "com.android.test.package";
+ mListenerServiceInfo.name = "SomeListenerService";
+ mListenerServiceInfo.nonLocalizedLabel = "label";
+ mApplicationInfo = new ApplicationInfo();
+ mApplicationInfo.uid = 123;
+ mListenerServiceInfo.applicationInfo = mApplicationInfo;
+
+ mListenerComponent = new ComponentName(mListenerServiceInfo.packageName,
+ mListenerServiceInfo.name);
+ }
+
+ @Test
+ public void onStart_loadsListenerServices() throws PackageManager.NameNotFoundException {
+ setupPreferenceController(/* permissionGranted= */true, mListenerServiceInfo);
+
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+ }
+
+ @Test
+ public void onStart_serviceAccessGranted_setsPreferenceChecked()
+ throws PackageManager.NameNotFoundException {
+ setupPreferenceController(/* permissionGranted= */true, mListenerServiceInfo);
+
+ TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+ assertThat(preference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void onStart_serviceAccessNotGranted_setsPreferenceUnchecked()
+ throws PackageManager.NameNotFoundException {
+ setupPreferenceController(/* permissionGranted= */false, mListenerServiceInfo);
+
+ TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+ assertThat(preference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void preferenceClicked_serviceAccessGranted_showsRevokeConfirmDialog()
+ throws PackageManager.NameNotFoundException {
+ setupPreferenceController(/* permissionGranted= */true, mListenerServiceInfo);
+ TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+ preference.performClick();
+
+ verify(mMockFragmentController).showDialog(any(
+ ConfirmationDialogFragment.class),
+ eq(NotificationAccessPreferenceController.REVOKE_CONFIRM_DIALOG_TAG));
+ }
+
+ @Test
+ public void preferenceClicked_serviceAccessNotGranted_showsGrantConfirmDialog()
+ throws PackageManager.NameNotFoundException {
+ setupPreferenceController(/* permissionGranted= */false, mListenerServiceInfo);
+ TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+ preference.performClick();
+
+ verify(mMockFragmentController).showDialog(any(
+ ConfirmationDialogFragment.class),
+ eq(NotificationAccessPreferenceController.GRANT_CONFIRM_DIALOG_TAG));
+ }
+
+ @Test
+ public void revokeConfirmed_revokesNotificationAccess()
+ throws PackageManager.NameNotFoundException {
+ setupPreferenceController(/* permissionGranted= */true, mListenerServiceInfo);
+ TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+ preference.performClick();
+
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mMockFragmentController).showDialog(dialogCaptor.capture(),
+ eq(NotificationAccessPreferenceController.REVOKE_CONFIRM_DIALOG_TAG));
+ ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+ dialogFragment.onClick(/* dialog= */ null, DialogInterface.BUTTON_POSITIVE);
+
+ assertThat(mNotificationManager.isNotificationListenerAccessGranted(mListenerComponent))
+ .isFalse();
+ }
+
+ @Test
+ public void revokeConfirmed_notificationPolicyAccessNotGranted_removesAutomaticZenRules()
+ throws PackageManager.NameNotFoundException {
+ setupPreferenceController(/* permissionGranted= */true, mListenerServiceInfo);
+
+ TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+ preference.performClick();
+
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mMockFragmentController).showDialog(dialogCaptor.capture(),
+ eq(NotificationAccessPreferenceController.REVOKE_CONFIRM_DIALOG_TAG));
+ ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+ mNotificationManager.setNotificationPolicyAccessGranted(
+ mListenerServiceInfo.packageName, /* granted= */ false);
+ dialogFragment.onClick(/* dialog= */ null, DialogInterface.BUTTON_POSITIVE);
+
+ PollingCheck.waitFor(
+ () -> mPreferenceController.mAsyncTask.getStatus() == AsyncTask.Status.FINISHED);
+
+ verify(mNotificationManager).removeAutomaticZenRules(any());
+ }
+
+ @Test
+ public void grantConfirmed_grantsNotificationAccess()
+ throws PackageManager.NameNotFoundException {
+ setupPreferenceController(/* permissionGranted= */false, mListenerServiceInfo);
+ TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+ preference.performClick();
+
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mMockFragmentController).showDialog(dialogCaptor.capture(),
+ eq(NotificationAccessPreferenceController.GRANT_CONFIRM_DIALOG_TAG));
+ ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+ dialogFragment.onClick(/* dialog= */ null, DialogInterface.BUTTON_POSITIVE);
+
+ assertThat(mNotificationManager.isNotificationListenerAccessGranted(mListenerComponent))
+ .isTrue();
+ }
+
+ private void setupPreferenceController(boolean permissionGranted, ServiceInfo serviceInfo)
+ throws PackageManager.NameNotFoundException {
+ when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockPackageManager.getApplicationInfoAsUser(mListenerServiceInfo.packageName,
+ /* flags= */ 0, UserHandle.myUserId())).thenReturn(mApplicationInfo);
+
+ mNotificationManager.setNotificationListenerAccessGranted(mListenerComponent,
+ /* granted= */ permissionGranted);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.onServicesReloaded(Collections.singletonList(serviceInfo));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java
new file mode 100644
index 0000000..4236142
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Looper;
+import android.telephony.SmsManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class PremiumSmsAccessPreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private PreferenceGroup mPreferenceGroup;
+ private PremiumSmsAccessPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private AppEntryListManager mMockAppEntryListManager;
+ @Mock
+ private ApplicationsState mMockApplicationsState;
+ @Mock
+ private SmsManager mMockSmsManager;
+ @Captor
+ private ArgumentCaptor<AppEntryListManager.Callback> mCallbackCaptor;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+ when(mMockApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
+
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new PremiumSmsAccessPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockSmsManager, mMockAppEntryListManager);
+
+ PreferenceControllerTestUtil
+ .assignPreference(mPreferenceController, mPreferenceGroup);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ verify(mMockAppEntryListManager).init(any(AppStatePremiumSmsBridge.class), any(),
+ mCallbackCaptor.capture());
+ }
+
+ @Test
+ public void onStart_startsListManager() {
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ verify(mMockAppEntryListManager).start();
+ }
+
+ @Test
+ public void onStop_stopsListManager() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.onStop(mLifecycleOwner);
+
+ verify(mMockAppEntryListManager).stop();
+ }
+
+ @Test
+ public void onDestroy_destroysListManager() {
+ mPreferenceController.onDestroy(mLifecycleOwner);
+
+ verify(mMockAppEntryListManager).destroy();
+ }
+
+ @Test
+ public void onAppEntryListChanged_addsPreferencesForEntries() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ List<ApplicationsState.AppEntry> entries = Arrays.asList(
+ createAppEntry("test.package", /* uid= */ 1,
+ SmsManager.PREMIUM_SMS_CONSENT_ALWAYS_ALLOW),
+ createAppEntry("another.test.package", /* uid= */ 2,
+ SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
+
+ mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+ assertThat(((ListPreference) mPreferenceGroup.getPreference(0)).getValue()).isEqualTo(
+ String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_ALWAYS_ALLOW));
+ assertThat(((ListPreference) mPreferenceGroup.getPreference(1)).getValue()).isEqualTo(
+ String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
+ }
+
+ @Test
+ public void onPreferenceChange_setsPremiumSmsPermission() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ String packageName = "test.package";
+ List<ApplicationsState.AppEntry> entries = Collections.singletonList(
+ createAppEntry(packageName, /* uid= */ 1,
+ SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
+ mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+ Preference appPref = mPreferenceGroup.getPreference(0);
+ int updatedValue = SmsManager.PREMIUM_SMS_CONSENT_ASK_USER;
+
+ appPref.getOnPreferenceChangeListener().onPreferenceChange(appPref,
+ String.valueOf(updatedValue));
+
+ verify(mMockSmsManager).setPremiumSmsConsent(packageName, updatedValue);
+ }
+
+ @Test
+ public void onPreferenceChange_updatesEntry() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ List<ApplicationsState.AppEntry> entries = Collections.singletonList(
+ createAppEntry("test.package", /* uid= */ 1,
+ SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
+ mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+ Preference appPref = mPreferenceGroup.getPreference(0);
+
+ appPref.getOnPreferenceChangeListener().onPreferenceChange(appPref,
+ String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_ASK_USER));
+
+ verify(mMockAppEntryListManager).forceUpdate(entries.get(0));
+ }
+
+ @Test
+ public void appFilter_removesUnknownStates() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
+ ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
+ verify(mMockAppEntryListManager).init(any(), filterCaptor.capture(), any());
+ ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
+ ApplicationsState.AppEntry unknownStateApp = createAppEntry("test.package", /* uid= */ 1,
+ SmsManager.PREMIUM_SMS_CONSENT_UNKNOWN);
+
+ assertThat(filter.filterApp(unknownStateApp)).isFalse();
+ }
+
+ private ApplicationsState.AppEntry createAppEntry(String packageName, int uid, int smsState) {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = packageName;
+ info.uid = uid;
+
+ ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
+ appEntry.info = info;
+ appEntry.label = packageName;
+ appEntry.extraInfo = smsState;
+
+ return appEntry;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java
index f882075..82bdafc 100644
--- a/tests/unit/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java
@@ -51,6 +51,7 @@
import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfile;
@@ -63,6 +64,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+import java.util.Set;
@RunWith(AndroidJUnit4.class)
public class BluetoothBondedDevicesPreferenceControllerTest {
@@ -86,6 +88,8 @@
private UserManager mUserManager;
@Mock
private CachedBluetoothDeviceManager mCachedDeviceManager;
+ @Mock
+ private LocalBluetoothAdapter mLocalBluetoothAdapter;
@Before
@UiThreadTest
@@ -117,6 +121,8 @@
mLocalBluetoothManager = spy(BluetoothUtils.getLocalBtManager(mContext));
when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager);
when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(mCachedDevices);
+ when(mLocalBluetoothManager.getBluetoothAdapter()).thenReturn(mLocalBluetoothAdapter);
+ when(mLocalBluetoothAdapter.getBondedDevices()).thenReturn(Set.of(mBondedDevice));
PreferenceManager preferenceManager = new PreferenceManager(mContext);
PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
@@ -148,6 +154,7 @@
// Unbond the only bonded device.
when(mBondedCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
when(mBondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+ when(mLocalBluetoothAdapter.getBondedDevices()).thenReturn(Set.of());
mPreferenceController.onDeviceBondStateChanged(mBondedCachedDevice,
BluetoothDevice.BOND_NONE);
diff --git a/tests/unit/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java
new file mode 100644
index 0000000..841219c
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assume.assumeTrue;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+import static org.testng.Assert.assertThrows;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothDevicePicker;
+import android.bluetooth.BluetoothUuid;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.IBinder;
+import android.os.ParcelUuid;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.BluetoothTestUtils;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+import java.util.Arrays;
+
+@RunWith(AndroidJUnit4.class)
+public class BluetoothDevicePickerPreferenceControllerTest {
+ private static final String ALLOWED_LAUNCH_PACKAGE = "com.android.car.settings.tests.unit";
+ private static final String DEFAULT_LAUNCH_PACKAGE = "test.package";
+ private static final String DEFAULT_LAUNCH_CLASS = "TestClass";
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private CarUxRestrictions mCarUxRestrictions;
+ private PreferenceGroup mPreferenceGroup;
+ private BluetoothDevicePickerPreferenceController mPreferenceController;
+ private MockitoSession mSession;
+
+ @Mock
+ private LocalBluetoothManager mLocalBluetoothManager;
+ @Mock
+ private BluetoothEventManager mBluetoothEventManager;
+ @Mock
+ private FragmentController mFragmentController;
+ @Mock
+ private CachedBluetoothDevice mUnbondedCachedDevice;
+ @Mock
+ private BluetoothDevice mUnbondedDevice;
+ @Mock
+ private CachedBluetoothDevice mBondedCachedDevice;
+ @Mock
+ private BluetoothDevice mBondedDevice;
+ @Mock
+ private CachedBluetoothDeviceManager mCachedDeviceManager;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ // Ensure bluetooth is available and enabled.
+ assumeTrue(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH));
+ BluetoothTestUtils.setBluetoothState(mContext, /* enable= */ true);
+
+ when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager);
+ when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager);
+ when(mUnbondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+ when(mUnbondedCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+ when(mUnbondedCachedDevice.getDevice()).thenReturn(mUnbondedDevice);
+ when(mBondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mBondedCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mBondedCachedDevice.getDevice()).thenReturn(mBondedDevice);
+ when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+ Arrays.asList(mUnbondedCachedDevice, mBondedCachedDevice));
+ // Make bonded device appear first in the list.
+ when(mBondedCachedDevice.compareTo(mUnbondedCachedDevice)).thenReturn(-1);
+ when(mUnbondedCachedDevice.compareTo(mBondedCachedDevice)).thenReturn(1);
+
+ mSession = ExtendedMockito.mockitoSession()
+ .mockStatic(BluetoothUtils.class, withSettings().lenient())
+ .startMocking();
+ when(BluetoothUtils.getLocalBtManager(mContext)).thenReturn(mLocalBluetoothManager);
+
+ mPreferenceController = new TestBluetoothDevicePickerPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController,
+ mCarUxRestrictions);
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ }
+
+ @After
+ @UiThreadTest
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void checkInitialized_noLaunchIntentSet_throwsIllegalStateException() {
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mPreferenceGroup));
+ }
+
+ @Test
+ public void onStart_appliesFilterType() {
+ // Setup device to pass the filter.
+ when(mBondedDevice.getUuids()).thenReturn(new ParcelUuid[]{BluetoothUuid.A2DP_SINK});
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ false,
+ BluetoothDevicePicker.FILTER_TYPE_AUDIO, DEFAULT_LAUNCH_PACKAGE,
+ DEFAULT_LAUNCH_CLASS);
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+ assertThat(((BluetoothDevicePreference) mPreferenceGroup.getPreference(
+ 0)).getCachedDevice()).isEqualTo(mBondedCachedDevice);
+ }
+
+ @Test
+ public void onDeviceClicked_callingPackageEqualToLaunchPackage_setsClassName() {
+ ComponentName component = new ComponentName(ALLOWED_LAUNCH_PACKAGE, DEFAULT_LAUNCH_CLASS);
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+ BluetoothDevicePicker.FILTER_TYPE_ALL, component.getPackageName(),
+ component.getClassName());
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ BluetoothDevicePreference devicePreference =
+ (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+ devicePreference.performClick();
+
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).sendBroadcast(captor.capture());
+ Intent pickedIntent = captor.getValue();
+ assertThat(pickedIntent.getAction()).isEqualTo(
+ BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+ assertThat(pickedIntent.getComponent()).isEqualTo(component);
+ assertThat((BluetoothDevice) pickedIntent.getParcelableExtra(
+ BluetoothDevice.EXTRA_DEVICE)).isEqualTo(mBondedDevice);
+ }
+
+ @Test
+ public void onDeviceClicked_callingPackageNotEqualToLaunchPackage_doesNotSetClassName() {
+ ComponentName component = new ComponentName(DEFAULT_LAUNCH_PACKAGE, DEFAULT_LAUNCH_CLASS);
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+ BluetoothDevicePicker.FILTER_TYPE_ALL, component.getPackageName(),
+ component.getClassName());
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ BluetoothDevicePreference devicePreference =
+ (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+ devicePreference.performClick();
+
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).sendBroadcast(captor.capture());
+ Intent pickedIntent = captor.getValue();
+ assertThat(pickedIntent.getAction()).isEqualTo(
+ BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+ assertThat(pickedIntent.getComponent()).isEqualTo(null);
+ assertThat((BluetoothDevice) pickedIntent.getParcelableExtra(
+ BluetoothDevice.EXTRA_DEVICE)).isEqualTo(mBondedDevice);
+ }
+
+ @Test
+ public void onDeviceClicked_bondedDevice_goesBack() {
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+ BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PACKAGE,
+ DEFAULT_LAUNCH_CLASS);
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ BluetoothDevicePreference devicePreference =
+ (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+ devicePreference.performClick();
+
+ verify(mFragmentController).goBack();
+ }
+
+ @Test
+ public void onDeviceClicked_unbondedDevice_doesNotNeedAuth_sendsPickedIntent() {
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ false,
+ BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PACKAGE,
+ DEFAULT_LAUNCH_CLASS);
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ BluetoothDevicePreference devicePreference =
+ (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+ devicePreference.performClick();
+
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).sendBroadcast(captor.capture());
+ Intent pickedIntent = captor.getValue();
+ assertThat(pickedIntent.getAction()).isEqualTo(
+ BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+ }
+
+ @Test
+ public void onDeviceClicked_unbondedDevice_needsAuth_startsPairing() {
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+ BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PACKAGE,
+ DEFAULT_LAUNCH_CLASS);
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ BluetoothDevicePreference devicePreference =
+ (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+ devicePreference.performClick();
+
+ verify(mUnbondedCachedDevice).startPairing();
+ }
+
+ @Test
+ public void onDeviceClicked_unbondedDevice_needsAuth_pairingStartFails_resumesScanning() {
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+ BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PACKAGE,
+ DEFAULT_LAUNCH_CLASS);
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ BluetoothDevicePreference devicePreference =
+ (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+ when(mUnbondedCachedDevice.startPairing()).thenReturn(false);
+ assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+
+ devicePreference.performClick();
+
+ assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+ }
+
+ @Test
+ public void onDeviceBondStateChanged_selectedDeviceBonded_sendsPickedIntent() {
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+ BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PACKAGE,
+ DEFAULT_LAUNCH_CLASS);
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ BluetoothDevicePreference devicePreference =
+ (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+ // Select device.
+ devicePreference.performClick();
+ // Device bonds.
+ mPreferenceController.onDeviceBondStateChanged(
+ devicePreference.getCachedDevice(), BluetoothDevice.BOND_BONDED);
+
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).sendBroadcast(captor.capture());
+ Intent pickedIntent = captor.getValue();
+ assertThat(pickedIntent.getAction()).isEqualTo(
+ BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+ }
+
+ @Test
+ public void onDeviceBondStateChanged_selectedDeviceBonded_goesBack() {
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+ BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PACKAGE,
+ DEFAULT_LAUNCH_CLASS);
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ BluetoothDevicePreference devicePreference =
+ (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+ // Select device.
+ devicePreference.performClick();
+ // Device bonds.
+ mPreferenceController.onDeviceBondStateChanged(
+ devicePreference.getCachedDevice(), BluetoothDevice.BOND_BONDED);
+
+ verify(mFragmentController).goBack();
+ }
+
+ @Test
+ public void onDestroy_noDeviceSelected_sendsNullPickedIntent() {
+ Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+ BluetoothDevicePicker.FILTER_TYPE_ALL, DEFAULT_LAUNCH_PACKAGE,
+ DEFAULT_LAUNCH_CLASS);
+ mPreferenceController.setLaunchIntent(launchIntent);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ mPreferenceController.onDestroy(mLifecycleOwner);
+
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).sendBroadcast(captor.capture());
+ Intent pickedIntent = captor.getValue();
+ assertThat(pickedIntent.getAction()).isEqualTo(
+ BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+ assertThat((BluetoothDevice) pickedIntent.getParcelableExtra(
+ BluetoothDevice.EXTRA_DEVICE)).isNull();
+ }
+
+ private Intent createLaunchIntent(boolean needAuth, int filterType, String packageName,
+ String className) {
+ Intent intent = new Intent(BluetoothDevicePicker.ACTION_LAUNCH);
+ intent.putExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, needAuth);
+ intent.putExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE, filterType);
+ intent.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE, packageName);
+ intent.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS, className);
+ return intent;
+ }
+
+ private static class TestBluetoothDevicePickerPreferenceController
+ extends BluetoothDevicePickerPreferenceController {
+
+ TestBluetoothDevicePickerPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ String getCallingAppPackageName(IBinder activityToken) {
+ return ALLOWED_LAUNCH_PACKAGE;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java b/tests/unit/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java
index f353ca9..133a297 100644
--- a/tests/unit/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java
+++ b/tests/unit/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;
+import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import androidx.fragment.app.FragmentManager;
@@ -152,6 +153,18 @@
assertThat(mActivity.getOnBackPressedFlag()).isTrue();
}
+ @Test
+ public void onBluetoothDisabled_goesBack() throws Throwable {
+ verify(mMockEventManager).registerCallback(mFragment.mCallback);
+
+ mActivityTestRule.runOnUiThread(() -> {
+ mFragment.mCallback.onBluetoothStateChanged(BluetoothAdapter.STATE_OFF);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ assertThat(mActivity.getOnBackPressedFlag()).isTrue();
+ }
+
private void setUpFragment() throws Throwable {
String bluetoothPairingSelectionFragmentTag = "bluetooth_pairing_selection_fragment";
mActivityTestRule.runOnUiThread(() -> {
diff --git a/tests/unit/src/com/android/car/settings/bluetooth/BluetoothStateSwitchPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/bluetooth/BluetoothStateSwitchPreferenceControllerTest.java
index 7c2c6a1..4cbdc40 100644
--- a/tests/unit/src/com/android/car/settings/bluetooth/BluetoothStateSwitchPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/bluetooth/BluetoothStateSwitchPreferenceControllerTest.java
@@ -18,8 +18,15 @@
import static android.os.UserManager.DISALLOW_BLUETOOTH;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.bluetooth.BluetoothAdapter;
@@ -32,9 +39,10 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.car.settings.common.ClickableWhileDisabledSwitchPreference;
+import com.android.car.settings.common.ColoredSwitchPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -46,8 +54,11 @@
@RunWith(AndroidJUnit4.class)
public class BluetoothStateSwitchPreferenceControllerTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
private LifecycleOwner mLifecycleOwner;
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
private SwitchPreference mSwitchPreference;
private BluetoothStateSwitchPreferenceController mPreferenceController;
private LocalBluetoothManager mLocalBluetoothManager;
@@ -70,7 +81,7 @@
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mSwitchPreference = new ClickableWhileDisabledSwitchPreference(mContext);
+ mSwitchPreference = new ColoredSwitchPreference(mContext);
mPreferenceController = new BluetoothStateSwitchPreferenceController(mContext,
/* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mSwitchPreference);
@@ -116,6 +127,46 @@
}
@Test
+ public void restrictedByDpm_availabilityIsAvailableForViewing() {
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void restrictedByDpm_disableSwitchPreference() {
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ mSwitchPreference.setEnabled(true);
+ BluetoothAdapter.getDefaultAdapter().enable();
+
+ mSwitchPreference.performClick();
+
+ assertThat(mSwitchPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void restrictedByDpm_showsDisabledByAdminDialog() {
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ BluetoothAdapter.getDefaultAdapter().enable();
+
+ mSwitchPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(), eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+
+ @Test
public void switchClicked_enabled_unchecksAndDisablesSwitch() {
mPreferenceController.onCreate(mLifecycleOwner);
mPreferenceController.onStart(mLifecycleOwner);
diff --git a/tests/unit/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerUnitTest.java b/tests/unit/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerUnitTest.java
new file mode 100644
index 0000000..3fd1efa
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerUnitTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.UserManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.car.settings.common.ColoredSwitchPreference;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public final class PairNewDevicePreferenceControllerUnitTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+ private LifecycleOwner mLifecycleOwner;
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private SwitchPreference mSwitchPreference;
+ private PairNewDevicePreferenceController mPreferenceController;
+ private LocalBluetoothManager mLocalBluetoothManager;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private UserManager mUserManager;
+
+ @Mock
+ private FragmentController mFragmentController;
+
+ @Before
+ public void setUp() {
+ mLifecycleOwner = new TestLifecycleOwner();
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new PairNewDevicePreferenceController(mContext, /* preferenceKey= */
+ "key", mFragmentController, mCarUxRestrictions);
+ mSwitchPreference = new ColoredSwitchPreference(mContext);
+ mSwitchPreference.setFragment(FragmentController.class.getCanonicalName());
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mSwitchPreference);
+ }
+
+ @Test
+ public void restrictedByDpm_availabilityIsAvailableForViewing() {
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ mSwitchPreference.performClick();
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void restrictedByDpm_showsDisabledByAdminDialog() {
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ mSwitchPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(), eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/common/ActionButtonsPreferenceTest.java b/tests/unit/src/com/android/car/settings/common/ActionButtonsPreferenceTest.java
index f2ad18b..bc1af04 100644
--- a/tests/unit/src/com/android/car/settings/common/ActionButtonsPreferenceTest.java
+++ b/tests/unit/src/com/android/car/settings/common/ActionButtonsPreferenceTest.java
@@ -48,6 +48,8 @@
import org.junit.runner.RunWith;
import org.mockito.MockitoSession;
+import java.util.Arrays;
+
@RunWith(AndroidJUnit4.class)
public class ActionButtonsPreferenceTest {
@@ -208,17 +210,25 @@
mPref.onBindViewHolder(mHolder);
assertThat(mRootView.findViewById(R.id.button1).isEnabled()).isTrue();
- assertThat(mRootView.findViewById(R.id.button1Icon).isEnabled()).isTrue();
- assertThat(mRootView.findViewById(R.id.button1Text).isEnabled()).isTrue();
+ assertThat(containsDrawableState(mRootView.findViewById(R.id.button1Icon),
+ android.R.attr.state_enabled)).isTrue();
+ assertThat(containsDrawableState(mRootView.findViewById(R.id.button1Text),
+ android.R.attr.state_enabled)).isTrue();
assertThat(mRootView.findViewById(R.id.button2).isEnabled()).isFalse();
- assertThat(mRootView.findViewById(R.id.button2Icon).isEnabled()).isFalse();
- assertThat(mRootView.findViewById(R.id.button2Text).isEnabled()).isFalse();
+ assertThat(containsDrawableState(mRootView.findViewById(R.id.button2Icon),
+ android.R.attr.state_enabled)).isFalse();
+ assertThat(containsDrawableState(mRootView.findViewById(R.id.button2Text),
+ android.R.attr.state_enabled)).isFalse();
assertThat(mRootView.findViewById(R.id.button3).isEnabled()).isTrue();
- assertThat(mRootView.findViewById(R.id.button3Icon).isEnabled()).isTrue();
- assertThat(mRootView.findViewById(R.id.button3Text).isEnabled()).isTrue();
+ assertThat(containsDrawableState(mRootView.findViewById(R.id.button3Icon),
+ android.R.attr.state_enabled)).isTrue();
+ assertThat(containsDrawableState(mRootView.findViewById(R.id.button3Text),
+ android.R.attr.state_enabled)).isTrue();
assertThat(mRootView.findViewById(R.id.button4).isEnabled()).isFalse();
- assertThat(mRootView.findViewById(R.id.button4Icon).isEnabled()).isFalse();
- assertThat(mRootView.findViewById(R.id.button4Text).isEnabled()).isFalse();
+ assertThat(containsDrawableState(mRootView.findViewById(R.id.button4Icon),
+ android.R.attr.state_enabled)).isFalse();
+ assertThat(containsDrawableState(mRootView.findViewById(R.id.button4Text),
+ android.R.attr.state_enabled)).isFalse();
}
@Test
@@ -328,4 +338,12 @@
assertThat(icon).isNull();
}
+
+ private boolean containsDrawableState(View view, int state) {
+ if (view == null) {
+ return false;
+ }
+ int[] drawableStates = view.getDrawableState();
+ return Arrays.stream(drawableStates).anyMatch(x -> x == state);
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/common/ClickableWhileDisabledPreferenceTest.java b/tests/unit/src/com/android/car/settings/common/ClickableWhileDisabledPreferenceTest.java
deleted file mode 100644
index 195d27a..0000000
--- a/tests/unit/src/com/android/car/settings/common/ClickableWhileDisabledPreferenceTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.common;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.view.View;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.function.Consumer;
-
-@RunWith(AndroidJUnit4.class)
-public class ClickableWhileDisabledPreferenceTest {
-
- private Context mContext = ApplicationProvider.getApplicationContext();
- private View mRootView;
- private ClickableWhileDisabledPreference mPref;
- private PreferenceViewHolder mHolder;
-
- @Mock
- private Consumer<Preference> mPreferenceConsumer;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mRootView = View.inflate(mContext, R.layout.action_buttons_preference, /* parent= */ null);
- mHolder = PreferenceViewHolder.createInstanceForTests(mRootView);
- mPref = new ClickableWhileDisabledPreference(mContext);
- mPref.setDisabledClickListener(mPreferenceConsumer);
- }
-
- @Test
- public void isDisabled_isClickable() {
- mPref.setEnabled(false);
- mPref.onBindViewHolder(mHolder);
-
- assertThat(mHolder.itemView.isClickable()).isTrue();
- }
-
- @Test
- public void onClick_isDisabled_handleWithDisabledClickHandler() {
- mPref.setEnabled(false);
- mPref.onBindViewHolder(mHolder);
-
- mPref.performClick();
-
- verify(mPreferenceConsumer).accept(any(Preference.class));
- }
-
- @Test
- public void onClick_isEnabled_handleWithRegularClickHandler() {
- mPref.setEnabled(true);
- mPref.onBindViewHolder(mHolder);
-
- mPref.performClick();
-
- verify(mPreferenceConsumer, never()).accept(any(Preference.class));
- }
-
-}
diff --git a/tests/unit/src/com/android/car/settings/common/ClickableWhileDisabledSwitchPreferenceTest.java b/tests/unit/src/com/android/car/settings/common/ClickableWhileDisabledSwitchPreferenceTest.java
deleted file mode 100644
index 5e2ae6a..0000000
--- a/tests/unit/src/com/android/car/settings/common/ClickableWhileDisabledSwitchPreferenceTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.common;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.widget.FrameLayout;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.function.Consumer;
-
-@RunWith(AndroidJUnit4.class)
-public class ClickableWhileDisabledSwitchPreferenceTest {
-
- private Context mContext = ApplicationProvider.getApplicationContext();
- private FrameLayout mWidgetView;
- private ClickableWhileDisabledSwitchPreference mPref;
- private PreferenceViewHolder mHolder;
-
- @Mock
- private Consumer<Preference> mPreferenceConsumer;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- LayoutInflater inflater = LayoutInflater.from(mContext);
- mHolder = PreferenceViewHolder.createInstanceForTests(inflater.inflate(
- R.layout.car_ui_preference, null));
- mWidgetView = mHolder.itemView.findViewById(android.R.id.widget_frame);
- inflater.inflate(R.layout.car_ui_preference_widget_switch, mWidgetView,
- /* attachToRoot= */ true);
- mPref = new ClickableWhileDisabledSwitchPreference(mContext);
- mPref.setDisabledClickListener(mPreferenceConsumer);
- }
-
- @Test
- public void isDisabled_isClickable() {
- mPref.setEnabled(false);
- mPref.onBindViewHolder(mHolder);
-
- assertThat(mHolder.itemView.isClickable()).isTrue();
- }
-
- @Test
- public void onClick_isDisabled_handleWithDisabledClickHandler() {
- mPref.setEnabled(false);
- mPref.onBindViewHolder(mHolder);
-
- mPref.performClick();
-
- verify(mPreferenceConsumer).accept(any(Preference.class));
- }
-
- @Test
- public void onClick_isEnabled_handleWithRegularClickHandler() {
- mPref.setEnabled(true);
- mPref.onBindViewHolder(mHolder);
-
- mPref.performClick();
-
- verify(mPreferenceConsumer, never()).accept(any(Preference.class));
- }
-
- @Test
- public void onBindViewHolder_setContentDescription_shouldSetDescription() {
- String description = "test contents description";
- mPref.setContentDescription(description);
-
- mPref.onBindViewHolder(mHolder);
-
- assertThat(mHolder.itemView.getContentDescription()).isEqualTo(description);
- }
-}
diff --git a/tests/unit/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java b/tests/unit/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java
index ef84570..09ffa3a 100644
--- a/tests/unit/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java
+++ b/tests/unit/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import android.app.AlertDialog;
@@ -179,7 +180,7 @@
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
dialog.dismiss();
ArgumentCaptor<Bundle> bundle = ArgumentCaptor.forClass(Bundle.class);
- verify(mDismissListener).onDismiss(bundle.capture());
+ verify(mDismissListener).onDismiss(bundle.capture(), eq(false));
assertThat(bundle.getValue().getString(TEST_ARG_KEY)).isEqualTo(TEST_ARG_VALUE);
}
diff --git a/tests/unit/src/com/android/car/settings/common/DualPaneBaseCarSettingsActivityTest.java b/tests/unit/src/com/android/car/settings/common/DualPaneBaseCarSettingsActivityTest.java
index 8ef5f85..d660872 100644
--- a/tests/unit/src/com/android/car/settings/common/DualPaneBaseCarSettingsActivityTest.java
+++ b/tests/unit/src/com/android/car/settings/common/DualPaneBaseCarSettingsActivityTest.java
@@ -31,7 +31,7 @@
import com.android.car.settings.testutils.DualPaneTestActivity;
import com.android.car.settings.testutils.EmptySettingsFragment;
import com.android.car.settings.testutils.TestTopLevelMenuFragment;
-import com.android.car.ui.toolbar.Toolbar;
+import com.android.car.ui.toolbar.NavButtonMode;
import com.android.car.ui.toolbar.ToolbarController;
import org.junit.Rule;
@@ -140,7 +140,7 @@
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
assertThat(toolbar.getNavButtonMode()).isEquivalentAccordingToCompareTo(
- Toolbar.NavButtonMode.DISABLED);
+ NavButtonMode.DISABLED);
mActivityTestRule.runOnUiThread(() -> {
BaseTestSettingsFragment fragment2 = new BaseTestSettingsFragment();
@@ -148,13 +148,13 @@
});
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
- assertThat(toolbar.getNavButtonMode()).isEqualTo(Toolbar.NavButtonMode.BACK);
+ assertThat(toolbar.getNavButtonMode()).isEqualTo(NavButtonMode.BACK);
mActivityTestRule.runOnUiThread(() -> mActivity.goBack());
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
assertThat(toolbar.getNavButtonMode()).isEquivalentAccordingToCompareTo(
- Toolbar.NavButtonMode.DISABLED);
+ NavButtonMode.DISABLED);
}
@Test
diff --git a/tests/unit/src/com/android/car/settings/common/PreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/common/PreferenceControllerTest.java
index 447741b..9ff7618 100644
--- a/tests/unit/src/com/android/car/settings/common/PreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/common/PreferenceControllerTest.java
@@ -48,6 +48,9 @@
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import java.util.HashSet;
+import java.util.Set;
+
@RunWith(AndroidJUnit4.class)
public class PreferenceControllerTest {
@@ -62,6 +65,7 @@
private static final CarUxRestrictions BASELINE_UX_RESTRICTIONS =
new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ private static final String PREFERENCE_KEY = "key";
private LifecycleOwner mLifecycleOwner;
@@ -79,7 +83,7 @@
MockitoAnnotations.initMocks(this);
- mPreferenceController = new FakePreferenceController(mContext, /* preferenceKey= */ "key",
+ mPreferenceController = new FakePreferenceController(mContext, PREFERENCE_KEY,
mFragmentController, BASELINE_UX_RESTRICTIONS);
}
@@ -128,6 +132,49 @@
}
@Test
+ public void shouldApplyUxRestrictions_baseline() {
+ boolean result = mPreferenceController.shouldApplyUxRestrictions(BASELINE_UX_RESTRICTIONS);
+ assertThat(result).isFalse();
+ }
+
+ @Test
+ public void shouldApplyUxRestrictions_isNoSetup() {
+ mPreferenceController.setUxRestrictionsIgnoredConfig(false, new HashSet<String>());
+ boolean result = mPreferenceController.shouldApplyUxRestrictions(NO_SETUP_UX_RESTRICTIONS);
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void shouldApplyUxRestrictions_containsKey() {
+ Set prefsThatIgnore = new HashSet<String>();
+ prefsThatIgnore.add(PREFERENCE_KEY);
+
+ mPreferenceController.setUxRestrictionsIgnoredConfig(false, prefsThatIgnore);
+ boolean result = mPreferenceController.shouldApplyUxRestrictions(NO_SETUP_UX_RESTRICTIONS);
+ assertThat(result).isFalse();
+ }
+
+ @Test
+ public void shouldApplyUxRestrictions_not_containsKey() {
+ Set prefsThatIgnore = new HashSet<String>();
+ prefsThatIgnore.add("unknown key");
+
+ mPreferenceController.setUxRestrictionsIgnoredConfig(false, prefsThatIgnore);
+ boolean result = mPreferenceController.shouldApplyUxRestrictions(NO_SETUP_UX_RESTRICTIONS);
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void shouldApplyUxRestrictions_allIgnore() {
+ Set prefsThatIgnore = new HashSet<String>();
+ prefsThatIgnore.add("unknown key");
+
+ mPreferenceController.setUxRestrictionsIgnoredConfig(true, prefsThatIgnore);
+ boolean result = mPreferenceController.shouldApplyUxRestrictions(NO_SETUP_UX_RESTRICTIONS);
+ assertThat(result).isFalse();
+ }
+
+ @Test
public void onCreate_unrestricted_disabled_preferenceUnrestricted() {
mPreference.setEnabled(false);
mPreferenceController.setPreference(mPreference);
@@ -248,6 +295,8 @@
private int mAvailabilityStatus;
private int mUpdateStateCallCount;
private Preference mUpdateStateArg;
+ private boolean mAllIgnoresUxRestrictions = false;
+ private Set<String> mPreferencesIgnoringUxRestrictions = new HashSet<>();
FakePreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -282,5 +331,16 @@
public int getUpdateStateCallCount() {
return mUpdateStateCallCount;
}
+
+ public void setUxRestrictionsIgnoredConfig(boolean allIgnore, Set preferencesThatIgnore) {
+ mAllIgnoresUxRestrictions = allIgnore;
+ mPreferencesIgnoringUxRestrictions = preferencesThatIgnore;
+ }
+
+ @Override
+ protected boolean isUxRestrictionsIgnored(boolean allIgnores, Set prefsThatIgnore) {
+ return super.isUxRestrictionsIgnored(mAllIgnoresUxRestrictions,
+ mPreferencesIgnoringUxRestrictions);
+ }
}
}
diff --git a/tests/unit/src/com/android/car/settings/common/SinglePaneSettingsFragmentTest.java b/tests/unit/src/com/android/car/settings/common/SinglePaneSettingsFragmentTest.java
index 3ef78ed..c4b7f1d 100644
--- a/tests/unit/src/com/android/car/settings/common/SinglePaneSettingsFragmentTest.java
+++ b/tests/unit/src/com/android/car/settings/common/SinglePaneSettingsFragmentTest.java
@@ -24,7 +24,7 @@
import com.android.car.settings.testutils.RootTestSettingsFragment;
import com.android.car.settings.testutils.SinglePaneTestActivity;
-import com.android.car.ui.toolbar.Toolbar;
+import com.android.car.ui.toolbar.NavButtonMode;
import com.android.car.ui.toolbar.ToolbarController;
import org.junit.Rule;
@@ -56,7 +56,7 @@
ToolbarController toolbar = mActivity.getToolbar();
assertThat(toolbar.getNavButtonMode()).isEquivalentAccordingToCompareTo(
- Toolbar.NavButtonMode.DISABLED);
+ NavButtonMode.DISABLED);
}
@Test
@@ -64,6 +64,6 @@
ToolbarController toolbar = mActivity.getToolbar();
assertThat(toolbar.getNavButtonMode()).isEquivalentAccordingToCompareTo(
- Toolbar.NavButtonMode.BACK);
+ NavButtonMode.BACK);
}
}
diff --git a/tests/unit/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java b/tests/unit/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java
index 6be3d6b..b0e9da5 100644
--- a/tests/unit/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java
+++ b/tests/unit/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java
@@ -18,13 +18,10 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
-
import android.content.Context;
import android.net.NetworkPolicy;
+import android.net.NetworkTemplate;
import android.os.Bundle;
-import android.text.format.DateUtils;
import android.util.Pair;
import androidx.fragment.app.FragmentManager;
@@ -35,22 +32,23 @@
import com.android.car.settings.R;
import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
-import com.android.settingslib.NetworkPolicyEditor;
+import com.android.settingslib.net.DataUsageController;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.concurrent.TimeUnit;
/** Unit test for {@link AppDataUsageFragment}. */
@RunWith(AndroidJUnit4.class)
public class AppDataUsageFragmentTest {
+ private static final String KEY_TEMPLATE = "template";
private static final String KEY_START = "start";
private static final String KEY_END = "end";
@@ -61,11 +59,6 @@
private Iterator<Pair<ZonedDateTime, ZonedDateTime>> mIterator;
- @Mock
- private NetworkPolicyEditor mNetworkPolicyEditor;
- @Mock
- private NetworkPolicy mNetworkPolicy;
-
@Rule
public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
@@ -82,56 +75,32 @@
throws Throwable {
setUpFragment();
Bundle bundle = mFragment.getBundle();
+ NetworkTemplate networkTemplate = bundle.getParcelable(KEY_TEMPLATE);
long start = bundle.getLong(KEY_START);
long end = bundle.getLong(KEY_END);
- long timeDiff = end - start;
+ DataUsageController.DataUsageInfo dataUsageInfo =
+ new DataUsageController(mContext).getDataUsageInfo(networkTemplate);
- assertThat(timeDiff).isEqualTo(DateUtils.WEEK_IN_MILLIS * 4);
+ compareMilliseconds(start, dataUsageInfo.cycleStart);
+ compareMilliseconds(end, dataUsageInfo.cycleEnd);
}
@Test
public void onActivityCreated_iteratorIsEmpty_startAndEndDateShouldHaveFourWeeksDifference()
throws Throwable {
- when(mNetworkPolicyEditor.getPolicy(any())).thenReturn(mNetworkPolicy);
-
ArrayList<Pair<ZonedDateTime, ZonedDateTime>> list = new ArrayList<>();
mIterator = list.iterator();
setUpFragment();
Bundle bundle = mFragment.getBundle();
+ NetworkTemplate networkTemplate = bundle.getParcelable(KEY_TEMPLATE);
long start = bundle.getLong(KEY_START);
long end = bundle.getLong(KEY_END);
- long timeDiff = end - start;
+ DataUsageController.DataUsageInfo dataUsageInfo =
+ new DataUsageController(mContext).getDataUsageInfo(networkTemplate);
- assertThat(timeDiff).isEqualTo(DateUtils.WEEK_IN_MILLIS * 4);
- }
-
- @Test
- public void onActivityCreated_iteratorIsNotEmpty_startAndEndDateShouldBeLastOneInIterator()
- throws Throwable {
- when(mNetworkPolicyEditor.getPolicy(any())).thenReturn(mNetworkPolicy);
-
- ZonedDateTime start1 = ZonedDateTime.now();
- ZonedDateTime end1 = ZonedDateTime.now();
- ZonedDateTime start2 = ZonedDateTime.now();
- ZonedDateTime end2 = ZonedDateTime.now();
-
- Pair pair1 = new Pair(start1, end1);
- Pair pair2 = new Pair(start2, end2);
-
- ArrayList<Pair<ZonedDateTime, ZonedDateTime>> list = new ArrayList<>();
- list.add(pair1);
- list.add(pair2);
-
- mIterator = list.iterator();
- setUpFragment();
-
- Bundle bundle = mFragment.getBundle();
- long start = bundle.getLong(KEY_START);
- long end = bundle.getLong(KEY_END);
-
- assertThat(start).isEqualTo(start2.toInstant().toEpochMilli());
- assertThat(end).isEqualTo(end2.toInstant().toEpochMilli());
+ compareMilliseconds(start, dataUsageInfo.cycleStart);
+ compareMilliseconds(end, dataUsageInfo.cycleEnd);
}
private void setUpFragment() throws Throwable {
@@ -139,7 +108,7 @@
mActivityTestRule.runOnUiThread(() -> {
mFragmentManager.beginTransaction()
.replace(R.id.fragment_container,
- TestAppDataUsageFragment.newInstance(mNetworkPolicyEditor, mIterator),
+ TestAppDataUsageFragment.newInstance(mIterator),
appDataUsageFragmentTag)
.commitNow();
});
@@ -150,23 +119,16 @@
public static class TestAppDataUsageFragment extends AppDataUsageFragment {
- private NetworkPolicyEditor mNetworkPolicyEditor;
private Iterator<Pair<ZonedDateTime, ZonedDateTime>> mIterator;
- public static TestAppDataUsageFragment newInstance(NetworkPolicyEditor networkPolicyEditor,
+ public static TestAppDataUsageFragment newInstance(
Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator) {
TestAppDataUsageFragment fragment = new TestAppDataUsageFragment();
- fragment.mNetworkPolicyEditor = networkPolicyEditor;
fragment.mIterator = cycleIterator;
return fragment;
}
@Override
- NetworkPolicyEditor getNetworkPolicyEditor(Context context) {
- return mNetworkPolicyEditor;
- }
-
- @Override
Iterator<Pair<ZonedDateTime, ZonedDateTime>> getCycleIterator(NetworkPolicy policy) {
if (mIterator != null) {
return mIterator;
@@ -174,4 +136,10 @@
return super.getCycleIterator(policy);
}
}
+
+ /** Avoid some offset in milliseconds. */
+ private void compareMilliseconds(long milli1, long milli2) {
+ assertThat(TimeUnit.MILLISECONDS.toMinutes(milli1))
+ .isEqualTo(TimeUnit.MILLISECONDS.toMinutes(milli2));
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java
new file mode 100644
index 0000000..62653ee
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.net.TrafficStats.UID_TETHERING;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.NetworkStats;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.common.ProgressBarPreference;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.net.UidDetail;
+import com.android.settingslib.net.UidDetailProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class AppDataUsagePreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private CarUxRestrictions mCarUxRestrictions;
+ private AppDataUsagePreferenceController mPreferenceController;
+ private LogicalPreferenceGroup mPreferenceGroup;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private UidDetailProvider mMockUidDetailProvider;
+ @Mock
+ private UidDetail mMockUidDetail;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new AppDataUsagePreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockUidDetailProvider);
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @Test
+ public void defaultInitialize_hasNoPreference() {
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+ }
+
+ @Test
+ public void onDataLoaded_dataNotLoaded_hasNoPreference() {
+ mPreferenceController.onDataLoaded(null, new int[0]);
+
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+ }
+
+ @Test
+ public void onDataLoaded_statsSizeZero_hasNoPreference() {
+ NetworkStats networkStats = new NetworkStats(0, 0);
+
+ mPreferenceController.onDataLoaded(networkStats, new int[0]);
+
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+ }
+
+ @Test
+ public void onDataLoaded_statsLoaded_hasTwoPreference() {
+ NetworkStats networkStats = new NetworkStats(0, 0);
+ NetworkStats.Entry entry1 = new NetworkStats.Entry();
+ entry1.rxBytes = 100;
+ NetworkStats.Entry entry2 = new NetworkStats.Entry();
+ entry2.uid = UID_TETHERING;
+ entry2.rxBytes = 200;
+
+ mPreferenceController.onDataLoaded(networkStats.addEntry(entry1)
+ .addEntry(entry2), new int[0]);
+
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+ }
+
+ @Test
+ public void onDataLoaded_statsLoaded_hasOnePreference() {
+ when(mMockUidDetailProvider.getUidDetail(anyInt(), anyBoolean()))
+ .thenReturn(mMockUidDetail);
+ NetworkStats networkStats = new NetworkStats(0, 0);
+ NetworkStats.Entry entry1 = new NetworkStats.Entry();
+ entry1.rxBytes = 100;
+ NetworkStats.Entry entry2 = new NetworkStats.Entry();
+ entry2.uid = UID_TETHERING;
+ entry2.rxBytes = 200;
+
+ mPreferenceController.onDataLoaded(networkStats.addEntry(entry1)
+ .addEntry(entry2), new int[0]);
+
+ ProgressBarPreference preference1 =
+ (ProgressBarPreference) mPreferenceGroup.getPreference(0);
+ ProgressBarPreference preference2 =
+ (ProgressBarPreference) mPreferenceGroup.getPreference(1);
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+ assertThat(preference1.getProgress()).isEqualTo(100);
+ assertThat(preference2.getProgress()).isEqualTo(50);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/AppSpecificDataUsageManagerTest.java b/tests/unit/src/com/android/car/settings/datausage/AppSpecificDataUsageManagerTest.java
new file mode 100644
index 0000000..06ccf43
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/AppSpecificDataUsageManagerTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.android.car.settings.datausage.AppSpecificDataUsageManager.NETWORK_CYCLE_LOADER_ID;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+
+import androidx.loader.app.LoaderManager;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settingslib.net.NetworkCycleDataForUid;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class AppSpecificDataUsageManagerTest {
+
+ private static final int TEST_UID = 1;
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private AppSpecificDataUsageManager mAppSpecificDataUsageManager;
+
+ @Captor
+ private ArgumentCaptor<LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>>>
+ mCallbacksArgumentCaptor;
+ @Mock
+ private AppSpecificDataUsageManager.AppSpecificDataLoaderCallback mCallback1;
+ @Mock
+ private AppSpecificDataUsageManager.AppSpecificDataLoaderCallback mCallback2;
+ @Mock
+ private LoaderManager mLoaderManager;
+ @Mock
+ private NetworkTemplate mNetworkTemplate;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ mAppSpecificDataUsageManager = new AppSpecificDataUsageManager(mContext, mNetworkTemplate,
+ TEST_UID);
+ mAppSpecificDataUsageManager.startLoading(mLoaderManager);
+
+ verify(mLoaderManager).restartLoader(eq(NETWORK_CYCLE_LOADER_ID), eq(null),
+ mCallbacksArgumentCaptor.capture());
+ }
+
+ @Test
+ public void callback_onLoadFinished_listenerOnDataLoadedCalled() {
+ mAppSpecificDataUsageManager.registerListener(mCallback1);
+ mAppSpecificDataUsageManager.registerListener(mCallback2);
+
+ List<NetworkCycleDataForUid> dataList = new ArrayList<>();
+
+ mCallbacksArgumentCaptor.getValue().onLoadFinished(null, dataList);
+
+ verify(mCallback1).onDataLoaded(dataList);
+ verify(mCallback2).onDataLoaded(dataList);
+ }
+
+ @Test
+ public void callback_unregisterListener_onlyOneListenerOnDataLoadedCalled() {
+ mAppSpecificDataUsageManager.registerListener(mCallback1);
+ mAppSpecificDataUsageManager.registerListener(mCallback2);
+ mAppSpecificDataUsageManager.unregisterListener(mCallback2);
+
+ List<NetworkCycleDataForUid> dataList = new ArrayList<>();
+
+ mCallbacksArgumentCaptor.getValue().onLoadFinished(null, dataList);
+
+ verify(mCallback1).onDataLoaded(dataList);
+ verify(mCallback2, never()).onDataLoaded(dataList);
+ }
+
+ @Test
+ public void callback_notLoaded_listenerOnDataLoadedNotCalled() {
+ mAppSpecificDataUsageManager.registerListener(mCallback1);
+ mAppSpecificDataUsageManager.registerListener(mCallback2);
+ mAppSpecificDataUsageManager.unregisterListener(mCallback2);
+
+ List<NetworkCycleDataForUid> dataList = new ArrayList<>();
+
+ verify(mCallback1, never()).onDataLoaded(dataList);
+ verify(mCallback2, never()).onDataLoaded(dataList);
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java b/tests/unit/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
similarity index 76%
rename from tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
rename to tests/unit/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
index d0b4685..e2898df 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
+++ b/tests/unit/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,18 +24,15 @@
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.net.INetworkStatsService;
import android.net.INetworkStatsSession;
import android.net.NetworkPolicyManager;
import android.net.NetworkStats;
import android.os.Bundle;
import androidx.loader.app.LoaderManager;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.car.settings.testutils.ShadowINetworkStatsServiceStub;
-import com.android.car.settings.testutils.ShadowNetworkPolicyManager;
-
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -43,64 +40,40 @@
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-/** Unit test for {@link AppsNetworkStatsManager}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowINetworkStatsServiceStub.class, ShadowNetworkPolicyManager.class})
+@RunWith(AndroidJUnit4.class)
public class AppsNetworkStatsManagerTest {
- private Context mContext;
+ private Context mContext = ApplicationProvider.getApplicationContext();
private AppsNetworkStatsManager mAppsNetworkStatsManager;
@Captor
- private ArgumentCaptor<LoaderManager.LoaderCallbacks<NetworkStats>>
- mCallbacksArgumentCaptor;
-
+ private ArgumentCaptor<LoaderManager.LoaderCallbacks<NetworkStats>> mCallbacksArgumentCaptor;
@Mock
private AppsNetworkStatsManager.Callback mCallback1;
-
@Mock
private AppsNetworkStatsManager.Callback mCallback2;
-
@Mock
private LoaderManager mLoaderManager;
-
- @Mock
- private INetworkStatsService mINetworkStatsService;
-
@Mock
private INetworkStatsSession mINetworkStatsSession;
-
@Mock
private NetworkPolicyManager mNetworkPolicyManager;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
-
- when(mINetworkStatsService.openSession()).thenReturn(mINetworkStatsSession);
- ShadowINetworkStatsServiceStub.setINetworkStatsSession(mINetworkStatsService);
when(mNetworkPolicyManager.getUidsWithPolicy(anyInt())).thenReturn(new int[0]);
- ShadowNetworkPolicyManager.setNetworkPolicyManager(mNetworkPolicyManager);
- mAppsNetworkStatsManager = new AppsNetworkStatsManager(mContext);
+ mAppsNetworkStatsManager = new AppsNetworkStatsManager(mContext, mNetworkPolicyManager,
+ mINetworkStatsSession);
mAppsNetworkStatsManager.startLoading(mLoaderManager, Bundle.EMPTY);
verify(mLoaderManager).restartLoader(eq(1), eq(Bundle.EMPTY),
mCallbacksArgumentCaptor.capture());
}
- @After
- public void tearDown() {
- ShadowINetworkStatsServiceStub.reset();
- ShadowNetworkPolicyManager.reset();
- }
-
@Test
public void callback_onLoadFinished_listenerOnDataLoadedCalled() throws Exception {
mAppsNetworkStatsManager.registerListener(mCallback1);
diff --git a/tests/unit/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java
new file mode 100644
index 0000000..0c17082
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.NetworkTemplate;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
+import android.text.format.Time;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.ListPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class CycleResetDayOfMonthPickerPreferenceControllerTest {
+ private static int STARTING_VALUE = 15;
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private CarUxRestrictions mCarUxRestrictions;
+ private CycleResetDayOfMonthPickerPreferenceController mPreferenceController;
+ private ListPreference mPreference;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private NetworkPolicyEditor mMockPolicyEditor;
+ @Mock
+ private NetworkTemplate mMockNetworkTemplate;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new CycleResetDayOfMonthPickerPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions);
+ mPreference = new ListPreference(mContext);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.setNetworkPolicyEditor(mMockPolicyEditor);
+ mPreferenceController.setNetworkTemplate(mMockNetworkTemplate);
+ when(mMockPolicyEditor.getPolicyCycleDay(mMockNetworkTemplate)).thenReturn(STARTING_VALUE);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @Test
+ public void onCreate_createEntries() {
+ CharSequence[] entries = mPreference.getEntries();
+
+ assertThat(entries[0]).isEqualTo(
+ String.valueOf(CycleResetDayOfMonthPickerPreferenceController.MIN_DAY));
+ assertThat(entries[entries.length - 1]).isEqualTo(
+ String.valueOf(CycleResetDayOfMonthPickerPreferenceController.MAX_DAY));
+ }
+
+ @Test
+ public void onCreate_setsSummary() {
+ String prefix = mContext.getString(R.string.cycle_reset_day_of_month_picker_subtitle);
+ assertThat(mPreference.getSummary()).isEqualTo(BidiFormatter.getInstance().unicodeWrap(
+ prefix + " " + STARTING_VALUE,
+ TextDirectionHeuristics.LOCALE));
+ }
+
+ @Test
+ public void onPreferenceChanged_setsCycleDay() {
+ int newValue = STARTING_VALUE + 1;
+ mPreferenceController.handlePreferenceChanged(mPreference, String.valueOf(newValue));
+
+ ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class);
+ verify(mMockPolicyEditor).setPolicyCycleDay(
+ eq(mMockNetworkTemplate), captor.capture(), eq(new Time().timezone));
+ assertThat(captor.getValue()).isEqualTo(newValue);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java
new file mode 100644
index 0000000..df2288f
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.net.NetworkPolicy.LIMIT_DISABLED;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.NetworkTemplate;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DataLimitPreferenceControllerTest {
+
+ private static final long GIB_IN_BYTES = 1024 * 1024 * 1024;
+ private static final long EPSILON = 100;
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private CarUxRestrictions mCarUxRestrictions;
+ private DataLimitPreferenceController mPreferenceController;
+ private LogicalPreferenceGroup mPreferenceGroup;
+ private Preference mLimitPreference;
+ private TwoStatePreference mEnablePreference;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private NetworkPolicyEditor mMockPolicyEditor;
+ @Mock
+ private NetworkTemplate mMockNetworkTemplate;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new DataLimitPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions);
+
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mEnablePreference = new SwitchPreference(mContext);
+ mEnablePreference.setKey(mContext.getString(R.string.pk_data_set_limit));
+ mPreferenceGroup.addPreference(mEnablePreference);
+ mLimitPreference = new CarUiPreference(mContext);
+ mLimitPreference.setKey(mContext.getString(R.string.pk_data_limit));
+ mPreferenceGroup.addPreference(mLimitPreference);
+
+ mPreferenceController.setNetworkPolicyEditor(mMockPolicyEditor);
+ mPreferenceController.setNetworkTemplate(mMockNetworkTemplate);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @Test
+ public void refreshUi_limitDisabled_summaryEmpty() {
+ when(mMockPolicyEditor.getPolicyLimitBytes(mMockNetworkTemplate))
+ .thenReturn(LIMIT_DISABLED);
+ mPreferenceController.refreshUi();
+
+ assertThat(mLimitPreference.getSummary()).isNull();
+ }
+
+ @Test
+ public void refreshUi_limitDisabled_preferenceDisabled() {
+ when(mMockPolicyEditor.getPolicyLimitBytes(mMockNetworkTemplate))
+ .thenReturn(LIMIT_DISABLED);
+ mPreferenceController.refreshUi();
+
+ assertThat(mLimitPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void refreshUi_limitDisabled_switchUnchecked() {
+ when(mMockPolicyEditor.getPolicyLimitBytes(mMockNetworkTemplate))
+ .thenReturn(LIMIT_DISABLED);
+ mPreferenceController.refreshUi();
+
+ assertThat(mEnablePreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void refreshUi_limitEnabled_summaryPopulated() {
+ when(mMockPolicyEditor.getPolicyLimitBytes(mMockNetworkTemplate))
+ .thenReturn(5 * GIB_IN_BYTES);
+ mPreferenceController.refreshUi();
+
+ assertThat(mLimitPreference.getSummary().toString()).isNotEmpty();
+ }
+
+ @Test
+ public void refreshUi_limitEnabled_preferenceEnabled() {
+ when(mMockPolicyEditor.getPolicyLimitBytes(mMockNetworkTemplate))
+ .thenReturn(5 * GIB_IN_BYTES);
+ mPreferenceController.refreshUi();
+
+ assertThat(mLimitPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void refreshUi_limitEnabled_switchChecked() {
+ when(mMockPolicyEditor.getPolicyLimitBytes(mMockNetworkTemplate))
+ .thenReturn(5 * GIB_IN_BYTES);
+ mPreferenceController.refreshUi();
+
+ assertThat(mEnablePreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void onPreferenceChanged_toggleFalse_limitBytesDisabled() {
+ mEnablePreference.callChangeListener(false);
+ verify(mMockPolicyEditor).setPolicyLimitBytes(mMockNetworkTemplate, LIMIT_DISABLED);
+ }
+
+ @Test
+ public void onPreferenceChanged_toggleTrue_showsDialog() {
+ mEnablePreference.callChangeListener(true);
+
+ verify(mMockFragmentController).showDialog(any(ConfirmationDialogFragment.class),
+ eq(ConfirmationDialogFragment.TAG));
+ }
+
+ @Test
+ public void onDialogConfirm_noWarningThreshold_setsLimitTo5GB() {
+ mPreferenceController.onConfirm(null);
+
+ verify(mMockPolicyEditor).setPolicyLimitBytes(mMockNetworkTemplate, 5 * GIB_IN_BYTES);
+ }
+
+ @Test
+ public void onDialogConfirm_hasWarningThreshold_setsLimitToWithMultiplier() {
+ when(mMockPolicyEditor.getPolicyWarningBytes(mMockNetworkTemplate))
+ .thenReturn(5 * GIB_IN_BYTES);
+ mPreferenceController.onConfirm(null);
+
+ ArgumentCaptor<Long> setLimit = ArgumentCaptor.forClass(Long.class);
+ verify(mMockPolicyEditor).setPolicyLimitBytes(eq(mMockNetworkTemplate), setLimit.capture());
+
+ long setValue = setLimit.getValue();
+ // Due to precision errors, add and subtract a small epsilon.
+ assertThat(setValue).isGreaterThan(
+ (long) (5 * GIB_IN_BYTES * DataLimitPreferenceController.LIMIT_BYTES_MULTIPLIER)
+ - EPSILON);
+ assertThat(setValue).isLessThan(
+ (long) (5 * GIB_IN_BYTES * DataLimitPreferenceController.LIMIT_BYTES_MULTIPLIER)
+ + EPSILON);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onPreferenceClicked_launchesFragment() {
+ mLimitPreference.performClick();
+
+ verify(mMockFragmentController).launchFragment(any(DataLimitSetThresholdFragment.class));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataLimitSetThresholdFragmentTest.java b/tests/unit/src/com/android/car/settings/datausage/DataLimitSetThresholdFragmentTest.java
new file mode 100644
index 0000000..a28b2b3
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataLimitSetThresholdFragmentTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.android.car.settings.datausage.DataUsageSetThresholdBaseFragment.MIB_IN_BYTES;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+
+import androidx.fragment.app.FragmentManager;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+import com.android.car.ui.toolbar.ToolbarController;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DataLimitSetThresholdFragmentTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private DataLimitSetThresholdFragment mFragment;
+ private BaseCarSettingsTestActivity mActivity;
+ private FragmentManager mFragmentManager;
+
+ @Mock
+ private NetworkPolicyEditor mMockNetworkPolicyEditor;
+ @Mock
+ private NetworkTemplate mMockNetworkTemplate;
+
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
+
+ @Before
+ @UiThreadTest
+ public void setUp() throws Throwable {
+ MockitoAnnotations.initMocks(this);
+ mActivity = mActivityTestRule.getActivity();
+ mFragmentManager = mActivityTestRule.getActivity().getSupportFragmentManager();
+ setUpFragment();
+ }
+
+ @Test
+ public void onActivityCreated_titleIsSet() {
+ ToolbarController toolbar = mActivity.getToolbar();
+ assertThat(toolbar.getTitle().toString()).isEqualTo(
+ mContext.getString(R.string.data_usage_limit_editor_title));
+ }
+
+ @Test
+ public void onActivityCreated_saveButtonClicked_savesLimit() {
+ mFragment.onSave(MIB_IN_BYTES);
+
+ verify(mMockNetworkPolicyEditor).setPolicyLimitBytes(mMockNetworkTemplate, MIB_IN_BYTES);
+ }
+
+ private void setUpFragment() throws Throwable {
+ String dataUsageSetThresholdFragmentTag = "data_usage_set_threshold_fragment";
+ DataLimitSetThresholdFragment fragment = DataLimitSetThresholdFragment.newInstance(
+ mMockNetworkTemplate);
+ fragment.mPolicyEditor = mMockNetworkPolicyEditor;
+ mActivityTestRule.runOnUiThread(() -> {
+ mFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, fragment, dataUsageSetThresholdFragmentTag)
+ .commitNow();
+ });
+ mFragment = spy((DataLimitSetThresholdFragment) mFragmentManager
+ .findFragmentByTag(dataUsageSetThresholdFragmentTag));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataUsageCycleManagerTest.java b/tests/unit/src/com/android/car/settings/datausage/DataUsageCycleManagerTest.java
new file mode 100644
index 0000000..d7aa58d
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataUsageCycleManagerTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.android.car.settings.datausage.DataUsageCycleManager.NETWORK_CYCLE_LOADER_ID;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+
+import androidx.loader.app.LoaderManager;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settingslib.net.NetworkCycleChartData;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class DataUsageCycleManagerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private DataUsageCycleManager mDataUsageCycleManager;
+
+ @Captor
+ private ArgumentCaptor<LoaderManager.LoaderCallbacks<List<NetworkCycleChartData>>>
+ mCallbacksArgumentCaptor;
+ @Mock
+ private DataUsageCycleManager.DataUsageCycleLoaderCallback mCallback1;
+ @Mock
+ private DataUsageCycleManager.DataUsageCycleLoaderCallback mCallback2;
+ @Mock
+ private LoaderManager mLoaderManager;
+ @Mock
+ private NetworkTemplate mNetworkTemplate;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ mDataUsageCycleManager = new DataUsageCycleManager(mContext, mNetworkTemplate);
+ mDataUsageCycleManager.startLoading(mLoaderManager);
+
+ verify(mLoaderManager).restartLoader(eq(NETWORK_CYCLE_LOADER_ID), eq(null),
+ mCallbacksArgumentCaptor.capture());
+ }
+
+ @Test
+ public void callback_onLoadFinished_listenerOnDataLoadedCalled() {
+ mDataUsageCycleManager.registerListener(mCallback1);
+ mDataUsageCycleManager.registerListener(mCallback2);
+
+ List<NetworkCycleChartData> dataList = new ArrayList<>();
+
+ mCallbacksArgumentCaptor.getValue().onLoadFinished(null, dataList);
+
+ verify(mCallback1).onDataLoaded(dataList);
+ verify(mCallback2).onDataLoaded(dataList);
+ }
+
+ @Test
+ public void callback_unregisterListener_onlyOneListenerOnDataLoadedCalled() {
+ mDataUsageCycleManager.registerListener(mCallback1);
+ mDataUsageCycleManager.registerListener(mCallback2);
+ mDataUsageCycleManager.unregisterListener(mCallback2);
+
+ List<NetworkCycleChartData> dataList = new ArrayList<>();
+
+ mCallbacksArgumentCaptor.getValue().onLoadFinished(null, dataList);
+
+ verify(mCallback1).onDataLoaded(dataList);
+ verify(mCallback2, never()).onDataLoaded(dataList);
+ }
+
+ @Test
+ public void callback_notLoaded_listenerOnDataLoadedNotCalled() {
+ mDataUsageCycleManager.registerListener(mCallback1);
+ mDataUsageCycleManager.registerListener(mCallback2);
+ mDataUsageCycleManager.unregisterListener(mCallback2);
+
+ List<NetworkCycleChartData> dataList = new ArrayList<>();
+
+ verify(mCallback1, never()).onDataLoaded(dataList);
+ verify(mCallback2, never()).onDataLoaded(dataList);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataUsageEditTextPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/datausage/DataUsageEditTextPreferenceControllerTest.java
new file mode 100644
index 0000000..f1b56ed
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataUsageEditTextPreferenceControllerTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.testng.Assert.assertThrows;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DataUsageEditTextPreferenceControllerTest {
+
+ private static final String DEFAULT_TEXT = "DEFAULT_TEXT";
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private CarUxRestrictions mCarUxRestrictions;
+ private DataUsageEditTextPreference mPreference;
+ private DataUsageEditTextPreferenceController mPreferenceController;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new DataUsageEditTextPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions);
+ mPreference = spy(new DataUsageEditTextPreference(mContext));
+ }
+
+ @Test
+ public void checkInitialized_noDefaultText_throwException() {
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mPreference));
+ }
+
+ @Test
+ public void onCreate_setsDefaultText_textSet() {
+ mPreferenceController.setDefaultText(DEFAULT_TEXT);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ verify(mPreference).setText(DEFAULT_TEXT);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataUsageEditTextPreferenceTest.java b/tests/unit/src/com/android/car/settings/datausage/DataUsageEditTextPreferenceTest.java
new file mode 100644
index 0000000..3eb5913
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataUsageEditTextPreferenceTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.view.View;
+
+import androidx.preference.PreferenceViewHolder;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class DataUsageEditTextPreferenceTest {
+
+ private static final String TEST_TEXT = "TEST_TEXT";
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private PreferenceViewHolder mViewHolder;
+ private DataUsageEditTextPreference mDataUsageEditTextPreference;
+
+ @Before
+ public void setUp() {
+ View rootView = View.inflate(mContext, R.layout.data_usage_edit_text_preference,
+ /* root= */ null);
+ mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
+ mDataUsageEditTextPreference = new DataUsageEditTextPreference(mContext);
+ }
+
+ @Test
+ public void onBindViewHolder_noSetText() {
+ mDataUsageEditTextPreference.onBindViewHolder(mViewHolder);
+
+ assertThat(mDataUsageEditTextPreference.getText()).isEmpty();
+ }
+
+ @Test
+ public void onBindViewHolder_setText_displaysText() {
+ mDataUsageEditTextPreference.setText(TEST_TEXT);
+ mDataUsageEditTextPreference.onBindViewHolder(mViewHolder);
+
+ assertThat(mDataUsageEditTextPreference.getText()).isEqualTo(TEST_TEXT);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..7f4b118
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
+import android.util.Range;
+import android.util.RecurrenceRule;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import com.google.android.collect.Lists;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+import java.time.ZonedDateTime;
+import java.util.Iterator;
+
+@RunWith(AndroidJUnit4.class)
+public class DataUsageEntryPreferenceControllerTest {
+
+ private static final int SUBSCRIPTION_ID = 1;
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private CarUxRestrictions mCarUxRestrictions;
+ private Preference mPreference;
+ private DataUsageEntryPreferenceController mPreferenceController;
+ private MockitoSession mSession;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private NetworkCapabilities mMockNetworkCapabilities;
+ @Mock
+ private SubscriptionManager mMockSubscriptionManager;
+ @Mock
+ private SubscriptionPlan mMockSubscriptionPlan;
+ @Mock
+ private RecurrenceRule mMockRecurrenceRule;
+ @Mock
+ private ConnectivityManager mMockConnectivityManager;
+ @Mock
+ private Network mMockNetwork;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new DataUsageEntryPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions);
+
+ mPreference = new CarUiPreference(mContext);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+
+ mSession = ExtendedMockito.mockitoSession().mockStatic(
+ SubscriptionManager.class, withSettings().lenient()).startMocking();
+
+ // Setup to always make preference available.
+ when(mContext.getSystemService(ConnectivityManager.class))
+ .thenReturn(mMockConnectivityManager);
+ Network[] networks = {mMockNetwork};
+ when(mMockConnectivityManager.getAllNetworks()).thenReturn(networks);
+ when(mMockConnectivityManager.getNetworkCapabilities(mMockNetwork))
+ .thenReturn(mMockNetworkCapabilities);
+ when(mMockNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
+ .thenReturn(true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void getAvailabilityStatus_noMobileNetwork_isUnsupported() {
+ when(mMockNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
+ .thenReturn(false);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_hasMobileNetwork_isAvailable() {
+ when(mMockNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
+ .thenReturn(true);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void refreshUi_noDefaultSubscriptionId_noSummarySet() {
+ when(mContext.getSystemService(SubscriptionManager.class))
+ .thenReturn(mMockSubscriptionManager);
+ ExtendedMockito.when(SubscriptionManager.getDefaultSubscriptionId())
+ .thenReturn(INVALID_SUBSCRIPTION_ID);
+
+ mPreferenceController.refreshUi();
+ assertThat(mPreference.getSummary()).isNull();
+ }
+
+ @Test
+ public void refreshUi_noPrimaryPlan_noSummarySet() {
+ when(mContext.getSystemService(SubscriptionManager.class))
+ .thenReturn(mMockSubscriptionManager);
+ ExtendedMockito.when(SubscriptionManager.getDefaultSubscriptionId())
+ .thenReturn(SUBSCRIPTION_ID);
+ when(mMockSubscriptionManager.getSubscriptionPlans(SUBSCRIPTION_ID))
+ .thenReturn(Lists.newArrayList());
+
+ mPreferenceController.refreshUi();
+ assertThat(mPreference.getSummary()).isNull();
+ }
+
+ @Test
+ public void refreshUi_hasPrimaryPlan_setsSummary() {
+ when(mContext.getSystemService(SubscriptionManager.class))
+ .thenReturn(mMockSubscriptionManager);
+ ExtendedMockito.when(SubscriptionManager.getDefaultSubscriptionId())
+ .thenReturn(SUBSCRIPTION_ID);
+ when(mMockSubscriptionManager.getSubscriptionPlans(SUBSCRIPTION_ID))
+ .thenReturn(Lists.newArrayList(mMockSubscriptionPlan));
+ when(mMockSubscriptionPlan.getDataLimitBytes()).thenReturn(100L);
+ when(mMockSubscriptionPlan.getDataUsageBytes()).thenReturn(10L);
+ when(mMockSubscriptionPlan.getCycleRule()).thenReturn(mMockRecurrenceRule);
+
+ // Provide arbitrary cycle start time so summary is displayed
+ Iterator<Range<ZonedDateTime>> cycle = new Iterator<Range<ZonedDateTime>>() {
+ @Override
+ public boolean hasNext() {
+ return true;
+ }
+
+ @Override
+ public Range<ZonedDateTime> next() {
+ return new Range<>(ZonedDateTime.now(), ZonedDateTime.now());
+ }
+ };
+ when(mMockSubscriptionPlan.cycleIterator()).thenReturn(cycle);
+
+ mPreferenceController.refreshUi();
+ assertThat(mPreference.getSummary().length()).isGreaterThan(0);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataUsageSetThresholdBaseFragmentTest.java b/tests/unit/src/com/android/car/settings/datausage/DataUsageSetThresholdBaseFragmentTest.java
new file mode 100644
index 0000000..26e7256
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataUsageSetThresholdBaseFragmentTest.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.android.car.settings.datausage.DataUsageSetThresholdBaseFragment.GIB_IN_BYTES;
+import static com.android.car.settings.datausage.DataUsageSetThresholdBaseFragment.MB_GB_SUFFIX_THRESHOLD;
+import static com.android.car.settings.datausage.DataUsageSetThresholdBaseFragment.MIB_IN_BYTES;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.content.Context;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+
+import androidx.annotation.StringRes;
+import androidx.fragment.app.FragmentManager;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+import com.android.car.ui.toolbar.ToolbarController;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+@RunWith(AndroidJUnit4.class)
+public class DataUsageSetThresholdBaseFragmentTest {
+
+ private static final int SUB_ID = 11;
+ private static final int TITLE_RES_ID = R.string.settings_label; // placeholder string
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private DataUsageSetThresholdBaseFragment mFragment;
+ private BaseCarSettingsTestActivity mActivity;
+ private FragmentManager mFragmentManager;
+ private MockitoSession mSession;
+
+ @Mock
+ private NetworkPolicyEditor mMockNetworkPolicyEditor;
+ @Mock
+ private NetworkTemplate mMockNetworkTemplate;
+
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
+
+ @Before
+ public void setUp() throws Throwable {
+ MockitoAnnotations.initMocks(this);
+ mActivity = mActivityTestRule.getActivity();
+ mFragmentManager = mActivityTestRule.getActivity().getSupportFragmentManager();
+ mSession = ExtendedMockito.mockitoSession().mockStatic(DataUsageUtils.class,
+ withSettings().lenient()).startMocking();
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ @UiThreadTest
+ public void onActivityCreated_noTemplateSet_getsDefaultTemplate() throws Throwable {
+ when(DataUsageUtils.getDefaultSubscriptionId(any())).thenReturn(SUB_ID);
+ when(DataUsageUtils.getMobileNetworkTemplate(any(), eq(SUB_ID)))
+ .thenReturn(mMockNetworkTemplate);
+ setUpFragment(/* useTemplate= */ false, /* initialBytes= */ MIB_IN_BYTES);
+
+ assertThat(mFragment.mNetworkTemplate).isEqualTo(mMockNetworkTemplate);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onActivityCreated_saveButtonSet() throws Throwable {
+ setUpFragment(/* useTemplate= */ true, /* initialBytes= */ MIB_IN_BYTES);
+
+ ToolbarController toolbar = mActivity.getToolbar();
+ assertThat(toolbar.getMenuItems().get(0).getTitle().toString()).isEqualTo(
+ mContext.getString(R.string.data_usage_warning_save_title));
+ }
+
+ @Test
+ @UiThreadTest
+ public void onActivityCreated_titleSet() throws Throwable {
+ setUpFragment(/* useTemplate= */ true, /* initialBytes= */ MIB_IN_BYTES);
+
+ ToolbarController toolbar = mActivity.getToolbar();
+ assertThat(toolbar.getTitle().toString()).isEqualTo(mContext.getString(TITLE_RES_ID));
+ }
+
+ @Test
+ @UiThreadTest
+ public void onActivityCreated_belowGbThreshold_mbSet() throws Throwable {
+ setUpFragment(/* useTemplate= */ true, /* initialBytes= */ MIB_IN_BYTES);
+
+ assertThat(mFragment.mDataWarningUnitsPreferenceController.isGbSelected()).isFalse();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onActivityCreated_aboveGbThreshold_gbSet() throws Throwable {
+ setUpFragment(/* useTemplate= */ true,
+ /* initialBytes= */ (long) (MB_GB_SUFFIX_THRESHOLD * GIB_IN_BYTES * 2));
+
+ assertThat(mFragment.mDataWarningUnitsPreferenceController.isGbSelected()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onActivityCreated_saveButtonClicked_goesBack() throws Throwable {
+ setUpFragment(/* useTemplate= */ true, /* initialBytes= */ MIB_IN_BYTES);
+
+ doReturn(MIB_IN_BYTES).when(mFragment).getCurrentThreshold();
+
+ mFragment.onSaveClicked();
+
+ assertThat(mActivity.getOnBackPressedFlag()).isTrue();
+ }
+
+ private void setUpFragment(boolean useTemplate, long initialBytes) throws Throwable {
+ String dataUsageSetThresholdFragmentTag = "data_usage_set_threshold_fragment";
+ TestDataUsageSetThresholdBaseFragment fragment = new
+ TestDataUsageSetThresholdBaseFragment();
+ fragment.mInitialBytes = initialBytes;
+ Bundle args = new Bundle();
+ args.putParcelable(NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE, useTemplate
+ ? mMockNetworkTemplate : null);
+ fragment.setArguments(args);
+ fragment.mPolicyEditor = mMockNetworkPolicyEditor;
+
+ mActivityTestRule.runOnUiThread(() -> {
+ mFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, fragment, dataUsageSetThresholdFragmentTag)
+ .commitNow();
+ });
+ mFragment = spy((TestDataUsageSetThresholdBaseFragment) mFragmentManager
+ .findFragmentByTag(dataUsageSetThresholdFragmentTag));
+ }
+
+ public static class TestDataUsageSetThresholdBaseFragment extends
+ DataUsageSetThresholdBaseFragment {
+ public long mInitialBytes;
+
+ @Override
+ protected void onSave(long threshold) {}
+
+ @Override
+ @StringRes
+ protected int getTitleResId() {
+ return TITLE_RES_ID;
+ }
+
+ @Override
+ protected long getInitialBytes() {
+ return mInitialBytes;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
new file mode 100644
index 0000000..d626f2a
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.text.format.Formatter;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.net.DataUsageController;
+
+import com.google.android.collect.Lists;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+import java.time.Period;
+import java.time.ZonedDateTime;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+public class DataUsageSummaryPreferenceControllerTest {
+
+ private static final CharSequence TEST_CARRIER_NAME = "TEST_CARRIER_NAME";
+ private static final int SUB_ID = 1;
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private CarUxRestrictions mCarUxRestrictions;
+ private DataUsageSummaryPreference mDataUsageSummaryPreference;
+ private DataUsageSummaryPreferenceController mPreferenceController;
+ private MockitoSession mSession;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private DataUsageController mMockDataUsageController;
+ @Mock
+ private SubscriptionManager mMockSubscriptionManager;
+ @Mock
+ private TelephonyManager mMockTelephonyManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mSession = ExtendedMockito.mockitoSession()
+ .spyStatic(TelephonyManager.class)
+ .startMocking();
+
+ ExtendedMockito.when(TelephonyManager.from(mContext)).thenReturn(mMockTelephonyManager);
+ when(mMockTelephonyManager.createForSubscriptionId(SUB_ID))
+ .thenReturn(mMockTelephonyManager);
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new DataUsageSummaryPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions, mMockSubscriptionManager, mMockDataUsageController);
+ mDataUsageSummaryPreference = new DataUsageSummaryPreference(mContext);
+ mPreferenceController.setFields(SUB_ID);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mDataUsageSummaryPreference);
+
+ SubscriptionInfo info = mock(SubscriptionInfo.class);
+ when(mMockSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(info);
+
+ when(mMockTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_LOADED);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void getAvailabilityStatus_hasSim_isAvailable() {
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_noSim_isConditionallyUnavailable() {
+ when(mMockTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_UNKNOWN);
+ assertThat(mPreferenceController.getAvailabilityStatus())
+ .isEqualTo(CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
+ public void refreshUi_hasUsage_titleSet() {
+ DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+ info.usageLevel = 10000;
+ when(mMockDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ String usedValueString = Formatter.formatBytes(mContext.getResources(), info.usageLevel,
+ Formatter.FLAG_CALCULATE_ROUNDED | Formatter.FLAG_IEC_UNITS).value;
+ assertThat(mDataUsageSummaryPreference.getTitle().toString()).contains(usedValueString);
+ }
+
+ @Test
+ public void refreshUi_hasCarrierName_hasRecentUpdate_setsCarrierInfoText() {
+ DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+ info.usageLevel = 10000;
+ when(mMockDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+
+ setCarrierName(TEST_CARRIER_NAME);
+ setSubscriptionPlan(/* usageBytes= */ 1000L, System.currentTimeMillis());
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mDataUsageSummaryPreference.getCarrierInfoText()).isEqualTo(
+ TextUtils.expandTemplate(mContext.getText(R.string.carrier_and_update_now_text),
+ TEST_CARRIER_NAME));
+ }
+
+ @Test
+ public void refreshUi_hasCarrierName_hasOldUpdate_setsCarrierInfoText() {
+ DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+ info.usageLevel = 10000;
+ when(mMockDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+
+ int numDays = 15;
+ setCarrierName(TEST_CARRIER_NAME);
+ setSubscriptionPlan(/* usageBytes= */ 1000L,
+ System.currentTimeMillis() - TimeUnit.DAYS.toMillis(numDays));
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mDataUsageSummaryPreference.getCarrierInfoText()).isEqualTo(
+ TextUtils.expandTemplate(mContext.getText(R.string.carrier_and_update_text),
+ TEST_CARRIER_NAME, numDays + " days"));
+ }
+
+ @Test
+ public void refreshUi_noCarrierName_hasRecentUpdate_setsCarrierInfoText() {
+ DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+ info.usageLevel = 10000;
+ when(mMockDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+
+ setSubscriptionPlan(/* usageBytes= */ 1000L, System.currentTimeMillis());
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mDataUsageSummaryPreference.getCarrierInfoText().toString()).isEqualTo(
+ mContext.getString(R.string.no_carrier_update_now_text));
+ }
+
+ @Test
+ public void refreshUi_noCarrierName_hasOldUpdate_setsCarrierInfoText() {
+ DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+ info.usageLevel = 10000;
+ when(mMockDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+
+ int numDays = 15;
+ setSubscriptionPlan(/* usageBytes= */ 1000L,
+ System.currentTimeMillis() - TimeUnit.DAYS.toMillis(numDays));
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mDataUsageSummaryPreference.getCarrierInfoText()).isEqualTo(
+ TextUtils.expandTemplate(mContext.getText(R.string.no_carrier_update_text),
+ null, numDays + " days"));
+ }
+
+ @Test
+ public void refreshUi_hasUpdateTimeOlderThanWarning_setsCarrierInfoStyle() {
+ DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+ info.usageLevel = 10000;
+ when(mMockDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+
+
+ // Subtract an extra hour to account fo the difference in calls to
+ // System.currentTimeMillis().
+ setSubscriptionPlan(/* usageBytes= */ 1000L,
+ System.currentTimeMillis() - DataUsageSummaryPreferenceController.WARNING_AGE
+ - TimeUnit.HOURS.toMillis(1));
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mDataUsageSummaryPreference.getCarrierInfoTextStyle()).isEqualTo(
+ R.style.DataUsageSummaryCarrierInfoWarningTextAppearance);
+ }
+
+ @Test
+ public void refreshUi_hasUpdateTimeYoungerThanWarning_setsCarrierInfoStyle() {
+ DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+ info.usageLevel = 10000;
+ when(mMockDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+
+ // Subtract an extra hour to account fo the difference in calls to
+ // System.currentTimeMillis().
+ setSubscriptionPlan(/* usageBytes= */ 1000L,
+ System.currentTimeMillis() - DataUsageSummaryPreferenceController.WARNING_AGE
+ + TimeUnit.HOURS.toMillis(1));
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mDataUsageSummaryPreference.getCarrierInfoTextStyle()).isEqualTo(
+ R.style.DataUsageSummaryCarrierInfoTextAppearance);
+ }
+
+ private void setCarrierName(CharSequence name) {
+ SubscriptionInfo subInfo = new SubscriptionInfo(/* id= */ 0, /* iccId= */ "",
+ /* simSlotIndex= */ 0, /* displayName= */ "", name,
+ /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+ /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
+ /* countryIso= */ "", /* isEmbedded= */ false,
+ /* accessRules= */ null, /* cardString= */ "");
+ when(mMockSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(subInfo);
+ }
+
+ private void setSubscriptionPlan(long usageBytes, long snapshotMillis) {
+ ZonedDateTime start = ZonedDateTime.now();
+ ZonedDateTime end = ZonedDateTime.now().plusDays(30);
+ SubscriptionPlan plan = new SubscriptionPlan.Builder(start, end, Period.ofMonths(1))
+ .setDataLimit(/* dataLimitBytes= */ 5000000000L,
+ SubscriptionPlan.LIMIT_BEHAVIOR_DISABLED)
+ .setDataUsage(usageBytes, snapshotMillis)
+ .build();
+ when(mMockSubscriptionManager.getSubscriptionPlans(anyInt()))
+ .thenReturn(Lists.newArrayList(plan));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/unit/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java
new file mode 100644
index 0000000..58179f2
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.Intent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.preference.PreferenceViewHolder;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+
+@RunWith(AndroidJUnit4.class)
+public class DataUsageSummaryPreferenceTest {
+
+ private static final String TEST_LABEL = "TEST_LABEL";
+ private static final Intent TEST_INTENT = new Intent("test_action");
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private PreferenceViewHolder mViewHolder;
+ private DataUsageSummaryPreference mDataUsageSummaryPreference;
+
+ @Before
+ public void setUp() {
+ View rootView = View.inflate(mContext, R.layout.data_usage_summary_preference,
+ /* root= */ null);
+ mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
+ mDataUsageSummaryPreference = new DataUsageSummaryPreference(mContext);
+ }
+
+ @Test
+ public void onBindViewHolder_noCarrierInfoText_isGone() {
+ mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+ assertThat(getCarrierInfoText().getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void onBindViewHolder_hasCarrierInfoText_isVisible() {
+ mDataUsageSummaryPreference.setCarrierInfoText(TEST_LABEL);
+ mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+ assertThat(getCarrierInfoText().getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void onBindViewHolder_hasCarrierInfoText_setsText() {
+ mDataUsageSummaryPreference.setCarrierInfoText(TEST_LABEL);
+ mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+ assertThat(mDataUsageSummaryPreference.getCarrierInfoText().toString()).isEqualTo(
+ TEST_LABEL);
+ }
+
+ @Test
+ public void onBindViewHolder_noManagePlanIntent_isGone() {
+ mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+ assertThat(getManageSubscriptionButton().getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void onBindViewHolder_hasManagePlanIntent_isVisible() {
+ mDataUsageSummaryPreference.setManageSubscriptionIntent(TEST_INTENT);
+ mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+ assertThat(getManageSubscriptionButton().getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void onButtonClick_hasManagePlanIntent_startsActivity() {
+ mDataUsageSummaryPreference.setManageSubscriptionIntent(TEST_INTENT);
+ mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+ doNothing().when(mContext).startActivity(any());
+ getManageSubscriptionButton().performClick();
+
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).startActivity(captor.capture());
+
+ Intent intent = captor.getValue();
+ assertThat(intent.getAction()).isEqualTo(TEST_INTENT.getAction());
+ }
+
+ private TextView getCarrierInfoText() {
+ return (TextView) mViewHolder.findViewById(R.id.carrier_info_text);
+ }
+
+ private Button getManageSubscriptionButton() {
+ return (Button) mViewHolder.findViewById(R.id.manage_subscription_button);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataUsageUnitPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/datausage/DataUsageUnitPreferenceControllerTest.java
new file mode 100644
index 0000000..ff21d72
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataUsageUnitPreferenceControllerTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DataUsageUnitPreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private CarUxRestrictions mCarUxRestrictions;
+ private LogicalPreferenceGroup mPreferenceGroup;
+ private DataUsageUnitPreferenceController mPreferenceController;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new DataUsageUnitPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions);
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ }
+
+ @Test
+ public void checkInitialized_noDefaultSelection_throwException() {
+ assertThrows(IllegalStateException.class,
+ () -> PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mPreferenceGroup));
+ }
+
+ @Test
+ public void onCreate_setsGbDefault_mbSet() {
+ mPreferenceController.setDefaultSelection(/* isGb= */ true);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.isGbSelected()).isTrue();
+ }
+
+ @Test
+ public void onCreate_setsMbDefault_mbSet() {
+ mPreferenceController.setDefaultSelection(/* isGb= */ false);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.isGbSelected()).isFalse();
+ }
+
+ @Test
+ public void onCreate_setsGbDefault_onToggleMbSet() {
+ mPreferenceController.setDefaultSelection(/* isGb= */ true);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ Preference mbPreference = mPreferenceGroup
+ .findPreference(mContext.getString(R.string.pk_data_usage_radio_mb));
+ mbPreference.performClick();
+
+ assertThat(mPreferenceController.isGbSelected()).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java b/tests/unit/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
similarity index 97%
rename from tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
rename to tests/unit/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
index d718f5d..f71c892 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
+++ b/tests/unit/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,15 +26,16 @@
import android.telephony.SubscriptionPlan;
import android.util.RecurrenceRule;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.google.android.collect.Lists;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
import java.util.Collections;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class DataUsageUtilsTest {
private static final int SUBSCRIPTION_ID = 1;
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
similarity index 60%
rename from tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
rename to tests/unit/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
index 63f26af..9fa1533 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,19 +25,26 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.net.NetworkTemplate;
-import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import androidx.preference.TwoStatePreference;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.settingslib.NetworkPolicyEditor;
import org.junit.Before;
@@ -46,51 +53,61 @@
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class DataWarningPreferenceControllerTest {
private static final long BYTES_IN_GIGABYTE = 1024 * 1024 * 1024;
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private CarUxRestrictions mCarUxRestrictions;
private TwoStatePreference mEnablePreference;
+ private PreferenceGroup mPreferenceGroup;
private Preference mWarningPreference;
- private DataWarningPreferenceController mController;
- private FragmentController mFragmentController;
+ private DataWarningPreferenceController mPreferenceController;
+
+ @Mock
+ private FragmentController mMockFragmentController;
@Mock
private NetworkPolicyEditor mPolicyEditor;
@Mock
private NetworkTemplate mNetworkTemplate;
@Before
+ @UiThreadTest
public void setUp() {
MockitoAnnotations.initMocks(this);
- Context context = RuntimeEnvironment.application;
+ mLifecycleOwner = new TestLifecycleOwner();
- PreferenceGroup preferenceGroup = new LogicalPreferenceGroup(context);
- PreferenceControllerTestHelper<DataWarningPreferenceController> controllerHelper =
- new PreferenceControllerTestHelper<>(context,
- DataWarningPreferenceController.class, preferenceGroup);
- mController = controllerHelper.getController();
- mFragmentController = controllerHelper.getMockFragmentController();
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new DataWarningPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController,
+ mCarUxRestrictions);
- mEnablePreference = new SwitchPreference(context);
- mEnablePreference.setKey(context.getString(R.string.pk_data_set_warning));
- preferenceGroup.addPreference(mEnablePreference);
- mWarningPreference = new Preference(context);
- mWarningPreference.setKey(context.getString(R.string.pk_data_warning));
- preferenceGroup.addPreference(mWarningPreference);
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
- mController.setNetworkPolicyEditor(mPolicyEditor);
- mController.setNetworkTemplate(mNetworkTemplate);
- controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+ mEnablePreference = new SwitchPreference(mContext);
+ mEnablePreference.setKey(mContext.getString(R.string.pk_data_set_warning));
+ mPreferenceGroup.addPreference(mEnablePreference);
+ mWarningPreference = new Preference(mContext);
+ mWarningPreference.setKey(mContext.getString(R.string.pk_data_warning));
+ mPreferenceGroup.addPreference(mWarningPreference);
+
+ mPreferenceController.setNetworkPolicyEditor(mPolicyEditor);
+ mPreferenceController.setNetworkTemplate(mNetworkTemplate);
+ mPreferenceController.onCreate(mLifecycleOwner);
}
@Test
public void refreshUi_warningDisabled_summaryEmpty() {
when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(WARNING_DISABLED);
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mWarningPreference.getSummary()).isNull();
}
@@ -98,7 +115,7 @@
@Test
public void refreshUi_warningDisabled_preferenceDisabled() {
when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(WARNING_DISABLED);
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mWarningPreference.isEnabled()).isFalse();
}
@@ -106,7 +123,7 @@
@Test
public void refreshUi_warningDisabled_switchUnchecked() {
when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(WARNING_DISABLED);
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mEnablePreference.isChecked()).isFalse();
}
@@ -115,7 +132,7 @@
public void refreshUi_warningEnabled_summaryPopulated() {
when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(
3 * BYTES_IN_GIGABYTE);
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mWarningPreference.getSummary().toString()).isNotEmpty();
}
@@ -124,7 +141,7 @@
public void refreshUi_warningEnabled_preferenceEnabled() {
when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(
3 * BYTES_IN_GIGABYTE);
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mWarningPreference.isEnabled()).isTrue();
}
@@ -133,7 +150,7 @@
public void refreshUi_warningEnabled_switchChecked() {
when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(
3 * BYTES_IN_GIGABYTE);
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mEnablePreference.isChecked()).isTrue();
}
@@ -154,10 +171,10 @@
}
@Test
- public void onPreferenceClicked_showsPickerDialog() {
+ @UiThreadTest
+ public void onPreferenceClicked_launchesFragment() {
mWarningPreference.performClick();
- verify(mFragmentController).showDialog(any(UsageBytesThresholdPickerDialog.class),
- eq(UsageBytesThresholdPickerDialog.TAG));
+ verify(mMockFragmentController).launchFragment(any(DataWarningSetThresholdFragment.class));
}
}
diff --git a/tests/unit/src/com/android/car/settings/datausage/DataWarningSetThresholdFragmentTest.java b/tests/unit/src/com/android/car/settings/datausage/DataWarningSetThresholdFragmentTest.java
new file mode 100644
index 0000000..808b83f
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/DataWarningSetThresholdFragmentTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.android.car.settings.datausage.DataWarningSetThresholdFragment.MIB_IN_BYTES;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+
+import androidx.fragment.app.FragmentManager;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+import com.android.car.ui.toolbar.ToolbarController;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DataWarningSetThresholdFragmentTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private DataWarningSetThresholdFragment mFragment;
+ private BaseCarSettingsTestActivity mActivity;
+ private FragmentManager mFragmentManager;
+
+ @Mock
+ private NetworkPolicyEditor mMockNetworkPolicyEditor;
+ @Mock
+ private NetworkTemplate mMockNetworkTemplate;
+
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
+
+ @Before
+ @UiThreadTest
+ public void setUp() throws Throwable {
+ MockitoAnnotations.initMocks(this);
+ mActivity = mActivityTestRule.getActivity();
+ mFragmentManager = mActivityTestRule.getActivity().getSupportFragmentManager();
+ setUpFragment();
+ }
+
+ @Test
+ public void onActivityCreated_titleIsSet() {
+ ToolbarController toolbar = mActivity.getToolbar();
+ assertThat(toolbar.getTitle().toString()).isEqualTo(
+ mContext.getString(R.string.data_usage_warning_editor_title));
+ }
+
+ @Test
+ public void onActivityCreated_saveButtonClicked_savesThreshold() {
+ mFragment.onSave(MIB_IN_BYTES);
+
+ verify(mMockNetworkPolicyEditor).setPolicyWarningBytes(mMockNetworkTemplate, MIB_IN_BYTES);
+ }
+
+ private void setUpFragment() throws Throwable {
+ String dataUsageSetThresholdFragmentTag = "data_usage_set_threshold_fragment";
+ DataWarningSetThresholdFragment fragment = DataWarningSetThresholdFragment.newInstance(
+ mMockNetworkTemplate);
+ fragment.mPolicyEditor = mMockNetworkPolicyEditor;
+ mActivityTestRule.runOnUiThread(() -> {
+ mFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, fragment, dataUsageSetThresholdFragmentTag)
+ .commitNow();
+ });
+ mFragment = spy((DataWarningSetThresholdFragment) mFragmentManager
+ .findFragmentByTag(dataUsageSetThresholdFragmentTag));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java b/tests/unit/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java
new file mode 100644
index 0000000..999b641
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.DialogInterface;
+
+import androidx.fragment.app.FragmentManager;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class UsageBytesThresholdPickerDialogTest {
+
+ private FragmentManager mFragmentManager;
+
+ @Mock
+ private UsageBytesThresholdPickerDialog.BytesThresholdPickedListener
+ mBytesThresholdPickedListener;
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mFragmentManager = mActivityTestRule.getActivity().getSupportFragmentManager();
+ }
+
+ @Test
+ public void dialogInit_validValue_showsCurrentValue() throws Throwable {
+ long twoGB = 2 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
+ UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+ R.string.data_usage_limit_editor_title, twoGB);
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.show(mFragmentManager, /* tag= */ null);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ assertThat(dialog.getCurrentThreshold()).isEqualTo(twoGB);
+ }
+
+ @Test
+ public void dialogInit_lowInvalidValue_showsLowestPossibleValue() throws Throwable {
+ UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+ R.string.data_usage_limit_editor_title, -1);
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.show(mFragmentManager, /* tag= */ null);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ assertThat(dialog.getCurrentThreshold()).isEqualTo(0);
+ }
+
+ @Test
+ public void positiveButtonClick_noChangeInValue_dialogListenerNotCalled() throws Throwable {
+ long twoGB = 2 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
+ UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+ R.string.data_usage_limit_editor_title, twoGB);
+ dialog.setBytesThresholdPickedListener(mBytesThresholdPickedListener);
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.show(mFragmentManager, /* tag= */ null);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ DialogInterface dialogInterface = mock(DialogInterface.class);
+ dialog.onClick(dialogInterface, DialogInterface.BUTTON_POSITIVE);
+
+ verify(mBytesThresholdPickedListener, never()).onThresholdPicked(anyLong());
+ }
+
+ @Test
+ public void positiveButtonClick_changeInValue_dialogListenerCalled() throws Throwable {
+ long twoGB = 2 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
+ UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+ R.string.data_usage_limit_editor_title, twoGB);
+ dialog.setBytesThresholdPickedListener(mBytesThresholdPickedListener);
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.show(mFragmentManager, /* tag= */ null);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ long threeGB = 3 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.setThresholdEditor(threeGB);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ DialogInterface dialogInterface = mock(DialogInterface.class);
+ dialog.onClick(dialogInterface, DialogInterface.BUTTON_POSITIVE);
+
+ verify(mBytesThresholdPickedListener).onThresholdPicked(threeGB);
+ }
+
+ @Test
+ public void getCurrentThreshold_aboveLimit_returnLimit() throws Throwable {
+ long limitGBTimesTwo = 2 * UsageBytesThresholdPickerDialog.MAX_DATA_LIMIT_BYTES;
+ UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+ R.string.data_usage_limit_editor_title, limitGBTimesTwo);
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.show(mFragmentManager, /* tag= */ null);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ assertThat(dialog.getCurrentThreshold()).isEqualTo(
+ UsageBytesThresholdPickerDialog.MAX_DATA_LIMIT_BYTES);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java
index bae5b49..3338c3b 100644
--- a/tests/unit/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java
@@ -16,52 +16,84 @@
package com.android.car.settings.datetime;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.content.Intent;
+import android.os.UserManager;
import android.provider.Settings;
+import android.widget.Toast;
import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.SwitchPreference;
+import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiSwitchPreference;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
import java.util.List;
@RunWith(AndroidJUnit4.class)
public class AutoTimeZoneTogglePreferenceControllerTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_CONFIG_DATE_TIME;
- private Context mContext;
- private SwitchPreference mPreference;
+ private final LifecycleOwner mLifecycleOwner = new TestLifecycleOwner();
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+
+ private CarUiSwitchPreference mPreference;
private AutoTimeZoneTogglePreferenceController mController;
+ private MockitoSession mSession;
@Mock
private FragmentController mFragmentController;
+ @Mock
+ private UserManager mMockUserManager;
+ @Mock
+ private Toast mMockToast;
@Before
+ @UiThreadTest
public void setUp() {
- LifecycleOwner lifecycleOwner = new TestLifecycleOwner();
- MockitoAnnotations.initMocks(this);
+ mSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(Toast.class)
+ .strictness(Strictness.LENIENT)
+ .startMocking();
- mContext = spy(ApplicationProvider.getApplicationContext());
- mPreference = new SwitchPreference(mContext);
+ mPreference = new CarUiSwitchPreference(mContext);
+
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ when(Toast.makeText(any(), anyString(), anyInt())).thenReturn(mMockToast);
CarUxRestrictions carUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
@@ -69,7 +101,15 @@
/* preferenceKey= */ "key", mFragmentController, carUxRestrictions);
PreferenceControllerTestUtil.assignPreference(mController, mPreference);
- mController.onCreate(lifecycleOwner);
+ mController.onCreate(mLifecycleOwner);
+ }
+
+ @After
+ @UiThreadTest
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
}
@Test
@@ -111,4 +151,69 @@
Intent intentFired = intentsFired.get(0);
assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED);
}
+
+ @Test
+ public void testGetAvailabilityStatus_restricted_availableForViewing() {
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(true);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_notRestricted_available() {
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(false);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ assertThat(mPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void testDisabledClick_restrictedByUm_toast() {
+ mockUserRestrictionSetByUm(true);
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(true);
+ mController.onCreate(mLifecycleOwner);
+
+ mPreference.performClick();
+
+ assertShowingBlockedToast();
+ }
+
+ @Test
+ @UiThreadTest
+ public void testDisabledClick_restrictedByDpm_dialog() {
+ mockUserRestrictionSetByDpm(true);
+ mController.onCreate(mLifecycleOwner);
+
+ mPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void mockUserRestrictionSetByUm(boolean restricted) {
+ when(mMockUserManager.hasBaseUserRestriction(eq(TEST_RESTRICTION), any()))
+ .thenReturn(restricted);
+ }
+
+ private void mockUserRestrictionSetByDpm(boolean restricted) {
+ mockUserRestrictionSetByUm(false);
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(restricted);
+ }
+
+ private void assertShowingBlockedToast() {
+ String toastText = mContext.getResources().getString(R.string.action_unavailable);
+ ExtendedMockito.verify(
+ () -> Toast.makeText(any(), eq(toastText), anyInt()));
+ verify(mMockToast).show();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java b/tests/unit/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
index 2e2ce3f..1ba6578 100644
--- a/tests/unit/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
+++ b/tests/unit/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -36,6 +37,7 @@
@RunWith(AndroidJUnit4.class)
public class DevelopmentSettingsUtilTest {
private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mSpiedContext = spy(mContext);
@Mock
private UserManager mMockUserManager;
@@ -47,6 +49,8 @@
// default to no debugging restrictions
when(mMockUserManager.hasUserRestriction(
UserManager.DISALLOW_DEBUGGING_FEATURES)).thenReturn(false);
+ when(mSpiedContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ when(mSpiedContext.getContentResolver()).thenReturn(mContext.getContentResolver());
}
@Test
@@ -90,8 +94,8 @@
when(mMockUserManager.hasUserRestriction(
UserManager.DISALLOW_DEBUGGING_FEATURES)).thenReturn(true);
- assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext, mMockUserManager))
- .isFalse();
+ assertThat(DevelopmentSettingsUtil
+ .isDevelopmentSettingsEnabled(mSpiedContext, mMockUserManager)).isFalse();
}
@Test
diff --git a/tests/unit/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java
index 97d4f62..c5a7ec5 100644
--- a/tests/unit/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java
@@ -16,21 +16,38 @@
package com.android.car.settings.display;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
import android.car.drivingstate.CarUxRestrictions;
+import android.content.ContentResolver;
import android.content.Context;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.os.UserManager;
import android.provider.Settings;
import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.SwitchPreference;
-import androidx.preference.TwoStatePreference;
+import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiSwitchPreference;
import org.junit.Before;
import org.junit.Test;
@@ -40,29 +57,58 @@
@RunWith(AndroidJUnit4.class)
public class AdaptiveBrightnessTogglePreferenceControllerTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_CONFIG_BRIGHTNESS;
private Context mContext;
+ private Resources mResources;
+ private LifecycleOwner mLifecycleOwner;
private AdaptiveBrightnessTogglePreferenceController mPreferenceController;
- private TwoStatePreference mTwoStatePreference;
+ private CarUiSwitchPreference mPreference;
@Mock
private FragmentController mFragmentController;
+ @Mock
+ private UserManager mMockUserManager;
@Before
+ @UiThreadTest
public void setUp() {
- LifecycleOwner lifecycleOwner = new TestLifecycleOwner();
MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
- mContext = ApplicationProvider.getApplicationContext();
- mTwoStatePreference = new SwitchPreference(mContext);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(mResources);
+ mPreference = new CarUiSwitchPreference(mContext);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
CarUxRestrictions carUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
mPreferenceController = new AdaptiveBrightnessTogglePreferenceController(mContext,
/* preferenceKey= */ "key", mFragmentController, carUxRestrictions);
- PreferenceControllerTestUtil.assignPreference(mPreferenceController, mTwoStatePreference);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
- mPreferenceController.onCreate(lifecycleOwner);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @Test
+ public void onStart_registersContentObserver() {
+ ContentResolver resolver = spy(mContext.getContentResolver());
+ when(mContext.getContentResolver()).thenReturn(resolver);
+ mPreferenceController.onStart(mLifecycleOwner);
+ verify(resolver).registerContentObserver(
+ eq(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE)), eq(false),
+ any(ContentObserver.class));
+ }
+
+ @Test
+ public void onStop_unregistersContentObserver() {
+ ContentResolver resolver = spy(mContext.getContentResolver());
+ when(mContext.getContentResolver()).thenReturn(resolver);
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.onStop(mLifecycleOwner);
+ verify(resolver).unregisterContentObserver(any(ContentObserver.class));
}
@Test
@@ -72,7 +118,7 @@
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
mPreferenceController.refreshUi();
- assertThat(mTwoStatePreference.isChecked()).isFalse();
+ assertThat(mPreference.isChecked()).isFalse();
}
@Test
@@ -82,12 +128,12 @@
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
mPreferenceController.refreshUi();
- assertThat(mTwoStatePreference.isChecked()).isTrue();
+ assertThat(mPreference.isChecked()).isTrue();
}
@Test
public void testHandlePreferenceChanged_setFalse() {
- mTwoStatePreference.callChangeListener(false);
+ mPreference.callChangeListener(false);
int brightnessMode = Settings.System.getInt(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
@@ -96,10 +142,63 @@
@Test
public void testHandlePreferenceChanged_setTrue() {
- mTwoStatePreference.callChangeListener(true);
+ mPreference.callChangeListener(true);
int brightnessMode = Settings.System.getInt(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
assertThat(brightnessMode).isEqualTo(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
}
+
+ @Test
+ public void getAvailabilityStatus_supportedd_notRestricted_available() {
+ mockSupportsAdaptiveBrightness(true);
+ mockUserRestrictionSetByDpm(false);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_notSupported_unsupportOnDevice() {
+ mockSupportsAdaptiveBrightness(false);
+
+ assertThat(mPreferenceController.getAvailabilityStatus())
+ .isEqualTo(UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_supported_restricted_availableForViewing() {
+ mockSupportsAdaptiveBrightness(true);
+ mockUserRestrictionSetByDpm(true);
+
+ assertThat(mPreferenceController.getAvailabilityStatus())
+ .isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void disabledClick_restrictedByDpm_showActionDisabledByAdminDialog() {
+ mockSupportsAdaptiveBrightness(true);
+ mockUserRestrictionSetByDpm(true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ mPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ // TODO: refactor to use EnterpriseTestUtils
+ private void mockUserRestrictionSetByDpm(boolean restricted) {
+ when(mMockUserManager.hasBaseUserRestriction(eq(TEST_RESTRICTION), any()))
+ .thenReturn(false);
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(restricted);
+ }
+
+ private void mockSupportsAdaptiveBrightness(boolean supported) {
+ when(mResources.getBoolean(R.bool.config_automatic_brightness_available))
+ .thenReturn(supported);
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerMockTest.java b/tests/unit/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerMockTest.java
new file mode 100644
index 0000000..4f49790
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerMockTest.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.display;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.UserManager;
+import android.widget.Toast;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.common.SeekBarPreference;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
+
+@RunWith(AndroidJUnit4.class)
+public final class BrightnessLevelPreferenceControllerMockTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_CONFIG_BRIGHTNESS;
+
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private final LifecycleOwner mLifecycleOwner = new TestLifecycleOwner();
+
+ private BrightnessLevelPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private SeekBarPreference mPreference;
+ private MockitoSession mSession;
+
+ @Mock
+ private FragmentController mFragmentController;
+ @Mock
+ private UserManager mMockUserManager;
+ @Mock
+ private Toast mMockToast;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ mSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(Toast.class)
+ .strictness(Strictness.LENIENT)
+ .startMocking();
+
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ when(Toast.makeText(any(), anyString(), anyInt())).thenReturn(mMockToast);
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreference = new SeekBarPreference(mContext);
+ mPreferenceController = new BrightnessLevelPreferenceController(mContext,
+ "key", mFragmentController, mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ }
+
+ @After
+ @UiThreadTest
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_restrictedByUm_disabledForUser() {
+ mockUserRestrictionSetByUm(true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_restrictedByDpm_disabledForUser() {
+ mockUserRestrictionSetByDpm(true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_notRestricted_available() {
+ mockUserRestrictionSetByDpm(false);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ assertThat(mPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void testDisabledClick_restrictedByUm_toast() {
+ mockUserRestrictionSetByUm(true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ mPreference.performClick();
+
+ assertShowingBlockedToast();
+ }
+
+ @Test
+ @UiThreadTest
+ public void testDisabledClick_restrictedByDpm_dialog() {
+ mockUserRestrictionSetByDpm(true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ mPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void mockUserRestrictionSetByUm(boolean restricted) {
+ when(mMockUserManager.hasBaseUserRestriction(eq(TEST_RESTRICTION), any()))
+ .thenReturn(restricted);
+ }
+
+ private void mockUserRestrictionSetByDpm(boolean restricted) {
+ mockUserRestrictionSetByUm(false);
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(restricted);
+ }
+
+ private void assertShowingBlockedToast() {
+ String toastText = mContext.getResources().getString(R.string.action_unavailable);
+ ExtendedMockito.verify(
+ () -> Toast.makeText(any(), eq(toastText), anyInt()));
+ verify(mMockToast).show();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java
index 64e26f1..23b9316 100644
--- a/tests/unit/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java
@@ -21,8 +21,19 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
import android.car.drivingstate.CarUxRestrictions;
+import android.content.ContentResolver;
import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.Looper;
import android.os.UserHandle;
import android.provider.Settings;
@@ -41,11 +52,18 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
@RunWith(AndroidJUnit4.class)
public class BrightnessLevelPreferenceControllerTest {
+ private static final int WAIT_TIME_SEC = 10; // Time to ensure brightness value has been written
+
private Context mContext;
+ private LifecycleOwner mLifecycleOwner;
private BrightnessLevelPreferenceController mController;
private SeekBarPreference mSeekBarPreference;
+ private CountDownLatch mCountDownLatch;
private int mMin;
private int mMax;
private int mMid;
@@ -55,10 +73,12 @@
@Before
public void setUp() {
- LifecycleOwner lifecycleOwner = new TestLifecycleOwner();
+ mLifecycleOwner = new TestLifecycleOwner();
MockitoAnnotations.initMocks(this);
- mContext = ApplicationProvider.getApplicationContext();
+ mCountDownLatch = new CountDownLatch(1);
+
+ mContext = spy(ApplicationProvider.getApplicationContext());
mMin = mContext.getResources().getInteger(
com.android.internal.R.integer.config_screenBrightnessSettingMinimum);
mMax = mContext.getResources().getInteger(
@@ -72,7 +92,26 @@
/* preferenceKey= */ "key", mFragmentController, carUxRestrictions);
PreferenceControllerTestUtil.assignPreference(mController, mSeekBarPreference);
- mController.onCreate(lifecycleOwner);
+ mController.onCreate(mLifecycleOwner);
+ }
+
+ @Test
+ public void onStart_registersContentObserver() {
+ ContentResolver resolver = mock(ContentResolver.class);
+ when(mContext.getContentResolver()).thenReturn(resolver);
+ mController.onStart(mLifecycleOwner);
+ verify(resolver).registerContentObserver(
+ eq(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS)), eq(false),
+ any(ContentObserver.class));
+ }
+
+ @Test
+ public void onStop_unregistersContentObserver() {
+ ContentResolver resolver = mock(ContentResolver.class);
+ when(mContext.getContentResolver()).thenReturn(resolver);
+ mController.onStart(mLifecycleOwner);
+ mController.onStop(mLifecycleOwner);
+ verify(resolver).unregisterContentObserver(any(ContentObserver.class));
}
@Test
@@ -111,26 +150,56 @@
}
@Test
- public void testHandlePreferenceChanged_minValue() throws Settings.SettingNotFoundException {
+ public void testHandlePreferenceChanged_minValue()
+ throws Settings.SettingNotFoundException, InterruptedException {
+ ContentObserver contentObserver = registerContentObserver();
mSeekBarPreference.callChangeListener(0);
+ mCountDownLatch.await(WAIT_TIME_SEC, TimeUnit.SECONDS); // Wait to ensure value is written
int currentSettingsVal = Settings.System.getIntForUser(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, UserHandle.myUserId());
+ unregisterContentObserver(contentObserver);
assertThat(currentSettingsVal).isEqualTo(mMin);
}
@Test
- public void testHandlePreferenceChanged_maxValue() throws Settings.SettingNotFoundException {
+ public void testHandlePreferenceChanged_maxValue()
+ throws Settings.SettingNotFoundException, InterruptedException {
+ ContentObserver contentObserver = registerContentObserver();
mSeekBarPreference.callChangeListener(GAMMA_SPACE_MAX);
+ mCountDownLatch.await(WAIT_TIME_SEC, TimeUnit.SECONDS); // Wait to ensure value is written
int currentSettingsVal = Settings.System.getIntForUser(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, UserHandle.myUserId());
+ unregisterContentObserver(contentObserver);
assertThat(currentSettingsVal).isEqualTo(mMax);
}
@Test
- public void testHandlePreferenceChanged_midValue() throws Settings.SettingNotFoundException {
+ public void testHandlePreferenceChanged_midValue()
+ throws Settings.SettingNotFoundException, InterruptedException {
+ ContentObserver contentObserver = registerContentObserver();
mSeekBarPreference.callChangeListener(convertLinearToGamma(mMid, mMin, mMax));
+ mCountDownLatch.await(WAIT_TIME_SEC, TimeUnit.SECONDS); // Wait to ensure value is written
int currentSettingsVal = Settings.System.getIntForUser(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, UserHandle.myUserId());
+ unregisterContentObserver(contentObserver);
assertThat(currentSettingsVal).isEqualTo(mMid);
}
+
+ private ContentObserver registerContentObserver() {
+ ContentObserver contentObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange) {
+ mCountDownLatch.countDown();
+ }
+ };
+ mContext.getContentResolver().registerContentObserver(
+ Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), false,
+ contentObserver);
+
+ return contentObserver;
+ }
+
+ private void unregisterContentObserver(ContentObserver contentObserver) {
+ mContext.getContentResolver().unregisterContentObserver(contentObserver);
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/ActionDisabledByAdminActivityTest.java b/tests/unit/src/com/android/car/settings/enterprise/ActionDisabledByAdminActivityTest.java
new file mode 100644
index 0000000..27910b2
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/ActionDisabledByAdminActivityTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminActivity.FRAGMENT_TAG;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AlertDialog;
+import android.app.admin.DevicePolicyManager;
+import android.content.Intent;
+
+import androidx.fragment.app.FragmentManager;
+import androidx.test.rule.ActivityTestRule;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.MockitoAnnotations;
+
+public class ActionDisabledByAdminActivityTest extends BaseEnterpriseTestCase {
+
+ private static final String RESTRICTION_STRING = "RESTRICTION_STRING";
+
+ private FragmentManager mFragmentManager;
+ private ActionDisabledByAdminDialogFragment mFragment;
+
+ @Rule
+ public ActivityTestRule<ActionDisabledByAdminActivity> mActivityTestRule =
+ new ActivityTestRule<>(ActionDisabledByAdminActivity.class, true, false);
+
+ @Before
+ public void setUp() throws Throwable {
+ MockitoAnnotations.initMocks(this);
+ mockNullEnforcedAdmin(RESTRICTION_STRING, 0);
+ mockNullEnforcedAdmin(RESTRICTION_STRING, mRealContext.getUserId());
+ }
+
+ @Test
+ public void onCreate_showDialog() {
+ mActivityTestRule.launchActivity(getIntent(false));
+ mFragmentManager = mActivityTestRule.getActivity().getSupportFragmentManager();
+ mFragment = (ActionDisabledByAdminDialogFragment)
+ mFragmentManager.findFragmentByTag(FRAGMENT_TAG);
+
+ assertThat(mFragment).isNotNull();
+ AlertDialog dialog = (AlertDialog) mFragment.getDialog();
+ assertThat(dialog).isNotNull();
+ assertThat(dialog.isShowing()).isTrue();
+ }
+
+ @Test
+ public void onCreate_readsIntentRestriction() {
+ mActivityTestRule.launchActivity(getIntent(true));
+ mFragmentManager = mActivityTestRule.getActivity().getSupportFragmentManager();
+ mFragment = (ActionDisabledByAdminDialogFragment)
+ mFragmentManager.findFragmentByTag(FRAGMENT_TAG);
+
+ assertThat(mFragment).isNotNull();
+ assertThat(mFragment.mRestriction).isEqualTo(RESTRICTION_STRING);
+ }
+
+ private Intent getIntent(boolean hasRestrictionFlag) {
+ Intent intent = new Intent(mSpiedContext, ActionDisabledByAdminActivity.class);
+ if (hasRestrictionFlag) {
+ intent.putExtra(DevicePolicyManager.EXTRA_RESTRICTION, RESTRICTION_STRING);
+ }
+
+ return intent;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/BaseDeviceAdminAddPreferenceControllerTestCase.java b/tests/unit/src/com/android/car/settings/enterprise/BaseDeviceAdminAddPreferenceControllerTestCase.java
deleted file mode 100644
index 1ea7754..0000000
--- a/tests/unit/src/com/android/car/settings/enterprise/BaseDeviceAdminAddPreferenceControllerTestCase.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.settings.enterprise;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.notNull;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-abstract class BaseDeviceAdminAddPreferenceControllerTestCase<T extends
- BaseDeviceAdminAddPreferenceController<?>> extends BasePreferenceControllerTestCase {
-
- protected final void verifyPreferenceTitleNeverSet() {
- verify(mPreference, never()).setTitle(any());
- }
-
- protected final void verifyPreferenceTitleSet(CharSequence title) {
- verify(mPreference).setTitle(title);
- }
-
- protected final void verifyPreferenceTitleSet(int resId) {
- verify(mPreference).setTitle(resId);
- }
-
- protected final void verifyPreferenceSummarySet(CharSequence title) {
- verify(mPreference).setSummary(title);
- }
-
- protected final void verifyPreferenceSummaryNeverSet() {
- verify(mPreference, never()).setSummary(any());
- }
-
- protected final void verifyPreferenceIconSet() {
- verify(mPreference).setIcon(notNull());
- }
-
- protected final void verifyPreferenceIconNeverSet() {
- verify(mPreference, never()).setIcon(notNull());
- }
-
- protected final void verifyPreferenceDisabled() {
- verify(mPreference).setEnabled(false);
- }
-
- protected final void verifyPreferenceEnabled() {
- verify(mPreference).setEnabled(true);
- }
-}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/BaseEnterpriseTestCase.java b/tests/unit/src/com/android/car/settings/enterprise/BaseEnterpriseTestCase.java
index 2bebf0f..1c4188e 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/BaseEnterpriseTestCase.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/BaseEnterpriseTestCase.java
@@ -15,6 +15,10 @@
*/
package com.android.car.settings.enterprise;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -24,38 +28,42 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.AppOpsManager;
import android.app.admin.DeviceAdminInfo;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.IBinder;
import android.os.UserManager;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.RestrictedLockUtilsInternal;
+
+import org.junit.After;
import org.junit.Before;
-import org.junit.Rule;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
+import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
import java.util.Arrays;
@RunWith(AndroidJUnit4.class)
-abstract class BaseEnterpriseTestCase {
-
- @Rule
- public final MockitoRule mockitorule = MockitoJUnit.rule();
+public abstract class BaseEnterpriseTestCase {
protected final Context mRealContext = ApplicationProvider.getApplicationContext();
protected final Context mSpiedContext = spy(mRealContext);
protected final String mPackageName = mRealContext.getPackageName();
- private final PackageManager mRealPm = mRealContext.getPackageManager();
+ protected final PackageManager mRealPm = mRealContext.getPackageManager();
protected PackageManager mSpiedPm = spy(mRealPm);
protected final ComponentName mDefaultAdmin =
@@ -63,63 +71,130 @@
protected final ComponentName mFancyAdmin =
new ComponentName(mSpiedContext, FancyDeviceAdminReceiver.class);
+ protected ResolveInfo mDefaultResolveInfo;
+ protected ResolveInfo mFancyResolveInfo;
protected DeviceAdminInfo mDefaultDeviceAdminInfo;
protected DeviceAdminInfo mFancyDeviceAdminInfo;
@Mock
- private DevicePolicyManager mDpm;
+ protected AppOpsManager mAppOpsMgr;
@Mock
- private UserManager mUm;
+ protected DevicePolicyManager mDpm;
+
+ @Mock
+ protected UserManager mUm;
+
+ private MockitoSession mSession;
@Before
public final void setFixtures() throws Exception {
+ if (mSession != null) {
+ throw new IllegalStateException("Already set session - subclasses should NOT explicitly"
+ + " call setFixtures()");
+ }
+ mSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(UserManager.class)
+ .mockStatic(RestrictedLockUtilsInternal.class)
+ .strictness(Strictness.LENIENT)
+ .startMocking();
+
+ assertWithMessage("mDpm").that(mDpm).isNotNull();
+ assertWithMessage("mUm").that(mUm).isNotNull();
+
+ when(mSpiedContext.getSystemService(AppOpsManager.class)).thenReturn(mAppOpsMgr);
when(mSpiedContext.getSystemService(DevicePolicyManager.class)).thenReturn(mDpm);
when(mSpiedContext.getSystemService(PackageManager.class)).thenReturn(mSpiedPm);
when(mSpiedContext.getPackageManager()).thenReturn(mSpiedPm);
when(mSpiedContext.getSystemService(UserManager.class)).thenReturn(mUm);
+ doReturn(mUm).when(() -> UserManager.get(any()));
- ActivityInfo defaultInfo = mRealPm.getReceiverInfo(mDefaultAdmin,
- PackageManager.GET_META_DATA);
- mDefaultDeviceAdminInfo = new DeviceAdminInfo(mRealContext, defaultInfo);
+ ActivityInfo defaultActivityInfo =
+ mRealPm.getReceiverInfo(mDefaultAdmin, PackageManager.GET_META_DATA);
+ mDefaultDeviceAdminInfo = new DeviceAdminInfo(mRealContext, defaultActivityInfo);
+ mDefaultResolveInfo = new ResolveInfo();
+ mDefaultResolveInfo.activityInfo = defaultActivityInfo;
- ActivityInfo fancyInfo = mRealPm.getReceiverInfo(mFancyAdmin, PackageManager.GET_META_DATA);
- mFancyDeviceAdminInfo = new DeviceAdminInfo(mRealContext, fancyInfo);
+ ActivityInfo fancyActivityInfo =
+ mRealPm.getReceiverInfo(mFancyAdmin, PackageManager.GET_META_DATA);
+ mFancyDeviceAdminInfo = new DeviceAdminInfo(mRealContext, fancyActivityInfo);
+ mFancyResolveInfo = new ResolveInfo();
+ mFancyResolveInfo.activityInfo = fancyActivityInfo;
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ mSession = null;
+ }
}
protected final void mockProfileOwner() {
- mockActiveAdmin();
+ mockActiveAdmin(mDefaultAdmin);
when(mDpm.getProfileOwner()).thenReturn(mDefaultAdmin);
}
protected final void mockDeviceOwner() {
- mockActiveAdmin();
+ when(mDpm.isDeviceManaged()).thenReturn(true);
+ mockActiveAdmin(mDefaultAdmin);
+ when(mDpm.isDeviceManaged()).thenReturn(true);
when(mDpm.getDeviceOwnerComponentOnCallingUser()).thenReturn(mDefaultAdmin);
when(mDpm.getDeviceOwnerComponentOnAnyUser()).thenReturn(mDefaultAdmin);
}
+ protected final void mockNoDeviceOwner() {
+ when(mDpm.getDeviceOwnerComponentOnCallingUser()).thenReturn(null);
+ when(mDpm.getDeviceOwnerComponentOnAnyUser()).thenReturn(null);
+ }
+
+ protected final void mockNotManaged() {
+ when(mDpm.isDeviceManaged()).thenReturn(false);
+ }
+
+ protected final void mockOrganizationName(String orgName) {
+ when(mDpm.getDeviceOwnerOrganizationName()).thenReturn(orgName);
+ }
+
protected final void mockFinancialDevice() {
when(mDpm.isDeviceManaged()).thenReturn(true);
when(mDpm.getDeviceOwnerType(mDefaultAdmin))
.thenReturn(DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED);
}
- protected final void mockActiveAdmin() {
- when(mDpm.isAdminActive(mDefaultAdmin)).thenReturn(true);
+ protected final void mockActiveAdmin(ComponentName componentName) {
+ when(mDpm.isAdminActive(componentName)).thenReturn(true);
}
- protected final void mockInactiveAdmin() {
- when(mDpm.isAdminActive(mDefaultAdmin)).thenReturn(false);
+ protected final void mockInactiveAdmin(ComponentName componentName) {
+ when(mDpm.isAdminActive(componentName)).thenReturn(false);
}
- protected final void mockActiveAdmin(ComponentName admin) {
- when(mDpm.getActiveAdmins()).thenReturn(Arrays.asList(admin));
+ protected final void mockGetActiveAdmins(ComponentName... componentNames) {
+ when(mDpm.getActiveAdmins()).thenReturn(Arrays.asList(componentNames));
+ }
+
+ protected final void mockQueryBroadcastReceivers(ResolveInfo... resolveInfoArray) {
+ // Need to use doReturn() instead of when() because mSpiedPm is a spy.
+ doReturn(Arrays.asList(resolveInfoArray))
+ .when(mSpiedPm).queryBroadcastReceivers(any(Intent.class), anyInt());
}
protected final void mockGetLongSupportMessageForUser(CharSequence message) {
when(mDpm.getLongSupportMessageForUser(eq(mDefaultAdmin), anyInt())).thenReturn(message);
}
+ protected final void mockRemovingAdmin(ComponentName admin, int userId) {
+ when(mDpm.isRemovingAdmin(admin, userId)).thenReturn(true);
+ }
+
+ protected final void mockGrantedPolicies(ComponentName admin, int ... policies) {
+ for (int policy: policies) {
+ when(mDpm.hasGrantedPolicy(admin, policy)).thenReturn(true);
+ }
+ }
+
protected final void mockHasDeviceAdminFeature() {
when(mSpiedPm.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN)).thenReturn(true);
}
@@ -128,6 +203,35 @@
when(mSpiedPm.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN)).thenReturn(false);
}
+ protected final void mockSystemUser() {
+ when(mUm.isSystemUser()).thenReturn(true);
+ }
+
+ protected final void mockNonSystemUser() {
+ when(mUm.isSystemUser()).thenReturn(false);
+ }
+
+ protected final void mockNullEnforcedAdmin(String restriction, int userId) {
+ when(RestrictedLockUtilsInternal
+ .checkIfRestrictionEnforced(mSpiedContext, restriction, userId)).thenReturn(null);
+ }
+
+ protected final void mockGetLastBugreportTime(long time) {
+ when(mDpm.getLastBugReportRequestTime()).thenReturn(time);
+ }
+
+ protected final void mockGetLastNetworkLogRetrievalTime(long time) {
+ when(mDpm.getLastNetworkLogRetrievalTime()).thenReturn(time);
+ }
+
+ protected final void mockGetLastSecurityLogRetrievalTime(long time) {
+ when(mDpm.getLastSecurityLogRetrievalTime()).thenReturn(time);
+ }
+
+ protected final void mockIsCurrentInputMethodSetByOwner(boolean value) {
+ when(mDpm.isCurrentInputMethodSetByOwner()).thenReturn(value);
+ }
+
protected final void verifyAdminActivated() {
verify(mDpm).setActiveAdmin(eq(mDefaultAdmin), anyBoolean());
}
@@ -144,11 +248,7 @@
verify(mDpm, never()).removeActiveAdmin(any());
}
- protected final void mockAdminUser() {
- when(mUm.isAdminUser()).thenReturn(true);
- }
-
- protected final void mockNonAdminUser() {
- when(mUm.isAdminUser()).thenReturn(false);
+ protected final void verifyAppOpsMgrSetUserRestriction(int code, boolean restricted) {
+ verify(mAppOpsMgr).setUserRestriction(eq(code), eq(restricted), any(IBinder.class));
}
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/BasePreferenceControllerTestCase.java b/tests/unit/src/com/android/car/settings/enterprise/BasePreferenceControllerTestCase.java
index 0a2148d..5cefceb 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/BasePreferenceControllerTestCase.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/BasePreferenceControllerTestCase.java
@@ -15,19 +15,30 @@
*/
package com.android.car.settings.enterprise;
+import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.notNull;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
+import static java.util.stream.Collectors.toList;
+
import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
import org.mockito.Mock;
+import java.util.ArrayList;
+import java.util.List;
+
abstract class BasePreferenceControllerTestCase extends BaseEnterpriseTestCase {
protected final String mPreferenceKey = "Da Key";
@@ -36,8 +47,6 @@
.build();
@Mock
protected FragmentController mFragmentController;
- @Mock
- protected Preference mPreference;
protected static final String availabilityToString(int value) {
switch (value) {
@@ -63,7 +72,78 @@
.that(actualValue).isEqualTo(expectedValue);
}
- protected final void verifyGoBack() {
- verify(mFragmentController).goBack();
+ protected static final void assertPreferenceSummary(Preference preference, String summary) {
+ assertWithMessage("(preference %s).getSummary()", preference).that(preference.getSummary())
+ .isEqualTo(summary);
+ }
+
+ protected void verifyPreferenceTitles(DummyPreferenceGroup preferenceGroup,
+ CharSequence... titles) {
+ assertThat(preferenceGroup.getPreferences().stream()
+ .map(p -> p.getTitle()).collect(toList())).containsExactly(titles);
+ }
+
+ protected static final void verifyPreferenceTitleSet(Preference preference,
+ CharSequence title) {
+ verify(preference).setTitle(title);
+ }
+
+ protected static final void verifyPreferenceTitleNeverSet(Preference preference) {
+ verify(preference, never()).setTitle(any());
+ }
+
+ protected static final void verifyPreferenceSummarySet(Preference preference,
+ CharSequence summary) {
+ verify(preference).setSummary(summary);
+ }
+
+ protected static final void verifyPreferenceSummarySet(Preference preference, int resId) {
+ verify(preference).setSummary(resId);
+ }
+
+ protected static final void verifyPreferenceSummaryNeverSet(Preference preference) {
+ verify(preference, never()).setSummary(any());
+ }
+
+ protected static final void verifyPreferenceIconSet(Preference preference) {
+ verify(preference).setIcon(notNull());
+ }
+
+ protected static final void verifyPreferenceIconNeverSet(Preference preference) {
+ verify(preference, never()).setIcon(notNull());
+ }
+
+ protected static final void verifyPreferenceDisabled(Preference preference) {
+ verify(preference).setEnabled(false);
+ }
+
+ protected static final void verifyPreferenceEnabled(Preference preference) {
+ verify(preference).setEnabled(true);
+ }
+
+ static final class DummyPreferenceGroup extends PreferenceGroup {
+
+ private final List<Preference> mList = new ArrayList<>();
+
+ DummyPreferenceGroup(Context context) {
+ super(context, null);
+ }
+
+ @Override public void removeAll() {
+ mList.clear();
+ }
+
+ @Override public boolean addPreference(Preference preference) {
+ mList.add(preference);
+ return true;
+ }
+
+ @Override public int getPreferenceCount() {
+ return mList.size();
+ }
+
+ public List<Preference> getPreferences() {
+ return mList;
+ }
}
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/BugReportsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/BugReportsPreferenceControllerTest.java
new file mode 100644
index 0000000..9a03e8f
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/BugReportsPreferenceControllerTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.text.format.DateUtils;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+public final class BugReportsPreferenceControllerTest extends BasePreferenceControllerTestCase {
+
+ private BugReportsPreferenceController mController;
+
+ @Mock
+ private Preference mPreference;
+
+ @Before
+ public void setUp() throws Exception {
+ mController = new BugReportsPreferenceController(mSpiedContext, mPreferenceKey,
+ mFragmentController, mUxRestrictions);
+ }
+
+ @Test
+ public void testUpdateState_noBugreport() {
+ mockGetLastBugreportTime(-1);
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceTitleNeverSet(mPreference);
+ verifyPreferenceSummarySet(mPreference, R.string.enterprise_privacy_none);
+ verifyPreferenceIconNeverSet(mPreference);
+ }
+
+ @Test
+ public void testUpdateState_withBugreport() {
+ long now = System.currentTimeMillis();
+ mockGetLastBugreportTime(now);
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceTitleNeverSet(mPreference);
+ String formattedDate = DateUtils.formatDateTime(mRealContext, now,
+ DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE);
+ verifyPreferenceSummarySet(mPreference, formattedDate);
+ verifyPreferenceIconNeverSet(mPreference);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminActivatedAppsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminActivatedAppsPreferenceControllerTest.java
new file mode 100644
index 0000000..beac1fd
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminActivatedAppsPreferenceControllerTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public final class DeviceAdminActivatedAppsPreferenceControllerTest
+ extends BasePreferenceControllerTestCase {
+
+ private DeviceAdminAppsPreferenceController mController;
+ private BasePreferenceControllerTestCase.DummyPreferenceGroup mPreferenceGroup;
+
+ @Before
+ @UiThreadTest
+ public void setUp() throws Exception {
+ mController = new DeviceAdminActivatedAppsPreferenceController(mSpiedContext,
+ mPreferenceKey, mFragmentController, mUxRestrictions);
+ mPreferenceGroup = new DummyPreferenceGroup(mSpiedContext);
+ }
+
+ @Test
+ public void testUpdateState_noBroadcastReceivers() {
+ mockQueryBroadcastReceivers();
+
+ mController.updateState(mPreferenceGroup);
+
+ verifyPreferenceTitles(mPreferenceGroup,
+ mRealContext.getString(R.string.device_admin_apps_list_empty));
+ }
+
+ @Test
+ public void testUpdateState_noActivatedAdminApp() {
+ mockQueryBroadcastReceivers(mDefaultResolveInfo, mFancyResolveInfo);
+ mockInactiveAdmin(mDefaultAdmin);
+ mockInactiveAdmin(mFancyAdmin);
+
+ mController.updateState(mPreferenceGroup);
+
+ verifyPreferenceTitles(mPreferenceGroup,
+ mRealContext.getString(R.string.device_admin_apps_list_empty));
+ }
+
+ @Test
+ public void testUpdateState_singleActivatedAdminApp() {
+ mockQueryBroadcastReceivers(mDefaultResolveInfo, mFancyResolveInfo);
+ mockInactiveAdmin(mDefaultAdmin);
+ mockActiveAdmin(mFancyAdmin);
+
+ mController.updateState(mPreferenceGroup);
+
+ verifyPreferenceTitles(mPreferenceGroup, mFancyDeviceAdminInfo.loadLabel(mRealPm));
+ }
+
+ @Test
+ public void testUpdateState_multipleActivatedAdminApps() {
+ mockQueryBroadcastReceivers(mDefaultResolveInfo, mFancyResolveInfo);
+ mockActiveAdmin(mDefaultAdmin);
+ mockActiveAdmin(mFancyAdmin);
+
+ mController.updateState(mPreferenceGroup);
+
+ verifyPreferenceTitles(mPreferenceGroup,
+ mDefaultDeviceAdminInfo.loadLabel(mRealPm),
+ mFancyDeviceAdminInfo.loadLabel(mRealPm));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddActionPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddActionPreferenceControllerTest.java
deleted file mode 100644
index 5b8b6b8..0000000
--- a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddActionPreferenceControllerTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.settings.enterprise;
-
-import static com.google.common.truth.Truth.assertWithMessage;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.PreferenceController;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public final class DeviceAdminAddActionPreferenceControllerTest extends
- BaseDeviceAdminAddPreferenceControllerTestCase
- <DeviceAdminAddActionPreferenceController> {
-
- private DeviceAdminAddActionPreferenceController mController;
-
- @Before
- public void setController() {
- mController = new DeviceAdminAddActionPreferenceController(mSpiedContext,
- mPreferenceKey, mFragmentController, mUxRestrictions);
- mController.setDeviceAdmin(mDefaultDeviceAdminInfo);
- }
-
- @Test
- public void testGetAvailabilityStatus_noAdmin() throws Exception {
- DeviceAdminAddActionPreferenceController controller =
- new DeviceAdminAddActionPreferenceController(mSpiedContext, mPreferenceKey,
- mFragmentController, mUxRestrictions);
-
- assertAvailability(controller.getAvailabilityStatus(),
- PreferenceController.CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void testUpdateStatus_deviceOwner() throws Exception {
- mockDeviceOwner();
-
- mController.updateState(mPreference);
-
- verifyPreferenceDisabled();
- verifyPreferenceTitleSet(R.string.remove_device_admin);
- }
-
- @Test
- public void testUpdateStatus_profileOwner() throws Exception {
- mockProfileOwner();
-
- mController.updateState(mPreference);
-
- verifyPreferenceDisabled();
- verifyPreferenceTitleSet(R.string.remove_device_admin);
- }
-
- @Test
- public void testUpdateStatus_activeAdmin() throws Exception {
- mockActiveAdmin();
-
- mController.updateState(mPreference);
-
- verifyPreferenceEnabled();
- verifyPreferenceTitleSet(R.string.remove_device_admin);
- }
-
- @Test
- public void testUpdateStatus_inactiveAdmin() throws Exception {
- mockInactiveAdmin();
-
- mController.updateState(mPreference);
-
- verifyPreferenceEnabled();
- verifyPreferenceTitleSet(R.string.add_device_admin);
- }
-
- @Test
- public void testHandlePreferenceClicked_deviceOwner() throws Exception {
- mockDeviceOwner();
- mController.setIsActive();
-
- handlePreferenceClicked();
-
- verifyAdminNeverActivated();
- verifyAdminNeverDeactivated();
- verifyGoBack();
- }
-
- @Test
- public void testHandlePreferenceClicked_profileOwner() throws Exception {
- mockProfileOwner();
- mController.setIsActive();
-
- handlePreferenceClicked();
-
- verifyAdminNeverActivated();
- verifyAdminNeverDeactivated();
- verifyGoBack();
- }
-
- @Test
- public void testHandlePreferenceClicked_activeAdmin() throws Exception {
- mockActiveAdmin();
- mController.setIsActive();
-
- handlePreferenceClicked();
-
- verifyAdminNeverActivated();
- verifyAdminDeactivated();
- verifyGoBack();
- }
-
- @Test
- public void testHandlePreferenceClicked_inactiveAdmin() throws Exception {
- mockInactiveAdmin();
- mController.setIsActive();
-
- handlePreferenceClicked();
-
- verifyAdminActivated();
- verifyAdminNeverDeactivated();
- verifyGoBack();
- }
-
- private void handlePreferenceClicked() {
- boolean handled = mController.handlePreferenceClicked(mPreference);
- assertWithMessage("handlePreferenceClicked() result").that(handled).isTrue();
- }
-}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceControllerTest.java
deleted file mode 100644
index 1ef9399..0000000
--- a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddCancelPreferenceControllerTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.settings.enterprise;
-
-import static com.google.common.truth.Truth.assertWithMessage;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public final class DeviceAdminAddCancelPreferenceControllerTest extends
- BaseDeviceAdminAddPreferenceControllerTestCase
- <DeviceAdminAddCancelPreferenceController> {
-
- private DeviceAdminAddCancelPreferenceController mController;
-
- @Before
- public void setController() {
- mController = new DeviceAdminAddCancelPreferenceController(mSpiedContext,
- mPreferenceKey, mFragmentController, mUxRestrictions);
- mController.setDeviceAdmin(mDefaultDeviceAdminInfo);
- }
-
- @Test
- public void testUpdateState() throws Exception {
- mController.updateState(mPreference);
-
- verifyPreferenceTitleSet(com.android.internal.R.string.cancel);
- }
-
- @Test
- public void testHandlePreferenceClicked() throws Exception {
- boolean handled = mController.handlePreferenceClicked(mPreference);
-
- assertWithMessage("handlePreferenceClicked() result").that(handled).isTrue();
- verifyGoBack();
- }
-}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddExplanationPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddExplanationPreferenceControllerTest.java
index 18e4c5b..7501a4c 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddExplanationPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddExplanationPreferenceControllerTest.java
@@ -15,14 +15,19 @@
*/
package com.android.car.settings.enterprise;
+import androidx.preference.Preference;
+
import com.android.car.settings.common.PreferenceController;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mock;
public final class DeviceAdminAddExplanationPreferenceControllerTest extends
- BaseDeviceAdminAddPreferenceControllerTestCase
- <DeviceAdminAddExplanationPreferenceController> {
+ BasePreferenceControllerTestCase {
+
+ @Mock
+ private Preference mPreference;
private DeviceAdminAddExplanationPreferenceController mController;
@@ -38,27 +43,42 @@
DeviceAdminAddExplanationPreferenceController controller =
new DeviceAdminAddExplanationPreferenceController(mSpiedContext, mPreferenceKey,
mFragmentController, mUxRestrictions);
+ mController.setExplanation("To conquer the universe");
assertAvailability(controller.getAvailabilityStatus(),
PreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
- public void testGetAvailabilityStatus_deviceOwner() throws Exception {
+ public void testGetAvailabilityStatus_deviceOwner_noReason() throws Exception {
mockDeviceOwner();
- mController.setExplanation("To conquer the universe");
assertAvailability(mController.getAvailabilityStatus(),
- PreferenceController.DISABLED_FOR_PROFILE);
+ PreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
- public void testGetAvailabilityStatus_profileOwner() throws Exception {
+ public void testGetAvailabilityStatus_deviceOwner_withReason() throws Exception {
+ mockDeviceOwner();
+ mController.setExplanation("To conquer the universe");
+
+ assertAvailability(mController.getAvailabilityStatus(), PreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_profileOwner_noReason() throws Exception {
+ mockProfileOwner();
+
+ assertAvailability(mController.getAvailabilityStatus(),
+ PreferenceController.CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_profileOwner_withReason() throws Exception {
mockProfileOwner();
mController.setExplanation("To conquer the universe");
- assertAvailability(mController.getAvailabilityStatus(),
- PreferenceController.DISABLED_FOR_PROFILE);
+ assertAvailability(mController.getAvailabilityStatus(), PreferenceController.AVAILABLE);
}
@Test
@@ -90,8 +110,8 @@
mController.updateState(mPreference);
- verifyPreferenceTitleSet("To conquer the universe");
- verifyPreferenceSummaryNeverSet();
- verifyPreferenceIconNeverSet();
+ verifyPreferenceTitleSet(mPreference, "To conquer the universe");
+ verifyPreferenceSummaryNeverSet(mPreference);
+ verifyPreferenceIconNeverSet(mPreference);
}
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddFragmentTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddFragmentTest.java
index 777af9b..35a8a88 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddFragmentTest.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddFragmentTest.java
@@ -15,36 +15,527 @@
*/
package com.android.car.settings.enterprise;
+import static android.app.Activity.RESULT_CANCELED;
+import static android.app.Activity.RESULT_OK;
+import static android.app.admin.DeviceAdminInfo.USES_ENCRYPTED_STORAGE;
+import static android.app.admin.DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD;
+import static android.app.admin.DeviceAdminInfo.USES_POLICY_FORCE_LOCK;
+import static android.app.admin.DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD;
+import static android.app.admin.DeviceAdminInfo.USES_POLICY_RESET_PASSWORD;
+import static android.app.admin.DeviceAdminInfo.USES_POLICY_WATCH_LOGIN;
+import static android.app.admin.DeviceAdminInfo.USES_POLICY_WIPE_DATA;
+import static android.app.admin.DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN;
+import static android.app.admin.DevicePolicyManager.EXTRA_ADD_EXPLANATION;
+import static android.app.admin.DevicePolicyManager.EXTRA_DEVICE_ADMIN;
import static android.car.test.mocks.AndroidMockitoHelper.syncCallOnMainThread;
+import static com.android.car.settings.enterprise.DeviceAdminAddActivity.EXTRA_DEVICE_ADMIN_PACKAGE_NAME;
+import static com.android.car.settings.enterprise.DeviceAdminAddFragment.UNINSTALL_DEVICE_ADMIN_REQUEST_CODE;
+
+import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.res.XmlResourceParser;
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
+import com.android.car.settings.R;
+import com.android.car.settings.enterprise.DeviceAdminAddHeaderPreferenceController.ActivationListener;
+import com.android.car.ui.toolbar.MenuItem;
+import com.android.car.ui.toolbar.ToolbarController;
+
import org.junit.Before;
import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+
+import java.util.Arrays;
public final class DeviceAdminAddFragmentTest extends BaseEnterpriseTestCase {
+ private static final String EXPLANATION = "To get to the other side";
+
private final Context mRealContext = ApplicationProvider.getApplicationContext();
- private DeviceAdminAddFragment mFragment;
+ private DeviceAdminAddFragment mRealFragment;
+ private DeviceAdminAddFragment mSpiedFragment;
+
+ @Mock
+ private ToolbarController mToolbarController;
+
+ @Mock
+ private FragmentActivity mActivity;
+
+ @Mock
+ private PreferenceScreen mPreferenceScreen;
+
+ @Mock
+ private DeviceAdminAddHeaderPreferenceController mHeaderController;
+ @Mock
+ private DeviceAdminAddExplanationPreferenceController mExplanationController;
+ @Mock
+ private DeviceAdminAddSupportPreferenceController mSupportController;
+ @Mock
+ private DeviceAdminAddWarningPreferenceController mWarningController;
+ @Mock
+ private DeviceAdminAddPoliciesPreferenceController mPoliciesController;
+
+ @Captor
+ private ArgumentCaptor<ActivationListener> mActivationListenerCaptor;
@Before
- public void createFragment() throws Exception {
- mFragment = syncCallOnMainThread(() -> new DeviceAdminAddFragment());
+ public void createFragments() throws Exception {
+ mRealFragment = syncCallOnMainThread(() -> new DeviceAdminAddFragment());
+ mSpiedFragment = spy(mRealFragment);
+
+ when(mExplanationController.setDeviceAdmin(any())).thenReturn(mExplanationController);
+ when(mHeaderController.setDeviceAdmin(any())).thenReturn(mHeaderController);
+
+ // Note: Must use doReturn (instead of when..doReturn() below because it's a spy
+ doReturn(mActivity).when(mSpiedFragment).requireActivity();
+ doReturn(mHeaderController).when(mSpiedFragment)
+ .use(eq(DeviceAdminAddHeaderPreferenceController.class), anyInt());
+ doReturn(mExplanationController).when(mSpiedFragment)
+ .use(eq(DeviceAdminAddExplanationPreferenceController.class), anyInt());
+ doReturn(mSupportController).when(mSpiedFragment)
+ .use(eq(DeviceAdminAddSupportPreferenceController.class), anyInt());
+ doReturn(mWarningController).when(mSpiedFragment)
+ .use(eq(DeviceAdminAddWarningPreferenceController.class), anyInt());
+ doReturn(mPoliciesController).when(mSpiedFragment)
+ .use(eq(DeviceAdminAddPoliciesPreferenceController.class), anyInt());
}
@Test
public void testGetPreferenceScreenResId() {
- int resId = mFragment.getPreferenceScreenResId();
+ int resId = mRealFragment.getPreferenceScreenResId();
XmlResourceParser parser = mRealContext.getResources().getXml(resId);
- assertWithMessage("xml with id%s", resId).that(parser).isNotNull();
+ assertWithMessage("xml with id %s", resId).that(parser).isNotNull();
}
- // TODO(b/191269229): add tests for onAttach()
+ @Test
+ public void testSetupToolbar_noIntent() {
+ mSpiedFragment.setToolbarTitle(mToolbarController);
+
+ verify(mToolbarController, never()).setTitle(anyInt());
+ }
+
+ @Test
+ public void testSetupToolbar_notFromActionAddDeviceAdmin() {
+ mockActivityIntent(new Intent());
+
+ mSpiedFragment.setToolbarTitle(mToolbarController);
+
+ verify(mToolbarController, never()).setTitle(anyInt());
+ }
+
+ @Test
+ public void testSetupToolbar_fromActionAddDeviceAdmin() {
+ mockActivityIntent(new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN));
+
+ mSpiedFragment.setToolbarTitle(mToolbarController);
+
+ verify(mToolbarController).setTitle(R.string.add_device_admin_msg);
+ }
+
+ @Test
+ public void testAttach_noIntent() {
+ mRealFragment.onAttach(mSpiedContext, mActivity);
+
+ verifyActivityFinished();
+ verifyControllersNeverUsed();
+ }
+
+ @Test
+ public void testAttach_noExtra() {
+ mockActivityIntent(new Intent());
+
+ mRealFragment.onAttach(mSpiedContext, mActivity);
+
+ verifyActivityFinished();
+ verifyControllersNeverUsed();
+ }
+
+ @Test
+ public void testAttach_adminExtra_adminNotFound() {
+ mockActivityIntent(new Intent()
+ .putExtra(EXTRA_DEVICE_ADMIN, new ComponentName("Guy", "Incognito")));
+
+ mRealFragment.onAttach(mSpiedContext, mActivity);
+
+ verifyActivityFinished();
+ verifyControllersNeverUsed();
+ }
+
+ @Test
+ public void testAttach_adminExtra_ok_active() {
+ mockActivityIntent(new Intent()
+ .putExtra(EXTRA_DEVICE_ADMIN, mDefaultAdmin)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockActiveAdmin(mDefaultAdmin);
+
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verifyActivityNeverFinished();
+ verifyControllersUsed(mDefaultAdmin);
+ }
+
+ @Test
+ public void testAttach_addDeviceAdminAction_active() {
+ mockActivityIntent(new Intent(ACTION_ADD_DEVICE_ADMIN)
+ .putExtra(EXTRA_DEVICE_ADMIN, mDefaultAdmin)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockActiveAdmin(mDefaultAdmin);
+
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verityActivityResultSet(Activity.RESULT_OK);
+ verifyActivityFinished();
+ verifyControllersNeverUsed();
+ }
+
+ @Test
+ public void testAttach_addDeviceAdminAction_active_removing() {
+ mockActivityIntent(new Intent(ACTION_ADD_DEVICE_ADMIN)
+ .putExtra(EXTRA_DEVICE_ADMIN, mDefaultAdmin)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockActiveAdmin(mDefaultAdmin);
+ mockRemovingAdmin(mDefaultAdmin, mSpiedContext.getUserId());
+
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verityActivityResultNeverSet();
+ verifyActivityFinished();
+ verifyControllersNeverUsed();
+ }
+
+ @Test
+ public void testAttach_addDeviceAdminAction_active_noRefreshing() {
+ mockActivityIntent(new Intent(ACTION_ADD_DEVICE_ADMIN)
+ .putExtra(EXTRA_DEVICE_ADMIN, mFancyAdmin)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockActiveAdmin(mFancyAdmin);
+ // Grant all policies that mFancyAdmin has.
+ mockGrantedPolicies(mFancyAdmin, USES_POLICY_LIMIT_PASSWORD, USES_POLICY_WATCH_LOGIN,
+ USES_POLICY_RESET_PASSWORD, USES_POLICY_FORCE_LOCK, USES_POLICY_WIPE_DATA,
+ USES_POLICY_EXPIRE_PASSWORD, USES_ENCRYPTED_STORAGE);
+
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verityActivityResultSet(Activity.RESULT_OK);
+ verifyActivityFinished();
+ verifyControllersNeverUsed();
+ }
+
+ @Test
+ public void testAttach_addDeviceAdminAction_active_refreshing() {
+ mockActivityIntent(new Intent(ACTION_ADD_DEVICE_ADMIN)
+ .putExtra(EXTRA_DEVICE_ADMIN, mFancyAdmin)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockActiveAdmin(mFancyAdmin);
+ // Grant all policies that mFancyAdmin has besides USES_ENCRYPTED_STORAGE.
+ mockGrantedPolicies(mFancyAdmin, USES_POLICY_LIMIT_PASSWORD, USES_POLICY_WATCH_LOGIN,
+ USES_POLICY_RESET_PASSWORD, USES_POLICY_FORCE_LOCK, USES_POLICY_WIPE_DATA,
+ USES_POLICY_EXPIRE_PASSWORD);
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verifyActivityNeverFinished();
+ verifyControllersUsed(mFancyAdmin);
+ }
+
+ @Test
+ public void testAttach_addDeviceAdminAction_inactive_userActivates() {
+ ActivationListener listener = attachActivityForResultTesting(ACTION_ADD_DEVICE_ADMIN);
+
+ listener.onChanged(true);
+
+ verityActivityResultSet(Activity.RESULT_OK);
+ verifyActivityNeverFinished();
+ }
+
+ @Test
+ public void testAttach_addDeviceAdminAction_inactive_userDeactivates() {
+ ActivationListener listener = attachActivityForResultTesting(ACTION_ADD_DEVICE_ADMIN);
+
+ listener.onChanged(false);
+
+ verityActivityResultSet(Activity.RESULT_CANCELED);
+ verifyActivityNeverFinished();
+ }
+
+ @Test
+ public void testAttach_inactive_notDeviceAdminAction() {
+ ActivationListener listener = attachActivityForResultTesting("ACTION_JACKSON");
+
+ listener.onChanged(true); // value doesn't matter
+
+ verityActivityResultNeverSet();
+ verifyActivityNeverFinished();
+ }
+
+ @Test
+ public void testAttach_adminExtra_ok_inactiveButValid() {
+ mockActivityIntent(new Intent()
+ .putExtra(EXTRA_DEVICE_ADMIN, mDefaultAdmin)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockInactiveAdmin(mDefaultAdmin);
+ mockValidAdmin();
+
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verifyActivityNeverFinished();
+ verifyControllersUsed(mDefaultAdmin);
+ }
+
+ // TODO(b/202342351): add similar test for when new DeviceAdminInfo(context, ri) throws an
+ // exception (for example, when metadata is invalid).
+ @Test
+ public void testAttach_adminExtra_adminFoundButInvalid() {
+ mockActivityIntent(new Intent()
+ .putExtra(EXTRA_DEVICE_ADMIN, mDefaultAdmin)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockInactiveAdmin(mDefaultAdmin);
+ // Don't need to mock pm
+
+ mRealFragment.onAttach(mSpiedContext, mActivity);
+
+ verifyActivityFinished();
+ verifyControllersNeverUsed();
+ }
+
+ @Test
+ public void testAttach_packageExtra_adminNotFound() {
+ mockActivityIntent(new Intent().putExtra(EXTRA_DEVICE_ADMIN_PACKAGE_NAME, "D'OH!"));
+
+ mRealFragment.onAttach(mSpiedContext, mActivity);
+
+ verifyActivityFinished();
+ verifyControllersNeverUsed();
+ }
+
+ @Test
+ public void testAttach_packageExtra_ok() {
+ mockActivityIntent(new Intent()
+ .putExtra(EXTRA_DEVICE_ADMIN_PACKAGE_NAME, mPackageName)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockGetActiveAdmins(mDefaultAdmin);
+
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verifyActivityNeverFinished();
+ verifyControllersUsed(mDefaultAdmin);
+ }
+
+ @Test
+ public void testAttach_adminExtra_doesNotShowUninstallButton() {
+ mockActivityIntent(new Intent()
+ .putExtra(EXTRA_DEVICE_ADMIN, mDefaultAdmin)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockValidAdmin();
+
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verify(mSpiedFragment).setUninstallButton(any(Context.class), eq(false));
+ }
+
+ @Test
+ public void testAttach_packageExtra_showsUninstallButton() {
+ mockActivityIntent(new Intent()
+ .putExtra(EXTRA_DEVICE_ADMIN_PACKAGE_NAME, mPackageName)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockGetActiveAdmins(mDefaultAdmin);
+
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verify(mSpiedFragment).setUninstallButton(any(Context.class), eq(true));
+ }
+
+ @Test
+ public void testSetUninstallButton_showButtonFalse() {
+ mRealFragment.setUninstallButton(mRealContext, false);
+
+ MenuItem button = mRealFragment.getToolbarMenuItems().get(0);
+ assertThat(button).isNotNull();
+ assertThat(button.getTitle().toString())
+ .isEqualTo(mRealContext.getString(R.string.deactivate_and_uninstall_device_admin));
+ assertThat(button.isEnabled()).isFalse();
+ assertThat(button.isVisible()).isFalse();
+ }
+
+ @Test
+ public void testSetUninstallButton_showButtonTrue() {
+ mRealFragment.setUninstallButton(mRealContext, true);
+
+ MenuItem button = mRealFragment.getToolbarMenuItems().get(0);
+ assertThat(button).isNotNull();
+ assertThat(button.getTitle().toString())
+ .isEqualTo(mRealContext.getString(R.string.deactivate_and_uninstall_device_admin));
+ assertThat(button.isEnabled()).isTrue();
+ assertThat(button.isVisible()).isTrue();
+ }
+
+ @Test
+ public void testUninstallOnClickListener_activeAdmin() {
+ mSpiedFragment.setDevicePolicyManager(mDpm);
+ mSpiedFragment.setPackageToUninstall(mPackageName, mDefaultAdmin);
+ mSpiedFragment.setUninstallButton(mSpiedContext, true);
+ mockActiveAdmin(mDefaultAdmin);
+ doNothing().when(mSpiedFragment).startActivityForResult(any(Intent.class), anyInt());
+
+ mSpiedFragment.getToolbarMenuItems().get(0).getOnClickListener().onClick(/* item= */ null);
+
+ ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(
+ Intent.class);
+ verify(mSpiedFragment).startActivityForResult(intentArgumentCaptor.capture(),
+ eq(UNINSTALL_DEVICE_ADMIN_REQUEST_CODE));
+
+ Intent intent = intentArgumentCaptor.getValue();
+ assertThat(intent.getAction()).isEqualTo(Intent.ACTION_UNINSTALL_PACKAGE);
+ assertThat(intent.getData().toString()).isEqualTo("package:" + mPackageName);
+ assertThat(intent.getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)).isTrue();
+ verify(mDpm).removeActiveAdmin(mDefaultAdmin);
+ }
+
+ @Test
+ public void testUninstallOnClickListener_inactiveAdmin() {
+ mSpiedFragment.setDevicePolicyManager(mDpm);
+ mSpiedFragment.setPackageToUninstall(mPackageName, mDefaultAdmin);
+ mSpiedFragment.setUninstallButton(mSpiedContext, true);
+ mockInactiveAdmin(mDefaultAdmin);
+ doNothing().when(mSpiedFragment).startActivityForResult(any(Intent.class), anyInt());
+
+ mSpiedFragment.getToolbarMenuItems().get(0).getOnClickListener().onClick(/* item= */ null);
+
+ ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(
+ Intent.class);
+ verify(mSpiedFragment).startActivityForResult(intentArgumentCaptor.capture(),
+ eq(UNINSTALL_DEVICE_ADMIN_REQUEST_CODE));
+
+ Intent intent = intentArgumentCaptor.getValue();
+ assertThat(intent.getAction()).isEqualTo(Intent.ACTION_UNINSTALL_PACKAGE);
+ assertThat(intent.getData().toString()).isEqualTo("package:" + mPackageName);
+ assertThat(intent.getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)).isTrue();
+ verify(mDpm, never()).removeActiveAdmin(mDefaultAdmin);
+ }
+
+ @Test
+ public void testOnActivityResult_resultOk() {
+ mSpiedFragment.onActivityResult(UNINSTALL_DEVICE_ADMIN_REQUEST_CODE, RESULT_OK, null);
+
+ verify(mActivity).setResult(RESULT_OK);
+ verify(mActivity).finish();
+ }
+
+ @Test
+ public void testOnActivityResult_resultNotOk() {
+ mSpiedFragment.onActivityResult(UNINSTALL_DEVICE_ADMIN_REQUEST_CODE, RESULT_CANCELED,
+ null);
+
+ verify(mActivity, never()).setResult(anyInt());
+ verify(mActivity, never()).finish();
+ }
+
+ @Test
+ public void testSetPreferenceScreenTitle() {
+ mockActivityIntent(new Intent()
+ .putExtra(EXTRA_DEVICE_ADMIN, mDefaultAdmin)
+ .putExtra(EXTRA_ADD_EXPLANATION, EXPLANATION));
+ mockActiveAdmin(mDefaultAdmin);
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ mSpiedFragment.setPreferenceScreenTitle(mPreferenceScreen);
+
+ verify(mPreferenceScreen).setTitle((mDefaultDeviceAdminInfo.loadLabel(mRealPm)));
+ }
+
+ private ActivationListener attachActivityForResultTesting(String action) {
+ mockValidAdmin();
+ mockActivityIntent(new Intent(action)
+ .putExtra(EXTRA_DEVICE_ADMIN, mDefaultAdmin));
+
+ mSpiedFragment.onAttach(mSpiedContext, mActivity);
+
+ verify(mHeaderController).setActivationListener(mActivationListenerCaptor.capture());
+ return mActivationListenerCaptor.getValue();
+ }
+
+ private void mockActivityIntent(Intent intent) {
+ when(mActivity.getIntent()).thenReturn(intent);
+ }
+
+ private void mockValidAdmin() {
+ // TODO(b/202342351): use a custom matcher for
+ // DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED instead of any()
+ doReturn(Arrays.asList(mDefaultResolveInfo)).when(mSpiedPm).queryBroadcastReceivers(any(),
+ eq(PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS));
+ }
+
+ private void verifyActivityFinished() {
+ verify(mActivity).finish();
+ }
+
+ private void verifyActivityNeverFinished() {
+ verify(mActivity, never()).finish();
+ }
+
+ private void verityActivityResultSet(int result) {
+ verify(mActivity).setResult(result);
+ }
+
+ private void verityActivityResultNeverSet() {
+ verify(mActivity, never()).setResult(anyInt());
+ }
+
+ private void verifyControllersNeverUsed() {
+ verify(mSpiedFragment, never()).use(any(), anyInt());
+ }
+
+ private void verifyControllersUsed(ComponentName admin) {
+ verify(mSpiedFragment).use(DeviceAdminAddHeaderPreferenceController.class,
+ R.string.pk_device_admin_add_header);
+ verifySetDeviceAdmin(mHeaderController, admin);
+ verify(mHeaderController).setActivationListener(any());
+
+ verify(mSpiedFragment).use(DeviceAdminAddExplanationPreferenceController.class,
+ R.string.pk_device_admin_add_explanation);
+ verifySetDeviceAdmin(mExplanationController, admin);
+ verify(mExplanationController).setExplanation(EXPLANATION);
+
+ verify(mSpiedFragment).use(DeviceAdminAddSupportPreferenceController.class,
+ R.string.pk_device_admin_add_support);
+ verifySetDeviceAdmin(mSupportController, admin);
+
+ verify(mSpiedFragment).use(DeviceAdminAddWarningPreferenceController.class,
+ R.string.pk_device_admin_add_warning);
+ verifySetDeviceAdmin(mWarningController, admin);
+
+ verify(mSpiedFragment).use(DeviceAdminAddPoliciesPreferenceController.class,
+ R.string.pk_device_admin_add_policies);
+ verifySetDeviceAdmin(mPoliciesController, admin);
+ }
+
+ private void verifySetDeviceAdmin(BaseDeviceAdminAddPreferenceController<?> controller,
+ ComponentName admin) {
+ verify(controller).setDeviceAdmin(argThat(info->info.getComponent().equals(admin)));
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddHeaderPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddHeaderPreferenceControllerTest.java
index 566ed2a..0425246 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddHeaderPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddHeaderPreferenceControllerTest.java
@@ -15,15 +15,32 @@
*/
package com.android.car.settings.enterprise;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.app.AppOpsManager;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.enterprise.DeviceAdminAddHeaderPreferenceController.ActivationListener;
+
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mock;
public final class DeviceAdminAddHeaderPreferenceControllerTest extends
- BaseDeviceAdminAddPreferenceControllerTestCase
- <DeviceAdminAddHeaderPreferenceController> {
+ BasePreferenceControllerTestCase {
private DeviceAdminAddHeaderPreferenceController mController;
+ @Mock
+ private TwoStatePreference mPreference;
+
+ @Mock
+ private ActivationListener mActivationListener;
+
@Before
public void setController() {
mController = new DeviceAdminAddHeaderPreferenceController(mSpiedContext,
@@ -32,22 +49,185 @@
}
@Test
- public void testUpdateState_adminWithNoProperties() throws Exception {
- mController.updateState(mPreference);
-
- verifyPreferenceTitleSet(DefaultDeviceAdminReceiver.class.getName());
- verifyPreferenceSummaryNeverSet();
- verifyPreferenceIconSet();
+ public void testGetAvailabilityStatus_admin() throws Exception {
+ assertAvailability(mController.getAvailabilityStatus(),
+ PreferenceController.AVAILABLE);
}
@Test
- public void testUpdateState_adminWithAllProperties() throws Exception {
- mController.setDeviceAdmin(mFancyDeviceAdminInfo);
+ public void testGetAvailabilityStatus_noAdmin() throws Exception {
+ DeviceAdminAddHeaderPreferenceController controller =
+ new DeviceAdminAddHeaderPreferenceController(mSpiedContext, mPreferenceKey,
+ mFragmentController, mUxRestrictions);
+
+ assertAvailability(controller.getAvailabilityStatus(),
+ PreferenceController.CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
+ public void testOnResumeInternal_inactiveAdmin() throws Exception {
+ mockInactiveAdmin(mDefaultAdmin);
+
+ mController.onResumeInternal(mPreference);
+
+ verifyPreferenceSetChecked(mPreference, false);
+ verifyPreferenceEnabled(mPreference);
+ verifyAppOpsMgrSetUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
+ /* restricted= */ true);
+ verifyAppOpsMgrSetUserRestriction(AppOpsManager.OP_TOAST_WINDOW, /* restricted= */ true);
+ }
+
+ @Test
+ public void testOnResumeInternal_activeAdmin() throws Exception {
+ mockActiveAdmin(mDefaultAdmin);
+
+ mController.onResumeInternal(mPreference);
+
+ verifyPreferenceSetChecked(mPreference, true);
+ verifyPreferenceEnabled(mPreference);
+ verifyAppOpsMgrSetUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
+ /* restricted= */ true);
+ verifyAppOpsMgrSetUserRestriction(AppOpsManager.OP_TOAST_WINDOW, /* restricted= */ true);
+ }
+
+ @Test
+ public void testOnResumeInternal_deviceOwner() throws Exception {
+ mockDeviceOwner();
+
+ mController.onResumeInternal(mPreference);
+
+ verifyPreferenceSetChecked(mPreference, true);
+ verifyPreferenceDisabled(mPreference);
+ verifyAppOpsMgrSetUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
+ /* restricted= */ true);
+ verifyAppOpsMgrSetUserRestriction(AppOpsManager.OP_TOAST_WINDOW, /* restricted= */ true);
+ }
+
+ @Test
+ public void testOnPauseInternal() throws Exception {
+ mController.onPauseInternal(mPreference);
+
+ verifyPreferenceDisabled(mPreference);
+ verifyAppOpsMgrSetUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
+ /* restricted= */ false);
+ verifyAppOpsMgrSetUserRestriction(AppOpsManager.OP_TOAST_WINDOW, /* restricted= */ false);
+ }
+
+ @Test
+ public void testUpdateState_activeAdminWithNoProperties() throws Exception {
+ mockActiveAdmin(mDefaultAdmin);
mController.updateState(mPreference);
- verifyPreferenceTitleSet("LordOfTheSevenReceiverKingdoms");
- verifyPreferenceSummarySet("One Receiver to Rule them All");
- verifyPreferenceIconSet();
+ verifyPreferenceSetChecked(mPreference, true);
+ verifyPreferenceEnabled(mPreference);
+ verifyPreferenceTitleSet(mPreference, mDefaultDeviceAdminInfo.loadLabel(mRealPm));
+ verifyPreferenceSummaryNeverSet(mPreference);
+ verifyPreferenceIconSet(mPreference);
+ }
+
+ @Test
+ public void testUpdateState_activeAdminWithAllProperties() throws Exception {
+ mController.setDeviceAdmin(mFancyDeviceAdminInfo);
+ mockActiveAdmin(mFancyAdmin);
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceSetChecked(mPreference, true);
+ verifyPreferenceEnabled(mPreference);
+ verifyPreferenceTitleSet(mPreference, mFancyDeviceAdminInfo.loadLabel(mRealPm));
+ verifyPreferenceSummarySet(mPreference, mFancyDeviceAdminInfo.loadDescription(mRealPm));
+ verifyPreferenceIconSet(mPreference);
+ }
+
+ @Test
+ public void testUpdateStatus_inactiveAdmin() throws Exception {
+ mockInactiveAdmin(mDefaultAdmin);
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceSetChecked(mPreference, false);
+ verifyPreferenceEnabled(mPreference);
+ verifyPreferenceTitleSet(mPreference, mDefaultDeviceAdminInfo.loadLabel(mRealPm));
+ }
+
+ @Test
+ public void testUpdateStatus_deviceOwner() throws Exception {
+ mockDeviceOwner();
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceSetChecked(mPreference, true);
+ verifyPreferenceDisabled(mPreference);
+ verifyPreferenceTitleSet(mPreference, mDefaultDeviceAdminInfo.loadLabel(mRealPm));
+ }
+
+ @Test
+ public void testUpdateStatus_profileOwner() throws Exception {
+ mockProfileOwner();
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceSetChecked(mPreference, true);
+ verifyPreferenceDisabled(mPreference);
+ verifyPreferenceTitleSet(mPreference, mDefaultDeviceAdminInfo.loadLabel(mRealPm));
+ }
+
+ @Test
+ public void testHandlePreferenceChanged_activateAdmin_withoutListener() {
+ mockInactiveAdmin(mDefaultAdmin);
+
+ mController.handlePreferenceChanged(mPreference, true);
+
+ verifyAdminNeverDeactivated();
+ verifyAdminActivated();
+ verifyActivationListenerNotCalled();
+ }
+
+ @Test
+ public void testHandlePreferenceChanged_activateAdmin_withListener() {
+ mockInactiveAdmin(mDefaultAdmin);
+ mController.setActivationListener(mActivationListener);
+
+ mController.handlePreferenceChanged(mPreference, true);
+
+ verifyAdminNeverDeactivated();
+ verifyAdminActivated();
+ verifyActivationListenerCalled(true);
+ }
+
+ @Test
+ public void testHandlePreferenceChanged_deactivateAdmin_withoutListener() {
+ mockActiveAdmin(mDefaultAdmin);
+
+ mController.handlePreferenceChanged(mPreference, false);
+
+ verifyAdminNeverActivated();
+ verifyAdminDeactivated();
+ verifyActivationListenerNotCalled();
+ }
+
+ @Test
+ public void testHandlePreferenceChanged_deactivateAdmin_withListener() {
+ mockActiveAdmin(mDefaultAdmin);
+ mController.setActivationListener(mActivationListener);
+
+ mController.handlePreferenceChanged(mPreference, false);
+
+ verifyAdminNeverActivated();
+ verifyAdminDeactivated();
+ verifyActivationListenerCalled(false);
+ }
+
+ private void verifyPreferenceSetChecked(TwoStatePreference preference, boolean isChecked) {
+ verify(preference).setChecked(isChecked);
+ }
+
+ private void verifyActivationListenerNotCalled() {
+ verify(mActivationListener, never()).onChanged(anyBoolean());
+ }
+
+ private void verifyActivationListenerCalled(boolean active) {
+ verify(mActivationListener).onChanged(active);
}
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddPoliciesPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddPoliciesPreferenceControllerTest.java
index b7ed858..ba99611 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddPoliciesPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddPoliciesPreferenceControllerTest.java
@@ -17,29 +17,25 @@
import static com.google.common.truth.Truth.assertWithMessage;
-import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
import android.app.admin.DeviceAdminInfo.PolicyInfo;
import android.util.Log;
-import androidx.preference.PreferenceGroup;
+import androidx.preference.Preference;
-import com.android.car.settings.R;
import com.android.car.settings.common.PreferenceController;
-import com.android.car.ui.preference.CarUiPreference;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
import org.mockito.Mock;
import java.util.ArrayList;
-import java.util.List;
public final class DeviceAdminAddPoliciesPreferenceControllerTest extends
- BaseDeviceAdminAddPreferenceControllerTestCase
- <DeviceAdminAddPoliciesPreferenceController> {
+ BasePreferenceControllerTestCase {
private static final String TAG = DeviceAdminAddPoliciesPreferenceControllerTest.class
.getSimpleName();
@@ -47,7 +43,9 @@
private DeviceAdminAddPoliciesPreferenceController mController;
@Mock
- private PreferenceGroup mPreferenceGroup;
+ private Preference mPreference;
+ @Captor
+ private ArgumentCaptor<CharSequence> mTitleCaptor;
@Before
public void setController() {
@@ -59,7 +57,7 @@
@Test
public void testGetPreferenceType() throws Exception {
assertWithMessage("preference type").that(mController.getPreferenceType())
- .isEqualTo(PreferenceGroup.class);
+ .isEqualTo(Preference.class);
}
@Test
@@ -96,61 +94,37 @@
}
@Test
- public void testUpdateState_adminUser() throws Exception {
- updateStateTest(/* isAdmin= */ true);
+ public void testUpdateState_systemUser() throws Exception {
+ updateStateTest(/* isSystemUser= */ true);
}
@Test
- public void testUpdateState_nonAdminUser() throws Exception {
- updateStateTest(/* isAdmin= */ false);
+ public void testUpdateState_nonSystemUser() throws Exception {
+ updateStateTest(/* isSystemUser= */ false);
}
- private void updateStateTest(boolean isAdmin) {
+ private void updateStateTest(boolean isSystemUser) {
// Arrange
- if (isAdmin) {
- mockAdminUser();
+ if (isSystemUser) {
+ mockSystemUser();
} else {
- mockNonAdminUser();
+ mockNonSystemUser();
}
ArrayList<PolicyInfo> usedPolicies = mFancyDeviceAdminInfo.getUsedPolicies();
Log.d(TAG, "Admin policies: " + usedPolicies);
mController.setDeviceAdmin(mFancyDeviceAdminInfo);
- List<CarUiPreference> addedPreferences = new ArrayList<>();
- when(mPreferenceGroup.addPreference(any())).thenAnswer(call -> {
- Log.d(TAG, "Mocking " + call);
- addedPreferences.add((CarUiPreference) call.getArguments()[0]);
- return true;
- });
// Act
- mController.updateState(mPreferenceGroup);
- Log.d(TAG, "Added preferences: " + addedPreferences);
+ mController.updateState(mPreference);
// Assert
-
- verify(mPreferenceGroup).removeAll();
-
- int maxPoliciesShown = mRealContext.getResources()
- .getInteger(R.integer.max_device_policies_shown);
- Log.d(TAG, "R.integer.max_device_policies_shown: " + maxPoliciesShown);
- verify(mPreferenceGroup).setInitialExpandedChildrenCount(maxPoliciesShown);
-
- int expectedSize = usedPolicies.size();
- assertWithMessage("added preferences").that(addedPreferences).hasSize(expectedSize);
-
- for (int i = 0; i < expectedSize; i++) {
- CarUiPreference preference = addedPreferences.get(i);
- PolicyInfo policy = usedPolicies.get(i);
- CharSequence expectedTitle = mRealContext
- .getText(isAdmin ? policy.label : policy.labelForSecondaryUsers);
- assertWithMessage("title for policy at index %s", i)
- .that(preference.getTitle().toString())
- .isEqualTo(expectedTitle);
- CharSequence expectedSummary = mRealContext
- .getText(isAdmin ? policy.description : policy.descriptionForSecondaryUsers);
- assertWithMessage("summary for policy at index %s", i)
- .that(preference.getSummary().toString())
- .isEqualTo(expectedSummary);
+ verify(mPreference).setTitle(mTitleCaptor.capture());
+ Log.d(TAG, "Preference title: " + mTitleCaptor.getValue());
+ for (PolicyInfo policy : usedPolicies) {
+ CharSequence itemTitle = mRealContext
+ .getText(isSystemUser ? policy.label : policy.labelForSecondaryUsers);
+ assertWithMessage("policy item title")
+ .that(mTitleCaptor.getValue().toString()).contains(itemTitle);
}
}
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddSupportPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddSupportPreferenceControllerTest.java
index bea4383..ed1149e 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddSupportPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddSupportPreferenceControllerTest.java
@@ -15,14 +15,19 @@
*/
package com.android.car.settings.enterprise;
+import androidx.preference.Preference;
+
import com.android.car.settings.common.PreferenceController;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mock;
public final class DeviceAdminAddSupportPreferenceControllerTest extends
- BaseDeviceAdminAddPreferenceControllerTestCase
- <DeviceAdminAddSupportPreferenceController> {
+ BasePreferenceControllerTestCase {
+
+ @Mock
+ private Preference mPreference;
private DeviceAdminAddSupportPreferenceController mController;
@@ -73,6 +78,6 @@
mController.updateState(mPreference);
- verifyPreferenceTitleSet("WHAZZZZUP");
+ verifyPreferenceTitleSet(mPreference, "WHAZZZZUP");
}
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddWarningPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddWarningPreferenceControllerTest.java
index 1561ffa..d15592a 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddWarningPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminAddWarningPreferenceControllerTest.java
@@ -15,14 +15,19 @@
*/
package com.android.car.settings.enterprise;
+import androidx.preference.Preference;
+
import com.android.car.settings.R;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mock;
public final class DeviceAdminAddWarningPreferenceControllerTest extends
- BaseDeviceAdminAddPreferenceControllerTestCase
- <DeviceAdminAddWarningPreferenceController> {
+ BasePreferenceControllerTestCase {
+
+ @Mock
+ private Preference mPreference;
private DeviceAdminAddWarningPreferenceController mController;
@@ -35,21 +40,21 @@
@Test
public void testUpdateState_adminInactive() {
- mockInactiveAdmin();
+ mockInactiveAdmin(mDefaultAdmin);
mController.updateState(mPreference);
- verifyPreferenceTitleSet(
+ verifyPreferenceTitleSet(mPreference,
mRealContext.getString(R.string.device_admin_warning, mPackageName));
}
@Test
public void testUpdateState_adminActive() {
- mockActiveAdmin();
+ mockActiveAdmin(mDefaultAdmin);
mController.updateState(mPreference);
- verifyPreferenceTitleSet(
+ verifyPreferenceTitleSet(mPreference,
mRealContext.getString(R.string.device_admin_status, mPackageName));
}
@@ -59,7 +64,8 @@
mController.updateState(mPreference);
- verifyPreferenceTitleSet(mRealContext.getString(R.string.admin_profile_owner_user_message));
+ verifyPreferenceTitleSet(mPreference,
+ mRealContext.getString(R.string.admin_profile_owner_user_message));
}
@Test
@@ -68,7 +74,8 @@
mController.updateState(mPreference);
- verifyPreferenceTitleSet(mRealContext.getString(R.string.admin_device_owner_message));
+ verifyPreferenceTitleSet(mPreference,
+ mRealContext.getString(R.string.admin_device_owner_message));
}
@Test
@@ -78,6 +85,7 @@
mController.updateState(mPreference);
- verifyPreferenceTitleSet(mRealContext.getString(R.string.admin_financed_message));
+ verifyPreferenceTitleSet(mPreference,
+ mRealContext.getString(R.string.admin_financed_message));
}
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminDeactivatedAppsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminDeactivatedAppsPreferenceControllerTest.java
new file mode 100644
index 0000000..aa2cfb0
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminDeactivatedAppsPreferenceControllerTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public final class DeviceAdminDeactivatedAppsPreferenceControllerTest
+ extends BasePreferenceControllerTestCase {
+
+ private DeviceAdminAppsPreferenceController mController;
+ private BasePreferenceControllerTestCase.DummyPreferenceGroup mPreferenceGroup;
+
+ @Before
+ @UiThreadTest
+ public void setUp() throws Exception {
+ mController = new DeviceAdminDeactivatedAppsPreferenceController(mSpiedContext,
+ mPreferenceKey, mFragmentController, mUxRestrictions);
+ mPreferenceGroup = new DummyPreferenceGroup(mSpiedContext);
+ }
+
+ @Test
+ public void testUpdateState_noBroadcastReceivers() {
+ mockQueryBroadcastReceivers();
+
+ mController.updateState(mPreferenceGroup);
+
+ verifyPreferenceTitles(mPreferenceGroup,
+ mRealContext.getString(R.string.device_admin_apps_list_empty));
+ }
+
+ @Test
+ public void testUpdateState_noDeactivatedAdminApp() {
+ mockQueryBroadcastReceivers(mDefaultResolveInfo, mFancyResolveInfo);
+ mockActiveAdmin(mDefaultAdmin);
+ mockActiveAdmin(mFancyAdmin);
+
+ mController.updateState(mPreferenceGroup);
+
+ verifyPreferenceTitles(mPreferenceGroup,
+ mRealContext.getString(R.string.device_admin_apps_list_empty));
+ }
+
+ @Test
+ public void testUpdateState_singleDeactivatedAdminApp() {
+ mockQueryBroadcastReceivers(mDefaultResolveInfo, mFancyResolveInfo);
+ mockActiveAdmin(mDefaultAdmin);
+ mockInactiveAdmin(mFancyAdmin);
+
+ mController.updateState(mPreferenceGroup);
+
+ verifyPreferenceTitles(mPreferenceGroup, mFancyDeviceAdminInfo.loadLabel(mRealPm));
+ }
+
+ @Test
+ public void testUpdateState_multipleDeactivatedAdminApps() {
+ mockQueryBroadcastReceivers(mDefaultResolveInfo, mFancyResolveInfo);
+ mockInactiveAdmin(mDefaultAdmin);
+ mockInactiveAdmin(mFancyAdmin);
+
+ mController.updateState(mPreferenceGroup);
+
+ verifyPreferenceTitles(mPreferenceGroup,
+ mDefaultDeviceAdminInfo.loadLabel(mRealPm),
+ mFancyDeviceAdminInfo.loadLabel(mRealPm));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminStringProviderImplTest.java b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminStringProviderImplTest.java
new file mode 100644
index 0000000..c18fde2
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/DeviceAdminStringProviderImplTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.expectThrows;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class DeviceAdminStringProviderImplTest {
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private final DeviceAdminStringProviderImpl mDeviceAdminStringProvider =
+ new DeviceAdminStringProviderImpl(mContext);
+
+ @Test
+ public void testDefaultDisabledByPolicyTitle() {
+ assertThat(mDeviceAdminStringProvider.getDefaultDisabledByPolicyTitle())
+ .isEqualTo(mContext.getString(R.string.disabled_by_policy_title));
+ }
+
+ @Test
+ public void testDisallowAdjustVolumeTitle() {
+ assertThat(mDeviceAdminStringProvider.getDisallowAdjustVolumeTitle())
+ .isEqualTo(mContext.getString(R.string.disabled_by_policy_title_adjust_volume));
+ }
+
+ @Test
+ public void testDisallowOutgoingCallsTitle() {
+ assertThat(mDeviceAdminStringProvider.getDisallowOutgoingCallsTitle())
+ .isEqualTo(mContext.getString(R.string.disabled_by_policy_title_outgoing_calls));
+ }
+
+ @Test
+ public void testDisallowSmsTitle() {
+ assertThat(mDeviceAdminStringProvider.getDisallowSmsTitle())
+ .isEqualTo(mContext.getString(R.string.disabled_by_policy_title_sms));
+ }
+
+ @Test
+ public void testDisableCameraTitle() {
+ assertThat(mDeviceAdminStringProvider.getDisableCameraTitle())
+ .isEqualTo(mContext.getString(R.string.disabled_by_policy_title_camera));
+ }
+
+ @Test
+ public void testDisableScreenCaptureTitle() {
+ assertThat(mDeviceAdminStringProvider.getDisableScreenCaptureTitle())
+ .isEqualTo(mContext.getString(R.string.disabled_by_policy_title_screen_capture));
+ }
+
+ @Test
+ public void testSuspendPackagesTitle() {
+ assertThat(mDeviceAdminStringProvider.getSuspendPackagesTitle())
+ .isEqualTo(mContext.getString(R.string.disabled_by_policy_title_suspend_packages));
+ }
+
+ @Test
+ public void testDefaultDisabledByPolicyContent() {
+ assertThat(mDeviceAdminStringProvider.getDefaultDisabledByPolicyContent())
+ .isEqualTo(mContext.getString(R.string.default_admin_support_msg));
+ }
+
+ @Test
+ public void testLearnMoreHelpPageUrl() {
+ assertThat(mDeviceAdminStringProvider.getLearnMoreHelpPageUrl())
+ .isEqualTo(mContext.getString(R.string.help_url_action_disabled_by_it_admin));
+ }
+
+ @Test
+ public void testDisabledByPolicyTitleForFinancedDevice() {
+ assertThat(mDeviceAdminStringProvider.getDisabledByPolicyTitleForFinancedDevice())
+ .isEqualTo(mContext.getString(R.string.disabled_by_policy_title_financed_device));
+ }
+
+ @Test
+ public void testDisabledBiometricsParentConsentTitle() {
+ UnsupportedOperationException e = expectThrows(UnsupportedOperationException.class,
+ () -> mDeviceAdminStringProvider.getDisabledBiometricsParentConsentTitle());
+ assertThat(e.getMessage()).contains("disabled_by_policy_title_biometric_parental_consent");
+ }
+
+ @Test
+ public void testDisabledBiometricsParentConsentContent() {
+ UnsupportedOperationException e = expectThrows(UnsupportedOperationException.class,
+ () -> mDeviceAdminStringProvider.getDisabledBiometricsParentConsentContent());
+ assertThat(e.getMessage())
+ .contains("disabled_by_policy_content_biometric_parental_consent");
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/EnterpriseDisclosurePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/EnterpriseDisclosurePreferenceControllerTest.java
new file mode 100644
index 0000000..4956c80
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/EnterpriseDisclosurePreferenceControllerTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.enterprise;
+
+
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.drivingstate.CarUxRestrictions;
+
+import com.android.car.admin.ui.R;
+import com.android.settingslib.widget.FooterPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public final class EnterpriseDisclosurePreferenceControllerTest extends
+ BasePreferenceControllerTestCase {
+ private static final String ORG_NAME = "My Org";
+
+ private EnterpriseDisclosurePreferenceController mEnterpriseDisclosurePreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private FooterPreference mPreference;
+
+ @Before
+ public void setUp() {
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreference = new FooterPreference(mSpiedContext);
+ mEnterpriseDisclosurePreferenceController = new EnterpriseDisclosurePreferenceController(
+ mSpiedContext, mPreferenceKey, mFragmentController, mCarUxRestrictions);
+ }
+
+ @Test
+ public void testDeviceAdminFeatureMissing_noDisclosure() {
+ mockNoDeviceAdminFeature();
+
+ mEnterpriseDisclosurePreferenceController.updateState(mPreference);
+
+ assertAvailability(mEnterpriseDisclosurePreferenceController.getAvailabilityStatus(),
+ UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void testNoDeviceOwnerComponent_noDisclosure() {
+ mockHasDeviceAdminFeature();
+ mockNoDeviceOwner();
+
+ mEnterpriseDisclosurePreferenceController.updateState(mPreference);
+
+ assertAvailability(mEnterpriseDisclosurePreferenceController.getAvailabilityStatus(),
+ UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void testOrganizationNameAbsent_genericDisclosure() {
+ mockHasDeviceAdminFeature();
+ mockDeviceOwner();
+ mockOrganizationName(null);
+
+ mEnterpriseDisclosurePreferenceController.updateState(mPreference);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.getTitle().toString()).isEqualTo(mRealContext.getString(
+ R.string.car_admin_ui_managed_device_message_generic));
+ }
+
+ @Test
+ public void testOrganizationNamePresent_specificDisclosure() {
+ mockHasDeviceAdminFeature();
+ mockDeviceOwner();
+ mockOrganizationName(ORG_NAME);
+
+ mEnterpriseDisclosurePreferenceController.updateState(mPreference);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.getTitle().toString()).isEqualTo(mRealContext.getString(
+ R.string.car_admin_ui_managed_device_message_by_org, ORG_NAME));
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java b/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java
new file mode 100644
index 0000000..7e25fbe
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.when;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+import java.util.Date;
+
+public final class EnterprisePrivacyFeatureProviderImplTest extends BaseEnterpriseTestCase {
+
+ private static final String IME_PACKAGE_NAME = "acme.keyboards";
+ private static final String IME_PACKAGE_LABEL = "ACME Keyboards";
+
+ private static final UserHandle MY_USER_ID = UserHandle.of(UserHandle.myUserId());
+
+ private EnterprisePrivacyFeatureProviderImpl mProvider;
+
+ @Mock
+ private ApplicationInfo mApplicationInfo;
+
+ @Before
+ public void setProvider() {
+ mProvider = new EnterprisePrivacyFeatureProviderImpl(mSpiedContext, mDpm, mSpiedPm);
+ }
+
+ @Test
+ public void testGetLastBugReportRequestTime_none() {
+ mockGetLastBugreportTime(-1);
+
+ assertWithMessage("getLastBugReportRequestTime()")
+ .that(mProvider.getLastBugReportRequestTime()).isNull();
+ }
+
+ @Test
+ public void testGetLastBugReportRequestTime_ok() {
+ long now = System.currentTimeMillis();
+ mockGetLastBugreportTime(now);
+
+ Date last = mProvider.getLastBugReportRequestTime();
+ assertWithMessage("getLastBugReportRequestTime()").that(last).isNotNull();
+ assertWithMessage("getLastBugReportRequestTime().getTime()").that(last.getTime())
+ .isEqualTo(now);
+ }
+
+ @Test
+ public void testGetLastNetworkLogRetrievalTime_none() {
+ mockGetLastNetworkLogRetrievalTime(-1);
+
+ assertWithMessage("getLastNetworkLogRetrievalTime()")
+ .that(mProvider.getLastNetworkLogRetrievalTime()).isNull();
+ }
+
+ @Test
+ public void testGetLastNetworkLogRetrievalTime_ok() {
+ long now = System.currentTimeMillis();
+ mockGetLastNetworkLogRetrievalTime(now);
+
+ Date last = mProvider.getLastNetworkLogRetrievalTime();
+ assertWithMessage("getLastNetworkLogRetrievalTime()").that(last).isNotNull();
+ assertWithMessage("getLastNetworkLogRetrievalTime().getTime()").that(last.getTime())
+ .isEqualTo(now);
+ }
+
+ @Test
+ public void testGetLastSecurityLogRetrievalTime_none() {
+ mockGetLastSecurityLogRetrievalTime(-1);
+
+ assertWithMessage("getLastSecurityLogRetrievalTime()")
+ .that(mProvider.getLastSecurityLogRetrievalTime()).isNull();
+ }
+
+ @Test
+ public void testGetLastSecurityLogRetrievalTime_ok() {
+ long now = System.currentTimeMillis();
+ mockGetLastSecurityLogRetrievalTime(now);
+
+ Date last = mProvider.getLastSecurityLogRetrievalTime();
+ assertWithMessage("getLastSecurityLogRetrievalTime()").that(last).isNotNull();
+ assertWithMessage("getLastSecurityLogRetrievalTime().getTime()").that(last.getTime())
+ .isEqualTo(now);
+ }
+
+ @Test
+ public void testGetImeLabelIfOwnerSet_notSet() {
+ mockIsCurrentInputMethodSetByOwner(false);
+
+ assertWithMessage("getImeLabelIfOwnerSet()").that(mProvider.getImeLabelIfOwnerSet())
+ .isNull();
+ }
+
+ @Test
+ public void testGetImeLabelIfOwnerSet_nullString() {
+ mockIsCurrentInputMethodSetByOwner(true);
+ mockDefaultInputMehtodSettings(null);
+
+ assertWithMessage("getImeLabelIfOwnerSet()").that(mProvider.getImeLabelIfOwnerSet())
+ .isNull();
+ }
+
+ @Test
+ public void testGetImeLabelIfOwnerSet_emptyString() {
+ mockIsCurrentInputMethodSetByOwner(true);
+ mockDefaultInputMehtodSettings("");
+
+ assertWithMessage("getImeLabelIfOwnerSet()").that(mProvider.getImeLabelIfOwnerSet())
+ .isNull();
+ }
+
+ @Test
+ public void testGetImeLabelIfOwnerSet_nonexistentPackage() throws Exception {
+ mockIsCurrentInputMethodSetByOwner(true);
+ mockDefaultInputMehtodSettings(IME_PACKAGE_NAME);
+ mockGetApplicationInfoNotFound(IME_PACKAGE_NAME);
+
+ assertWithMessage("getImeLabelIfOwnerSet()").that(mProvider.getImeLabelIfOwnerSet())
+ .isNull();
+ }
+
+ @Test
+ public void testGetImeLabelIfOwnerSet_existentPackage() throws Exception {
+ mockIsCurrentInputMethodSetByOwner(true);
+ mockDefaultInputMehtodSettings(IME_PACKAGE_NAME);
+ mockGetApplicationInfoLabel(IME_PACKAGE_NAME, IME_PACKAGE_LABEL);
+
+ assertWithMessage("getImeLabelIfOwnerSet()").that(mProvider.getImeLabelIfOwnerSet())
+ .isEqualTo(IME_PACKAGE_LABEL);
+ }
+
+ private void mockDefaultInputMehtodSettings(String value) {
+ Settings.Secure.putString(mRealContext.getContentResolver(),
+ Settings.Secure.DEFAULT_INPUT_METHOD, value);
+ }
+
+ private void mockGetApplicationInfoNotFound(String packageName) throws Exception {
+ doThrow(new PackageManager.NameNotFoundException("D'OH!")).when(mSpiedPm)
+ .getApplicationInfoAsUser(packageName, /* flags= */ 0, MY_USER_ID);
+ }
+
+ private void mockGetApplicationInfoLabel(String packageName, CharSequence label)
+ throws Exception {
+ doReturn(mApplicationInfo).when(mSpiedPm).getApplicationInfoAsUser(packageName,
+ /* flags= */ 0, MY_USER_ID);
+ doReturn(mApplicationInfo).when(mSpiedPm).getApplicationInfoAsUser(packageName,
+ /* flags= */ 0, MY_USER_ID.getIdentifier());
+ when(mApplicationInfo.loadLabel(mSpiedPm)).thenReturn(label);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsActivityTest.java b/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsActivityTest.java
new file mode 100644
index 0000000..b86f6c3
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsActivityTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import static android.car.test.mocks.AndroidMockitoHelper.syncCallOnMainThread;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import androidx.fragment.app.Fragment;
+
+import org.junit.Test;
+
+public final class EnterprisePrivacySettingsActivityTest extends BaseEnterpriseTestCase {
+
+ @Test
+ public void testGetFragment() throws Exception {
+ Fragment fragment = syncCallOnMainThread(() ->
+ // EnterprisePrivacySettingsActivity must be created in the main thread
+ new EnterprisePrivacySettingsActivity().getInitialFragment());
+ assertWithMessage("initial fragment class").that(fragment)
+ .isInstanceOf(EnterprisePrivacySettingsFragment.class);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsFragmentTest.java b/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsFragmentTest.java
new file mode 100644
index 0000000..a05cbde
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsFragmentTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import static android.car.test.mocks.AndroidMockitoHelper.syncCallOnMainThread;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.res.XmlResourceParser;
+
+import androidx.fragment.app.FragmentActivity;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+public final class EnterprisePrivacySettingsFragmentTest extends BaseEnterpriseTestCase {
+
+ private EnterprisePrivacySettingsFragment mFragment;
+
+ @Mock
+ private FragmentActivity mFragmentActivity;
+
+ @Before
+ public void setFragment() throws Exception {
+ mFragment = syncCallOnMainThread(() -> new EnterprisePrivacySettingsFragment());
+ }
+
+ @Test
+ public void testGetPreferenceScreenResId() {
+ int resId = mFragment.getPreferenceScreenResId();
+
+ XmlResourceParser parser = mRealContext.getResources().getXml(resId);
+ assertWithMessage("xml with id %s", resId).that(parser).isNotNull();
+ }
+
+ @Test
+ public void testFinishActivityWhenDeviceOwnerIsNotSet() {
+ mockNotManaged();
+
+ mFragment.onAttach(mSpiedContext, mFragmentActivity);
+
+ verify(mFragmentActivity).finish();
+ }
+
+ @Test
+ public void testDoesNotFinishActivityWhenDeviceOwnerIsNotSet() {
+ mockDeviceOwner();
+
+ mFragment.onAttach(mSpiedContext, mFragmentActivity);
+
+ verify(mFragmentActivity, never()).finish();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsPreferenceControllerTest.java
new file mode 100644
index 0000000..534c61b
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/EnterprisePrivacySettingsPreferenceControllerTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+public final class EnterprisePrivacySettingsPreferenceControllerTest
+ extends BasePreferenceControllerTestCase {
+
+ private EnterprisePrivacySettingsPreferenceController mController;
+
+ @Mock
+ private Preference mPreference;
+
+ @Before
+ public void setController() {
+ mController = new EnterprisePrivacySettingsPreferenceController(mSpiedContext,
+ mPreferenceKey, mFragmentController, mUxRestrictions);
+ }
+
+ @Test
+ public void testuUdateState() {
+ mController.updateState(mPreference);
+
+ verifyPreferenceTitleNeverSet(mPreference);
+ verifyPreferenceSummarySet(mPreference,
+ R.string.enterprise_privacy_settings_summary_generic);
+ verifyPreferenceIconNeverSet(mPreference);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/EnterpriseUtilsTest.java b/tests/unit/src/com/android/car/settings/enterprise/EnterpriseUtilsTest.java
index 4251de6..37f5482 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/EnterpriseUtilsTest.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/EnterpriseUtilsTest.java
@@ -17,16 +17,29 @@
import static com.android.car.settings.enterprise.EnterpriseUtils.getAdminWithinPackage;
import static com.android.car.settings.enterprise.EnterpriseUtils.getDeviceAdminInfo;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasDeviceOwner;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByDpm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.hasUserRestrictionByUm;
+import static com.android.car.settings.enterprise.EnterpriseUtils.isAdminUser;
+import static com.android.car.settings.enterprise.EnterpriseUtils.isDemoUser;
+import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.when;
+
import android.app.admin.DeviceAdminInfo;
import android.content.ComponentName;
+import android.os.UserManager;
import org.junit.Test;
public final class EnterpriseUtilsTest extends BaseEnterpriseTestCase {
+ private static final String TEST_RESTRICTION = "test_restriction";
+
@Test
public void testGetAdminWithinPackage_notFound() {
ComponentName admin = getAdminWithinPackage(mSpiedContext, mPackageName);
@@ -36,7 +49,7 @@
@Test
public void testGetAdminWithinPackage_found() {
- mockActiveAdmin(mDefaultAdmin);
+ mockGetActiveAdmins(mDefaultAdmin);
ComponentName admin = getAdminWithinPackage(mSpiedContext, mPackageName);
@@ -60,4 +73,93 @@
assertWithMessage("Component for %s", info).that(info.getComponent())
.isEqualTo(mDefaultAdmin);
}
+
+ @Test
+ public void testIsDemoUser_notDemoMode_notDemoUser() {
+ when(UserManager.isDeviceInDemoMode(mSpiedContext)).thenReturn(false);
+ when(mUm.isDemoUser()).thenReturn(false);
+
+ assertThat(isDemoUser(mSpiedContext)).isFalse();
+ }
+
+ @Test
+ public void testIsDemoUser_notDemoMode_demoUser() {
+ when(UserManager.isDeviceInDemoMode(mSpiedContext)).thenReturn(false);
+ when(mUm.isDemoUser()).thenReturn(true);
+
+ assertThat(isDemoUser(mSpiedContext)).isFalse();
+ }
+
+ @Test
+ public void testIsDemoUser_demoMode_notDemoUser() {
+ when(UserManager.isDeviceInDemoMode(mSpiedContext)).thenReturn(true);
+ when(mUm.isDemoUser()).thenReturn(false);
+
+ assertThat(isDemoUser(mSpiedContext)).isFalse();
+ }
+
+ @Test
+ public void testIsDemoUser_demoMode_demoUser() {
+ when(UserManager.isDeviceInDemoMode(mSpiedContext)).thenReturn(true);
+ when(mUm.isDemoUser()).thenReturn(true);
+
+ assertThat(isDemoUser(mSpiedContext)).isTrue();
+ }
+
+ @Test
+ public void testIsAdminUser_true() {
+ when(mUm.isAdminUser()).thenReturn(true);
+
+ assertThat(isAdminUser(mSpiedContext)).isTrue();
+ }
+
+ @Test
+ public void testUserRestriction_notBaseRestricted_notUmRestricted() {
+ when(mUm.hasBaseUserRestriction(eq(TEST_RESTRICTION), any())).thenReturn(false);
+ when(mUm.hasUserRestriction(TEST_RESTRICTION)).thenReturn(false);
+
+ assertThat(hasUserRestrictionByUm(mSpiedContext, TEST_RESTRICTION)).isFalse();
+ assertThat(hasUserRestrictionByDpm(mSpiedContext, TEST_RESTRICTION)).isFalse();
+ }
+
+ @Test
+ public void testUserRestriction_baseRestricted_umRestricted() {
+ when(mUm.hasBaseUserRestriction(eq(TEST_RESTRICTION), any())).thenReturn(true);
+
+ assertThat(hasUserRestrictionByUm(mSpiedContext, TEST_RESTRICTION)).isTrue();
+ assertThat(hasUserRestrictionByDpm(mSpiedContext, TEST_RESTRICTION)).isFalse();
+ }
+
+ @Test
+ public void testUserRestriction_notBaseRestricted_umRestricted() {
+ when(mUm.hasBaseUserRestriction(eq(TEST_RESTRICTION), any())).thenReturn(false);
+ when(mUm.hasUserRestriction(TEST_RESTRICTION)).thenReturn(true);
+
+ assertThat(hasUserRestrictionByUm(mSpiedContext, TEST_RESTRICTION)).isFalse();
+ assertThat(hasUserRestrictionByDpm(mSpiedContext, TEST_RESTRICTION)).isTrue();
+ }
+
+ @Test
+ public void testHasDeviceOwner_unmanagedDevice() {
+ when(mDpm.isDeviceManaged()).thenReturn(false);
+
+ assertThat(hasDeviceOwner(mSpiedContext)).isFalse();
+ }
+
+ @Test
+ public void testHasDeviceOwner_managedDevice_noDeviceOwnerComponent() {
+ when(mDpm.isDeviceManaged()).thenReturn(true);
+ when(mDpm.getDeviceOwnerComponentOnAnyUser()).thenReturn(null);
+
+ assertThat(hasDeviceOwner(mSpiedContext)).isFalse();
+ }
+
+ @Test
+ public void testHasDeviceOwner() {
+ when(mDpm.isDeviceManaged()).thenReturn(true);
+ when(mDpm.getDeviceOwnerComponentOnAnyUser())
+ .thenReturn(new ComponentName("testPackage", "testClass"));
+
+ assertThat(hasDeviceOwner(mSpiedContext)).isTrue();
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/ImePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/ImePreferenceControllerTest.java
new file mode 100644
index 0000000..0dbbabd
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/ImePreferenceControllerTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static org.mockito.Mockito.when;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+public final class ImePreferenceControllerTest extends BasePreferenceControllerTestCase {
+
+ private ImePreferenceController mController;
+
+ @Mock
+ private Preference mPreference;
+
+ @Mock
+ private EnterprisePrivacyFeatureProvider mProvider;
+
+ @Before
+ public void setUp() throws Exception {
+ mController = new ImePreferenceController(mSpiedContext, mPreferenceKey,
+ mFragmentController, mUxRestrictions, mProvider);
+ }
+
+ @Test
+ public void testGetgetAvailabilityStatus_noFeature() {
+ mockNoDeviceAdminFeature();
+ // Cannot use mController because it check for feature on constructor
+ ImePreferenceController controller = new ImePreferenceController(mSpiedContext,
+ mPreferenceKey, mFragmentController, mUxRestrictions, mProvider);
+
+ assertAvailability(controller.getAvailabilityStatus(), UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void testGetgetAvailabilityStatus_notSet() {
+ mockHasDeviceAdminFeature();
+ mockGetImeLabelIfOwnerSet(null);
+
+ assertAvailability(mController.getAvailabilityStatus(), CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
+ public void testGetgetAvailabilityStatus_set() {
+ mockHasDeviceAdminFeature();
+ mockGetImeLabelIfOwnerSet("Da Lablue");
+
+ assertAvailability(mController.getAvailabilityStatus(), AVAILABLE);
+ }
+
+ @Test
+ public void testUpdateState_set() {
+ mockGetImeLabelIfOwnerSet("Da Lablue");
+
+ mController.updateState(mPreference);
+
+ String summary = mRealContext.getResources()
+ .getString(R.string.enterprise_privacy_input_method_name, "Da Lablue");
+ verifyPreferenceTitleNeverSet(mPreference);
+ verifyPreferenceSummarySet(mPreference, summary);
+ verifyPreferenceIconNeverSet(mPreference);
+ }
+
+ private void mockGetImeLabelIfOwnerSet(String label) {
+ when(mProvider.getImeLabelIfOwnerSet()).thenReturn(label);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java
new file mode 100644
index 0000000..6784f6e
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import android.content.ComponentName;
+
+import androidx.preference.Preference;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.settingslib.utils.StringUtil;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public final class ManageDeviceAdminPreferenceControllerTest
+ extends BasePreferenceControllerTestCase {
+
+ private Preference mPreference;
+
+ @Test
+ public void testUpdateState_noActiveAdminApps() {
+ ManageDeviceAdminPreferenceController controller = newControllerWithFeatureEnabled();
+ mockGetActiveAdmins();
+
+ controller.updateState(mPreference);
+
+ assertPreferenceSummary(mPreference,
+ mRealContext.getString(R.string.number_of_device_admins_none));
+ }
+
+ @Test
+ public void testUpdateState_singleActiveAdminApp() {
+ ManageDeviceAdminPreferenceController controller = newControllerWithFeatureEnabled();
+ mockGetActiveAdmins(ComponentName.createRelative("packageName", "className"));
+
+ controller.updateState(mPreference);
+
+ assertPreferenceSummary(mPreference,
+ StringUtil.getIcuPluralsString(mRealContext, 1, R.string.number_of_device_admins));
+ }
+
+ @Test
+ public void testUpdateState_multipleActiveAdminApps() {
+ ManageDeviceAdminPreferenceController controller = newControllerWithFeatureEnabled();
+ mockGetActiveAdmins(ComponentName.createRelative("packageName1", "className1"),
+ ComponentName.createRelative("packageName2", "className2"));
+
+ controller.updateState(mPreference);
+
+ assertPreferenceSummary(mPreference,
+ StringUtil.getIcuPluralsString(mRealContext, 2, R.string.number_of_device_admins));
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_deviceAdminDisabled() {
+ ManageDeviceAdminPreferenceController controller = newControllerWithFeatureDisabled();
+
+ assertAvailability(controller.getAvailabilityStatus(), UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_deviceAdminEnabled() {
+ ManageDeviceAdminPreferenceController controller = newControllerWithFeatureEnabled();
+
+ assertAvailability(controller.getAvailabilityStatus(), AVAILABLE);
+ }
+
+ private ManageDeviceAdminPreferenceController newControllerWithFeatureDisabled() {
+ mockNoDeviceAdminFeature();
+ return newController();
+ }
+
+ private ManageDeviceAdminPreferenceController newControllerWithFeatureEnabled() {
+ mockHasDeviceAdminFeature();
+ ManageDeviceAdminPreferenceController controller = newController();
+ return controller;
+ }
+
+ private ManageDeviceAdminPreferenceController newController() {
+ mPreference = new Preference(mSpiedContext);
+ return new ManageDeviceAdminPreferenceController(
+ mSpiedContext, mPreferenceKey, mFragmentController, mUxRestrictions);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/NetworkLogsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/NetworkLogsPreferenceControllerTest.java
new file mode 100644
index 0000000..63b5c27
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/NetworkLogsPreferenceControllerTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.text.format.DateUtils;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+public final class NetworkLogsPreferenceControllerTest extends BasePreferenceControllerTestCase {
+
+ private NetworkLogsPreferenceController mController;
+
+ @Mock
+ private Preference mPreference;
+
+ @Before
+ public void setUp() throws Exception {
+ mController = new NetworkLogsPreferenceController(mSpiedContext, mPreferenceKey,
+ mFragmentController, mUxRestrictions);
+ }
+
+ @Test
+ public void testUpdateState_noLogs() {
+ mockGetLastNetworkLogRetrievalTime(-1);
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceTitleNeverSet(mPreference);
+ verifyPreferenceSummarySet(mPreference, R.string.enterprise_privacy_none);
+ verifyPreferenceIconNeverSet(mPreference);
+ }
+
+ @Test
+ public void testUpdateState_withLogs() {
+ long now = System.currentTimeMillis();
+ mockGetLastNetworkLogRetrievalTime(now);
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceTitleNeverSet(mPreference);
+ String formattedDate = DateUtils.formatDateTime(mRealContext, now,
+ DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE);
+ verifyPreferenceSummarySet(mPreference, formattedDate);
+ verifyPreferenceIconNeverSet(mPreference);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/SecurityLogsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/SecurityLogsPreferenceControllerTest.java
new file mode 100644
index 0000000..b31d6d8
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/enterprise/SecurityLogsPreferenceControllerTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.enterprise;
+
+import android.text.format.DateUtils;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+public final class SecurityLogsPreferenceControllerTest extends BasePreferenceControllerTestCase {
+
+ private SecurityLogsPreferenceController mController;
+
+ @Mock
+ private Preference mPreference;
+
+ @Before
+ public void setUp() throws Exception {
+ mController = new SecurityLogsPreferenceController(mSpiedContext, mPreferenceKey,
+ mFragmentController, mUxRestrictions);
+ }
+
+ @Test
+ public void testUpdateState_noLogs() {
+ mockGetLastSecurityLogRetrievalTime(-1);
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceTitleNeverSet(mPreference);
+ verifyPreferenceSummarySet(mPreference, R.string.enterprise_privacy_none);
+ verifyPreferenceIconNeverSet(mPreference);
+ }
+
+ @Test
+ public void testUpdateState_withLogs() {
+ long now = System.currentTimeMillis();
+ mockGetLastSecurityLogRetrievalTime(now);
+
+ mController.updateState(mPreference);
+
+ verifyPreferenceTitleNeverSet(mPreference);
+ String formattedDate = DateUtils.formatDateTime(mRealContext, now,
+ DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE);
+ verifyPreferenceSummarySet(mPreference, formattedDate);
+ verifyPreferenceIconNeverSet(mPreference);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/enterprise/WorkPolicyInfoPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/enterprise/WorkPolicyInfoPreferenceControllerTest.java
index 8392c78..b8b6437 100644
--- a/tests/unit/src/com/android/car/settings/enterprise/WorkPolicyInfoPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/enterprise/WorkPolicyInfoPreferenceControllerTest.java
@@ -26,15 +26,19 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import android.content.Intent;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.provider.Settings;
import androidx.preference.Preference;
+import com.android.car.settings.R;
+
import org.junit.Test;
import org.mockito.Mock;
@@ -49,7 +53,7 @@
private Preference mPreference;
@Test
- public void testGetPreferenceType() {
+ public void testGetPreferenceType() throws Exception {
WorkPolicyInfoPreferenceController controller = newControllerWithFeatureEnabled();
assertWithMessage("preferenceType").that(controller.getPreferenceType())
@@ -57,14 +61,14 @@
}
@Test
- public void testGetAvailabilityStatus_noFeature() {
+ public void testGetAvailabilityStatus_noFeature() throws Exception {
WorkPolicyInfoPreferenceController controller = newControllerWithFeatureDisabled();
assertAvailability(controller.getAvailabilityStatus(), UNSUPPORTED_ON_DEVICE);
}
@Test
- public void testGetAvailabilityStatus_noAdmin() {
+ public void testGetAvailabilityStatus_noAdmin() throws Exception {
WorkPolicyInfoPreferenceController controller = newControllerWithFeatureEnabled();
// Don't need to mock anything else
@@ -72,7 +76,7 @@
}
@Test
- public void testGetAvailabilityStatus_adminWithoutReceiver() {
+ public void testGetAvailabilityStatus_adminWithoutReceiver() throws Exception {
WorkPolicyInfoPreferenceController controller = newControllerWithFeatureEnabled();
mockProfileOwner();
// Don't need to mock anything else
@@ -90,17 +94,18 @@
}
@Test
- public void testUpdateStatus_noFeature() {
+ public void testUpdateStatus_noFeature() throws Exception {
WorkPolicyInfoPreferenceController controller = newControllerWithFeatureDisabled();
// Don't need to mock anything else
controller.updateState(mPreference);
verifyPreferenceIntentNotSet();
+ verifyPreferenceTitleNotSet();
}
@Test
- public void testUpdateStatus_noAdmin() {
+ public void testUpdateStatus_noAdmin() throws Exception {
WorkPolicyInfoPreferenceController controller = newControllerWithFeatureEnabled();
// Don't need to mock anything else
@@ -110,7 +115,7 @@
}
@Test
- public void testUpdateStatus_adminWithoutReceiver() {
+ public void testUpdateStatus_adminWithoutReceiver() throws Exception {
WorkPolicyInfoPreferenceController controller = newControllerWithFeatureEnabled();
mockProfileOwner();
// Don't need to mock anything else
@@ -118,10 +123,11 @@
controller.updateState(mPreference);
verifyPreferenceIntentNotSet();
+ verifyPreferenceTitleNotSet();
}
@Test
- public void testUpdateStatus_adminWithReceiver() {
+ public void testUpdateStatus_adminWithReceiver() throws Exception {
WorkPolicyInfoPreferenceController controller = newControllerWithFeatureEnabled();
mockProfileOwner();
mockHasIntent();
@@ -129,6 +135,20 @@
controller.updateState(mPreference);
verifyPreferenceIntentSet();
+ verifyPreferenceTitleSet();
+ }
+
+ @Test
+ public void testUpdateStatus_adminWithReceiverButNoPackageInfo() throws Exception {
+ WorkPolicyInfoPreferenceController controller = newControllerWithFeatureEnabled();
+ mockProfileOwner();
+ mockHasIntent();
+ mockAppInfoMissing();
+
+ controller.updateState(mPreference);
+
+ verifyPreferenceIntentNotSet();
+ verifyPreferenceTitleNotSet();
}
// Must create new instances on demand as the feature check is done on constructor
@@ -154,6 +174,12 @@
.queryIntentActivities(showWorkPolicyInfoIntent(), eq(/* flags= */ 0));
}
+ private void mockAppInfoMissing() throws NameNotFoundException {
+ // Must use doThrow() instead of when() because it's a spy
+ doThrow(new NameNotFoundException("D'OH!")).when(mSpiedPm).getApplicationInfo(mPackageName,
+ /* flags= */ 0);
+ }
+
private Intent showWorkPolicyInfoIntent() {
return intentFor(Settings.ACTION_SHOW_WORK_POLICY_INFO, mDefaultAdmin.getPackageName());
}
@@ -165,4 +191,13 @@
private void verifyPreferenceIntentSet() {
verify(mPreference).setIntent(showWorkPolicyInfoIntent());
}
+
+ private void verifyPreferenceTitleNotSet() {
+ verify(mPreference, never()).setTitle(any());
+ }
+
+ private void verifyPreferenceTitleSet() {
+ verify(mPreference).setTitle(mRealContext.getString(R.string.work_policy_privacy_settings,
+ mPackageName)); // NOTE: this test package doesn't provide a label
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java
index 44cb11d..3f1133a 100644
--- a/tests/unit/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java
@@ -138,6 +138,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_permitAllInputMethods_preferenceCountIs4() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
@@ -154,6 +155,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_multiplteAllowedImeByOrganization_allPreferencesVisible() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(
mPermittedList);
@@ -173,6 +175,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_multipleEnabledInputMethods_allPreferencesEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(
mPermittedList);
@@ -192,6 +195,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_multipleEnabledInputMethods_allPreferencesChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(
mPermittedList);
@@ -212,7 +216,8 @@
}
@Test
- public void refreshUi_disallowedByOrganization_noPreferencesShown() {
+ @UiThreadTest
+ public void refreshUi_disallowedByOrganization_preferenceShownDisabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(
mPermittedList);
List<InputMethodInfo> infos = createInputMethodInfoList(DISALLOWED_PACKAGE_NAME,
@@ -225,10 +230,17 @@
mPreferenceController.refreshUi();
- assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(infos.size());
+
+ for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+ SwitchPreference pref = (SwitchPreference) mPreferenceGroup.getPreference(i);
+ assertThat(pref.isVisible()).isTrue();
+ assertThat(pref.isEnabled()).isTrue();
+ }
}
@Test
+ @UiThreadTest
public void refreshUi_skipVoiceTyping() {
List<InputMethodInfo> infos =
createInputMethodInfoList(InputMethodUtil.GOOGLE_VOICE_TYPING);
@@ -240,6 +252,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_verifyPreferenceIcon() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
@@ -258,6 +271,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_verifyPreferenceTitle() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
@@ -276,6 +290,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_verifyPreferenceSummary() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
@@ -294,6 +309,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_oneInputMethod_noneEnabled_oneInputMethodPreferenceInView() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -307,6 +323,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_oneInputMethod_noneEnabled_preferenceEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -320,6 +337,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_oneInputMethod_noneEnabled_preferenceNotChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -334,6 +352,7 @@
}
@Test
+ @UiThreadTest
public void refreshUi_oneInputMethod_defaultable_notChecked_preferenceEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -347,6 +366,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_securityDialogShown() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -364,6 +384,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showSecurityDialog_positive_noOtherPreferenceAdded() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -389,6 +410,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showSecurityDialog_positive_preferenceChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -413,6 +435,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showSecurityDialog_positive_preferenceEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -436,6 +459,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showSecurityDialog_positive_inputMethodEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -460,6 +484,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showSecurityDialog_negative_noOtherPreferenceAdded() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -485,6 +510,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showSecurityDialog_negative_preferenceEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -508,6 +534,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showSecurityDialog_negative_inputMethodDisabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -532,6 +559,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_directBootWarningShown() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -559,6 +587,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showDirectBootDialog_positive_noOtherPreferenceAdded() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -593,6 +622,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showDirectBootDialog_positive_preferenceChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -626,6 +656,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showDirectBootDialog_positive_preferenceEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -658,6 +689,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showDirectBootDialog_positive_inputMethodEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -691,6 +723,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showDirectBootDialog_negative_noOtherPreferenceAdded() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -726,6 +759,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showDirectBootDialog_negative_preferenceNotChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -760,6 +794,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showDirectBootDialog_negative_preferenceEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -792,6 +827,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_showDirectBootDialog_negative_inputMethodDisabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -825,6 +861,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_noOtherPreferenceAdded() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -842,6 +879,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_preferenceNotChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -858,6 +896,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_preferenceEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -874,6 +913,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_inputMethodDisabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -890,6 +930,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_twoDefaultable_notClickDefaultablePreferenceDisabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -909,6 +950,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_twoDefaultable_clickedDefaultablePreferenceEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -928,6 +970,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_twoDefaultable_nonDefaultablePreferenceEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -947,6 +990,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_twoDefaultable_clickedDefaultablePreferenceNotChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -966,6 +1010,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_twoDefaultable_notClickedDefaultablePreferenceChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -985,6 +1030,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleFalse_twoDefaultable_nonDefaultablePreferenceChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -1004,6 +1050,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_twoDefaultable_allPreferencesEnabled() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
@@ -1035,6 +1082,7 @@
}
@Test
+ @UiThreadTest
public void performClick_toggleTrue_twoDefaultable_allPreferencesChecked() {
when(mDevicePolicyManager.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
List<InputMethodInfo> infos = createInputMethodInfoList(
diff --git a/tests/unit/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java
new file mode 100644
index 0000000..d6ebe82
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.language;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.internal.app.LocalePicker;
+import com.android.internal.app.LocaleStore;
+import com.android.internal.app.SuggestedLocaleAdapter;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Locale;
+
+@RunWith(AndroidJUnit4.class)
+public class LanguageBasePreferenceControllerTest {
+
+ private static final LocaleStore.LocaleInfo TEST_LOCALE_INFO = LocaleStore.getLocaleInfo(
+ Locale.FRENCH);
+
+ private LanguageBasePreferenceController mController;
+ private Context mContext;
+ private PreferenceGroup mPreferenceGroup;
+ private MockitoSession mSession;
+ @Mock
+ private FragmentController mFragmentController;
+ @Mock
+ private SuggestedLocaleAdapter mSuggestedLocaleAdapter;
+ @Mock
+ private LocaleStore.LocaleInfo mLocaleInfo;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ LifecycleOwner lifecycleOwner = new TestLifecycleOwner();
+
+ mContext = ApplicationProvider.getApplicationContext();
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreferenceGroup);
+ initMocks();
+ CarUxRestrictions carUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ LocalePreferenceProvider localePreferenceProvider =
+ new LocalePreferenceProvider(mContext, mSuggestedLocaleAdapter);
+ mController = new LanguageBasePreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, carUxRestrictions) {
+ @Override
+ protected LocalePreferenceProvider defineLocaleProvider() {
+ return localePreferenceProvider;
+ }
+ };
+ PreferenceControllerTestUtil.assignPreference(mController, mPreferenceGroup);
+
+ mController.onCreate(lifecycleOwner);
+ }
+
+ @After
+ @UiThreadTest
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void testRefreshUi_groupConstructed() {
+ when(mSuggestedLocaleAdapter.getCount()).thenReturn(1);
+ when(mSuggestedLocaleAdapter.getItemViewType(0)).thenReturn(
+ LocalePreferenceProvider.TYPE_LOCALE);
+ when(mSuggestedLocaleAdapter.getItem(0)).thenReturn(TEST_LOCALE_INFO);
+ mController.refreshUi();
+ assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+ }
+
+ @Test
+ public void testOnPreferenceClick_noLocale_returnsFalse() {
+ assertThat(mController.onPreferenceClick(new Preference(mContext))).isFalse();
+ }
+
+ @Test
+ public void testOnPreferenceClick_hasMultipleChildLocales_returnsTrue() {
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ ExtendedMockito.when(LocaleStore.getLevelLocales(mContext,
+ mController.getExclusionSet(), mLocaleInfo, true))
+ .thenReturn(new HashSet<>(Arrays.asList(
+ mock(LocaleStore.LocaleInfo.class),
+ mock(LocaleStore.LocaleInfo.class))));
+ Preference preference = new Preference(mContext);
+
+ assertThat(mController.onPreferenceClick(preference)).isTrue();
+ }
+
+ @Test
+ public void testOnPreferenceClick_hasMultipleChildLocales_localeNotUpdated() {
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ ExtendedMockito.when(LocaleStore.getLevelLocales(mContext,
+ mController.getExclusionSet(), mLocaleInfo, true))
+ .thenReturn(new HashSet<>(Arrays.asList(
+ mock(LocaleStore.LocaleInfo.class),
+ mock(LocaleStore.LocaleInfo.class))));
+ Preference preference = new Preference(mContext);
+ mController.onPreferenceClick(preference);
+
+ ExtendedMockito.verify(() -> LocalePicker.updateLocale(any()), never());
+ }
+
+ @Test
+ public void testOnPreferenceClick_hasMultipleChildLocales_neverCallsGoBack() {
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ ExtendedMockito.when(LocaleStore.getLevelLocales(mContext,
+ mController.getExclusionSet(), mLocaleInfo, true))
+ .thenReturn(new HashSet<>(Arrays.asList(
+ mock(LocaleStore.LocaleInfo.class),
+ mock(LocaleStore.LocaleInfo.class))));
+ Preference preference = new Preference(mContext);
+ mController.onPreferenceClick(preference);
+
+ verify(mFragmentController, never()).goBack();
+ }
+
+ @Test
+ public void testOnPreferenceClick_hasSingleChildLocale_returnsTrue() {
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ ExtendedMockito.when(LocaleStore.getLevelLocales(mContext,
+ mController.getExclusionSet(), mLocaleInfo, true))
+ .thenReturn(new HashSet<>(Arrays.asList(
+ mock(LocaleStore.LocaleInfo.class))));
+ Preference preference = new Preference(mContext);
+ assertThat(mController.onPreferenceClick(preference)).isTrue();
+ }
+
+ @Test
+ public void testOnPreferenceClick_hasSingleChildLocale_localeUpdated() {
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ ExtendedMockito.when(LocaleStore.getLevelLocales(mContext,
+ mController.getExclusionSet(), mLocaleInfo, true))
+ .thenReturn(new HashSet<>(Arrays.asList(
+ mock(LocaleStore.LocaleInfo.class))));
+ Preference preference = new Preference(mContext);
+ mController.onPreferenceClick(preference);
+
+ ExtendedMockito.verify(() -> LocalePicker.updateLocale(any()), times(1));
+ }
+
+ @Test
+ public void testOnPreferenceClick_hasSingleChildLocale_callsGoBack() {
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ ExtendedMockito.when(LocaleStore.getLevelLocales(mContext,
+ mController.getExclusionSet(), mLocaleInfo, true))
+ .thenReturn(new HashSet<>(Arrays.asList(
+ mock(LocaleStore.LocaleInfo.class))));
+ Preference preference = new Preference(mContext);
+ mController.onPreferenceClick(preference);
+
+ verify(mFragmentController).goBack();
+ }
+
+ @Test
+ public void testOnPreferenceClick_noChildLocale_returnsFalse() {
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ Preference preference = new Preference(mContext);
+ assertThat(mController.onPreferenceClick(preference)).isFalse();
+ }
+
+ @Test
+ public void testOnPreferenceClick_noChildLocale_localeNotUpdated() {
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ Preference preference = new Preference(mContext);
+ mController.onPreferenceClick(preference);
+ ExtendedMockito.verify(() -> LocalePicker.updateLocale(any()), never());
+ }
+
+ @Test
+ public void testOnPreferenceClick_noChildLocale_neverCallsGoBack() {
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ Preference preference = new Preference(mContext);
+ mController.onPreferenceClick(preference);
+ verify(mFragmentController, never()).goBack();
+ }
+
+ @Test
+ public void testOnPreferenceClick_hasParentLocale_returnsTrue() {
+ when(mLocaleInfo.getParent()).thenReturn(Locale.ENGLISH);
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ Preference preference = new Preference(mContext);
+ assertThat(mController.onPreferenceClick(preference)).isTrue();
+ }
+
+ @Test
+ public void testOnPreferenceClick_hasParentLocale_localeUpdated() {
+ when(mLocaleInfo.getParent()).thenReturn(Locale.ENGLISH);
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ Preference preference = new Preference(mContext);
+ mController.onPreferenceClick(preference);
+ ExtendedMockito.verify(() -> LocalePicker.updateLocale(any()), times(1));
+ }
+
+ @Test
+ public void testOnPreferenceClick_hasParentLocale_callsGoBack() {
+ when(mLocaleInfo.getParent()).thenReturn(Locale.ENGLISH);
+ when(LocaleUtil.getLocaleArgument(any())).thenReturn(mLocaleInfo);
+ Preference preference = new Preference(mContext);
+ mController.onPreferenceClick(preference);
+ verify(mFragmentController).goBack();
+ }
+
+ private void initMocks() {
+ mSession = ExtendedMockito.mockitoSession()
+ .mockStatic(LocalePicker.class, withSettings().lenient())
+ .mockStatic(LocaleStore.class, withSettings().lenient())
+ .mockStatic(LocaleUtil.class, withSettings().lenient())
+ .startMocking();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/location/AdasGroupPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/location/AdasGroupPreferenceControllerTest.java
new file mode 100644
index 0000000..bfed4f5
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/location/AdasGroupPreferenceControllerTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.location;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.location.LocationManager;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class AdasGroupPreferenceControllerTest {
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LogicalPreferenceGroup mPreference;
+ private CarUxRestrictions mCarUxRestrictions;
+ private AdasGroupPreferenceController mController;
+ private LocationManager mLocationManager;
+
+ @Mock
+ private FragmentController mFragmentController;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ mPreference = new LogicalPreferenceGroup(mContext);
+ mController = new AdasGroupPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+
+ mLocationManager = mContext.getSystemService(LocationManager.class);
+ }
+
+ @Test
+ public void getAvailabilityStatus_driverAssistanceEnabled_unsupportedOnDevice() {
+ mLocationManager.setAdasGnssLocationEnabled(true);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_driverAssistanceDisabled_available() {
+ mLocationManager.setAdasGnssLocationEnabled(false);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/location/AdasLocationSwitchPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/location/AdasLocationSwitchPreferenceControllerTest.java
new file mode 100644
index 0000000..411a704
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/location/AdasLocationSwitchPreferenceControllerTest.java
@@ -0,0 +1,345 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.location;
+
+import static android.os.UserManager.DISALLOW_CONFIG_LOCATION;
+import static android.os.UserManager.DISALLOW_SHARE_LOCATION;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.AlertDialog;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.location.LocationManager;
+import android.os.UserManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiTwoActionSwitchPreference;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class AdasLocationSwitchPreferenceControllerTest {
+ private LifecycleOwner mLifecycleOwner;
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private CarUiTwoActionSwitchPreference mSwitchPreference;
+ private AdasLocationSwitchPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mFragmentController;
+
+ @Mock
+ private LocationManager mLocationManager;
+
+ @Mock
+ private UserManager mUserManager;
+
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
+
+ @Before
+ public void setUp() {
+ mLifecycleOwner = new TestLifecycleOwner();
+ MockitoAnnotations.initMocks(this);
+
+ when(mContext.getSystemService(LocationManager.class)).thenReturn(mLocationManager);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ mSwitchPreference = new CarUiTwoActionSwitchPreference(mContext);
+ mPreferenceController = new AdasLocationSwitchPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mSwitchPreference);
+ }
+
+ @Test
+ public void onAdasIntentReceived_updateUi() {
+ initializePreference(/* checked= */false, /* enabled= */true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ ArgumentCaptor<BroadcastReceiver> broadcastReceiverArgumentCaptor = ArgumentCaptor.forClass(
+ BroadcastReceiver.class);
+ ArgumentCaptor<IntentFilter> intentFilterCaptor = ArgumentCaptor.forClass(
+ IntentFilter.class);
+ verify(mContext, times(2))
+ .registerReceiver(broadcastReceiverArgumentCaptor.capture(),
+ intentFilterCaptor.capture());
+ List<IntentFilter> actions = intentFilterCaptor.getAllValues();
+ assertTrue(actions.get(0).hasAction(LocationManager.ACTION_ADAS_GNSS_ENABLED_CHANGED));
+ assertTrue(actions.get(1).hasAction(LocationManager.MODE_CHANGED_ACTION));
+
+ when(mLocationManager.isAdasGnssLocationEnabled()).thenReturn(true);
+ broadcastReceiverArgumentCaptor.getValue().onReceive(mContext,
+ new Intent(LocationManager.ACTION_ADAS_GNSS_ENABLED_CHANGED));
+
+ assertThat(mSwitchPreference.isSecondaryActionEnabled()).isTrue();
+ }
+
+ @Test
+ public void onLocationIntentReceived_updateUi() {
+ initializePreference(/* checked= */false, /* enabled= */true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ ArgumentCaptor<BroadcastReceiver> broadcastReceiverArgumentCaptor = ArgumentCaptor.forClass(
+ BroadcastReceiver.class);
+ ArgumentCaptor<IntentFilter> intentFilterCaptor = ArgumentCaptor.forClass(
+ IntentFilter.class);
+
+ verify(mContext, times(2))
+ .registerReceiver(broadcastReceiverArgumentCaptor.capture(),
+ intentFilterCaptor.capture());
+ List<IntentFilter> actions = intentFilterCaptor.getAllValues();
+ assertTrue(actions.get(0).hasAction(LocationManager.ACTION_ADAS_GNSS_ENABLED_CHANGED));
+ assertTrue(actions.get(1).hasAction(LocationManager.MODE_CHANGED_ACTION));
+
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
+ broadcastReceiverArgumentCaptor.getValue().onReceive(mContext,
+ new Intent(LocationManager.MODE_CHANGED_ACTION));
+
+ assertThat(mSwitchPreference.isSecondaryActionEnabled()).isFalse();
+ }
+
+ @Test
+ public void onPreferenceClicked_adasDisabled_shouldEnable_notShowDialog() {
+ initializePreference(/* checked= */false, /* enabled= */true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mSwitchPreference.performSecondaryActionClick();
+
+ assertThat(mSwitchPreference.isSecondaryActionEnabled()).isTrue();
+ assertThat(mSwitchPreference.isSecondaryActionChecked()).isTrue();
+ verify(mLocationManager).setAdasGnssLocationEnabled(true);
+ verify(mFragmentController, never())
+ .showDialog(any(ConfirmationDialogFragment.class), any());
+ }
+
+ @Test
+ public void onPreferenceClicked_adasEnabled_shouldStayEnable_showDialog() {
+ initializePreference(/* checked= */true, /* enabled= */true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mSwitchPreference.performSecondaryActionClick();
+
+ assertThat(mSwitchPreference.isSecondaryActionEnabled()).isTrue();
+ assertThat(mSwitchPreference.isSecondaryActionChecked()).isTrue();
+ verify(mLocationManager, never()).setLocationEnabledForUser(anyBoolean(), any());
+ verify(mFragmentController)
+ .showDialog(any(ConfirmationDialogFragment.class),
+ eq(ConfirmationDialogFragment.TAG));
+ }
+
+ @Test
+ public void confirmDialog_turnOffDriverAssistance() throws Throwable {
+ initializePreference(/* checked= */true, /* enabled= */true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mSwitchPreference.performSecondaryActionClick();
+
+ // Capture the dialog that is shown on toggle.
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mFragmentController).showDialog(dialogCaptor.capture(),
+ eq(ConfirmationDialogFragment.TAG));
+
+ // Show the captured dialog on press the confirmation button.
+ ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+ assertThat(dialogCaptor).isNotNull();
+ AlertDialog alertDialog = showDialog(dialog);
+
+ // Confirm action is the listener of negative button.
+ mActivityTestRule.runOnUiThread(() -> {
+ alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mLocationManager).setAdasGnssLocationEnabled(false);
+ }
+
+ @Test
+ public void onPolicyChanged_enabled_setsSwitchEnabled() {
+ initializePreference(/* checked= */ true, /* enabled= */ false);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
+
+ mPreferenceController.mPowerPolicyListener.getPolicyChangeHandler()
+ .handlePolicyChange(/* isOn= */ true);
+
+ assertThat(mSwitchPreference.isSecondaryActionEnabled()).isTrue();
+ }
+
+ @Test
+ public void onPolicyChanged_disabled_setsSwitchDisabled() {
+ initializePreference(/* checked= */ true, /* enabled= */ true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
+
+ mPreferenceController.mPowerPolicyListener.getPolicyChangeHandler()
+ .handlePolicyChange(/* isOn= */ false);
+
+ assertThat(mSwitchPreference.isSecondaryActionEnabled()).isFalse();
+ }
+
+ @Test
+ public void onPolicyChange_enabled_locationEnabled_switchStaysDisabled() {
+ initializePreference(/* checked= */ true, /* enabled= */ false);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
+
+ mPreferenceController.mPowerPolicyListener.getPolicyChangeHandler()
+ .handlePolicyChange(/* isOn= */ true);
+
+ assertThat(mSwitchPreference.isSecondaryActionEnabled()).isFalse();
+ }
+
+ @Test
+ public void adasLocationOnAndEnabled_disallowConfigLocation_switchStaysChecked() {
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, DISALLOW_CONFIG_LOCATION,
+ /* restricted= */true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
+
+ initializePreference(/* checked= */ true, /* enabled= */ false);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mSwitchPreference.isSecondaryActionEnabled()).isFalse();
+ assertThat(mSwitchPreference.isSecondaryActionChecked()).isTrue();
+ }
+ @Test
+ public void adasLocationOnAndEnabled_disallowShareLocation_setsSwitchUnchecked() {
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, DISALLOW_SHARE_LOCATION,
+ /* restricted= */true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
+
+ initializePreference(/* checked= */ true, /* enabled= */ false);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mSwitchPreference.isSecondaryActionEnabled()).isFalse();
+ assertThat(mSwitchPreference.isSecondaryActionChecked()).isFalse();
+ }
+
+ @Test
+ public void disallowConfigLocation_switchTapped_showsDialog() {
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, DISALLOW_CONFIG_LOCATION,
+ /* restricted= */true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
+ initializePreference(/* checked= */ true, /* enabled= */ false);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ mSwitchPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ @Test
+ public void disallowShareLocation_switchTapped_showsDialog() {
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, DISALLOW_SHARE_LOCATION,
+ /* restricted= */true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
+ initializePreference(/* checked= */ true, /* enabled= */ false);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ mSwitchPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+
+ @Test
+ public void cancelDialog_DriverAssistanceStaysOn() throws Throwable {
+ initializePreference(/* checked= */true, /* enabled= */true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mSwitchPreference.performSecondaryActionClick();
+
+ // Capture the dialog that is shown on toggle.
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mFragmentController).showDialog(dialogCaptor.capture(),
+ eq(ConfirmationDialogFragment.TAG));
+
+ // Show the captured dialog on press the confirmation button.
+ ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+ assertThat(dialogCaptor).isNotNull();
+ AlertDialog alertDialog = showDialog(dialog);
+
+ // Cancel action is the listener of positive button.
+ mActivityTestRule.runOnUiThread(() -> {
+ alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mLocationManager, never()).setAdasGnssLocationEnabled(false);
+ }
+
+ private void initializePreference(boolean checked, boolean enabled) {
+ when(mLocationManager.isAdasGnssLocationEnabled()).thenReturn(checked);
+ mSwitchPreference.setSecondaryActionChecked(checked);
+ mSwitchPreference.setSecondaryActionEnabled(enabled);
+ }
+
+ private AlertDialog showDialog(ConfirmationDialogFragment dialog) throws Throwable {
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.show(mActivityTestRule.getActivity().getSupportFragmentManager(),
+ /* tag= */ null);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ return (AlertDialog) dialog.getDialog();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/location/AdasLocationSwitchSubMenuPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/location/AdasLocationSwitchSubMenuPreferenceControllerTest.java
new file mode 100644
index 0000000..f59a9ac
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/location/AdasLocationSwitchSubMenuPreferenceControllerTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.location;
+
+import static org.mockito.Mockito.verify;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+import com.android.car.ui.preference.CarUiTwoActionTextPreference;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class AdasLocationSwitchSubMenuPreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private CarUiTwoActionTextPreference mPreference;
+ private AdasLocationSwitchSubMenuPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mFragmentController;
+
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ mPreference = new CarUiTwoActionTextPreference(mContext);
+ mPreferenceController = new AdasLocationSwitchSubMenuPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ }
+
+ @Test
+ public void performSecondaryActionClick_goBack() {
+ mPreferenceController.onCreateInternal();
+ mPreference.performSecondaryActionClick();
+
+ verify(mFragmentController).goBack();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/location/LocationStateSwitchPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/location/LocationStateSwitchPreferenceControllerTest.java
index 41cdfb1..0e8bafb 100644
--- a/tests/unit/src/com/android/car/settings/location/LocationStateSwitchPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/location/LocationStateSwitchPreferenceControllerTest.java
@@ -16,30 +16,49 @@
package com.android.car.settings.location;
+import static android.os.UserManager.DISALLOW_CONFIG_LOCATION;
+import static android.os.UserManager.DISALLOW_SHARE_LOCATION;
+
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import android.app.AlertDialog;
import android.car.drivingstate.CarUxRestrictions;
import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.location.LocationManager;
import android.os.UserHandle;
+import android.os.UserManager;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.SwitchPreference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
-import com.android.car.settings.common.ClickableWhileDisabledSwitchPreference;
+import com.android.car.settings.common.ColoredSwitchPreference;
+import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -52,25 +71,33 @@
private Context mContext = spy(ApplicationProvider.getApplicationContext());
private SwitchPreference mSwitchPreference;
private LocationStateSwitchPreferenceController mPreferenceController;
- private LocationManager mLocationManager;
private CarUxRestrictions mCarUxRestrictions;
private UserHandle mUserHandle;
@Mock
private FragmentController mFragmentController;
+ @Mock
+ private LocationManager mLocationManager;
+ @Mock
+ private UserManager mUserManager;
+
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
@Before
public void setUp() {
mLifecycleOwner = new TestLifecycleOwner();
MockitoAnnotations.initMocks(this);
- mLocationManager = mContext.getSystemService(LocationManager.class);
+ when(mContext.getSystemService(LocationManager.class)).thenReturn(mLocationManager);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
mUserHandle = UserHandle.of(UserHandle.myUserId());
- mSwitchPreference = new ClickableWhileDisabledSwitchPreference(mContext);
+ mSwitchPreference = new ColoredSwitchPreference(mContext);
mPreferenceController = new LocationStateSwitchPreferenceController(mContext,
/* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mSwitchPreference);
@@ -85,35 +112,91 @@
BroadcastReceiver.class);
verify(mContext).registerReceiver(broadcastReceiverArgumentCaptor.capture(), any());
- mLocationManager.setLocationEnabledForUser(/* enabled= */ true, mUserHandle);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
broadcastReceiverArgumentCaptor.getValue().onReceive(mContext,
new Intent(LocationManager.MODE_CHANGED_ACTION));
assertThat(mSwitchPreference.isChecked()).isTrue();
}
@Test
- public void onPreferenceClicked_locationDisabled_shouldEnable() {
+ public void onPreferenceClicked_locationDisabled_shouldEnable_notShowDialog() {
initializePreference(/* checked= */ false, /* enabled= */ true);
mSwitchPreference.performClick();
assertThat(mSwitchPreference.isChecked()).isTrue();
- assertThat(mLocationManager.isLocationEnabledForUser(mUserHandle)).isTrue();
+ verify(mLocationManager).setLocationEnabledForUser(/* enabled= */ true, mUserHandle);
+ verify(mFragmentController, never()).showDialog(any(ConfirmationDialogFragment.class),
+ any());
}
@Test
- public void onPreferenceClicked_locationEnabled_shouldDisable() {
+ public void onPreferenceClicked_locationEnabled_shouldStayEnable_showDialog() {
initializePreference(/* checked= */ true, /* enabled= */ true);
mSwitchPreference.performClick();
- assertThat(mSwitchPreference.isChecked()).isFalse();
- assertThat(mLocationManager.isLocationEnabledForUser(mUserHandle)).isFalse();
+ assertThat(mSwitchPreference.isChecked()).isTrue();
+ verify(mLocationManager, never()).setLocationEnabledForUser(/* enabled= */ anyBoolean(),
+ any());
+ verify(mFragmentController).showDialog(any(ConfirmationDialogFragment.class),
+ eq(ConfirmationDialogFragment.TAG));
+ }
+
+ @Test
+ public void confirmDialog_turnOffLocation() throws Throwable {
+ initializePreference(/* checked= */ true, /* enabled= */ true);
+
+ mSwitchPreference.performClick();
+
+ // Capture the dialog that is shown on toggle.
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mFragmentController).showDialog(dialogCaptor.capture(),
+ eq(ConfirmationDialogFragment.TAG));
+
+ // Show the captured dialog on press the confirmation button.
+ ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+ assertThat(dialogCaptor).isNotNull();
+ AlertDialog alertDialog = showDialog(dialog);
+ mActivityTestRule.runOnUiThread(() -> {
+ alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mLocationManager).setLocationEnabledForUser(/* enabled= */ false,
+ mUserHandle);
+ }
+
+ @Test
+ public void cancelDialog_LocationStaysOn() throws Throwable {
+ initializePreference(/* checked= */ true, /* enabled= */ true);
+
+ mSwitchPreference.performClick();
+
+ // Capture the dialog that is shown on toggle.
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mFragmentController).showDialog(dialogCaptor.capture(),
+ eq(ConfirmationDialogFragment.TAG));
+
+ // Show the captured dialog on press the confirmation button.
+ ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+ assertThat(dialogCaptor).isNotNull();
+ AlertDialog alertDialog = showDialog(dialog);
+ mActivityTestRule.runOnUiThread(() -> {
+ alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mLocationManager, never()).setLocationEnabledForUser(/* enabled= */ false,
+ mUserHandle);
}
@Test
public void onPolicyChanged_enabled_setsSwitchEnabled() {
initializePreference(/* checked= */ false, /* enabled= */ false);
+ mPreferenceController.onCreate(mLifecycleOwner);
mPreferenceController.mPowerPolicyListener.getPolicyChangeHandler()
.handlePolicyChange(/* isOn= */ true);
@@ -124,6 +207,7 @@
@Test
public void onPolicyChanged_disabled_setsSwitchDisabled() {
initializePreference(/* checked= */ false, /* enabled= */ true);
+ mPreferenceController.onCreate(mLifecycleOwner);
mPreferenceController.mPowerPolicyListener.getPolicyChangeHandler()
.handlePolicyChange(/* isOn= */ false);
@@ -131,9 +215,93 @@
assertThat(mSwitchPreference.isEnabled()).isFalse();
}
+ @Test
+ public void locationOn_disallowConfigLocation_interactionDisabled() {
+ verifyLocationStateWithRestriction(/* locationOnByDefault= */true,
+ DISALLOW_CONFIG_LOCATION, /* expectedLocationToBeOn= */ true);
+ }
+
+ @Test
+ public void locationOff_disallowConfigLocation_interactionDisabled() {
+ verifyLocationStateWithRestriction(/* locationOnByDefault= */false,
+ DISALLOW_CONFIG_LOCATION, /* expectedLocationToBeOn= */ false);
+ }
+
+ @Test
+ public void locationOn_disallowShareLocation_interactionDisabled_locationTurnedOff() {
+ verifyLocationStateWithRestriction(/* locationOnByDefault= */true,
+ DISALLOW_SHARE_LOCATION, /* expectedLocationToBeOn= */ false);
+ }
+
+ @Test
+ public void locationOff_disallowShareLocation_interactionDisabled_locationRemainsOff() {
+ verifyLocationStateWithRestriction(/* locationOnByDefault= */false,
+ DISALLOW_SHARE_LOCATION, /* expectedLocationToBeOn= */ false);
+ }
+
+ public void verifyLocationStateWithRestriction(boolean locationOnByDefault, String restriction,
+ boolean expectedLocationToBeOn) {
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, restriction,
+ /* restricted= */true);
+ initializePreference(/* checked= */ locationOnByDefault, /* enabled= */ true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mPowerPolicyListener.getPolicyChangeHandler()
+ .handlePolicyChange(/* isOn= */ true);
+
+ assertThat(mSwitchPreference.isEnabled()).isFalse();
+ if (expectedLocationToBeOn) {
+ assertThat(mSwitchPreference.isChecked()).isTrue();
+ } else {
+ assertThat(mSwitchPreference.isChecked()).isFalse();
+ }
+ }
+
+ @Test
+ public void disallowConfigLocation_onInteraction_showsDialog() {
+ initializePreference(/* checked= */ true, /* enabled= */ true);
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, DISALLOW_CONFIG_LOCATION,
+ /* restricted= */true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mPowerPolicyListener.getPolicyChangeHandler()
+ .handlePolicyChange(/* isOn= */ true);
+
+ mSwitchPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ @Test
+ public void disallowShareLocation_onInteraction_showsDialog() {
+ initializePreference(/* checked= */ true, /* enabled= */ true);
+ EnterpriseTestUtils.mockUserRestrictionSetByDpm(mUserManager, DISALLOW_SHARE_LOCATION,
+ /* restricted= */true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mPowerPolicyListener.getPolicyChangeHandler()
+ .handlePolicyChange(/* isOn= */ true);
+
+ mSwitchPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+
private void initializePreference(boolean checked, boolean enabled) {
- mLocationManager.setLocationEnabledForUser(checked, mUserHandle);
+ when(mLocationManager.isLocationEnabled()).thenReturn(checked);
mSwitchPreference.setChecked(checked);
mSwitchPreference.setEnabled(enabled);
}
+
+ private AlertDialog showDialog(ConfirmationDialogFragment dialog) throws Throwable {
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.show(mActivityTestRule.getActivity().getSupportFragmentManager(),
+ /* tag= */ null);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ return (AlertDialog) dialog.getDialog();
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java
index b18c817..3e41c87 100644
--- a/tests/unit/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java
@@ -19,20 +19,18 @@
import static com.android.car.settings.location.RecentLocationRequestsEntryPreferenceController.INTENT_FILTER_LOCATION_MODE_CHANGED;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.car.drivingstate.CarUxRestrictions;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.location.LocationManager;
-import android.os.UserHandle;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
@@ -50,9 +48,6 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
@RunWith(AndroidJUnit4.class)
public class RecentLocationRequestsEntryPreferenceControllerTest {
private static final long TIMEOUT_MS = 5000;
@@ -62,10 +57,11 @@
private Preference mPreference;
private RecentLocationRequestsEntryPreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
- private LocationManager mLocationManager;
@Mock
private FragmentController mFragmentController;
+ @Mock
+ private LocationManager mLocationManager;
@Before
public void setUp() {
@@ -74,7 +70,7 @@
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mLocationManager = mContext.getSystemService(LocationManager.class);
+ when(mContext.getSystemService(LocationManager.class)).thenReturn(mLocationManager);
mPreference = new Preference(mContext);
mPreferenceController = new RecentLocationRequestsEntryPreferenceController(mContext,
@@ -105,7 +101,7 @@
@Test
public void refreshUi_locationOn_preferenceIsEnabled() {
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
mPreferenceController.refreshUi();
assertThat(mPreference.isEnabled()).isTrue();
@@ -113,7 +109,7 @@
@Test
public void refreshUi_locationOff_preferenceIsDisabled() {
- setLocationEnabled(false);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
mPreferenceController.refreshUi();
assertThat(mPreference.isEnabled()).isFalse();
@@ -122,9 +118,10 @@
@Test
public void locationModeChangedBroadcastSent_locationOff_preferenceIsDisabled() {
mPreferenceController.onStart(mLifecycleOwner);
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
mPreferenceController.refreshUi();
- setLocationEnabled(false);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
+ mPreferenceController.mReceiver.onReceive(mContext, new Intent());
assertThat(mPreference.isEnabled()).isFalse();
}
@@ -132,31 +129,11 @@
@Test
public void locationModeChangedBroadcastSent_locationOn_preferenceIsEnabled() {
mPreferenceController.onStart(mLifecycleOwner);
- setLocationEnabled(false);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
mPreferenceController.refreshUi();
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
+ mPreferenceController.mReceiver.onReceive(mContext, new Intent());
assertThat(mPreference.isEnabled()).isTrue();
}
-
- private void setLocationEnabled(boolean enabled) {
- CountDownLatch latch = new CountDownLatch(1);
- BroadcastReceiver receiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- latch.countDown();
- }
- };
- mContext.registerReceiver(receiver, new IntentFilter(LocationManager.MODE_CHANGED_ACTION));
- try {
- mLocationManager.setLocationEnabledForUser(enabled,
- UserHandle.of(UserHandle.myUserId()));
- assertWithMessage("%s intent reveiced in %sms", LocationManager.MODE_CHANGED_ACTION,
- TIMEOUT_MS).that(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue();
- } catch (InterruptedException e) {
- assertThat(mLocationManager.isLocationEnabled()).isEqualTo(enabled);
- } finally {
- mContext.unregisterReceiver(receiver);
- }
- }
}
diff --git a/tests/unit/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..b547b5d
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java
@@ -0,0 +1,401 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.app.AlertDialog;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.net.Uri;
+import android.provider.Settings;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+@RunWith(AndroidJUnit4.class)
+public class MobileDataTogglePreferenceControllerTest {
+
+ private static final int SUB_ID = 1;
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private TwoStatePreference mPreference;
+ private MobileDataTogglePreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private MockitoSession mSession;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private TelephonyManager mMockTelephonyManager;
+ @Mock
+ private ContentResolver mMockContentResolver;
+ @Mock
+ private SubscriptionManager mMockSubscriptionManager;
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mSession = ExtendedMockito.mockitoSession()
+ .mockStatic(SubscriptionManager.class, withSettings().lenient())
+ .mockStatic(TelephonyManager.class, withSettings().lenient())
+ .startMocking();
+
+ ExtendedMockito.when(TelephonyManager.from(mContext)).thenReturn(mMockTelephonyManager);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mMockTelephonyManager);
+ when(mMockTelephonyManager.createForSubscriptionId(SUB_ID))
+ .thenReturn(mMockTelephonyManager);
+ when(mMockTelephonyManager.getSimCount()).thenReturn(1);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(false);
+ when(mContext.getContentResolver()).thenReturn(mMockContentResolver);
+ ExtendedMockito.when(SubscriptionManager.getDefaultDataSubscriptionId())
+ .thenReturn(SUB_ID);
+ when(mMockSubscriptionManager.isActiveSubscriptionId(SUB_ID)).thenReturn(true);
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreference = new SwitchPreference(mContext);
+ mPreferenceController = new MobileDataTogglePreferenceController(mContext,
+ "key", mMockFragmentController, mCarUxRestrictions,
+ mMockSubscriptionManager);
+ mPreferenceController.setFields(SUB_ID);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void onStart_singleSim_registersObserver() {
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA);
+ verify(mMockContentResolver).registerContentObserver(eq(uri), eq(false), any());
+ }
+
+ @Test
+ public void onStart_multiSim_registersObserver() {
+ when(mMockTelephonyManager.getSimCount()).thenReturn(2);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + SUB_ID);
+ verify(mMockContentResolver).registerContentObserver(eq(uri), eq(false), any());
+ }
+
+ @Test
+ public void onStop_singleSim_unregistersObserver() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.onStop(mLifecycleOwner);
+
+ verify(mMockContentResolver).unregisterContentObserver(any());
+ }
+
+ @Test
+ public void refreshUi_isOpportunistic_isDisabled() {
+ when(mMockSubscriptionManager.getActiveSubscriptionInfo(SUB_ID))
+ .thenReturn(createSubscriptionInfo(SUB_ID, /* isOpportunistic= */ true));
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void refreshUi_isNotOpportunistic_isEnabled() {
+ when(mMockSubscriptionManager.getActiveSubscriptionInfo(SUB_ID))
+ .thenReturn(createSubscriptionInfo(SUB_ID, /* isOpportunistic= */ false));
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void refreshUi_dataEnabled_setChecked() {
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(true);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void refreshUi_dataDisabled_setUnchecked() {
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void handlePreferenceChanged_setFalse_isSingleSim_opensDialog() {
+ mPreference.callChangeListener(false);
+
+ verify(mMockFragmentController).showDialog(any(ConfirmationDialogFragment.class),
+ eq(MobileDataTogglePreferenceController.DISABLE_DIALOG_TAG));
+ }
+
+ @Test
+ public void handlePreferenceChanged_setFalse_isMultiSim_disablesData() {
+ mPreference.setChecked(true);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(true);
+ when(mMockTelephonyManager.getSimCount()).thenReturn(2);
+ mPreference.callChangeListener(false);
+
+ verify(mMockTelephonyManager).setDataEnabled(false);
+ }
+
+ @Test
+ public void handlePreferenceChanged_setFalse_isMultiSim_setsUnchecked() {
+ mPreference.setChecked(true);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(true);
+ when(mMockTelephonyManager.getSimCount()).thenReturn(2);
+ mPreference.callChangeListener(false);
+
+ verify(mMockTelephonyManager).setDataEnabled(false);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(false);
+ mPreferenceController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void handlePreferenceChanged_setTrue_isSingleSim_enablesData() {
+ mPreference.setChecked(false);
+ mPreference.callChangeListener(true);
+
+ verify(mMockTelephonyManager).setDataEnabled(true);
+ }
+
+ @Test
+ public void handlePreferenceChanged_setTrue_isSingleSim_setsChecked() {
+ mPreference.setChecked(false);
+ mPreference.callChangeListener(true);
+
+ verify(mMockTelephonyManager).setDataEnabled(true);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(true);
+ mPreferenceController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void handlePreferenceChanged_setTrue_isMultiSim_noOtherSimActive_enablesData() {
+ mPreference.setChecked(false);
+ when(mMockTelephonyManager.getSimCount()).thenReturn(2);
+ mPreference.callChangeListener(true);
+
+ verify(mMockTelephonyManager).setDataEnabled(true);
+ }
+
+ @Test
+ public void handlePreferenceChanged_setTrue_isMultiSim_noOtherSimActive_setsChecked() {
+ mPreference.setChecked(false);
+ when(mMockTelephonyManager.getSimCount()).thenReturn(2);
+ mPreference.callChangeListener(true);
+
+ verify(mMockTelephonyManager).setDataEnabled(true);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(true);
+ mPreferenceController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void handlePreferenceChanged_setTrue_isMultiSim_otherSimActive_opensDialog() {
+ int otherSubId = SUB_ID + 1;
+ mPreference.setChecked(false);
+ when(mMockTelephonyManager.getSimCount()).thenReturn(2);
+ ExtendedMockito.when(SubscriptionManager.getDefaultDataSubscriptionId())
+ .thenReturn(otherSubId);
+ when(mMockSubscriptionManager.isActiveSubscriptionId(otherSubId)).thenReturn(true);
+ mPreference.callChangeListener(true);
+
+ verify(mMockFragmentController).showDialog(any(ConfirmationDialogFragment.class),
+ eq(MobileDataTogglePreferenceController.ENABLE_MULTISIM_DIALOG_TAG));
+ }
+
+ @Test
+ public void disableSingleSimDialog_onConfirm_disablesData() throws Throwable {
+ mPreference.setChecked(true);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(true);
+ mPreference.callChangeListener(false);
+
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mMockFragmentController).showDialog(dialogCaptor.capture(),
+ eq(MobileDataTogglePreferenceController.DISABLE_DIALOG_TAG));
+
+ ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+ assertThat(dialogCaptor).isNotNull();
+ AlertDialog alertDialog = showDialog(dialog);
+ mActivityTestRule.runOnUiThread(() -> {
+ alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mMockTelephonyManager).setDataEnabled(false);
+ }
+
+ @Test
+ public void disableSingleSimDialog_onConfirm_setsUnchecked() throws Throwable {
+ mPreference.setChecked(true);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(true);
+ mPreference.callChangeListener(false);
+
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mMockFragmentController).showDialog(dialogCaptor.capture(),
+ eq(MobileDataTogglePreferenceController.DISABLE_DIALOG_TAG));
+
+ ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+ assertThat(dialogCaptor).isNotNull();
+ AlertDialog alertDialog = showDialog(dialog);
+ mActivityTestRule.runOnUiThread(() -> {
+ alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mMockTelephonyManager).setDataEnabled(false);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(false);
+ mPreferenceController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void enableMutliSimDialog_onConfirm_enablesData() throws Throwable {
+ int otherSubId = SUB_ID + 1;
+ mPreference.setChecked(false);
+ when(mMockTelephonyManager.getSimCount()).thenReturn(2);
+ when(mMockTelephonyManager.createForSubscriptionId(otherSubId))
+ .thenReturn(mMockTelephonyManager);
+ ExtendedMockito.when(SubscriptionManager.getDefaultDataSubscriptionId())
+ .thenReturn(otherSubId);
+ when(mMockSubscriptionManager.isActiveSubscriptionId(otherSubId)).thenReturn(true);
+ mPreference.callChangeListener(true);
+
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mMockFragmentController).showDialog(dialogCaptor.capture(),
+ eq(MobileDataTogglePreferenceController.ENABLE_MULTISIM_DIALOG_TAG));
+
+ ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+ assertThat(dialogCaptor).isNotNull();
+ AlertDialog alertDialog = showDialog(dialog);
+ mActivityTestRule.runOnUiThread(() -> {
+ alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mMockTelephonyManager).setDataEnabled(true);
+ }
+
+ @Test
+ public void enableMutliSimDialog_onConfirm_setsChecked() throws Throwable {
+ int otherSubId = SUB_ID + 1;
+ mPreference.setChecked(false);
+ when(mMockTelephonyManager.getSimCount()).thenReturn(2);
+ when(mMockTelephonyManager.createForSubscriptionId(otherSubId))
+ .thenReturn(mMockTelephonyManager);
+ ExtendedMockito.when(SubscriptionManager.getDefaultDataSubscriptionId())
+ .thenReturn(otherSubId);
+ when(mMockSubscriptionManager.isActiveSubscriptionId(otherSubId)).thenReturn(true);
+ mPreference.callChangeListener(true);
+
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mMockFragmentController).showDialog(dialogCaptor.capture(),
+ eq(MobileDataTogglePreferenceController.ENABLE_MULTISIM_DIALOG_TAG));
+
+ ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+ assertThat(dialogCaptor).isNotNull();
+ AlertDialog alertDialog = showDialog(dialog);
+ mActivityTestRule.runOnUiThread(() -> {
+ alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mMockTelephonyManager).setDataEnabled(true);
+ when(mMockTelephonyManager.isDataEnabled()).thenReturn(true);
+ mPreferenceController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ private SubscriptionInfo createSubscriptionInfo(int subId, boolean isOpportunistic) {
+ SubscriptionInfo subInfo = new SubscriptionInfo(subId, /* iccId= */ "",
+ /* simSlotIndex= */ 0, /* displayName= */ "", /* carrierName= */ "",
+ /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+ /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
+ /* countryIso= */ "", /* isEmbedded= */ false,
+ /* accessRules= */ null, /* cardString= */ "", isOpportunistic,
+ /* groupUUID= */ null, /* carrierId= */ 0, /* profileClass= */ 0);
+ return subInfo;
+ }
+
+ private AlertDialog showDialog(ConfirmationDialogFragment dialog) throws Throwable {
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.show(mActivityTestRule.getActivity().getSupportFragmentManager(),
+ /* tag= */ null);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ return (AlertDialog) dialog.getDialog();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java
index fecc6fa..1d99614 100644
--- a/tests/unit/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java
@@ -23,42 +23,49 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
import android.car.drivingstate.CarUxRestrictions;
+import android.content.ContentResolver;
import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
+import android.net.Uri;
import android.os.UserManager;
+import android.provider.Settings;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.testutils.TestLifecycleOwner;
-import com.android.car.ui.preference.CarUiPreference;
+import com.android.car.ui.preference.CarUiTwoActionSwitchPreference;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.utils.StringUtil;
import com.google.android.collect.Lists;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
import java.util.List;
@@ -66,12 +73,14 @@
public class MobileNetworkEntryPreferenceControllerTest {
private static final String TEST_NETWORK_NAME = "test network name";
+ private static final int SUB_ID = 1;
private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
- private Preference mPreference;
+ private CarUiTwoActionSwitchPreference mPreference;
private MobileNetworkEntryPreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
+ private MockitoSession mSession;
@Mock
private FragmentController mFragmentController;
@@ -80,13 +89,9 @@
@Mock
private SubscriptionManager mSubscriptionManager;
@Mock
- private ConnectivityManager mConnectivityManager;
- @Mock
private TelephonyManager mTelephonyManager;
@Mock
- private Network mNetwork;
- @Mock
- private NetworkCapabilities mNetworkCapabilities;
+ private ContentResolver mMockContentResolver;
@Before
@UiThreadTest
@@ -94,35 +99,47 @@
MockitoAnnotations.initMocks(this);
mLifecycleOwner = new TestLifecycleOwner();
+ mSession = ExtendedMockito.mockitoSession()
+ .mockStatic(SubscriptionManager.class, withSettings().lenient())
+ .startMocking();
+
// Setup to always make preference available.
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
- when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
- when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ // Because of the static mock of SubscriptionManager, Mockito thinks .from() is supposed to
+ // return SubscriptionManager instead of TelephonyManager
+ doReturn(mTelephonyManager).when(mContext).getSystemService(TelephonyManager.class);
+ when(mContext.getContentResolver()).thenReturn(mMockContentResolver);
+ ExtendedMockito.when(SubscriptionManager.getDefaultDataSubscriptionId())
+ .thenReturn(SUB_ID);
+
+ when(mTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_PRESENT);
+ when(mTelephonyManager.getSimCount()).thenReturn(1);
when(mUserManager.isAdminUser()).thenReturn(true);
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS))
.thenReturn(false);
- when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
- true);
- when(mConnectivityManager.getNetworkCapabilities(mNetwork))
- .thenReturn(mNetworkCapabilities);
- when(mConnectivityManager.getAllNetworks()).thenReturn(new Network[]{mNetwork});
-
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mPreference = new CarUiPreference(mContext);
+ mPreference = new CarUiTwoActionSwitchPreference(mContext);
mPreferenceController = new MobileNetworkEntryPreferenceController(mContext,
"key", mFragmentController, mCarUxRestrictions);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
}
+ @After
+ @UiThreadTest
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
@Test
- public void getAvailabilityStatus_noMobileNetwork_unsupported() {
- when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
- false);
+ public void getAvailabilityStatus_noSim_unsupported() {
+ when(mTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_ABSENT);
assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
}
@@ -148,7 +165,32 @@
}
@Test
- public void onCreate_noSims_disabled() {
+ public void onStart_singleSim_registersObserver() {
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA);
+ verify(mMockContentResolver).registerContentObserver(eq(uri), eq(false), any());
+ }
+
+ @Test
+ public void onStart_multiSim_registersObserver() {
+ when(mTelephonyManager.getSimCount()).thenReturn(2);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + SUB_ID);
+ verify(mMockContentResolver).registerContentObserver(eq(uri), eq(false), any());
+ }
+
+ @Test
+ public void onStop_singleSim_unregistersObserver() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.onStop(mLifecycleOwner);
+
+ verify(mMockContentResolver).unregisterContentObserver(any());
+ }
+
+ @Test
+ public void onCreate_noSubscriptions_disabled() {
mPreferenceController.onCreate(mLifecycleOwner);
assertThat(mPreference.isEnabled()).isFalse();
@@ -203,8 +245,8 @@
mPreferenceController.onCreate(mLifecycleOwner);
- assertThat(mPreference.getSummary()).isEqualTo(mContext.getResources().getQuantityString(
- R.plurals.mobile_network_summary_count, 2, 2));
+ assertThat(mPreference.getSummary()).isEqualTo(StringUtil.getIcuPluralsString(mContext, 2,
+ R.string.mobile_network_summary_count));
}
@Test
@@ -254,6 +296,40 @@
any(MobileNetworkListFragment.class));
}
+ @Test
+ public void performToggle_disabled_setsDataEnabled() {
+ SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1,
+ /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
+ List<SubscriptionInfo> selectable = Lists.newArrayList(info);
+ when(mSubscriptionManager.getSelectableSubscriptionInfoList()).thenReturn(selectable);
+
+ when(mTelephonyManager.isDataEnabled()).thenReturn(false);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mPreference.isSecondaryActionChecked()).isFalse();
+
+ mPreference.performSecondaryActionClick();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mTelephonyManager).setDataEnabled(true);
+ }
+
+ @Test
+ public void performToggle_enabled_setsDataDisabled() {
+ SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1,
+ /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
+ List<SubscriptionInfo> selectable = Lists.newArrayList(info);
+ when(mSubscriptionManager.getSelectableSubscriptionInfoList()).thenReturn(selectable);
+
+ when(mTelephonyManager.isDataEnabled()).thenReturn(true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mPreference.isSecondaryActionChecked()).isTrue();
+
+ mPreference.performSecondaryActionClick();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mTelephonyManager).setDataEnabled(false);
+ }
+
private SubscriptionInfo createSubscriptionInfo(int subId, int simSlotIndex,
String displayName) {
SubscriptionInfo subInfo = new SubscriptionInfo(subId, /* iccId= */ "",
@@ -264,5 +340,4 @@
/* accessRules= */ null, /* cardString= */ "");
return subInfo;
}
-
}
diff --git a/tests/unit/src/com/android/car/settings/network/MobileNetworkFragmentTest.java b/tests/unit/src/com/android/car/settings/network/MobileNetworkFragmentTest.java
index 219d751..00299b1 100644
--- a/tests/unit/src/com/android/car/settings/network/MobileNetworkFragmentTest.java
+++ b/tests/unit/src/com/android/car/settings/network/MobileNetworkFragmentTest.java
@@ -40,6 +40,7 @@
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -55,6 +56,8 @@
private BaseCarSettingsTestActivity mActivity;
private FragmentManager mFragmentManager;
+ @Mock
+ private static MobileNetworkUpdateManager.PhoneChangeReceiver sMockPhoneChangeReceiver;
@Rule
public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
@@ -142,5 +145,11 @@
SubscriptionManager getSubscriptionManager(Context context) {
return sMockSubscriptionManager;
}
+
+ @Override
+ MobileNetworkUpdateManager getMobileNetworkUpdateManager(Context context, int subId) {
+ return new MobileNetworkUpdateManager(subId, sMockSubscriptionManager,
+ sMockPhoneChangeReceiver);
+ }
}
}
diff --git a/tests/unit/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java b/tests/unit/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java
new file mode 100644
index 0000000..8d40a32
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class MobileNetworkUpdateManagerTest {
+
+ private static final int SUB_ID = 1;
+
+ private BaseCarSettingsTestActivity mActivity;
+ private MobileNetworkUpdateManager mMobileNetworkUpdateManager;
+
+ @Mock
+ private MobileNetworkUpdateManager.MobileNetworkUpdateListener mMockMobileNetworkUpdateListener;
+ @Mock
+ private SubscriptionManager mMockSubscriptionManager;
+ @Mock
+ private MobileNetworkUpdateManager.PhoneChangeReceiver mMockPhoneChangeReceiver;
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mActivity = mActivityTestRule.getActivity();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onStart_receiverRegistered() {
+ setupMobileNetworkUpdateManager(SUB_ID);
+
+ verify(mMockPhoneChangeReceiver).register();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onStop_receiverUnregistered() {
+ setupMobileNetworkUpdateManager(SUB_ID);
+ mMobileNetworkUpdateManager.onStop(mActivity);
+
+ verify(mMockPhoneChangeReceiver).unregister();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onStart_subscriptionListenerRegistered() {
+ setupMobileNetworkUpdateManager(SUB_ID);
+
+ verify(mMockSubscriptionManager).addOnSubscriptionsChangedListener(any());
+ }
+
+ @Test
+ @UiThreadTest
+ public void onStop_subscriptionListenerUnregistered() {
+ setupMobileNetworkUpdateManager(SUB_ID);
+ mMobileNetworkUpdateManager.onStop(mActivity);
+
+ verify(mMockSubscriptionManager).removeOnSubscriptionsChangedListener(any());
+ }
+
+ @Test
+ @UiThreadTest
+ public void onMobileNetworkUpdated_withInitialSubId_pickSubId() {
+ setupMobileNetworkUpdateManager(SUB_ID);
+ List<SubscriptionInfo> newSubscriptionInfoList = List.of(createSubscriptionInfo(SUB_ID + 1),
+ createSubscriptionInfo(SUB_ID + 2));
+ when(mMockSubscriptionManager.getActiveSubscriptionInfoList(true)).thenReturn(
+ newSubscriptionInfoList);
+ when(mMockSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
+ newSubscriptionInfoList);
+ mMobileNetworkUpdateManager.mOnSubscriptionsChangeListener.onSubscriptionsChanged();
+
+ // Ensure SubId doesn't change. There are three statements because using any() causes a
+ // runtime exception.
+ verify(mMockMobileNetworkUpdateListener, never()).onMobileNetworkUpdated(SUB_ID);
+ verify(mMockMobileNetworkUpdateListener, never()).onMobileNetworkUpdated(SUB_ID + 1);
+ verify(mMockMobileNetworkUpdateListener, never()).onMobileNetworkUpdated(SUB_ID + 2);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onMobileNetworkUpdated_withoutInitialSubId_pickDefaultSubId() {
+ setupMobileNetworkUpdateManager(MobileNetworkUpdateManager.SUB_ID_NULL);
+ List<SubscriptionInfo> newSubscriptionInfoList = List.of(createSubscriptionInfo(SUB_ID + 1),
+ createSubscriptionInfo(SUB_ID + 2));
+ when(mMockSubscriptionManager.getActiveSubscriptionInfoList(true)).thenReturn(
+ newSubscriptionInfoList);
+ when(mMockSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
+ newSubscriptionInfoList);
+ mMobileNetworkUpdateManager.mOnSubscriptionsChangeListener.onSubscriptionsChanged();
+
+ verify(mMockMobileNetworkUpdateListener).onMobileNetworkUpdated(SUB_ID + 1);
+ }
+
+ private void setupMobileNetworkUpdateManager(int subId) {
+ when(mMockSubscriptionManager.getActiveSubscriptionInfoList())
+ .thenReturn(Collections.singletonList(createSubscriptionInfo(subId)));
+ when(mMockSubscriptionManager.getSelectableSubscriptionInfoList())
+ .thenReturn(Collections.singletonList(createSubscriptionInfo(subId)));
+ mMobileNetworkUpdateManager = new MobileNetworkUpdateManager(subId,
+ mMockSubscriptionManager, mMockPhoneChangeReceiver);
+ mActivity.getLifecycle().addObserver(mMobileNetworkUpdateManager);
+ mMobileNetworkUpdateManager.registerListener(mMockMobileNetworkUpdateListener);
+ }
+
+ private SubscriptionInfo createSubscriptionInfo(int subId) {
+ SubscriptionInfo subInfo = new SubscriptionInfo(/* id= */ subId, /* iccId= */ "",
+ /* simSlotIndex= */ 0, /* displayName= */ "", /* carrierName= */ "",
+ /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+ /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
+ /* countryIso= */ "", /* isEmbedded= */ false,
+ /* accessRules= */ null, /* cardString= */ "");
+ return subInfo;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/network/NetworkBasePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/network/NetworkBasePreferenceControllerTest.java
new file mode 100644
index 0000000..08fe8d3
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/network/NetworkBasePreferenceControllerTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.NetworkTemplate;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.datausage.DataUsageUtils;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+@RunWith(AndroidJUnit4.class)
+public class NetworkBasePreferenceControllerTest {
+
+ private static final int SUB_ID = 1;
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private TestNetworkBasePreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private MockitoSession mSession;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private TelephonyManager mMockTelephonyManager;
+ @Mock
+ private NetworkTemplate mMockNetworkTemplate;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mSession = ExtendedMockito.mockitoSession()
+ .mockStatic(TelephonyManager.class, withSettings().lenient())
+ .mockStatic(DataUsageUtils.class, withSettings().lenient())
+ .startMocking();
+
+ ExtendedMockito.when(TelephonyManager.from(mContext)).thenReturn(mMockTelephonyManager);
+ when(mMockTelephonyManager.createForSubscriptionId(SUB_ID))
+ .thenReturn(mMockTelephonyManager);
+ ExtendedMockito.when(DataUsageUtils.getMobileNetworkTemplate(mMockTelephonyManager, SUB_ID))
+ .thenReturn(mMockNetworkTemplate);
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreferenceController = new TestNetworkBasePreferenceController(mContext,
+ "key", mMockFragmentController, mCarUxRestrictions);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void onSubIdSet_setsFields() {
+ mPreferenceController.setFields(SUB_ID);
+ assertThat(mPreferenceController.getSubId()).isEqualTo(SUB_ID);
+ assertThat(mPreferenceController.getTelephonyManager()).isEqualTo(mMockTelephonyManager);
+ assertThat(mPreferenceController.getNetworkTemplate()).isEqualTo(mMockNetworkTemplate);
+ }
+
+ /** Concrete impl of {@link NetworkBasePreferenceController} for testing. */
+ private static class TestNetworkBasePreferenceController extends
+ NetworkBasePreferenceController<Preference> {
+
+ TestNetworkBasePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
+ }
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java b/tests/unit/src/com/android/car/settings/network/NetworkUtilsTest.java
similarity index 95%
rename from tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java
rename to tests/unit/src/com/android/car/settings/network/NetworkUtilsTest.java
index 8f6344d..31ac436 100644
--- a/tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java
+++ b/tests/unit/src/com/android/car/settings/network/NetworkUtilsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,11 +26,12 @@
import android.net.NetworkCapabilities;
import android.telephony.TelephonyManager;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class NetworkUtilsTest {
@Test
diff --git a/tests/unit/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java
new file mode 100644
index 0000000..90d0c57
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.app.AlertDialog;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.PersistableBundle;
+import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.BaseCarSettingsTestActivity;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+@RunWith(AndroidJUnit4.class)
+public class RoamingPreferenceControllerTest {
+
+ private static final int SUB_ID = 1;
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private TwoStatePreference mPreference;
+ private RoamingPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private MockitoSession mSession;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private CarrierConfigManager mMockCarrierConfigManager;
+ @Mock
+ private TelephonyManager mMockTelephonyManager;
+ @Mock
+ private ContentResolver mMockContentResolver;
+ @Rule
+ public ActivityTestRule<BaseCarSettingsTestActivity> mActivityTestRule =
+ new ActivityTestRule<>(BaseCarSettingsTestActivity.class);
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mSession = ExtendedMockito.mockitoSession()
+ .mockStatic(TelephonyManager.class, withSettings().lenient())
+ .mockStatic(SubscriptionManager.class, withSettings().lenient())
+ .startMocking();
+
+ ExtendedMockito.when(TelephonyManager.from(mContext)).thenReturn(mMockTelephonyManager);
+ when(mMockTelephonyManager.createForSubscriptionId(SUB_ID))
+ .thenReturn(mMockTelephonyManager);
+ when(mMockTelephonyManager.getSimCount()).thenReturn(1);
+ when(mMockTelephonyManager.isDataRoamingEnabled()).thenReturn(true);
+ when(mContext.getContentResolver()).thenReturn(mMockContentResolver);
+ when(mContext.getSystemService(CarrierConfigManager.class))
+ .thenReturn(mMockCarrierConfigManager);
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mPreference = new SwitchPreference(mContext);
+ mPreferenceController = new RoamingPreferenceController(mContext,
+ "key", mMockFragmentController, mCarUxRestrictions);
+ mPreferenceController.setFields(SUB_ID);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void onStart_registerObserver() {
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ verify(mMockContentResolver).registerContentObserver(
+ eq(Settings.Global.getUriFor(Settings.Global.DATA_ROAMING)), eq(false),
+ any());
+ }
+
+ @Test
+ public void onStart_registerObserver_additionalSubId() {
+ when(mMockTelephonyManager.getSimCount()).thenReturn(2);
+ mPreferenceController.onStart(mLifecycleOwner);
+
+ verify(mMockContentResolver).registerContentObserver(
+ eq(Settings.Global.getUriFor(Settings.Global.DATA_ROAMING + SUB_ID)),
+ eq(false), any());
+ }
+
+ @Test
+ public void onStop_unregisterObserver() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.onStop(mLifecycleOwner);
+
+ verify(mMockContentResolver).unregisterContentObserver(any());
+ }
+
+ @Test
+ public void refreshUi_invalidSubId_isDisabled() {
+ when(mMockTelephonyManager.createForSubscriptionId(
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID)).thenReturn(mMockTelephonyManager);
+ mPreferenceController.setFields(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void refreshUi_validSubId_isEnabled() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void refreshUi_roamingEnabled_setChecked() {
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void refreshUi_roamingDisabled_setUnchecked() {
+ when(mMockTelephonyManager.isDataRoamingEnabled()).thenReturn(false);
+ mPreferenceController.onStart(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void callChangeListener_toggleFalse_turnOffRoaming() {
+ mPreference.setChecked(true);
+
+ mPreference.callChangeListener(false);
+
+ verify(mMockTelephonyManager).setDataRoamingEnabled(false);
+ }
+
+ @Test
+ public void callChangeListener_toggleTrue_needsDialog_showDialog() {
+ mPreference.setChecked(false);
+ when(mMockTelephonyManager.isDataRoamingEnabled()).thenReturn(false);
+ PersistableBundle bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
+ when(mMockCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(bundle);
+
+ mPreference.callChangeListener(true);
+
+ verify(mMockFragmentController).showDialog(any(ConfirmationDialogFragment.class),
+ eq(ConfirmationDialogFragment.TAG));
+ }
+
+ @Test
+ public void confirmDialog_turnOnRoaming() throws Throwable {
+ mPreference.setChecked(false);
+ when(mMockTelephonyManager.isDataRoamingEnabled()).thenReturn(false);
+ PersistableBundle bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
+ when(mMockCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(bundle);
+
+ mPreference.callChangeListener(true);
+
+ // Capture the dialog that is shown on toggle.
+ ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+ ConfirmationDialogFragment.class);
+ verify(mMockFragmentController).showDialog(dialogCaptor.capture(),
+ eq(ConfirmationDialogFragment.TAG));
+
+ // Show the captured dialog on press the confirmation button.
+ ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+ assertThat(dialogCaptor).isNotNull();
+ AlertDialog alertDialog = showDialog(dialog);
+ mActivityTestRule.runOnUiThread(() -> {
+ alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mMockTelephonyManager).setDataRoamingEnabled(true);
+ }
+
+ @Test
+ public void callChangeListener_toggleTrue_doesntNeedDialog_turnOnRoaming() {
+ mPreference.setChecked(false);
+ when(mMockTelephonyManager.isDataRoamingEnabled()).thenReturn(false);
+ PersistableBundle bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, true);
+ when(mMockCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(bundle);
+
+ mPreference.callChangeListener(true);
+
+ verify(mMockTelephonyManager).setDataRoamingEnabled(true);
+ }
+
+ private AlertDialog showDialog(ConfirmationDialogFragment dialog) throws Throwable {
+ mActivityTestRule.runOnUiThread(() -> {
+ dialog.show(mActivityTestRule.getActivity().getSupportFragmentManager(),
+ /* tag= */ null);
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ return (AlertDialog) dialog.getDialog();
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java b/tests/unit/src/com/android/car/settings/network/SubscriptionUtilsTest.java
similarity index 96%
rename from tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java
rename to tests/unit/src/com/android/car/settings/network/SubscriptionUtilsTest.java
index 0b2a000..83c7e1d 100644
--- a/tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java
+++ b/tests/unit/src/com/android/car/settings/network/SubscriptionUtilsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,15 +26,16 @@
import android.telephony.TelephonyManager;
import android.telephony.UiccSlotInfo;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.google.android.collect.Lists;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
import java.util.List;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class SubscriptionUtilsTest {
@Test
diff --git a/tests/unit/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java b/tests/unit/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java
new file mode 100644
index 0000000..c687444
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.android.car.settings.network.SubscriptionsChangeListener.RADIO_TECH_CHANGED_FILTER;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.telephony.SubscriptionManager;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class SubscriptionsChangeListenerTest {
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private SubscriptionsChangeListener mSubscriptionsChangeListener;
+
+ @Mock
+ private SubscriptionsChangeListener.SubscriptionsChangeAction mSubscriptionsChangeAction;
+ @Mock
+ private SubscriptionManager mMockSubscriptionManager;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mContext.getSystemService(SubscriptionManager.class))
+ .thenReturn(mMockSubscriptionManager);
+ mSubscriptionsChangeListener = new SubscriptionsChangeListener(mContext,
+ mSubscriptionsChangeAction);
+ }
+
+ @Test
+ public void start_registersListener() {
+ verify(mMockSubscriptionManager, never()).addOnSubscriptionsChangedListener(
+ mSubscriptionsChangeListener.mSubscriptionsChangedListener);
+ mSubscriptionsChangeListener.start();
+
+ verify(mMockSubscriptionManager).addOnSubscriptionsChangedListener(
+ mSubscriptionsChangeListener.mSubscriptionsChangedListener);
+ }
+
+ @Test
+ public void onSubscriptionChange_triggersAction() {
+ mSubscriptionsChangeListener.start();
+ mSubscriptionsChangeListener.mSubscriptionsChangedListener.onSubscriptionsChanged();
+
+ verify(mSubscriptionsChangeAction).onSubscriptionsChanged();
+ }
+
+ @Test
+ public void stop_unregistersListener() {
+ mSubscriptionsChangeListener.start();
+ mSubscriptionsChangeListener.stop();
+
+ verify(mMockSubscriptionManager).removeOnSubscriptionsChangedListener(
+ mSubscriptionsChangeListener.mSubscriptionsChangedListener);
+ }
+
+ @Test
+ public void start_registersReceiver() {
+ mSubscriptionsChangeListener.start();
+
+ verify(mContext).registerReceiver(any(), eq(RADIO_TECH_CHANGED_FILTER));
+ }
+
+ @Test
+ public void onReceive_triggersAction() {
+ mSubscriptionsChangeListener.start();
+ mSubscriptionsChangeListener.mRadioTechChangeReceiver.onReceive(mContext, new Intent());
+
+ verify(mSubscriptionsChangeAction).onSubscriptionsChanged();
+ }
+
+ @Test
+ public void stop_unregistersReceiver() {
+ mSubscriptionsChangeListener.start();
+ mSubscriptionsChangeListener.stop();
+
+ verify(mContext).unregisterReceiver(any());
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/notifications/NotificationAccessConfirmationActivityTest.java b/tests/unit/src/com/android/car/settings/notifications/NotificationAccessConfirmationActivityTest.java
new file mode 100644
index 0000000..7ead8cd
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/notifications/NotificationAccessConfirmationActivityTest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.notifications;
+
+import static com.android.internal.notification.NotificationAccessConfirmationActivityContract.EXTRA_COMPONENT_NAME;
+import static com.android.internal.notification.NotificationAccessConfirmationActivityContract.EXTRA_PACKAGE_TITLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.Manifest;
+import android.app.AlertDialog;
+import android.app.NotificationManager;
+import android.car.test.mocks.AndroidMockitoHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.Lifecycle;
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.car.settings.common.ConfirmationDialogFragment;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Locale;
+
+/**
+ * Unit tests for {@link NotificationAccessConfirmationActivity}
+ */
+@RunWith(AndroidJUnit4.class)
+public final class NotificationAccessConfirmationActivityTest {
+ private static final ComponentName TEMP_COMPONENT_NAME = ComponentName.unflattenFromString(
+ "com.temp/com.temp.k");
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private ActivityScenario<TestActivity> mActivityScenario;
+ private TestActivity mActivity;
+ private PackageManager mPackageManager;
+ private NotificationManager mNotificationManager;
+
+ private static ServiceInfo createServiceInfoForTempComponent(String permission) {
+ ServiceInfo info = new ServiceInfo();
+ info.name = TEMP_COMPONENT_NAME.getClassName();
+ info.packageName = TEMP_COMPONENT_NAME.getPackageName();
+ info.permission = permission;
+ return info;
+ }
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void packageTitleEmpty_finishes() {
+ Intent intent = new Intent(mContext, TestActivity.class)
+ .putExtra(EXTRA_COMPONENT_NAME, TEMP_COMPONENT_NAME);
+ mActivityScenario = ActivityScenario.launch(intent);
+
+ assertThat(mActivityScenario.getState()).isEqualTo(Lifecycle.State.DESTROYED);
+ }
+
+ @Test
+ public void packageTitleNonEmpty_showsConfirmationDialog() {
+ launchActivityWithValidIntent();
+
+ assertThat(mActivityScenario.getState()).isEqualTo(Lifecycle.State.RESUMED);
+ }
+
+ @Test
+ public void onAllow_permissionMissing_finishes() throws Exception {
+ launchActivityWithValidIntent();
+ assertThat(mActivityScenario.getState()).isEqualTo(Lifecycle.State.RESUMED);
+ ServiceInfo info = createServiceInfoForTempComponent(/* permission = */ "");
+ doReturn(info).when(mPackageManager).getServiceInfo(info.getComponentName(), 0);
+
+ AndroidMockitoHelper.syncRunOnUiThread(mActivity, () -> {
+ getConfirmationDialog().getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ // Not asserting DESTROYED state as mActivityScenario.getState() returns STARTED state for
+ // some unknown reason.
+ assertThat(mActivity.mFinishTriggered).isTrue();
+ }
+
+ @Test
+ public void onAllow_permissionAvailable_callsNotificationManager() throws Exception {
+ launchActivityWithValidIntent();
+ assertThat(mActivityScenario.getState()).isEqualTo(Lifecycle.State.RESUMED);
+ ServiceInfo info = createServiceInfoForTempComponent(
+ Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE);
+ doReturn(info).when(mPackageManager).getServiceInfo(info.getComponentName(), 0);
+
+ AndroidMockitoHelper.syncRunOnUiThread(mActivity, () -> {
+ getConfirmationDialog().getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ verify(mNotificationManager)
+ .setNotificationListenerAccessGranted(eq(info.getComponentName()), eq(true));
+ }
+
+ @Test
+ public void onDeny_finishes() throws Exception {
+ launchActivityWithValidIntent();
+ assertThat(mActivityScenario.getState()).isEqualTo(Lifecycle.State.RESUMED);
+
+ AndroidMockitoHelper.syncRunOnUiThread(mActivity, () -> {
+ getConfirmationDialog().getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
+ });
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ // Not asserting DESTROYED state as mActivityScenario.getState() returns STARTED state for
+ // some unknown reason.
+ assertThat(mActivity.mFinishTriggered).isTrue();
+ }
+
+ private AlertDialog getConfirmationDialog() {
+ return (AlertDialog) ((ConfirmationDialogFragment) mActivity.getSupportFragmentManager()
+ .findFragmentByTag(ConfirmationDialogFragment.TAG))
+ .getDialog();
+ }
+
+ private void launchActivityWithValidIntent() {
+ Intent intent = new Intent(mContext, TestActivity.class)
+ .putExtra(EXTRA_COMPONENT_NAME, TEMP_COMPONENT_NAME)
+ .putExtra(EXTRA_PACKAGE_TITLE, "my_package_title");
+
+ mActivityScenario = ActivityScenario.launch(intent);
+ mActivityScenario.onActivity(
+ activity -> {
+ mActivity = activity;
+ mPackageManager = spy(mActivity.getPackageManager());
+ mNotificationManager = spy(
+ mActivity.getSystemService(NotificationManager.class));
+ mActivity.setPackageManagerSpy(mPackageManager);
+ mActivity.setNotificationManagerSpy(mNotificationManager);
+ });
+ }
+
+ public static final class TestActivity extends NotificationAccessConfirmationActivity {
+ @Nullable private PackageManager mPackageManagerSpy;
+ @Nullable private NotificationManager mNotificationManagerSpy;
+ boolean mFinishTriggered;
+
+ void setPackageManagerSpy(PackageManager packageManagerSpy) {
+ mPackageManagerSpy = packageManagerSpy;
+ }
+
+ void setNotificationManagerSpy(NotificationManager notificationManagerSpy) {
+ mNotificationManagerSpy = notificationManagerSpy;
+ }
+
+ @Override
+ public PackageManager getPackageManager() {
+ return mPackageManagerSpy != null ? mPackageManagerSpy : super.getPackageManager();
+ }
+
+ @Override
+ public Object getSystemService(String name) {
+ return mNotificationManagerSpy != null
+ && name.toLowerCase(Locale.ROOT).contains("notification")
+ ? mNotificationManagerSpy
+ : super.getSystemService(name);
+ }
+
+ @Override
+ public void finish() {
+ mFinishTriggered = true;
+ super.finish();
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/notifications/RecentNotificationsAppsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/notifications/RecentNotificationsAppsPreferenceControllerTest.java
index 56bcfd8..8e9ad91 100644
--- a/tests/unit/src/com/android/car/settings/notifications/RecentNotificationsAppsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/notifications/RecentNotificationsAppsPreferenceControllerTest.java
@@ -120,12 +120,11 @@
@Test
public void areEvents_showValidRecents() throws Exception {
+ long timestamp = System.currentTimeMillis();
List<UsageEvents.Event> events = new ArrayList<>();
- UsageEvents.Event app1 = createUsageEvent("a", System.currentTimeMillis());
- UsageEvents.Event app2 = createUsageEvent("com.android.settings",
- System.currentTimeMillis());
- UsageEvents.Event app3 = createUsageEvent("pkg.class2",
- System.currentTimeMillis() - 1000);
+ UsageEvents.Event app1 = createUsageEvent("a", timestamp);
+ UsageEvents.Event app2 = createUsageEvent("com.android.settings", timestamp);
+ UsageEvents.Event app3 = createUsageEvent("pkg.class2", timestamp - 1000);
events.add(app1);
events.add(app2);
@@ -135,12 +134,10 @@
ApplicationsState.AppEntry app2Entry = createAppEntry("app 2");
// app1, app2 are valid apps. app3 is invalid.
- when(mMockApplicationsState.getEntry(app1.getPackageName(), UserHandle.myUserId()))
- .thenReturn(app1Entry);
- when(mMockApplicationsState.getEntry(app2.getPackageName(), UserHandle.myUserId()))
- .thenReturn(app2Entry);
- when(mMockApplicationsState.getEntry(app3.getPackageName(), UserHandle.myUserId()))
- .thenReturn(null);
+ int userId = UserHandle.myUserId();
+ when(mMockApplicationsState.getEntry(app1.getPackageName(), userId)).thenReturn(app1Entry);
+ when(mMockApplicationsState.getEntry(app2.getPackageName(), userId)).thenReturn(app2Entry);
+ when(mMockApplicationsState.getEntry(app3.getPackageName(), userId)).thenReturn(null);
UsageEvents usageEvents = getUsageEvents(
new String[] {app1.getPackageName(), app2.getPackageName(), app3.getPackageName()},
@@ -161,14 +158,12 @@
@Test
public void areEvents_showMaximumRecents() throws Exception {
+ long timestamp = System.currentTimeMillis();
List<UsageEvents.Event> events = new ArrayList<>();
- UsageEvents.Event app1 = createUsageEvent("a", System.currentTimeMillis());
- UsageEvents.Event app2 = createUsageEvent("com.android.settings",
- System.currentTimeMillis());
- UsageEvents.Event app3 = createUsageEvent("pkg.class2",
- System.currentTimeMillis() - 1000);
- UsageEvents.Event app4 = createUsageEvent("pkg.class3",
- System.currentTimeMillis() - 1000);
+ UsageEvents.Event app1 = createUsageEvent("a", timestamp);
+ UsageEvents.Event app2 = createUsageEvent("com.android.settings", timestamp);
+ UsageEvents.Event app3 = createUsageEvent("pkg.class2", timestamp - 1000);
+ UsageEvents.Event app4 = createUsageEvent("pkg.class3", timestamp - 1000);
events.add(app1);
events.add(app2);
@@ -181,14 +176,11 @@
ApplicationsState.AppEntry app4Entry = createAppEntry("app 4");
// Four valid apps found
- when(mMockApplicationsState.getEntry(app1.getPackageName(), UserHandle.myUserId()))
- .thenReturn(app1Entry);
- when(mMockApplicationsState.getEntry(app2.getPackageName(), UserHandle.myUserId()))
- .thenReturn(app2Entry);
- when(mMockApplicationsState.getEntry(app3.getPackageName(), UserHandle.myUserId()))
- .thenReturn(app3Entry);
- when(mMockApplicationsState.getEntry(app4.getPackageName(), UserHandle.myUserId()))
- .thenReturn(app4Entry);
+ int userId = UserHandle.myUserId();
+ when(mMockApplicationsState.getEntry(app1.getPackageName(), userId)).thenReturn(app1Entry);
+ when(mMockApplicationsState.getEntry(app2.getPackageName(), userId)).thenReturn(app2Entry);
+ when(mMockApplicationsState.getEntry(app3.getPackageName(), userId)).thenReturn(app3Entry);
+ when(mMockApplicationsState.getEntry(app4.getPackageName(), userId)).thenReturn(app4Entry);
UsageEvents usageEvents = getUsageEvents(
new String[] {app1.getPackageName(), app2.getPackageName(), app3.getPackageName(),
diff --git a/tests/unit/src/com/android/car/settings/privacy/DeleteUserPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/privacy/DeleteUserPreferenceControllerTest.java
new file mode 100644
index 0000000..6bbec72
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/privacy/DeleteUserPreferenceControllerTest.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.widget.Toast;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.profiles.RemoveProfileHandler;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+@RunWith(AndroidJUnit4.class)
+public class DeleteUserPreferenceControllerTest {
+ private LifecycleOwner mLifecycleOwner;
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private Preference mPreference;
+ private DeleteUserPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mFragmentController;
+ @Mock
+ private RemoveProfileHandler mRemoveProfileHandler;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ mPreference = new CarUiPreference(mContext);
+ mPreferenceController = new DeleteUserPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions,
+ mRemoveProfileHandler);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ }
+
+ @Test
+ public void onCreate_canRemoveProfile_preferenceEnabled() {
+ when(mRemoveProfileHandler.canRemoveProfile(any())).thenReturn(true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void onCreate_cannotRemoveProfile_preferenceDisabled() {
+ when(mRemoveProfileHandler.canRemoveProfile(any())).thenReturn(false);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void onClick_preferenceDisabled_showsToast() {
+ Toast mockToast = mock(Toast.class);
+ MockitoSession session = ExtendedMockito.mockitoSession()
+ .mockStatic(Toast.class, withSettings().lenient())
+ .startMocking();
+ when(Toast.makeText(any(), anyString(), anyInt())).thenReturn(mockToast);
+ when(mRemoveProfileHandler.canRemoveProfile(any())).thenReturn(false);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreference.performClick();
+
+ ExtendedMockito.verify(
+ () -> Toast.makeText(any(),
+ eq(mContext.getString(R.string.action_unavailable)),
+ anyInt()));
+ verify(mockToast).show();
+ session.finishMocking();
+ }
+
+ @Test
+ public void onClick_preferenceEnabled_showsDialog() {
+ when(mRemoveProfileHandler.canRemoveProfile(any())).thenReturn(true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreference.performClick();
+
+ verify(mRemoveProfileHandler).showConfirmRemoveProfileDialog();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/privacy/LocationTogglePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/privacy/LocationTogglePreferenceControllerTest.java
deleted file mode 100644
index 419f5d8..0000000
--- a/tests/unit/src/com/android/car/settings/privacy/LocationTogglePreferenceControllerTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.privacy;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.location.LocationManager;
-import android.os.UserHandle;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceControllerTestUtil;
-import com.android.car.settings.testutils.TestLifecycleOwner;
-import com.android.car.ui.preference.CarUiTwoActionSwitchPreference;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class LocationTogglePreferenceControllerTest {
- private LifecycleOwner mLifecycleOwner;
- private Context mContext = spy(ApplicationProvider.getApplicationContext());
- private CarUiTwoActionSwitchPreference mSwitchPreference;
- private LocationTogglePreferenceController mPreferenceController;
- private CarUxRestrictions mCarUxRestrictions;
- private UserHandle mUserHandle;
- private LocationManager mLocationManager;
-
- @Mock
- private FragmentController mFragmentController;
-
- @Captor
- private ArgumentCaptor<BroadcastReceiver> mListener;
-
- @Before
- public void setUp() {
- mLifecycleOwner = new TestLifecycleOwner();
- MockitoAnnotations.initMocks(this);
-
- mLocationManager = mContext.getSystemService(LocationManager.class);
-
- mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
- CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mUserHandle = UserHandle.of(UserHandle.myUserId());
-
- mSwitchPreference = new CarUiTwoActionSwitchPreference(mContext);
- mPreferenceController = new LocationTogglePreferenceController(mContext,
- /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
- PreferenceControllerTestUtil.assignPreference(mPreferenceController, mSwitchPreference);
- }
-
- @Test
- public void onPreferenceClicked_clickLocationEnabled_shouldDisableLocation() {
- initializePreference(/* isLocationEnabled= */ true);
-
- mSwitchPreference.performSecondaryActionClick();
-
- assertThat(mLocationManager.isLocationEnabledForUser(mUserHandle)).isFalse();
- assertThat(mSwitchPreference.isSecondaryActionChecked()).isFalse();
- }
-
- @Test
- public void onPreferenceClicked_clickMicDisabled_shouldEnableLocation() {
- initializePreference(/* isLocationEnabled= */ false);
-
- mSwitchPreference.performSecondaryActionClick();
-
- assertThat(mLocationManager.isLocationEnabledForUser(mUserHandle)).isTrue();
- assertThat(mSwitchPreference.isSecondaryActionChecked()).isTrue();
- }
-
- @Test
- public void onListenerUpdate_locationDisabled_shouldUpdateChecked() {
- initializePreference(/* isLocationEnabled= */ false);
-
- mLocationManager.setLocationEnabledForUser(true, mUserHandle);
- mListener.getValue().onReceive(mContext, new Intent(LocationManager.MODE_CHANGED_ACTION));
-
- assertThat(mSwitchPreference.isSecondaryActionChecked()).isTrue();
- }
-
- @Test
- public void onListenerUpdate_locationEnabled_shouldUpdateChecked() {
- initializePreference(/* isLocationEnabled= */ true);
-
- mLocationManager.setLocationEnabledForUser(false, mUserHandle);
- mListener.getValue().onReceive(mContext, new Intent(LocationManager.MODE_CHANGED_ACTION));
-
- assertThat(mSwitchPreference.isSecondaryActionChecked()).isFalse();
- }
-
- private void initializePreference(boolean isLocationEnabled) {
- mLocationManager.setLocationEnabledForUser(isLocationEnabled, mUserHandle);
- mPreferenceController.onCreate(mLifecycleOwner);
- mPreferenceController.onStart(mLifecycleOwner);
- verify(mContext).registerReceiver(mListener.capture(),
- eq(LocationTogglePreferenceController.INTENT_FILTER_LOCATION_MODE_CHANGED));
- }}
diff --git a/tests/unit/src/com/android/car/settings/privacy/ManageMicPermissionsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/privacy/ManageMicPermissionsPreferenceControllerTest.java
new file mode 100644
index 0000000..003cdf1
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/privacy/ManageMicPermissionsPreferenceControllerTest.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.Manifest;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.hardware.SensorPrivacyManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.permission.PermissionControllerManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.utils.StringUtil;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RunWith(AndroidJUnit4.class)
+public class ManageMicPermissionsPreferenceControllerTest {
+
+ private final Context mContext = Mockito.spy(ApplicationProvider.getApplicationContext());
+
+ @Mock
+ private FragmentController mFragmentController;
+ @Mock
+ private SensorPrivacyManager mMockSensorPrivacyManager;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private UserHandle mUserHandle1;
+ @Mock
+ private UserHandle mUserHandle2;
+ @Captor
+ private ArgumentCaptor<SensorPrivacyManager.OnSensorPrivacyChangedListener> mListener;
+
+ private ManageMicPermissionsPreferenceController mPreferenceController;
+ private LifecycleOwner mLifecycleOwner;
+ private Preference mPreference;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+ CarUxRestrictions carUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreference = new Preference(mContext);
+ screen.addPreference(mPreference);
+ mPreferenceController = new ManageMicPermissionsPreferenceController(mContext,
+ "key", mFragmentController, carUxRestrictions,
+ mMockSensorPrivacyManager, mUserManager);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ when(mContext.getPackageName()).thenReturn("test.package");
+ when(mUserHandle1.getIdentifier()).thenReturn(1);
+ when(mUserHandle1.getIdentifier()).thenReturn(2);
+ }
+
+ @Test
+ public void getSummary_whenMicrophoneIsOff_shouldReturnStringForOff() throws Exception {
+ setIsSensorPrivacyEnabled(true);
+ initializePreference();
+
+ assertThat(mPreference.getSummary()).isEqualTo(
+ mContext.getString(R.string.microphone_app_permission_summary_microphone_off));
+ }
+
+ @Test
+ public void getSummary_whenLocationIsOn_shouldReturnLoadingString() throws Exception {
+ setIsSensorPrivacyEnabled(false);
+ initializePreference();
+
+ assertThat(mPreference.getSummary()).isEqualTo(
+ mContext.getString(R.string.microphone_settings_loading_app_permission_stats));
+ }
+
+ @Test
+ public void getSummary_whenLocationAppCountIsOne_shouldShowSingularString() throws Exception {
+ setIsSensorPrivacyEnabled(false);
+
+ when(mUserManager.getUserProfiles()).thenReturn(List.of(mUserHandle1));
+ PermissionControllerManager user1PermissionControllerManager = setupUser(mUserHandle1);
+ initializePreference();
+ setAppsForUser(1, 1, user1PermissionControllerManager);
+
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", 1);
+ arguments.put("total_count", 1);
+
+ assertThat(mPreference.getSummary()).isEqualTo(StringUtil.getIcuPluralsString(mContext,
+ arguments, R.string.microphone_app_permission_summary_microphone_on));
+ }
+
+ @Test
+ public void getSummary_whenLocationAppCountIsGreaterThanOne_shouldShowPluralString()
+ throws Exception {
+ setIsSensorPrivacyEnabled(false);
+
+ when(mUserManager.getUserProfiles()).thenReturn(List.of(mUserHandle1));
+ PermissionControllerManager user1PermissionControllerManager = setupUser(mUserHandle1);
+ initializePreference();
+ setAppsForUser(5, 10, user1PermissionControllerManager);
+
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", 5);
+ arguments.put("total_count", 10);
+
+ assertThat(mPreference.getSummary()).isEqualTo(StringUtil.getIcuPluralsString(mContext,
+ arguments, R.string.microphone_app_permission_summary_microphone_on));
+ }
+
+ @Test
+ public void getSummary_multipleUsers_addsAppCounts()
+ throws Exception {
+ setIsSensorPrivacyEnabled(false);
+
+ when(mUserManager.getUserProfiles()).thenReturn(List.of(mUserHandle1, mUserHandle2));
+ PermissionControllerManager user1PermissionControllerManager = setupUser(mUserHandle1);
+ PermissionControllerManager user2PermissionControllerManager = setupUser(mUserHandle2);
+ initializePreference();
+ setAppsForUser(2, 4, user1PermissionControllerManager);
+
+ // verify that loading state persists until all callbacks have returned
+ assertThat(mPreference.getSummary()).isEqualTo(
+ mContext.getString(R.string.microphone_settings_loading_app_permission_stats));
+
+ setAppsForUser(1, 1, user2PermissionControllerManager);
+
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", 3);
+ arguments.put("total_count", 5);
+
+ assertThat(mPreference.getSummary()).isEqualTo(StringUtil.getIcuPluralsString(mContext,
+ arguments, R.string.microphone_app_permission_summary_microphone_on));
+ }
+
+ @Test
+ public void getSummary_initializeTwiceBeforeCallbacksReturn_callbacksOnlyCalledOnce()
+ throws Exception {
+ setIsSensorPrivacyEnabled(false);
+
+ when(mUserManager.getUserProfiles()).thenReturn(List.of(mUserHandle1));
+ PermissionControllerManager user1PermissionControllerManager = setupUser(mUserHandle1);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ // verifies that callbacks are only called once due to the loading state
+ setAppsForUser(2, 4, user1PermissionControllerManager);
+ }
+
+ private PermissionControllerManager setupUser(UserHandle userHandle)
+ throws Exception {
+ Context userContext = mock(Context.class);
+ doReturn(userContext).when(mContext).createPackageContextAsUser(anyString(),
+ anyInt(), eq(userHandle));
+ PermissionControllerManager permissionControllerManager = mock(
+ PermissionControllerManager.class);
+ when(userContext.getSystemService(PermissionControllerManager.class)).thenReturn(
+ permissionControllerManager);
+ return permissionControllerManager;
+ }
+
+ private void setAppsForUser(int grantedCount, int totalCount,
+ PermissionControllerManager permissionControllerManagerForUser) {
+ ArgumentCaptor<PermissionControllerManager.OnCountPermissionAppsResultCallback>
+ permissionAllAppsCountCallback = ArgumentCaptor.forClass(
+ PermissionControllerManager.OnCountPermissionAppsResultCallback.class);
+ ArgumentCaptor<PermissionControllerManager.OnCountPermissionAppsResultCallback>
+ permissionAccessCountCallback = ArgumentCaptor.forClass(
+ PermissionControllerManager.OnCountPermissionAppsResultCallback.class);
+ verify(permissionControllerManagerForUser).countPermissionApps(
+ eq(Collections.singletonList(Manifest.permission.RECORD_AUDIO)), eq(/* flags= */ 0),
+ permissionAllAppsCountCallback.capture(), eq(null));
+ verify(permissionControllerManagerForUser).countPermissionApps(
+ eq(Collections.singletonList(Manifest.permission.RECORD_AUDIO)),
+ eq(PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED),
+ permissionAccessCountCallback.capture(), eq(null));
+ permissionAllAppsCountCallback.getValue().onCountPermissionApps(totalCount);
+ permissionAccessCountCallback.getValue().onCountPermissionApps(grantedCount);
+ }
+
+ private void initializePreference() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ verify(mMockSensorPrivacyManager).addSensorPrivacyListener(
+ eq(SensorPrivacyManager.Sensors.MICROPHONE), mListener.capture());
+ }
+
+ private void setIsSensorPrivacyEnabled(boolean isMuted) {
+ when(mMockSensorPrivacyManager.isSensorPrivacyEnabled(
+ eq(SensorPrivacyManager.Sensors.MICROPHONE))).thenReturn(isMuted);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/privacy/MuteMicTogglePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/privacy/MicTogglePreferenceControllerTest.java
similarity index 83%
rename from tests/unit/src/com/android/car/settings/privacy/MuteMicTogglePreferenceControllerTest.java
rename to tests/unit/src/com/android/car/settings/privacy/MicTogglePreferenceControllerTest.java
index a735f83..2484cea 100644
--- a/tests/unit/src/com/android/car/settings/privacy/MuteMicTogglePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/privacy/MicTogglePreferenceControllerTest.java
@@ -34,10 +34,10 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.car.settings.common.ColoredSwitchPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.testutils.TestLifecycleOwner;
-import com.android.car.ui.preference.CarUiTwoActionSwitchPreference;
import org.junit.Before;
import org.junit.Test;
@@ -48,11 +48,11 @@
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
-public class MuteMicTogglePreferenceControllerTest {
+public class MicTogglePreferenceControllerTest {
private LifecycleOwner mLifecycleOwner;
private Context mContext = ApplicationProvider.getApplicationContext();
- private CarUiTwoActionSwitchPreference mSwitchPreference;
- private MuteMicTogglePreferenceController mPreferenceController;
+ private ColoredSwitchPreference mSwitchPreference;
+ private MicTogglePreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
@Mock
@@ -72,8 +72,8 @@
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mSwitchPreference = new CarUiTwoActionSwitchPreference(mContext);
- mPreferenceController = new MuteMicTogglePreferenceController(mContext,
+ mSwitchPreference = new ColoredSwitchPreference(mContext);
+ mPreferenceController = new MicTogglePreferenceController(mContext,
/* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions,
mMockSensorPrivacyManager);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mSwitchPreference);
@@ -100,8 +100,9 @@
@Test
public void onPreferenceClicked_clickMicEnabled_shouldSetPrivacySensor() {
initializePreference(/* isMicEnabled= */ true);
+ assertThat(mSwitchPreference.isChecked()).isTrue();
- mSwitchPreference.performSecondaryActionClick();
+ mSwitchPreference.performClick();
verify(mMockSensorPrivacyManager).setSensorPrivacyForProfileGroup(
eq(SensorPrivacyManager.Sources.SETTINGS),
@@ -111,14 +112,15 @@
mListener.getValue().onSensorPrivacyChanged(SensorPrivacyManager.Sensors.MICROPHONE, true);
- assertThat(mSwitchPreference.isSecondaryActionChecked()).isFalse();
+ assertThat(mSwitchPreference.isChecked()).isFalse();
}
@Test
public void onPreferenceClicked_clickMicDisabled_shouldClearPrivacySensor() {
initializePreference(/* isMicEnabled= */ false);
+ assertThat(mSwitchPreference.isChecked()).isFalse();
- mSwitchPreference.performSecondaryActionClick();
+ mSwitchPreference.performClick();
verify(mMockSensorPrivacyManager).setSensorPrivacyForProfileGroup(
eq(SensorPrivacyManager.Sources.SETTINGS),
@@ -127,7 +129,7 @@
setIsSensorPrivacyEnabled(false);
mListener.getValue().onSensorPrivacyChanged(SensorPrivacyManager.Sensors.MICROPHONE, false);
- assertThat(mSwitchPreference.isSecondaryActionChecked()).isTrue();
+ assertThat(mSwitchPreference.isChecked()).isTrue();
}
@Test
@@ -137,7 +139,7 @@
setIsSensorPrivacyEnabled(false);
mListener.getValue().onSensorPrivacyChanged(SensorPrivacyManager.Sensors.MICROPHONE, false);
- assertThat(mSwitchPreference.isSecondaryActionChecked()).isTrue();
+ assertThat(mSwitchPreference.isChecked()).isTrue();
}
@Test
@@ -147,7 +149,16 @@
setIsSensorPrivacyEnabled(true);
mListener.getValue().onSensorPrivacyChanged(SensorPrivacyManager.Sensors.MICROPHONE, true);
- assertThat(mSwitchPreference.isSecondaryActionChecked()).isFalse();
+ assertThat(mSwitchPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void onStop_removesSensorPrivacyListener() {
+ initializePreference(/* isMicEnabled= */ true);
+ mPreferenceController.onStop(mLifecycleOwner);
+
+ verify(mMockSensorPrivacyManager).removeSensorPrivacyListener(
+ SensorPrivacyManager.Sensors.MICROPHONE, mListener.getValue());
}
private void initializePreference(boolean isMicEnabled) {
diff --git a/tests/unit/src/com/android/car/settings/privacy/MicrophoneRecentAccessViewAllPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/privacy/MicrophoneRecentAccessViewAllPreferenceControllerTest.java
new file mode 100644
index 0000000..7a54389
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/privacy/MicrophoneRecentAccessViewAllPreferenceControllerTest.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.applications.RecentAppOpsAccess;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.time.Clock;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class MicrophoneRecentAccessViewAllPreferenceControllerTest {
+
+ private final Context mContext = Mockito.spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private LogicalPreferenceGroup mPreference;
+ private MicrophoneRecentAccessViewAllPreferenceController mPreferenceController;
+
+ @Mock
+ private FragmentController mFragmentController;
+ @Mock
+ private RecentAppOpsAccess mRecentMicrophoneAccesses;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+ CarUxRestrictions carUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreference = new LogicalPreferenceGroup(mContext);
+ screen.addPreference(mPreference);
+ mPreferenceController = new MicrophoneRecentAccessViewAllPreferenceController(mContext,
+ "key", mFragmentController, carUxRestrictions,
+ mRecentMicrophoneAccesses);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ doNothing().when(mContext).startActivity(any());
+ }
+
+ @Test
+ public void updateState_noSystemAppsByDefault() {
+ initializePreference();
+ verify(mRecentMicrophoneAccesses, never()).getAppListSorted(/* showSystem= */ true);
+ }
+
+ @Test
+ public void setShowSystem_showsSystemApps() {
+ initializePreference();
+ mPreferenceController.setShowSystem(true);
+ verify(mRecentMicrophoneAccesses).getAppListSorted(/* showSystem= */ true);
+ }
+
+ @Test
+ public void refreshUi_noRecentRequests_showsEmptyState() {
+ initializePreference();
+
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(Collections.emptyList());
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.getPreference(0).getTitle()).isEqualTo(
+ mContext.getString(R.string.microphone_no_recent_access));
+ }
+
+ @Test
+ public void refreshUi_someRecentRequests_displaysAppInformation() {
+ initializePreference();
+
+ String fakeLabel = "Test app 1";
+ RecentAppOpsAccess.Access fakeAccess = new RecentAppOpsAccess.Access("com.test",
+ UserHandle.CURRENT, mock(Drawable.class), fakeLabel,
+ "fake contentDescription", Clock.systemDefaultZone().millis());
+ List<RecentAppOpsAccess.Access> list = Collections.singletonList(fakeAccess);
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(list);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.getPreference(0).getTitle()).isEqualTo(fakeLabel);
+ assertThat(mPreference.getPreference(0).getSummary().toString()).contains("min. ago");
+ }
+
+ @Test
+ public void refreshUi_recentRequests_launchMicrophoneSettings() {
+ initializePreference();
+
+ List<RecentAppOpsAccess.Access> list = Collections.singletonList(
+ mock(RecentAppOpsAccess.Access.class));
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(list);
+ mPreferenceController.refreshUi();
+
+ mPreference.getPreference(0).performClick();
+
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).startActivity(captor.capture());
+
+ Intent intent = captor.getValue();
+ assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MANAGE_APP_PERMISSION);
+ }
+
+ @Test
+ public void refreshUi_newRecentRequests_listIsUpdated() {
+ initializePreference();
+
+ List<RecentAppOpsAccess.Access> list1 = Collections.singletonList(
+ mock(RecentAppOpsAccess.Access.class));
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(list1);
+
+ List<RecentAppOpsAccess.Access> list2 = new ArrayList<>(list1);
+ list2.add(mock(RecentAppOpsAccess.Access.class));
+
+ mPreferenceController.refreshUi();
+ assertThat(mPreference.getPreferenceCount()).isEqualTo(list1.size());
+
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(list2);
+ mPreferenceController.refreshUi();
+ assertThat(mPreference.getPreferenceCount()).isEqualTo(list2.size());
+ }
+
+ private void initializePreference() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ }
+}
+
diff --git a/tests/unit/src/com/android/car/settings/privacy/MicrophoneRecentAccessesPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/privacy/MicrophoneRecentAccessesPreferenceControllerTest.java
new file mode 100644
index 0000000..bf0fa44
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/privacy/MicrophoneRecentAccessesPreferenceControllerTest.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.privacy;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.hardware.SensorPrivacyManager;
+import android.os.UserHandle;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.applications.RecentAppOpsAccess;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.time.Clock;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class MicrophoneRecentAccessesPreferenceControllerTest {
+ private static final int RECENT_APPS_MAX_COUNT = 2;
+
+ private final Context mContext = Mockito.spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private PreferenceCategory mPreference;
+ private MicrophoneRecentAccessesPreferenceController mPreferenceController;
+
+ @Mock
+ private FragmentController mFragmentController;
+ @Mock
+ private RecentAppOpsAccess mRecentMicrophoneAccesses;
+ @Mock
+ private SensorPrivacyManager mMockSensorPrivacyManager;
+ @Captor
+ private ArgumentCaptor<SensorPrivacyManager.OnSensorPrivacyChangedListener> mListener;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+ CarUxRestrictions carUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+ mPreference = new PreferenceCategory(mContext);
+ screen.addPreference(mPreference);
+ mPreferenceController = new MicrophoneRecentAccessesPreferenceController(mContext,
+ "key", mFragmentController, carUxRestrictions,
+ mRecentMicrophoneAccesses, RECENT_APPS_MAX_COUNT, mMockSensorPrivacyManager);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ doNothing().when(mContext).startActivity(any());
+ mPreferenceController.onCreate(mLifecycleOwner);
+ }
+
+ @Test
+ public void micMuted_preferenceIsHidden() {
+ setIsSensorPrivacyEnabled(true);
+ initializePreference();
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void micNotMuted_preferenceIsShown() {
+ setIsSensorPrivacyEnabled(false);
+ initializePreference();
+
+ assertThat(mPreference.isVisible()).isTrue();
+ }
+
+ @Test
+ public void onListenerUpdate_micEnabled_shouldShow() {
+ initializePreference();
+
+ setIsSensorPrivacyEnabled(false);
+ mListener.getValue().onSensorPrivacyChanged(SensorPrivacyManager.Sensors.MICROPHONE, false);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ }
+
+ @Test
+ public void onListenerUpdate_micDisabled_shouldHide() {
+ initializePreference();
+
+ setIsSensorPrivacyEnabled(true);
+ mListener.getValue().onSensorPrivacyChanged(SensorPrivacyManager.Sensors.MICROPHONE, true);
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void refreshUi_noRecentRequests_messageDisplayed() {
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(Collections.emptyList());
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.getPreference(0).getTitle()).isEqualTo(
+ mContext.getString(R.string.microphone_no_recent_access));
+ }
+
+ @Test
+ public void refreshUi_noRecentRequests_exceptForSomeRecentSystemAppRequests_showsViewAll() {
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(Collections.emptyList());
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ true))
+ .thenReturn(Collections.singletonList(mock(RecentAppOpsAccess.Access.class)));
+ mPreferenceController.refreshUi();
+
+ // includes preference for "View all"
+ assertThat(mPreference.getPreferenceCount()).isEqualTo(2);
+ assertThat(mPreference.getPreference(1).getTitle()).isEqualTo(
+ mContext.getString(R.string.microphone_settings_recent_requests_view_all_title));
+ }
+
+ @Test
+ @UiThreadTest
+ public void refreshUi_clickViewAll_launchesFragment() {
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ true))
+ .thenReturn(Collections.singletonList(mock(RecentAppOpsAccess.Access.class)));
+ mPreferenceController.refreshUi();
+
+ // click on the "View all" preference
+ mPreference.getPreference(1).performClick();
+ verify(mFragmentController)
+ .launchFragment(any(MicrophoneRecentAccessViewAllFragment.class));
+ }
+
+ @Test
+ public void refreshUi_noRecentRequests_includingNoSystemAppRequests_doesNotShowViewAll() {
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(Collections.emptyList());
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ true))
+ .thenReturn(Collections.emptyList());
+ mPreferenceController.refreshUi();
+
+ // no preference for "View all"
+ assertThat(mPreference.getPreferenceCount()).isEqualTo(1);
+ assertThat(mPreference.getPreference(0).getTitle()).isEqualTo(
+ mContext.getString(R.string.microphone_no_recent_access));
+ }
+
+ @Test
+ public void refreshUi_someRecentRequests_displaysAppInformation() {
+ String fakeLabel = "Test app 1";
+ RecentAppOpsAccess.Access fakeAccess = new RecentAppOpsAccess.Access("com.test",
+ UserHandle.CURRENT, mock(Drawable.class), fakeLabel,
+ "fake contentDescription", Clock.systemDefaultZone().millis());
+ List<RecentAppOpsAccess.Access> list = Collections.singletonList(fakeAccess);
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(list);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.getPreference(0).getTitle()).isEqualTo(fakeLabel);
+ assertThat(mPreference.getPreference(0).getSummary().toString()).contains("min. ago");
+ }
+
+ @Test
+ public void refreshUi_someRecentRequests_preferencesAddedToScreen_capsAtMax() {
+ List<RecentAppOpsAccess.Access> list = Arrays.asList(
+ mock(RecentAppOpsAccess.Access.class),
+ mock(RecentAppOpsAccess.Access.class),
+ mock(RecentAppOpsAccess.Access.class));
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(list);
+ mPreferenceController.refreshUi();
+
+ assertThat(mPreference.getPreferenceCount()).isEqualTo(RECENT_APPS_MAX_COUNT);
+ }
+
+ @Test
+ public void refreshUi_recentRequests_launchMicrophoneSettings() {
+ List<RecentAppOpsAccess.Access> list = Collections.singletonList(
+ mock(RecentAppOpsAccess.Access.class));
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(list);
+ mPreferenceController.refreshUi();
+
+ mPreference.getPreference(0).performClick();
+
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).startActivity(captor.capture());
+
+ Intent intent = captor.getValue();
+ assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MANAGE_APP_PERMISSION);
+ }
+
+ @Test
+ public void refreshUi_newRecentRequests_listIsUpdated() {
+ List<RecentAppOpsAccess.Access> list1 = Collections.singletonList(
+ mock(RecentAppOpsAccess.Access.class));
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(list1);
+
+ List<RecentAppOpsAccess.Access> list2 = new ArrayList<>(list1);
+ list2.add(mock(RecentAppOpsAccess.Access.class));
+
+ mPreferenceController.refreshUi();
+ assertThat(mPreference.getPreferenceCount()).isEqualTo(list1.size());
+
+ when(mRecentMicrophoneAccesses.getAppListSorted(/* showSystem= */ false))
+ .thenReturn(list2);
+ mPreferenceController.refreshUi();
+ assertThat(mPreference.getPreferenceCount()).isEqualTo(list2.size());
+ }
+
+ private void initializePreference() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
+ verify(mMockSensorPrivacyManager).addSensorPrivacyListener(
+ eq(SensorPrivacyManager.Sensors.MICROPHONE), mListener.capture());
+ }
+
+ private void setIsSensorPrivacyEnabled(boolean isMuted) {
+ when(mMockSensorPrivacyManager.isSensorPrivacyEnabled(
+ eq(SensorPrivacyManager.Sensors.MICROPHONE))).thenReturn(isMuted);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/profiles/AddProfileHandlerTest.java b/tests/unit/src/com/android/car/settings/profiles/AddProfileHandlerTest.java
index 8cef5df..9553f48 100644
--- a/tests/unit/src/com/android/car/settings/profiles/AddProfileHandlerTest.java
+++ b/tests/unit/src/com/android/car/settings/profiles/AddProfileHandlerTest.java
@@ -16,6 +16,10 @@
package com.android.car.settings.profiles;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
import static com.android.car.settings.profiles.AddProfileHandler.CONFIRM_CREATE_NEW_PROFILE_DIALOG_TAG;
import static com.google.common.truth.Truth.assertThat;
@@ -24,6 +28,7 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -43,6 +48,8 @@
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.ResourceTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.internal.infra.AndroidFuture;
@@ -60,8 +67,10 @@
@RunWith(AndroidJUnit4.class)
public class AddProfileHandlerTest {
private static final int ADD_PROFILE_TASK_TIMEOUT = 10; // in seconds
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_ADD_USER;
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
private AddProfileHandler mAddProfileHandler;
private LifecycleOwner mLifecycleOwner;
private TestAddProfilePreferenceController mPreferenceController;
@@ -78,6 +87,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
mLifecycleOwner = new TestLifecycleOwner();
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
@@ -133,6 +143,67 @@
eq(CONFIRM_CREATE_NEW_PROFILE_DIALOG_TAG));
}
+ @Test
+ public void getAddProfilePreferenceAvailabilityStatus_demoUser_available() {
+ when(mUserManager.isDemoUser()).thenReturn(true);
+ assertThat(mAddProfileHandler.getAddProfilePreferenceAvailabilityStatus(mContext))
+ .isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAddProfilePreferenceAvailabilityStatus_notRestricted_available() {
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mUserManager, TEST_RESTRICTION, false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, false);
+ assertThat(mAddProfileHandler.getAddProfilePreferenceAvailabilityStatus(mContext))
+ .isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAddProfilePreferenceAvailabilityStatus_notDemoUser_restrictedByUm_disabled() {
+ when(mUserManager.isDemoUser()).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mUserManager, TEST_RESTRICTION, true);
+ assertThat(mAddProfileHandler.getAddProfilePreferenceAvailabilityStatus(mContext))
+ .isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAddProfilePreferenceAvailabilityStatus_notDemoUser_restrictedByDpm_viewing() {
+ when(mUserManager.isDemoUser()).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
+ assertThat(mAddProfileHandler.getAddProfilePreferenceAvailabilityStatus(mContext))
+ .isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void getAddProfilePreferenceAvailabilityStatus_notDemoUser_restrictedByBoth_disabled() {
+ when(mUserManager.isDemoUser()).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mUserManager, TEST_RESTRICTION, true);
+ assertThat(mAddProfileHandler.getAddProfilePreferenceAvailabilityStatus(mContext))
+ .isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void runClickableWhileDisabled_restrictedByDpm_showAdminDialog() {
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
+
+ mAddProfileHandler.runClickableWhileDisabled();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mMockFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+
private class TestAddProfilePreferenceController
extends PreferenceController<Preference> {
diff --git a/tests/unit/src/com/android/car/settings/profiles/AddProfilePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/profiles/AddProfilePreferenceControllerTest.java
index bb09c45..f73e897 100644
--- a/tests/unit/src/com/android/car/settings/profiles/AddProfilePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/profiles/AddProfilePreferenceControllerTest.java
@@ -16,12 +16,17 @@
package com.android.car.settings.profiles;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
import static com.android.car.settings.profiles.AddProfilePreferenceController.MAX_PROFILES_LIMIT_REACHED_DIALOG_TAG;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -30,15 +35,18 @@
import android.os.UserManager;
import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
+import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.ResourceTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
import org.junit.Before;
import org.junit.Test;
@@ -48,10 +56,11 @@
@RunWith(AndroidJUnit4.class)
public class AddProfilePreferenceControllerTest {
-
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_ADD_USER;
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
- private Preference mPreference;
+ private CarUiPreference mPreference;
private AddProfilePreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
@@ -59,6 +68,8 @@
private FragmentController mFragmentController;
@Mock
private UserManager mUserManager;
+ @Mock
+ private ProfileHelper mMockProfileHelper;
@Before
public void setUp() {
@@ -67,10 +78,10 @@
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
-
- mPreference = new Preference(mContext);
+ mPreference = new CarUiPreference(mContext);
mPreferenceController = new AddProfilePreferenceController(mContext,
/* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
mPreferenceController.setUserManager(mUserManager);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
}
@@ -93,18 +104,33 @@
mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
assertThat(mPreference.isVisible()).isTrue();
assertThat(mPreference.getTitle()).isEqualTo(
ResourceTestUtils.getString(mContext, "add_profile_text"));
}
@Test
- public void onCreate_userRestrictedFromAddingNewProfileAndNotInDemo_doesNotShowActionButton() {
+ public void onCreate_userRestrictedByDpmFromAddingNewProfileAndNotInDemo_availableForViewing() {
when(mUserManager.isDemoUser()).thenReturn(false);
- when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true);
+ when(mUserManager.canAddMoreUsers()).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void onCreate_userRestrictedByUmFromAddingNewProfileAndNotInDemo_buttonDisabled() {
+ when(mUserManager.isDemoUser()).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mUserManager, TEST_RESTRICTION, true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
assertThat(mPreference.isVisible()).isFalse();
}
@@ -113,7 +139,8 @@
@Test
public void testCallOnClick_profileLimitReached_showErrorDialog() {
when(mUserManager.isDemoUser()).thenReturn(false);
- when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mUserManager, TEST_RESTRICTION, false);
when(mUserManager.canAddMoreUsers()).thenReturn(false);
mPreferenceController.onCreate(mLifecycleOwner);
@@ -122,4 +149,23 @@
verify(mFragmentController).showDialog(any(ConfirmationDialogFragment.class),
eq(MAX_PROFILES_LIMIT_REACHED_DIALOG_TAG));
}
+
+ @Test
+ @UiThreadTest
+ public void disabledClick_restrictedByDpm_dialog() {
+ when(mUserManager.isDemoUser()).thenReturn(false);
+ when(mUserManager.canAddMoreUsers()).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mUserManager, TEST_RESTRICTION, true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/profiles/ProfileDetailsActionButtonsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/profiles/ProfileDetailsActionButtonsPreferenceControllerTest.java
index 997c568..d626e0e 100644
--- a/tests/unit/src/com/android/car/settings/profiles/ProfileDetailsActionButtonsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/profiles/ProfileDetailsActionButtonsPreferenceControllerTest.java
@@ -20,6 +20,7 @@
import static android.content.pm.UserInfo.FLAG_INITIALIZED;
import static com.android.car.settings.common.ActionButtonsPreference.ActionButtons;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
import static com.android.car.settings.profiles.ProfileDetailsActionButtonsPreferenceController.MAKE_ADMIN_DIALOG_TAG;
import static com.google.common.truth.Truth.assertThat;
@@ -238,6 +239,8 @@
when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER))
.thenReturn(true);
+ when(mRemoveProfileHandler.getAvailabilityStatus(mContext, userInfo,
+ /* allowRemoveCurrentProcessUser */ false)).thenReturn(DISABLED_FOR_PROFILE);
mPreferenceController.setUserInfo(userInfo);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
mPreferenceController.onCreate(mLifecycleOwner);
@@ -250,9 +253,11 @@
public void onStart_userIsViewingSelf_deleteButtonHidden() {
UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+ when(mRemoveProfileHandler.getAvailabilityStatus(mContext, userInfo,
+ /* allowRemoveCurrentProcessUser */ false)).thenReturn(DISABLED_FOR_PROFILE);
+ when(mRemoveProfileHandler.canRemoveProfile(userInfo)).thenReturn(true);
mPreferenceController.setUserInfo(userInfo);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
- when(mRemoveProfileHandler.canRemoveProfile(userInfo)).thenReturn(true);
mPreferenceController.onCreate(mLifecycleOwner);
mPreferenceController.onStart(mLifecycleOwner);
diff --git a/tests/unit/src/com/android/car/settings/profiles/ProfileDetailsDeletePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/profiles/ProfileDetailsDeletePreferenceControllerTest.java
index 299dd8d..4008d18 100644
--- a/tests/unit/src/com/android/car/settings/profiles/ProfileDetailsDeletePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/profiles/ProfileDetailsDeletePreferenceControllerTest.java
@@ -18,8 +18,14 @@
import static android.content.pm.UserInfo.FLAG_INITIALIZED;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.car.drivingstate.CarUxRestrictions;
@@ -28,13 +34,15 @@
import android.os.UserManager;
import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
import org.junit.Before;
import org.junit.Test;
@@ -44,11 +52,13 @@
@RunWith(AndroidJUnit4.class)
public class ProfileDetailsDeletePreferenceControllerTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_REMOVE_USER;
private static final String TEST_PROFILE_NAME = "Test Profile Name";
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
- private Preference mPreference;
+ private CarUiPreference mPreference;
private CarUxRestrictions mCarUxRestrictions;
private ProfileDetailsDeletePreferenceController mPreferenceController;
private RemoveProfileHandler mRemoveProfileHandler;
@@ -68,12 +78,13 @@
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mPreference = new Preference(mContext);
+ mPreference = new CarUiPreference(mContext);
mRemoveProfileHandler = new RemoveProfileHandler(
mContext, mMockProfileHelper, mMockUserManager, mMockFragmentController);
mPreferenceController = new ProfileDetailsDeletePreferenceController(mContext,
/* preferenceKey= */ "key", mMockFragmentController, mCarUxRestrictions,
mMockProfileHelper, mRemoveProfileHandler);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
}
@Test
@@ -88,11 +99,11 @@
}
@Test
- public void onCreate_userRestricted_deleteButtonHidden() {
+ public void onCreate_userRestrictedByUm_deleteButtonHidden() {
UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
- when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER))
- .thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mMockUserManager, TEST_RESTRICTION, true);
mPreferenceController.setUserInfo(userInfo);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
mPreferenceController.onCreate(mLifecycleOwner);
@@ -101,6 +112,20 @@
}
@Test
+ public void onCreate_userRestrictedByDpm_deleteButtonVisible() {
+ UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
+ when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+ mPreferenceController.setUserInfo(userInfo);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
public void onCreate_userIsViewingSelf_deleteButtonHidden() {
UserInfo userInfo = new UserInfo(/* id= */ 0, TEST_PROFILE_NAME, FLAG_INITIALIZED);
when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
@@ -135,4 +160,38 @@
assertThat(mPreference.isVisible()).isFalse();
}
+
+ @Test
+ public void onCreate_isDemoUserAndRestrictedByDpm_deleteButtonHidden() {
+ UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
+ when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+ when(mMockUserManager.isDemoUser()).thenReturn(true);
+ mPreferenceController.setUserInfo(userInfo);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void disabledClick_restrictedByDpm_dialog() {
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+ UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
+ when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+ mPreferenceController.setUserInfo(userInfo);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ mPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mMockFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/profiles/RemoveProfileHandlerTest.java b/tests/unit/src/com/android/car/settings/profiles/RemoveProfileHandlerTest.java
index 6bd0552..4e19f47 100644
--- a/tests/unit/src/com/android/car/settings/profiles/RemoveProfileHandlerTest.java
+++ b/tests/unit/src/com/android/car/settings/profiles/RemoveProfileHandlerTest.java
@@ -18,6 +18,9 @@
import static android.content.pm.UserInfo.FLAG_INITIALIZED;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
import static com.android.car.settings.profiles.ProfilesDialogProvider.ANY_PROFILE;
import static com.android.car.settings.profiles.ProfilesDialogProvider.KEY_PROFILE_TYPE;
import static com.android.car.settings.profiles.ProfilesDialogProvider.LAST_ADMIN;
@@ -27,6 +30,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -41,6 +45,7 @@
import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import org.junit.Before;
import org.junit.Test;
@@ -51,8 +56,9 @@
@RunWith(AndroidJUnit4.class)
public class RemoveProfileHandlerTest {
private static final String TEST_PROFILE_NAME = "Test Profile Name";
+ private static final String TEST_RESTRICTION = UserManager.DISALLOW_REMOVE_USER;
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
private RemoveProfileHandler mRemoveProfileHandler;
@Mock
@@ -65,42 +71,38 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
mRemoveProfileHandler = new RemoveProfileHandler(
mContext, mMockProfileHelper, mMockUserManager, mMockFragmentController);
}
@Test
public void userNotRestricted_canRemoveProfile() {
- UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
- mRemoveProfileHandler.setUserInfo(userInfo);
- when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ false);
+
assertThat(mRemoveProfileHandler.canRemoveProfile(userInfo)).isTrue();
}
@Test
public void userRestricted_cannotRemoveProfile() {
- UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
- mRemoveProfileHandler.setUserInfo(userInfo);
- when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
- when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER))
- .thenReturn(true);
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ false);
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(true);
assertThat(mRemoveProfileHandler.canRemoveProfile(userInfo)).isFalse();
}
@Test
public void viewingSystemUser_cannotRemoveProfile() {
- UserInfo userInfo = new UserInfo(/* id= */ 0, TEST_PROFILE_NAME, FLAG_INITIALIZED);
- mRemoveProfileHandler.setUserInfo(userInfo);
- when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+ UserInfo userInfo = mockCurrentUserInfo(0, /* isCurrentProcess */ false);
+
assertThat(mRemoveProfileHandler.canRemoveProfile(userInfo)).isFalse();
}
@Test
public void isDemoUser_cannotRemoveProfile() {
- UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
- mRemoveProfileHandler.setUserInfo(userInfo);
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ true);
when(mMockUserManager.isDemoUser()).thenReturn(true);
+
assertThat(mRemoveProfileHandler.canRemoveProfile(userInfo)).isFalse();
}
@@ -119,9 +121,7 @@
@Test
public void showConfirmRemoveProfileDialog_showsConfirmationDialog() {
- UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
- mRemoveProfileHandler.setUserInfo(userInfo);
- when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ false);
mRemoveProfileHandler.showConfirmRemoveProfileDialog();
@@ -131,10 +131,7 @@
@Test
public void onDeleteConfirmed_removeProfile() {
- UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
- mRemoveProfileHandler.setUserInfo(userInfo);
- when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
-
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ false);
Bundle arguments = new Bundle();
arguments.putString(KEY_PROFILE_TYPE, ANY_PROFILE);
mRemoveProfileHandler.mRemoveConfirmListener.onConfirm(arguments);
@@ -145,9 +142,7 @@
@Test
@UiThreadTest
public void onDeleteConfirmed_lastAdmin_launchChooseNewAdminFragment() {
- UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_PROFILE_NAME, FLAG_INITIALIZED);
- mRemoveProfileHandler.setUserInfo(userInfo);
- when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ false);
Bundle arguments = new Bundle();
arguments.putString(KEY_PROFILE_TYPE, LAST_ADMIN);
@@ -155,4 +150,63 @@
verify(mMockFragmentController).launchFragment(any(ChooseNewAdminFragment.class));
}
+
+ @Test
+ public void getAvailabilityStatus_currentUser_availableForProcess_available() {
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ true);
+
+ assertThat(mRemoveProfileHandler.getAvailabilityStatus(mContext, userInfo,
+ /* availableForCurrentProcessUser */ true)).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_notCurrentUser_notAvailableForProcess_available() {
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ false);
+
+ assertThat(mRemoveProfileHandler.getAvailabilityStatus(mContext, userInfo,
+ /* availableForCurrentProcessUser */ false)).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_currentUser_notAvailableForCurrentUser_disable() {
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ true);
+
+ assertThat(mRemoveProfileHandler.getAvailabilityStatus(mContext, userInfo,
+ /* availableForCurrentProcessUser */ false)).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_notCurrentUser_availableForCurrentUser_disable() {
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ false);
+
+ assertThat(mRemoveProfileHandler.getAvailabilityStatus(mContext, userInfo,
+ /* availableForCurrentProcessUser */ true)).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_restrictedByUm_disable() {
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mMockUserManager, TEST_RESTRICTION, true);
+
+ assertThat(mRemoveProfileHandler.getAvailabilityStatus(mContext, userInfo,
+ /* availableForCurrentProcessUser */ true)).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_allowCurrentProcess_onlyRestrictedByDpm_viewing() {
+ UserInfo userInfo = mockCurrentUserInfo(10, /* isCurrentProcess */ true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+
+ assertThat(mRemoveProfileHandler.getAvailabilityStatus(mContext, userInfo,
+ /* availableForCurrentProcessUser */ true)).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ private UserInfo mockCurrentUserInfo(int userId, boolean isCurrentProcess) {
+ UserInfo userInfo = new UserInfo(userId, TEST_PROFILE_NAME, FLAG_INITIALIZED);
+ mRemoveProfileHandler.setUserInfo(userInfo);
+ when(mMockProfileHelper.isCurrentProcessUser(userInfo)).thenReturn(isCurrentProcess);
+ return userInfo;
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/qc/AdaptiveBrightnessSwitchTest.java b/tests/unit/src/com/android/car/settings/qc/AdaptiveBrightnessSwitchTest.java
new file mode 100644
index 0000000..2c8c187
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/AdaptiveBrightnessSwitchTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class AdaptiveBrightnessSwitchTest {
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private AdaptiveBrightnessSwitch mSwitch;
+ private boolean mIsAdaptiveBrightnessSupported;
+ private boolean mInitialAdaptiveBrightnessState;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mSwitch = new TestAdaptiveBrightnessSwitch(mContext);
+ mIsAdaptiveBrightnessSupported = true;
+ mInitialAdaptiveBrightnessState = isAdaptiveBrightnessEnabled();
+ }
+
+ @After
+ public void tearDown() {
+ setAdaptiveBrightnessEnabled(mInitialAdaptiveBrightnessState);
+ }
+
+ @Test
+ public void getQCItem_unsupported_returnsNull() {
+ mIsAdaptiveBrightnessSupported = false;
+ QCItem item = mSwitch.getQCItem();
+ assertThat(item).isNull();
+ }
+
+ @Test
+ public void getQCItem_supported_returnsRow() {
+ QCItem item = mSwitch.getQCItem();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ }
+
+ @Test
+ public void getQCItem_titleSet() {
+ QCRow row = getQCRow();
+ assertThat(row.getTitle()).isEqualTo(mContext.getString(R.string.auto_brightness_title));
+ }
+
+ @Test
+ public void getQCItem_hasActionSwitch() {
+ QCRow row = getQCRow();
+ assertThat(row.getEndItems().size()).isEqualTo(1);
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.getType()).isEqualTo(QCItem.QC_TYPE_ACTION_SWITCH);
+ }
+
+ @Test
+ public void getQCItem_adaptiveBrightnessOn_switchChecked() {
+ setAdaptiveBrightnessEnabled(true);
+ QCRow row = getQCRow();
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isTrue();
+ }
+
+ @Test
+ public void getQCItem_adaptiveBrightnessOff_switchUnchecked() {
+ setAdaptiveBrightnessEnabled(false);
+ QCRow row = getQCRow();
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isFalse();
+ }
+
+ @Test
+ public void onNotifyChange_enable_enablesAdaptiveBrightness() {
+ setAdaptiveBrightnessEnabled(false);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mSwitch.onNotifyChange(intent);
+ assertThat(isAdaptiveBrightnessEnabled()).isTrue();
+ }
+
+ @Test
+ public void onNotifyChange_disable_disablesAdaptiveBrightness() {
+ setAdaptiveBrightnessEnabled(true);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, false);
+ mSwitch.onNotifyChange(intent);
+ assertThat(isAdaptiveBrightnessEnabled()).isFalse();
+ }
+
+ private QCRow getQCRow() {
+ QCItem item = mSwitch.getQCItem();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ return list.getRows().get(0);
+ }
+
+ private boolean isAdaptiveBrightnessEnabled() {
+ int brightnessMode = Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+ return brightnessMode != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
+ }
+
+ private void setAdaptiveBrightnessEnabled(boolean enabled) {
+ Settings.System.putInt(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ enabled ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
+ : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+ }
+
+ private class TestAdaptiveBrightnessSwitch extends AdaptiveBrightnessSwitch {
+
+ TestAdaptiveBrightnessSwitch(Context context) {
+ super(context);
+ }
+
+ @Override
+ boolean supportsAdaptiveBrightness() {
+ return mIsAdaptiveBrightnessSupported;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/BluetoothSwitchTest.java b/tests/unit/src/com/android/car/settings/qc/BluetoothSwitchTest.java
new file mode 100644
index 0000000..eab1455
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/BluetoothSwitchTest.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+@RunWith(AndroidJUnit4.class)
+public class BluetoothSwitchTest {
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private BluetoothSwitch mBluetoothSwitch;
+ private MockitoSession mSession;
+
+ @Mock
+ private BluetoothAdapter mBluetoothAdapter;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mSession = ExtendedMockito.mockitoSession().mockStatic(
+ BluetoothAdapter.class, withSettings().lenient()).startMocking();
+ when(BluetoothAdapter.getDefaultAdapter()).thenReturn(mBluetoothAdapter);
+ when(mBluetoothAdapter.getState()).thenReturn(BluetoothAdapter.STATE_ON);
+ mBluetoothSwitch = new BluetoothSwitch(mContext);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void getQCItem_createsRow() {
+ QCItem item = mBluetoothSwitch.getQCItem();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ }
+
+ @Test
+ public void getQCItem_titleSet() {
+ QCList list = (QCList) mBluetoothSwitch.getQCItem();
+ QCRow row = list.getRows().get(0);
+ assertThat(row.getTitle()).isEqualTo(mContext.getString(R.string.bluetooth_settings_title));
+ }
+
+ @Test
+ public void getQCItem_hasActionSwitch() {
+ QCList list = (QCList) mBluetoothSwitch.getQCItem();
+ QCRow row = list.getRows().get(0);
+ assertThat(row.getEndItems().size()).isEqualTo(1);
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.getType()).isEqualTo(QCItem.QC_TYPE_ACTION_SWITCH);
+ }
+
+ @Test
+ public void getQCItem_bluetoothOn_switchChecked() {
+ QCList list = (QCList) mBluetoothSwitch.getQCItem();
+ QCActionItem actionItem = list.getRows().get(0).getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isTrue();
+ }
+
+ @Test
+ public void getQCItem_bluetoothOff_switchUnchecked() {
+ when(mBluetoothAdapter.getState()).thenReturn(BluetoothAdapter.STATE_OFF);
+ QCList list = (QCList) mBluetoothSwitch.getQCItem();
+ QCActionItem actionItem = list.getRows().get(0).getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isFalse();
+ }
+
+ @Test
+ public void onNotifyChange_enable_enablesBluetooth() {
+ when(mBluetoothAdapter.getState()).thenReturn(BluetoothAdapter.STATE_OFF);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mBluetoothSwitch.onNotifyChange(intent);
+ verify(mBluetoothAdapter).enable();
+ }
+
+ @Test
+ public void onNotifyChange_disable_disablesBluetooth() {
+ when(mBluetoothAdapter.getState()).thenReturn(BluetoothAdapter.STATE_ON);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, false);
+ mBluetoothSwitch.onNotifyChange(intent);
+ verify(mBluetoothAdapter).disable();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/BluetoothSwitchWorkerTest.java b/tests/unit/src/com/android/car/settings/qc/BluetoothSwitchWorkerTest.java
new file mode 100644
index 0000000..6e47365
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/BluetoothSwitchWorkerTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.IntentFilter;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+
+@RunWith(AndroidJUnit4.class)
+public class BluetoothSwitchWorkerTest {
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private BluetoothSwitchWorker mWorker;
+
+ @Before
+ public void setUp() {
+ mWorker = new BluetoothSwitchWorker(mContext, SettingsQCRegistry.BLUETOOTH_SWITCH_URI);
+ }
+
+ @Test
+ public void onSubscribe_registersReceiver() {
+ ArgumentCaptor<IntentFilter> captor = ArgumentCaptor.forClass(IntentFilter.class);
+ mWorker.onQCItemSubscribe();
+ verify(mContext).registerReceiver(any(BroadcastReceiver.class), captor.capture());
+ assertThat(captor.getValue().hasAction(BluetoothAdapter.ACTION_STATE_CHANGED)).isTrue();
+ }
+
+ @Test
+ public void onUnsubscribe_unregistersReceiver() {
+ ArgumentCaptor<BroadcastReceiver> captor = ArgumentCaptor.forClass(BroadcastReceiver.class);
+ mWorker.onQCItemSubscribe();
+ verify(mContext).registerReceiver(captor.capture(), any(IntentFilter.class));
+ mWorker.onQCItemUnsubscribe();
+ verify(mContext).unregisterReceiver(captor.getValue());
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/BrightnessSliderTest.java b/tests/unit/src/com/android/car/settings/qc/BrightnessSliderTest.java
new file mode 100644
index 0000000..522eb74
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/BrightnessSliderTest.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class BrightnessSliderTest extends BrightnessSliderTestCase {
+ @Override
+ protected BrightnessSlider getBrightnessSlider() {
+ return new BrightnessSlider(getContext());
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/BrightnessSliderTestCase.java b/tests/unit/src/com/android/car/settings/qc/BrightnessSliderTestCase.java
new file mode 100644
index 0000000..02e42a8
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/BrightnessSliderTestCase.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_SLIDER_VALUE;
+import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
+import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
+import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.qc.QCSlider;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.MockitoAnnotations;
+
+public abstract class BrightnessSliderTestCase {
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private BrightnessSlider mBrightnessSlider;
+ private int mMaximumBacklight;
+ private int mMinimumBacklight;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mBrightnessSlider = getBrightnessSlider();
+ PowerManager powerManager = mContext.getSystemService(PowerManager.class);
+ mMaximumBacklight = powerManager.getMaximumScreenBrightnessSetting();
+ mMinimumBacklight = powerManager.getMinimumScreenBrightnessSetting();
+ }
+
+ @Test
+ public void getQCItem_titleSet() {
+ QCRow row = getBrightnessRow();
+ assertThat(row.getTitle()).isEqualTo(mContext.getString(R.string.qc_display_brightness));
+ }
+
+ @Test
+ public void getQCItem_createsSlider() {
+ QCRow row = getBrightnessRow();
+ QCSlider slider = row.getSlider();
+ assertThat(slider).isNotNull();
+ assertThat(slider.getMax()).isEqualTo(GAMMA_SPACE_MAX);
+ assertThat(slider.getValue()).isEqualTo(
+ convertLinearToGamma(getScreenBrightness(), mMinimumBacklight, mMaximumBacklight));
+ }
+
+ @Test
+ public void onNotifyChange_updatesBrightness() {
+ int oldValue = getScreenBrightness();
+ int newValue = oldValue == 50 ? 51 : 50; // ensure we use a different value
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_SLIDER_VALUE, newValue);
+ mBrightnessSlider.onNotifyChange(intent);
+ assertThat(getScreenBrightness()).isEqualTo(
+ convertGammaToLinear(newValue, mMinimumBacklight, mMaximumBacklight));
+ // restore old value
+ Settings.System.putIntForUser(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS, oldValue, UserHandle.myUserId());
+ }
+
+ protected abstract BrightnessSlider getBrightnessSlider();
+
+ protected Context getContext() {
+ return mContext;
+ }
+
+ protected QCRow getBrightnessRow() {
+ QCItem item = mBrightnessSlider.getQCItem();
+ assertThat(item).isNotNull();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ return list.getRows().get(0);
+ }
+
+ private int getScreenBrightness() {
+ try {
+ return Settings.System.getIntForUser(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS, UserHandle.myUserId());
+ } catch (Settings.SettingNotFoundException e) {
+ return GAMMA_SPACE_MAX;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/BrightnessSliderWithIconTest.java b/tests/unit/src/com/android/car/settings/qc/BrightnessSliderWithIconTest.java
new file mode 100644
index 0000000..5053fad
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/BrightnessSliderWithIconTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class BrightnessSliderWithIconTest extends BrightnessSliderTestCase {
+ @Override
+ protected BrightnessSlider getBrightnessSlider() {
+ return new BrightnessSliderWithIcon(getContext());
+ }
+
+ @Test
+ public void getQCItem_iconSet() {
+ QCRow row = getBrightnessRow();
+ assertThat(row.getStartIcon()).isNotNull();
+ assertThat(row.getStartIcon().getResId()).isEqualTo(R.drawable.ic_qc_brightness);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/CallVolumeSliderTest.java b/tests/unit/src/com/android/car/settings/qc/CallVolumeSliderTest.java
new file mode 100644
index 0000000..73ea0a5
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/CallVolumeSliderTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class CallVolumeSliderTest extends VolumeSliderTestCase {
+ private CallVolumeSlider mVolumeSlider;
+
+ @Before
+ public void setUp() {
+ super.setUp();
+ mVolumeSlider = new TestCallVolumeSlider(mContext);
+ }
+
+ @Test
+ public void getQCItem_titleSet() {
+ verifyTitleSet(getCallVolumeSlider(), R.string.test_volume_call);
+ }
+
+ @Test
+ public void getQCItem_iconSet() {
+ verifyIconSet(getCallVolumeSlider(), R.drawable.test_icon);
+ }
+
+ @Test
+ public void getQCItem_createsSlider() {
+ verifySliderCreated(getCallVolumeSlider());
+ }
+
+ @Test
+ public void onNotifyChange_updatesVolume() {
+ verifyVolumeChanged(mVolumeSlider, GROUP_ID);
+ }
+
+ protected QCRow getCallVolumeSlider() {
+ QCItem item = mVolumeSlider.getQCItem();
+ assertThat(item).isNotNull();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ return list.getRows().get(0);
+ }
+
+ private static class TestCallVolumeSlider extends CallVolumeSlider {
+ TestCallVolumeSlider(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected int carVolumeItemsXml() {
+ return R.xml.test_car_volume_items;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/HotspotRowTest.java b/tests/unit/src/com/android/car/settings/qc/HotspotRowTest.java
new file mode 100644
index 0000000..027eb5e
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/HotspotRowTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.TetheringManager;
+import android.net.wifi.SoftApConfiguration;
+import android.net.wifi.WifiManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+import com.android.internal.util.ConcurrentUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class HotspotRowTest {
+ private static final String TEST_SSID = "TEST_SSID";
+ private static final String TEST_PASSWORD = "TEST_PASSWORD";
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private HotspotRow mHotspotRow;
+
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private TetheringManager mTetheringManager;
+ @Mock
+ private SoftApConfiguration mSoftApConfiguration;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(TetheringManager.class)).thenReturn(mTetheringManager);
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+ when(mSoftApConfiguration.getSsid()).thenReturn(TEST_SSID);
+ when(mSoftApConfiguration.getPassphrase()).thenReturn(TEST_PASSWORD);
+ when(mSoftApConfiguration.getSecurityType()).thenReturn(
+ SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ when(mWifiManager.getSoftApConfiguration()).thenReturn(mSoftApConfiguration);
+
+ mHotspotRow = new HotspotRow(mContext);
+ }
+
+ @Test
+ public void getQCItem_setsTitleAndIcon() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED);
+ QCRow row = getHotspotRow();
+ assertThat(row.getTitle()).isEqualTo(mContext.getString(R.string.hotspot_settings_title));
+ assertThat(row.getStartIcon()).isNotNull();
+ assertThat(row.getStartIcon().getResId()).isEqualTo(R.drawable.ic_qc_hotspot);
+ }
+
+ @Test
+ public void getQCItem_hotspotDisabled_returnsRow() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED);
+ QCRow row = getHotspotRow();
+ assertThat(row.getSubtitle()).isEqualTo(
+ mContext.getString(R.string.wifi_hotspot_state_off));
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isFalse();
+ }
+
+ @Test
+ public void getQCItem_hotspotEnabled_noDevices_returnsRow() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_ENABLED);
+ QCRow row = getHotspotRow();
+ assertThat(row.getSubtitle()).isEqualTo(String.format("%s / %s", TEST_SSID, TEST_PASSWORD));
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isTrue();
+ }
+
+ @Test
+ public void getQCItem_hotspotEnabled_hasDevices_returnsRow() {
+ int connectedDevices = 1;
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_ENABLED);
+ mHotspotRow.setConnectedDevicesCount(connectedDevices);
+ QCRow row = getHotspotRow();
+ assertThat(row.getSubtitle()).isEqualTo(mContext.getResources().getQuantityString(
+ R.plurals.wifi_tether_connected_summary, connectedDevices,
+ connectedDevices));
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isTrue();
+ }
+
+ @Test
+ public void onNotifyChange_togglesHotspot() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mHotspotRow.onNotifyChange(intent);
+ verify(mTetheringManager).startTethering(eq(ConnectivityManager.TETHERING_WIFI),
+ eq(ConcurrentUtils.DIRECT_EXECUTOR), any());
+ }
+
+ private QCRow getHotspotRow() {
+ QCItem item = mHotspotRow.getQCItem();
+ assertThat(item).isNotNull();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ return list.getRows().get(0);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/HotspotRowWorkerTest.java b/tests/unit/src/com/android/car/settings/qc/HotspotRowWorkerTest.java
new file mode 100644
index 0000000..7b471e7
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/HotspotRowWorkerTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.TetheringManager;
+import android.net.wifi.SoftApInfo;
+import android.net.wifi.WifiClient;
+import android.net.wifi.WifiManager;
+import android.os.HandlerExecutor;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Executor;
+
+@RunWith(AndroidJUnit4.class)
+public class HotspotRowWorkerTest {
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private HotspotRowWorker mWorker;
+
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private TetheringManager mTetheringManager;
+ @Mock
+ private HotspotRow mQCItem;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+ when(mContext.getSystemService(TetheringManager.class)).thenReturn(mTetheringManager);
+ mWorker = new HotspotRowWorker(mContext, SettingsQCRegistry.HOTSPOT_ROW_URI);
+ mWorker.setQCItem(mQCItem);
+ }
+
+ @Test
+ public void onSubscribe_registersCallbacks() {
+ mWorker.onQCItemSubscribe();
+ verify(mTetheringManager).registerTetheringEventCallback(any(HandlerExecutor.class),
+ any(TetheringManager.TetheringEventCallback.class));
+ verify(mWifiManager).registerSoftApCallback(any(Executor.class),
+ any(WifiManager.SoftApCallback.class));
+ }
+
+ @Test
+ public void onUnsubscribe_unregistersCallbacks() {
+ ArgumentCaptor<TetheringManager.TetheringEventCallback> tetheringEventCaptor =
+ ArgumentCaptor.forClass(TetheringManager.TetheringEventCallback.class);
+ ArgumentCaptor<WifiManager.SoftApCallback> softApCaptor = ArgumentCaptor.forClass(
+ WifiManager.SoftApCallback.class);
+ mWorker.onQCItemSubscribe();
+ verify(mTetheringManager).registerTetheringEventCallback(any(HandlerExecutor.class),
+ tetheringEventCaptor.capture());
+ verify(mWifiManager).registerSoftApCallback(any(Executor.class),
+ softApCaptor.capture());
+
+ mWorker.onQCItemUnsubscribe();
+ verify(mTetheringManager).unregisterTetheringEventCallback(tetheringEventCaptor.getValue());
+ verify(mWifiManager).unregisterSoftApCallback(softApCaptor.getValue());
+ }
+
+ @Test
+ public void onTetheringSupported_updatesQCItem() {
+ when(mQCItem.getHotspotSupported()).thenReturn(true);
+ ArgumentCaptor<TetheringManager.TetheringEventCallback> tetheringEventCaptor =
+ ArgumentCaptor.forClass(TetheringManager.TetheringEventCallback.class);
+ mWorker.onQCItemSubscribe();
+ verify(mTetheringManager).registerTetheringEventCallback(any(HandlerExecutor.class),
+ tetheringEventCaptor.capture());
+
+ TetheringManager.TetheringEventCallback callback = tetheringEventCaptor.getValue();
+ callback.onTetheringSupported(false);
+ verify(mQCItem).setHotspotSupported(false);
+ }
+
+ @Test
+ public void onConnectedClientsChanged_updatesQCItem() {
+ ArgumentCaptor<WifiManager.SoftApCallback> softApCaptor = ArgumentCaptor.forClass(
+ WifiManager.SoftApCallback.class);
+ mWorker.onQCItemSubscribe();
+ verify(mWifiManager).registerSoftApCallback(any(Executor.class),
+ softApCaptor.capture());
+
+ WifiManager.SoftApCallback callback = softApCaptor.getValue();
+ SoftApInfo info = mock(SoftApInfo.class);
+ List<WifiClient> clients = Collections.singletonList(mock(WifiClient.class));
+ callback.onConnectedClientsChanged(info, clients);
+ verify(mQCItem).setConnectedDevicesCount(1);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/HotspotTileTest.java b/tests/unit/src/com/android/car/settings/qc/HotspotTileTest.java
new file mode 100644
index 0000000..2c546a9
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/HotspotTileTest.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.TetheringManager;
+import android.net.wifi.WifiManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCTile;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.concurrent.Executor;
+
+@RunWith(AndroidJUnit4.class)
+public class HotspotTileTest {
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private HotspotTile mHotspotTile;
+
+ @Mock
+ private TetheringManager mTetheringManager;
+ @Mock
+ private WifiManager mWifiManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(TetheringManager.class)).thenReturn(mTetheringManager);
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+
+ mHotspotTile = new HotspotTile(mContext);
+ }
+
+ @Test
+ public void getQCItem_titleAndIconSet() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED);
+ QCTile tile = getTile();
+ assertThat(tile.getSubtitle()).isEqualTo(
+ mContext.getString(R.string.hotspot_settings_title));
+ assertThat(tile.getIcon()).isNotNull();
+ }
+
+ @Test
+ public void getQCItem_hotspotDisabled_tileUnchecked() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED);
+ QCTile tile = getTile();
+ assertThat(tile.isChecked()).isFalse();
+ assertThat(tile.isEnabled()).isTrue();
+ assertThat(tile.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void getQCItem_hotspotEnabled_tileChecked() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_ENABLED);
+ QCTile tile = getTile();
+ assertThat(tile.isChecked()).isTrue();
+ assertThat(tile.isEnabled()).isTrue();
+ assertThat(tile.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void getQCItem_hotspotBusy_tileDisabled() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_ENABLING);
+ QCTile tile = getTile();
+ assertThat(tile.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void getQCItem_hotspotUnsupported_tileUnavailable() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED);
+ mHotspotTile.setHotspotSupported(false);
+ QCTile tile = getTile();
+ assertThat(tile.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void onNotifyChange_togglesHotspot() {
+ when(mWifiManager.getWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mHotspotTile.onNotifyChange(intent);
+ verify(mTetheringManager).startTethering(eq(ConnectivityManager.TETHERING_WIFI),
+ any(Executor.class), any(TetheringManager.StartTetheringCallback.class));
+ }
+
+ private QCTile getTile() {
+ QCItem item = mHotspotTile.getQCItem();
+ assertThat(item).isNotNull();
+ assertThat(item instanceof QCTile).isTrue();
+ return (QCTile) item;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/HotspotTileWorkerTest.java b/tests/unit/src/com/android/car/settings/qc/HotspotTileWorkerTest.java
new file mode 100644
index 0000000..a364ade
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/HotspotTileWorkerTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.TetheringManager;
+import android.net.wifi.WifiManager;
+import android.os.HandlerExecutor;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.concurrent.Executor;
+
+@RunWith(AndroidJUnit4.class)
+public class HotspotTileWorkerTest {
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private HotspotTileWorker mWorker;
+
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private TetheringManager mTetheringManager;
+ @Mock
+ private HotspotTile mQCItem;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+ when(mContext.getSystemService(TetheringManager.class)).thenReturn(mTetheringManager);
+ mWorker = new HotspotTileWorker(mContext, SettingsQCRegistry.HOTSPOT_TILE_URI);
+ mWorker.setQCItem(mQCItem);
+ }
+
+ @Test
+ public void onSubscribe_registersCallbacks() {
+ mWorker.onQCItemSubscribe();
+ verify(mTetheringManager).registerTetheringEventCallback(any(HandlerExecutor.class),
+ any(TetheringManager.TetheringEventCallback.class));
+ verify(mWifiManager).registerSoftApCallback(any(Executor.class),
+ any(WifiManager.SoftApCallback.class));
+ }
+
+ @Test
+ public void onUnsubscribe_unregistersCallbacks() {
+ ArgumentCaptor<TetheringManager.TetheringEventCallback> tetheringEventCaptor =
+ ArgumentCaptor.forClass(TetheringManager.TetheringEventCallback.class);
+ ArgumentCaptor<WifiManager.SoftApCallback> softApCaptor = ArgumentCaptor.forClass(
+ WifiManager.SoftApCallback.class);
+ mWorker.onQCItemSubscribe();
+ verify(mTetheringManager).registerTetheringEventCallback(any(HandlerExecutor.class),
+ tetheringEventCaptor.capture());
+ verify(mWifiManager).registerSoftApCallback(any(Executor.class),
+ softApCaptor.capture());
+
+ mWorker.onQCItemUnsubscribe();
+ verify(mTetheringManager).unregisterTetheringEventCallback(tetheringEventCaptor.getValue());
+ verify(mWifiManager).unregisterSoftApCallback(softApCaptor.getValue());
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/MediaVolumeSliderTest.java b/tests/unit/src/com/android/car/settings/qc/MediaVolumeSliderTest.java
new file mode 100644
index 0000000..b5062b2
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/MediaVolumeSliderTest.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class MediaVolumeSliderTest extends VolumeSliderTestCase {
+
+ private MediaVolumeSlider mVolumeSlider;
+
+ @Before
+ public void setUp() {
+ super.setUp();
+ mVolumeSlider = new TestMediaVolumeSlider(mContext);
+ }
+
+ @Test
+ public void getQCItem_titleSet() {
+ verifyTitleSet(getMediaVolumeSlider(), R.string.test_volume_music);
+ }
+
+ @Test
+ public void getQCItem_iconSet() {
+ verifyIconSet(getMediaVolumeSlider(), R.drawable.test_icon);
+ }
+
+ @Test
+ public void getQCItem_createsSlider() {
+ verifySliderCreated(getMediaVolumeSlider());
+ }
+
+ @Test
+ public void onNotifyChange_updatesVolume() {
+ verifyVolumeChanged(mVolumeSlider, GROUP_ID);
+ }
+
+ protected QCRow getMediaVolumeSlider() {
+ QCItem item = mVolumeSlider.getQCItem();
+ assertThat(item).isNotNull();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ return list.getRows().get(0);
+ }
+
+ private static class TestMediaVolumeSlider extends MediaVolumeSlider {
+ TestMediaVolumeSlider(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected int carVolumeItemsXml() {
+ return R.xml.test_car_volume_items;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/MobileDataBaseWorkerTestCase.java b/tests/unit/src/com/android/car/settings/qc/MobileDataBaseWorkerTestCase.java
new file mode 100644
index 0000000..7dc589b
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/MobileDataBaseWorkerTestCase.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.telephony.SubscriptionManager;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+public abstract class MobileDataBaseWorkerTestCase<E extends MobileDataBaseWorker> {
+ private static final int DEFAULT_SUB_ID = 1;
+
+ protected final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private E mWorker;
+ private MockitoSession mSession;
+
+ @Mock
+ private ContentResolver mContentResolver;
+
+ protected abstract E getWorker();
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mSession = ExtendedMockito.mockitoSession()
+ .mockStatic(SubscriptionManager.class, withSettings().lenient())
+ .startMocking();
+
+ when(mContext.getContentResolver()).thenReturn(mContentResolver);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void onSubscribe_validSubId_registerObserver() {
+ createWorker(DEFAULT_SUB_ID);
+ mWorker.onQCItemSubscribe();
+ verify(mContentResolver).registerContentObserver(any(Uri.class), eq(false),
+ any(ContentObserver.class));
+ }
+
+ @Test
+ public void onSubscribe_invalidSubId_doesNotRegisterObserver() {
+ createWorker(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ mWorker.onQCItemSubscribe();
+ verify(mContentResolver, never()).registerContentObserver(any(Uri.class), eq(false),
+ any(ContentObserver.class));
+ }
+
+ @Test
+ public void onUnsubscribe_unregistersObserver() {
+ createWorker(DEFAULT_SUB_ID);
+ ArgumentCaptor<ContentObserver> captor = ArgumentCaptor.forClass(ContentObserver.class);
+ mWorker.onQCItemSubscribe();
+ verify(mContentResolver).registerContentObserver(any(Uri.class), eq(false),
+ captor.capture());
+ mWorker.onQCItemUnsubscribe();
+ verify(mContentResolver).unregisterContentObserver(captor.getValue());
+ }
+
+ private void createWorker(int subId) {
+ when(SubscriptionManager.getDefaultDataSubscriptionId()).thenReturn(subId);
+ mWorker = getWorker();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/MobileDataRowTest.java b/tests/unit/src/com/android/car/settings/qc/MobileDataRowTest.java
new file mode 100644
index 0000000..b5bed62
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/MobileDataRowTest.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.telephony.TelephonyManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.settingslib.net.DataUsageController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class MobileDataRowTest {
+ private static final String TEST_NETWORK_NAME = "TEST_NETWORK";
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private MobileDataRow mMobileDataRow;
+
+ @Mock
+ private DataUsageController mDataUsageController;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ mMobileDataRow = new TestMobileDataRow(mContext);
+ }
+
+ @Test
+ public void getQCItem_mobileDataUnsupported_returnsNull() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(false);
+ QCItem item = mMobileDataRow.getQCItem();
+ assertThat(item).isNull();
+ }
+
+ @Test
+ public void getQCItem_mobileDataDisabled_switchUnchecked() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn(TEST_NETWORK_NAME);
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(false);
+ QCRow row = getRow();
+ assertThat(row.getEndItems().get(0).isChecked()).isFalse();
+ }
+
+ @Test
+ public void getQCItem_mobileDataEnabled_switchChecked() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn(TEST_NETWORK_NAME);
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(true);
+ QCRow row = getRow();
+ assertThat(row.getEndItems().get(0).isChecked()).isTrue();
+ }
+
+ @Test
+ public void getQCItem_noNetworkName_nullSubtitle() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn("");
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(true);
+ QCRow row = getRow();
+ assertThat(row.getSubtitle()).isNull();
+ }
+
+ @Test
+ public void getQCItem_hasNetworkName_setsSubtitle() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn(TEST_NETWORK_NAME);
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(true);
+ QCRow row = getRow();
+ assertThat(row.getSubtitle()).isEqualTo(TEST_NETWORK_NAME);
+ }
+
+ @Test
+ public void onNotifyChange_togglesMobileData() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn(TEST_NETWORK_NAME);
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(false);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mMobileDataRow.onNotifyChange(intent);
+ verify(mDataUsageController).setMobileDataEnabled(true);
+ }
+
+ private QCRow getRow() {
+ QCItem item = mMobileDataRow.getQCItem();
+ assertThat(item).isNotNull();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ return list.getRows().get(0);
+ }
+
+ private class TestMobileDataRow extends MobileDataRow {
+
+ TestMobileDataRow(Context context) {
+ super(context);
+ }
+
+ @Override
+ DataUsageController getDataUsageController(Context context) {
+ return mDataUsageController;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/MobileDataRowWorkerTest.java b/tests/unit/src/com/android/car/settings/qc/MobileDataRowWorkerTest.java
new file mode 100644
index 0000000..f15f24c
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/MobileDataRowWorkerTest.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class MobileDataRowWorkerTest extends MobileDataBaseWorkerTestCase<MobileDataRowWorker> {
+ @Override
+ protected MobileDataRowWorker getWorker() {
+ return new MobileDataRowWorker(mContext, SettingsQCRegistry.MOBILE_DATA_ROW_URI);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/MobileDataTileTest.java b/tests/unit/src/com/android/car/settings/qc/MobileDataTileTest.java
new file mode 100644
index 0000000..f3c3905
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/MobileDataTileTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.telephony.TelephonyManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCTile;
+import com.android.car.settings.R;
+import com.android.settingslib.net.DataUsageController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class MobileDataTileTest {
+ private static final String TEST_NETWORK_NAME = "TEST_NETWORK";
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private MobileDataTile mMobileDataTile;
+
+ @Mock
+ private DataUsageController mDataUsageController;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ mMobileDataTile = new TestMobileDataTile(mContext);
+ }
+
+ @Test
+ public void getQCItem_mobileDataUnsupported_returnsNull() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(false);
+ QCItem item = mMobileDataTile.getQCItem();
+ assertThat(item).isNull();
+ }
+
+ @Test
+ public void getQCItem_mobileDataDisabled_tileUnchecked() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn(TEST_NETWORK_NAME);
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(false);
+ QCTile tile = getTile();
+ assertThat(tile.isChecked()).isFalse();
+ }
+
+ @Test
+ public void getQCItem_mobileDataEnabled_tileChecked() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn(TEST_NETWORK_NAME);
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(true);
+ QCTile tile = getTile();
+ assertThat(tile.isChecked()).isTrue();
+ }
+
+ @Test
+ public void getQCItem_noNetworkName_setsDefaultSubtitle() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn("");
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(true);
+ QCTile tile = getTile();
+ assertThat(tile.getSubtitle()).isEqualTo(
+ mContext.getString(R.string.mobile_network_toggle_title));
+ }
+
+ @Test
+ public void getQCItem_hasNetworkName_setsSubtitle() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn(TEST_NETWORK_NAME);
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(true);
+ QCTile tile = getTile();
+ assertThat(tile.getSubtitle()).isEqualTo(TEST_NETWORK_NAME);
+ }
+
+ @Test
+ public void onNotifyChange_togglesMobileData() {
+ when(mDataUsageController.isMobileDataSupported()).thenReturn(true);
+ when(mTelephonyManager.getNetworkOperatorName()).thenReturn(TEST_NETWORK_NAME);
+ when(mDataUsageController.isMobileDataEnabled()).thenReturn(false);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mMobileDataTile.onNotifyChange(intent);
+ verify(mDataUsageController).setMobileDataEnabled(true);
+ }
+
+ private QCTile getTile() {
+ QCItem item = mMobileDataTile.getQCItem();
+ assertThat(item instanceof QCTile).isTrue();
+ return (QCTile) item;
+ }
+
+ private class TestMobileDataTile extends MobileDataTile {
+
+ TestMobileDataTile(Context context) {
+ super(context);
+ }
+
+ @Override
+ DataUsageController getDataUsageController(Context context) {
+ return mDataUsageController;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/MobileDataTileWorkerTest.java b/tests/unit/src/com/android/car/settings/qc/MobileDataTileWorkerTest.java
new file mode 100644
index 0000000..98bcdee
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/MobileDataTileWorkerTest.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class MobileDataTileWorkerTest extends MobileDataBaseWorkerTestCase<MobileDataTileWorker> {
+ @Override
+ protected MobileDataTileWorker getWorker() {
+ return new MobileDataTileWorker(mContext, SettingsQCRegistry.MOBILE_DATA_TILE_URI);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/NavigationVolumeSliderTest.java b/tests/unit/src/com/android/car/settings/qc/NavigationVolumeSliderTest.java
new file mode 100644
index 0000000..6c5d5c1
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/NavigationVolumeSliderTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class NavigationVolumeSliderTest extends VolumeSliderTestCase {
+ private NavigationVolumeSlider mVolumeSlider;
+
+ @Before
+ public void setUp() {
+ super.setUp();
+ mVolumeSlider = new TestNavigationVolumeSlider(mContext);
+ }
+
+ @Test
+ public void getQCItem_titleSet() {
+ verifyTitleSet(getNavigationVolumeSlider(), R.string.test_volume_navigation);
+ }
+
+ @Test
+ public void getQCItem_iconSet() {
+ verifyIconSet(getNavigationVolumeSlider(), R.drawable.test_icon);
+ }
+
+ @Test
+ public void getQCItem_createsSlider() {
+ verifySliderCreated(getNavigationVolumeSlider());
+ }
+
+ @Test
+ public void onNotifyChange_updatesVolume() {
+ verifyVolumeChanged(mVolumeSlider, GROUP_ID);
+ }
+
+ protected QCRow getNavigationVolumeSlider() {
+ QCItem item = mVolumeSlider.getQCItem();
+ assertThat(item).isNotNull();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ return list.getRows().get(0);
+ }
+
+ private static class TestNavigationVolumeSlider extends NavigationVolumeSlider {
+ TestNavigationVolumeSlider(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected int carVolumeItemsXml() {
+ return R.xml.test_car_volume_items;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/PairedBluetoothDevicesTest.java b/tests/unit/src/com/android/car/settings/qc/PairedBluetoothDevicesTest.java
new file mode 100644
index 0000000..5aa9670
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/PairedBluetoothDevicesTest.java
@@ -0,0 +1,310 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+import static com.android.car.settings.qc.PairedBluetoothDevices.BLUETOOTH_BUTTON;
+import static com.android.car.settings.qc.PairedBluetoothDevices.EXTRA_BUTTON_TYPE;
+import static com.android.car.settings.qc.PairedBluetoothDevices.EXTRA_DEVICE_KEY;
+import static com.android.car.settings.qc.PairedBluetoothDevices.MEDIA_BUTTON;
+import static com.android.car.settings.qc.PairedBluetoothDevices.PHONE_BUTTON;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+public class PairedBluetoothDevicesTest {
+ private static final String DEFAULT_NAME = "DEFAULT_NAME";
+ private static final String DEFAULT_SUMMARY = "DEFAULT_SUMMARY";
+ private static final String DEFAULT_ADDRESS = "F6:8F:AC:E8:32:50";
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private PairedBluetoothDevices mPairedBluetoothDevices;
+ private MockitoSession mSession;
+ private ArrayList<CachedBluetoothDevice> mCachedDevices = new ArrayList<>();
+ private Set<BluetoothDevice> mBondedDevices = new HashSet<>();
+
+ @Mock
+ private BluetoothAdapter mBluetoothAdapter;
+ @Mock
+ private LocalBluetoothAdapter mLocalBluetoothAdapter;
+ @Mock
+ private LocalBluetoothManager mBluetoothManager;
+ @Mock
+ private UserManager mUserManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mSession = ExtendedMockito.mockitoSession()
+ .strictness(Strictness.LENIENT)
+ .mockStatic(BluetoothAdapter.class)
+ .mockStatic(LocalBluetoothManager.class)
+ .mockStatic(UserManager.class)
+ .startMocking();
+ when(BluetoothAdapter.getDefaultAdapter()).thenReturn(mBluetoothAdapter);
+ when(mBluetoothAdapter.isEnabled()).thenReturn(true);
+ when(LocalBluetoothManager.getInstance(any(), any())).thenReturn(mBluetoothManager);
+ when(mBluetoothManager.getBluetoothAdapter()).thenReturn(mLocalBluetoothAdapter);
+ when(mLocalBluetoothAdapter.getBondedDevices()).thenReturn(mBondedDevices);
+ when(UserManager.get(any())).thenReturn(mUserManager);
+ when(mUserManager.hasUserRestriction(DISALLOW_BLUETOOTH)).thenReturn(false);
+
+ CachedBluetoothDeviceManager deviceManager = mock(CachedBluetoothDeviceManager.class);
+ when(mBluetoothManager.getCachedDeviceManager()).thenReturn(deviceManager);
+ when(deviceManager.getCachedDevicesCopy()).thenReturn(mCachedDevices);
+
+ mPairedBluetoothDevices = new PairedBluetoothDevices(mContext);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void getQCItem_bluetoothDisallowed_returnsNull() {
+ when(mUserManager.hasUserRestriction(DISALLOW_BLUETOOTH)).thenReturn(true);
+ QCItem item = mPairedBluetoothDevices.getQCItem();
+ assertThat(item).isNull();
+ }
+
+ @Test
+ public void getQCItem_bluetoothDisabled_returnsBluetoothDisabledMessage() {
+ when(mBluetoothAdapter.isEnabled()).thenReturn(false);
+ QCItem item = mPairedBluetoothDevices.getQCItem();
+ assertThat(item).isNotNull();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ QCRow row = list.getRows().get(0);
+ assertThat(row.getTitle()).isEqualTo(
+ mContext.getString(R.string.qc_bluetooth_off_devices_info));
+ assertThat(row.getStartIcon()).isNotNull();
+ }
+
+ @Test
+ public void getQCItem_noDevices_returnsPairMessage() {
+ QCList list = (QCList) mPairedBluetoothDevices.getQCItem();
+ assertThat(list.getRows().size()).isEqualTo(1);
+ QCRow row = list.getRows().get(0);
+ assertThat(row.getTitle()).isEqualTo(
+ mContext.getString(R.string.qc_bluetooth_on_no_devices_info));
+ assertThat(row.getStartIcon()).isNotNull();
+ }
+
+ @Test
+ public void getQCItem_hasDevices_hasRows() {
+ addBluetoothDevice("Device1", /* connected= */ true, /* busy= */ false,
+ /* phoneEnabled= */ true, /* mediaEnabled= */ true);
+ addBluetoothDevice("Device2", /* connected= */ true, /* busy= */ false,
+ /* phoneEnabled= */ true, /* mediaEnabled= */ true);
+ QCList list = (QCList) mPairedBluetoothDevices.getQCItem();
+ assertThat(list.getRows().size()).isEqualTo(2);
+ }
+
+ @Test
+ public void getQCItem_limitsDeviceCount() {
+ addBluetoothDevice("Device1", /* connected= */ true, /* busy= */ false,
+ /* phoneEnabled= */ true, /* mediaEnabled= */ true);
+ addBluetoothDevice("Device2", /* connected= */ false, /* busy= */ false,
+ /* phoneEnabled= */ false, /* mediaEnabled= */ false);
+ addBluetoothDevice("Device3", /* connected= */ false, /* busy= */ false,
+ /* phoneEnabled= */ false, /* mediaEnabled= */ false);
+ addBluetoothDevice("Device4", /* connected= */ false, /* busy= */ false,
+ /* phoneEnabled= */ false, /* mediaEnabled= */ false);
+ QCList list = (QCList) mPairedBluetoothDevices.getQCItem();
+ assertThat(list.getRows().size()).isEqualTo(3);
+ }
+
+ @Test
+ public void getQCItem_setsTitle() {
+ addBluetoothDevice(DEFAULT_NAME, /* connected= */ true, /* busy= */ false,
+ /* phoneEnabled= */ true, /* mediaEnabled= */ true);
+ QCList list = (QCList) mPairedBluetoothDevices.getQCItem();
+ QCRow row = list.getRows().get(0);
+ assertThat(row.getTitle()).isEqualTo(DEFAULT_NAME);
+ }
+
+ @Test
+ public void getQCItem_bluetoothDisabled_togglesUpdated() {
+ addBluetoothDevice(DEFAULT_NAME, /* connected= */ false, /* busy= */ false,
+ /* phoneEnabled= */ true, /* mediaEnabled= */ true);
+ QCList list = (QCList) mPairedBluetoothDevices.getQCItem();
+ QCRow row = list.getRows().get(0);
+ QCActionItem btToggle = row.getEndItems().get(0);
+ QCActionItem phoneToggle = row.getEndItems().get(1);
+ QCActionItem mediaToggle = row.getEndItems().get(2);
+ assertThat(btToggle.isChecked()).isFalse();
+ assertThat(btToggle.isEnabled()).isTrue();
+ assertThat(phoneToggle.isAvailable()).isFalse();
+ assertThat(mediaToggle.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void getQCItem_bluetoothEnabled_togglesUpdated() {
+ addBluetoothDevice(DEFAULT_NAME, /* connected= */ true, /* busy= */ false,
+ /* phoneEnabled= */ true, /* mediaEnabled= */ true);
+ QCList list = (QCList) mPairedBluetoothDevices.getQCItem();
+ QCRow row = list.getRows().get(0);
+ QCActionItem btToggle = row.getEndItems().get(0);
+ QCActionItem phoneToggle = row.getEndItems().get(1);
+ QCActionItem mediaToggle = row.getEndItems().get(2);
+ assertThat(btToggle.isChecked()).isTrue();
+ assertThat(btToggle.isEnabled()).isTrue();
+ assertThat(phoneToggle.isChecked()).isTrue();
+ assertThat(phoneToggle.isEnabled()).isTrue();
+ assertThat(phoneToggle.isAvailable()).isTrue();
+ assertThat(mediaToggle.isChecked()).isTrue();
+ assertThat(mediaToggle.isEnabled()).isTrue();
+ assertThat(mediaToggle.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void getQCItem_isBusy_togglesDisabled() {
+ addBluetoothDevice(DEFAULT_NAME, /* connected= */ true, /* busy= */ true,
+ /* phoneEnabled= */ true, /* mediaEnabled= */ true);
+ QCList list = (QCList) mPairedBluetoothDevices.getQCItem();
+ QCRow row = list.getRows().get(0);
+ QCActionItem btToggle = row.getEndItems().get(0);
+ QCActionItem phoneToggle = row.getEndItems().get(1);
+ QCActionItem mediaToggle = row.getEndItems().get(2);
+ assertThat(btToggle.isEnabled()).isFalse();
+ assertThat(phoneToggle.isEnabled()).isFalse();
+ assertThat(mediaToggle.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void onNotifyChange_toggleBluetooth() {
+ addBluetoothDevice(DEFAULT_NAME, /* connected= */ false, /* busy= */ true,
+ /* phoneEnabled= */ true, /* mediaEnabled= */ true);
+ Intent intent = new Intent();
+ intent.putExtra(EXTRA_DEVICE_KEY, DEFAULT_ADDRESS);
+ intent.putExtra(EXTRA_BUTTON_TYPE, BLUETOOTH_BUTTON);
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mPairedBluetoothDevices.onNotifyChange(intent);
+ CachedBluetoothDevice device = mCachedDevices.get(0);
+ verify(device).connect();
+ }
+
+ @Test
+ public void onNotifyChange_togglePhone() {
+ addBluetoothDevice(DEFAULT_NAME, /* connected= */ false, /* busy= */ true,
+ /* phoneEnabled= */ false, /* mediaEnabled= */ true);
+ Intent intent = new Intent();
+ intent.putExtra(EXTRA_DEVICE_KEY, DEFAULT_ADDRESS);
+ intent.putExtra(EXTRA_BUTTON_TYPE, PHONE_BUTTON);
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mPairedBluetoothDevices.onNotifyChange(intent);
+ CachedBluetoothDevice device = mCachedDevices.get(0);
+ LocalBluetoothProfile profile = getProfile(device, BluetoothProfile.HEADSET_CLIENT);
+ verify(profile).setEnabled(any(), eq(true));
+ }
+
+ @Test
+ public void onNotifyChange_toggleMedia() {
+ addBluetoothDevice(DEFAULT_NAME, /* connected= */ false, /* busy= */ true,
+ /* phoneEnabled= */ true, /* mediaEnabled= */ false);
+ Intent intent = new Intent();
+ intent.putExtra(EXTRA_DEVICE_KEY, DEFAULT_ADDRESS);
+ intent.putExtra(EXTRA_BUTTON_TYPE, MEDIA_BUTTON);
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mPairedBluetoothDevices.onNotifyChange(intent);
+ CachedBluetoothDevice device = mCachedDevices.get(0);
+ LocalBluetoothProfile profile = getProfile(device, BluetoothProfile.A2DP_SINK);
+ verify(profile).setEnabled(any(), eq(true));
+ }
+
+ private void addBluetoothDevice(String name, boolean connected, boolean busy,
+ boolean phoneEnabled, boolean mediaEnabled) {
+ CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
+ BluetoothDevice device = mock(BluetoothDevice.class);
+ when(cachedDevice.getDevice()).thenReturn(device);
+ when(device.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(cachedDevice.getName()).thenReturn(name);
+ when(cachedDevice.getAddress()).thenReturn(DEFAULT_ADDRESS);
+ when(cachedDevice.isConnected()).thenReturn(connected);
+ when(cachedDevice.isBusy()).thenReturn(busy);
+ when(cachedDevice.getCarConnectionSummary()).thenReturn(DEFAULT_SUMMARY);
+ BluetoothClass btClass = mock(BluetoothClass.class);
+ when(cachedDevice.getBtClass()).thenReturn(btClass);
+ when(btClass.getMajorDeviceClass()).thenReturn(BluetoothClass.Device.Major.PHONE);
+ LocalBluetoothProfile phoneProfile = mock(LocalBluetoothProfile.class);
+ LocalBluetoothProfile mediaProfile = mock(LocalBluetoothProfile.class);
+ when(phoneProfile.getProfileId()).thenReturn(BluetoothProfile.HEADSET_CLIENT);
+ when(mediaProfile.getProfileId()).thenReturn(BluetoothProfile.A2DP_SINK);
+ when(phoneProfile.isEnabled(any())).thenReturn(phoneEnabled);
+ when(mediaProfile.isEnabled(any())).thenReturn(mediaEnabled);
+ when(cachedDevice.getProfiles()).thenReturn(Arrays.asList(phoneProfile, mediaProfile));
+ mCachedDevices.add(cachedDevice);
+ mBondedDevices.add(device);
+ }
+
+ private LocalBluetoothProfile getProfile(CachedBluetoothDevice device, int profileId) {
+ for (LocalBluetoothProfile profile : device.getProfiles()) {
+ if (profile.getProfileId() == profileId) {
+ return profile;
+ }
+ }
+ return null;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/PairedBluetoothDevicesWorkerTest.java b/tests/unit/src/com/android/car/settings/qc/PairedBluetoothDevicesWorkerTest.java
new file mode 100644
index 0000000..cd51c07
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/PairedBluetoothDevicesWorkerTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+@RunWith(AndroidJUnit4.class)
+public class PairedBluetoothDevicesWorkerTest {
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private PairedBluetoothDevicesWorker mWorker;
+ private MockitoSession mSession;
+
+ @Mock
+ private LocalBluetoothManager mLocalBluetoothManager;
+ @Mock
+ private BluetoothEventManager mBluetoothEventManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mSession = ExtendedMockito.mockitoSession().mockStatic(
+ LocalBluetoothManager.class, withSettings().lenient()).startMocking();
+ when(LocalBluetoothManager.getInstance(any(), any())).thenReturn(mLocalBluetoothManager);
+ when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager);
+ mWorker = new PairedBluetoothDevicesWorker(mContext,
+ SettingsQCRegistry.PAIRED_BLUETOOTH_DEVICES_URI);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void onSubscribe_registersReceiver() {
+ mWorker.onQCItemSubscribe();
+ verify(mBluetoothEventManager).registerCallback(mWorker);
+ }
+
+ @Test
+ public void onUnsubscribe_unregistersReceiver() {
+ mWorker.onQCItemSubscribe();
+ mWorker.onQCItemUnsubscribe();
+ verify(mBluetoothEventManager).unregisterCallback(mWorker);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/QCTestUtils.java b/tests/unit/src/com/android/car/settings/qc/QCTestUtils.java
new file mode 100644
index 0000000..62f1bd7
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/QCTestUtils.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.ContentResolver;
+import android.net.Uri;
+
+public class QCTestUtils {
+ public static final String AUTHORITY = "com.android.car.settings.test.unit";
+ public static final Uri URI = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY).appendPath("SettingsQCProviderTest")
+ .build();
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/SettingsQCBroadcastReceiverTest.java b/tests/unit/src/com/android/car/settings/qc/SettingsQCBroadcastReceiverTest.java
new file mode 100644
index 0000000..322b6a5
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/SettingsQCBroadcastReceiverTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class SettingsQCBroadcastReceiverTest {
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private SettingsQCBroadcastReceiver mReceiver;
+ private TestSettingsQCItem mQCItem;
+
+ @Before
+ public void setUp() {
+ SettingsQCRegistry.sUriToQC.clear();
+ SettingsQCRegistry.sUriToQC.put(QCTestUtils.URI, TestSettingsQCItem.class);
+ mReceiver = new TestSettingsQCBroadcastReceiver();
+ mQCItem = spy(new TestSettingsQCItem(mContext));
+ }
+
+ @Test
+ public void onReceive_notifiesChange() {
+ Intent intent = new Intent();
+ intent.setAction(QCTestUtils.URI.toString());
+ mReceiver.onReceive(mContext, intent);
+ verify(mQCItem).onNotifyChange(intent);
+ }
+
+ private class TestSettingsQCBroadcastReceiver extends SettingsQCBroadcastReceiver {
+ @Override
+ SettingsQCItem createQCItemInstance(Context context,
+ Class<? extends SettingsQCItem> qcItem) {
+ return mQCItem;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/SettingsQCProviderTest.java b/tests/unit/src/com/android/car/settings/qc/SettingsQCProviderTest.java
new file mode 100644
index 0000000..37d974f
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/SettingsQCProviderTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.content.Context;
+import android.net.Uri;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+public class SettingsQCProviderTest {
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private SettingsQCProvider mProvider;
+
+ @Before
+ public void setUp() {
+ SettingsQCRegistry.sUriToQC.clear();
+ SettingsQCRegistry.sUriToQC.put(QCTestUtils.URI, TestSettingsQCItem.class);
+ mProvider = new SettingsQCProvider();
+ ExtendedMockito.spyOn(mProvider);
+ ExtendedMockito.doReturn(mContext).when(mProvider).getContext();
+ ExtendedMockito.doReturn(mContext.getPackageName()).when(mProvider).getCallingPackage();
+ }
+
+ @Test
+ public void onCreate_allowlistSet() {
+ mProvider.onCreate();
+ Set<String> allowlist = mProvider.getAllowlistedPackages();
+ assertThat(allowlist.contains(QCTestUtils.AUTHORITY)).isTrue();
+ }
+
+ @Test
+ public void onBind_invalidUri_throwsException() {
+ mProvider.onCreate();
+ assertThrows(IllegalArgumentException.class,
+ () -> mProvider.onBind(Uri.EMPTY));
+ }
+
+ @Test
+ public void onBind_validUri_returnsQCItem() {
+ mProvider.onCreate();
+ assertThat(mProvider.onBind(QCTestUtils.URI)).isNotNull();
+ }
+
+ @Test
+ public void onSubscribe_startsBackgroundWorker() {
+ mProvider.onCreate();
+ mProvider.onSubscribed(QCTestUtils.URI);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ SettingsQCBackgroundWorker worker = mProvider.mSubscribedWorkers.get(QCTestUtils.URI);
+ assertThat(worker).isNotNull();
+ assertThat(worker instanceof TestSettingsQCBackgroundWorker).isTrue();
+ TestSettingsQCBackgroundWorker testWorker = (TestSettingsQCBackgroundWorker) worker;
+ assertThat(testWorker.isSubscribed()).isTrue();
+ }
+
+ @Test
+ public void onSubscribe_stopsBackgroundWorker() {
+ mProvider.onCreate();
+ mProvider.onSubscribed(QCTestUtils.URI);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ SettingsQCBackgroundWorker worker = mProvider.mSubscribedWorkers.get(QCTestUtils.URI);
+ assertThat(worker).isNotNull();
+ assertThat(worker instanceof TestSettingsQCBackgroundWorker).isTrue();
+ TestSettingsQCBackgroundWorker testWorker = (TestSettingsQCBackgroundWorker) worker;
+ mProvider.onUnsubscribed(QCTestUtils.URI);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ assertThat(testWorker.isSubscribed()).isFalse();
+ assertThat(mProvider.mSubscribedWorkers.containsKey(QCTestUtils.URI)).isFalse();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/SettingsQCRegistryTest.java b/tests/unit/src/com/android/car/settings/qc/SettingsQCRegistryTest.java
new file mode 100644
index 0000000..ee01de3
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/SettingsQCRegistryTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.net.Uri;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class SettingsQCRegistryTest {
+ @Before
+ public void setUp() {
+ SettingsQCRegistry.sUriToQC.clear();
+ SettingsQCRegistry.sUriToQC.put(QCTestUtils.URI, TestSettingsQCItem.class);
+ }
+
+ @Test
+ public void getQCClassByUri_validUri_returnsClass() {
+ Class<? extends SettingsQCItem> clazz = SettingsQCRegistry.getQCClassByUri(QCTestUtils.URI);
+ assertThat(clazz).isNotNull();
+ }
+
+ @Test
+ public void getQCClassByUri_invalidUri_returnsNull() {
+ Class<? extends SettingsQCItem> clazz = SettingsQCRegistry.getQCClassByUri(Uri.EMPTY);
+ assertThat(clazz).isNull();
+ }
+
+ @Test
+ public void removeParameterFromUri_removesParameters() {
+ Uri uri = SettingsQCRegistry.removeParameterFromUri(QCTestUtils.URI);
+ assertThat(uri).isEqualTo(QCTestUtils.URI);
+ }
+
+ @Test
+ public void isValidUri_validUri_returnsTrue() {
+ assertThat(SettingsQCRegistry.isValidUri(QCTestUtils.URI)).isTrue();
+ }
+
+ @Test
+ public void isValidUri_invalidUri_returnsFalse() {
+ assertThat(SettingsQCRegistry.isValidUri(Uri.EMPTY)).isFalse();
+ }
+
+ @Test
+ public void isValidAction_validAction_returnsTrue() {
+ assertThat(SettingsQCRegistry.isValidAction(QCTestUtils.URI.toString())).isTrue();
+ }
+
+ @Test
+ public void isValidAction_invalidAction_returnsFalse() {
+ assertThat(SettingsQCRegistry.isValidAction(Uri.EMPTY.toString())).isFalse();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/TestSettingsQCBackgroundWorker.java b/tests/unit/src/com/android/car/settings/qc/TestSettingsQCBackgroundWorker.java
new file mode 100644
index 0000000..f6bb8e4
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/TestSettingsQCBackgroundWorker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.Uri;
+
+import java.io.IOException;
+
+public class TestSettingsQCBackgroundWorker extends SettingsQCBackgroundWorker<TestSettingsQCItem> {
+
+ private boolean mIsSubscribed;
+
+ public TestSettingsQCBackgroundWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+
+ @Override
+ public void close() throws IOException {
+ }
+
+ @Override
+ protected void onQCItemSubscribe() {
+ mIsSubscribed = true;
+ }
+
+ @Override
+ protected void onQCItemUnsubscribe() {
+ mIsSubscribed = false;
+ }
+
+ boolean isSubscribed() {
+ return mIsSubscribed;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/TestSettingsQCItem.java b/tests/unit/src/com/android/car/settings/qc/TestSettingsQCItem.java
new file mode 100644
index 0000000..0e912a4
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/TestSettingsQCItem.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCTile;
+
+public class TestSettingsQCItem extends SettingsQCItem {
+
+ public TestSettingsQCItem(Context context) {
+ super(context);
+ }
+
+ @Override
+ QCItem getQCItem() {
+ return new QCTile.Builder().build();
+ }
+
+ @Override
+ Uri getUri() {
+ return QCTestUtils.URI;
+ }
+
+ @Override
+ Class<? extends SettingsQCBackgroundWorker> getBackgroundWorkerClass() {
+ return TestSettingsQCBackgroundWorker.class;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/VolumeSliderTestCase.java b/tests/unit/src/com/android/car/settings/qc/VolumeSliderTestCase.java
new file mode 100644
index 0000000..878f7a3
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/VolumeSliderTestCase.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static android.car.media.CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING;
+import static android.car.media.CarAudioManager.PRIMARY_AUDIO_ZONE;
+
+import static com.android.car.qc.QCItem.QC_ACTION_SLIDER_VALUE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.car.Car;
+import android.car.media.CarAudioManager;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.car.qc.QCRow;
+import com.android.car.qc.QCSlider;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.After;
+import org.junit.Before;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+public abstract class VolumeSliderTestCase {
+ protected static final int GROUP_ID = 0;
+ protected static final int TEST_MIN_VOLUME = 0;
+ protected static final int TEST_VOLUME = 40;
+ protected static final int TEST_NEW_VOLUME = 80;
+ protected static final int TEST_MAX_VOLUME = 100;
+
+ private MockitoSession mSession;
+ protected Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Mock
+ private Car mCar;
+ @Mock
+ protected CarAudioManager mCarAudioManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mSession = ExtendedMockito.mockitoSession().mockStatic(Car.class,
+ withSettings().lenient()).startMocking();
+
+ when(Car.createCar(any(Context.class))).thenReturn(mCar);
+
+ when(mCar.getCarManager(Car.AUDIO_SERVICE)).thenReturn(mCarAudioManager);
+ when(mCarAudioManager.getVolumeGroupIdForUsage(anyInt())).thenReturn(GROUP_ID);
+ when(mCarAudioManager.getGroupMinVolume(GROUP_ID)).thenReturn(TEST_MIN_VOLUME);
+ when(mCarAudioManager.getGroupVolume(GROUP_ID)).thenReturn(TEST_VOLUME);
+ when(mCarAudioManager.getGroupMaxVolume(GROUP_ID)).thenReturn(TEST_MAX_VOLUME);
+ when(mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_VOLUME_GROUP_MUTING)).thenReturn(
+ true);
+ when(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, GROUP_ID)).thenReturn(false);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ protected void verifyTitleSet(QCRow row, int titleResId) {
+ assertThat(row.getTitle()).isEqualTo(mContext.getString(titleResId));
+ }
+
+ protected void verifyIconSet(QCRow row, int iconResId) {
+ assertThat(row.getStartIcon().getResId()).isEqualTo(iconResId);
+ }
+
+ protected void verifySliderCreated(QCRow row) {
+ QCSlider slider = row.getSlider();
+ assertThat(slider).isNotNull();
+ assertThat(slider.getMin()).isEqualTo(TEST_MIN_VOLUME);
+ assertThat(slider.getMax()).isEqualTo(TEST_MAX_VOLUME);
+ assertThat(slider.getValue()).isEqualTo(TEST_VOLUME);
+ }
+
+ protected void verifyVolumeChanged(BaseVolumeSlider slider, int groupId) {
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_SLIDER_VALUE, TEST_NEW_VOLUME);
+ intent.putExtra(BaseVolumeSlider.EXTRA_GROUP_ID, groupId);
+ slider.onNotifyChange(intent);
+ verify(mCarAudioManager).setGroupVolume(eq(groupId), eq(TEST_NEW_VOLUME), anyInt());
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/WifiBaseWorkerTestCase.java b/tests/unit/src/com/android/car/settings/qc/WifiBaseWorkerTestCase.java
new file mode 100644
index 0000000..6d131ea
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/WifiBaseWorkerTestCase.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public abstract class WifiBaseWorkerTestCase<E extends WifiBaseWorker> {
+ protected final Context mContext = ApplicationProvider.getApplicationContext();
+ private E mWorker;
+
+ protected abstract E getWorker();
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ mWorker = getWorker();
+ }
+
+ @Test
+ public void onCreate_lifecycleCreated() {
+ assertThat(mWorker.getLifecycle().getCurrentState()).isEqualTo(Lifecycle.State.CREATED);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onSubscribe_lifecycleResumed() {
+ mWorker.onQCItemSubscribe();
+ assertThat(mWorker.getLifecycle().getCurrentState()).isEqualTo(Lifecycle.State.RESUMED);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onUnsubscribe_lifecycleCreated() {
+ mWorker.onQCItemSubscribe();
+ mWorker.onQCItemUnsubscribe();
+ assertThat(mWorker.getLifecycle().getCurrentState()).isEqualTo(Lifecycle.State.CREATED);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onClose_lifecycleDestroyed() throws IOException {
+ mWorker.onQCItemSubscribe();
+ mWorker.close();
+ assertThat(mWorker.getLifecycle().getCurrentState()).isEqualTo(Lifecycle.State.DESTROYED);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/WifiRowTest.java b/tests/unit/src/com/android/car/settings/qc/WifiRowTest.java
new file mode 100644
index 0000000..4343b98
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/WifiRowTest.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCActionItem;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiRowTest {
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private WifiRow mWifiRow;
+
+ @Mock
+ private WifiManager mWifiManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+
+ mWifiRow = new WifiRow(mContext);
+ }
+
+ @Test
+ public void getQCItem_setsTitle() {
+ when(mWifiManager.isWifiEnabled()).thenReturn(false);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
+ QCRow row = getWifiRow();
+ assertThat(row.getTitle()).isEqualTo(mContext.getString(R.string.wifi_settings));
+ }
+
+ @Test
+ public void getQCItem_wifiDisabled_returnsRow() {
+ when(mWifiManager.isWifiEnabled()).thenReturn(false);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
+ QCRow row = getWifiRow();
+ assertThat(row.getSubtitle()).isEqualTo(mContext.getString(R.string.wifi_disabled));
+ assertThat(row.getStartIcon().getResId()).isEqualTo(R.drawable.ic_qc_wifi_disabled);
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isFalse();
+ }
+
+ @Test
+ public void getQCItem_wifiNotConnected_returnsRow() {
+ when(mWifiManager.isWifiEnabled()).thenReturn(true);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED);
+ WifiInfo wifiInfo = mock(WifiInfo.class);
+ when(wifiInfo.getSSID()).thenReturn(WifiManager.UNKNOWN_SSID);
+ when(wifiInfo.getNetworkId()).thenReturn(-1);
+ when(mWifiManager.getConnectionInfo()).thenReturn(wifiInfo);
+ QCRow row = getWifiRow();
+ assertThat(row.getSubtitle()).isEqualTo(mContext.getString(R.string.wifi_disconnected));
+ assertThat(row.getStartIcon().getResId()).isEqualTo(R.drawable.ic_qc_wifi_disconnected);
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isTrue();
+ }
+
+ @Test
+ public void getQCItem_wifiConnected_returnsRow() {
+ String testSSID = "TEST_SSID";
+ when(mWifiManager.isWifiEnabled()).thenReturn(true);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED);
+ WifiInfo wifiInfo = mock(WifiInfo.class);
+ when(wifiInfo.getSSID()).thenReturn(testSSID);
+ when(wifiInfo.getNetworkId()).thenReturn(1);
+ when(wifiInfo.getRssi()).thenReturn(-90);
+ when(mWifiManager.getConnectionInfo()).thenReturn(wifiInfo);
+ when(mWifiManager.calculateSignalLevel(anyInt())).thenReturn(4);
+ QCRow row = getWifiRow();
+ assertThat(row.getSubtitle()).isEqualTo(testSSID);
+ assertThat(row.getStartIcon().getResId()).isEqualTo(R.drawable.ic_qc_wifi_level_4);
+ QCActionItem actionItem = row.getEndItems().get(0);
+ assertThat(actionItem.isChecked()).isTrue();
+ }
+
+ @Test
+ public void onNotifyChange_togglesWifi() {
+ when(mWifiManager.isWifiEnabled()).thenReturn(false);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mWifiRow.onNotifyChange(intent);
+ verify(mWifiManager).setWifiEnabled(true);
+ }
+
+ private QCRow getWifiRow() {
+ QCItem item = mWifiRow.getQCItem();
+ assertThat(item).isNotNull();
+ assertThat(item instanceof QCList).isTrue();
+ QCList list = (QCList) item;
+ assertThat(list.getRows().size()).isEqualTo(1);
+ return list.getRows().get(0);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/WifiRowWorkerTest.java b/tests/unit/src/com/android/car/settings/qc/WifiRowWorkerTest.java
new file mode 100644
index 0000000..1a3047a
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/WifiRowWorkerTest.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiRowWorkerTest extends WifiBaseWorkerTestCase<WifiRowWorker> {
+ @Override
+ protected WifiRowWorker getWorker() {
+ return new WifiRowWorker(mContext, SettingsQCRegistry.WIFI_ROW_URI);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/WifiTileTest.java b/tests/unit/src/com/android/car/settings/qc/WifiTileTest.java
new file mode 100644
index 0000000..45dcbd5
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/WifiTileTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCTile;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiTileTest {
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private WifiTile mWifiTile;
+
+ @Mock
+ private WifiManager mWifiManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+
+ mWifiTile = new WifiTile(mContext);
+ }
+
+ @Test
+ public void getQCItem_wifiDisabled_returnsTile() {
+ when(mWifiManager.isWifiEnabled()).thenReturn(false);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
+ QCTile tile = getWifiTile();
+ assertThat(tile.getIcon().getResId()).isEqualTo(R.drawable.ic_qc_wifi_disabled);
+ assertThat(tile.isChecked()).isFalse();
+ assertThat(tile.getSubtitle()).isEqualTo(mContext.getString(R.string.wifi_disabled));
+ }
+
+ @Test
+ public void getQCItem_wifiNotConnected_returnsTile() {
+ when(mWifiManager.isWifiEnabled()).thenReturn(true);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED);
+ WifiInfo wifiInfo = mock(WifiInfo.class);
+ when(wifiInfo.getSSID()).thenReturn(WifiManager.UNKNOWN_SSID);
+ when(wifiInfo.getNetworkId()).thenReturn(-1);
+ when(mWifiManager.getConnectionInfo()).thenReturn(wifiInfo);
+ QCTile tile = getWifiTile();
+ assertThat(tile.getIcon().getResId()).isEqualTo(R.drawable.ic_qc_wifi_disconnected);
+ assertThat(tile.isChecked()).isTrue();
+ assertThat(tile.getSubtitle()).isEqualTo(mContext.getString(R.string.wifi_disconnected));
+ }
+
+ @Test
+ public void getQCItem_wifiConnected_returnsTile() {
+ String testSSID = "TEST_SSID";
+ when(mWifiManager.isWifiEnabled()).thenReturn(true);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED);
+ WifiInfo wifiInfo = mock(WifiInfo.class);
+ when(wifiInfo.getSSID()).thenReturn(testSSID);
+ when(wifiInfo.getNetworkId()).thenReturn(1);
+ when(wifiInfo.getRssi()).thenReturn(-90);
+ when(mWifiManager.getConnectionInfo()).thenReturn(wifiInfo);
+ when(mWifiManager.calculateSignalLevel(anyInt())).thenReturn(4);
+ QCTile tile = getWifiTile();
+ assertThat(tile.getIcon().getResId()).isEqualTo(R.drawable.ic_qc_wifi_level_4);
+ assertThat(tile.isChecked()).isTrue();
+ assertThat(tile.getSubtitle()).isEqualTo(testSSID);
+ }
+
+ @Test
+ public void onNotifyChange_togglesWifi() {
+ when(mWifiManager.isWifiEnabled()).thenReturn(false);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
+ Intent intent = new Intent();
+ intent.putExtra(QC_ACTION_TOGGLE_STATE, true);
+ mWifiTile.onNotifyChange(intent);
+ verify(mWifiManager).setWifiEnabled(true);
+ }
+
+ private QCTile getWifiTile() {
+ QCItem item = mWifiTile.getQCItem();
+ assertThat(item).isNotNull();
+ assertThat(item instanceof QCTile).isTrue();
+ return (QCTile) item;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/qc/WifiTileWorkerTest.java b/tests/unit/src/com/android/car/settings/qc/WifiTileWorkerTest.java
new file mode 100644
index 0000000..0bf8c4a
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/qc/WifiTileWorkerTest.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.qc;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiTileWorkerTest extends WifiBaseWorkerTestCase<WifiTileWorker> {
+ @Override
+ protected WifiTileWorker getWorker() {
+ return new WifiTileWorker(mContext, SettingsQCRegistry.WIFI_TILE_URI);
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/sound/RingtonePickerPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/sound/RingtonePickerPreferenceControllerTest.java
index 947c695..4a7dbab 100644
--- a/tests/unit/src/com/android/car/settings/sound/RingtonePickerPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/sound/RingtonePickerPreferenceControllerTest.java
@@ -109,14 +109,15 @@
}
@Test
- public void onCreate_noArgsSet_invalidRingtoneTypeSet() {
+ public void onStart_noArgsSet_invalidRingtoneTypeSet() {
mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
verify(mRingtoneManager).setType(eq(-1));
}
@Test
- public void onCreate_setArgs_validRingtoneTypeSet() {
+ public void onStart_setArgs_validRingtoneTypeSet() {
Bundle args = new Bundle();
args.putInt(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
args.putBoolean(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
@@ -125,12 +126,13 @@
mPreferenceController.setArguments(args);
mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
verify(mRingtoneManager).setType(eq(RingtoneManager.TYPE_RINGTONE));
}
@Test
- public void onCreate_doesNotShowSilent_noExtraPreference() {
+ public void onStart_doesNotShowSilent_noExtraPreference() {
Bundle args = new Bundle();
args.putInt(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
args.putBoolean(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
@@ -145,12 +147,13 @@
mPreferenceController.setArguments(args);
mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
}
@Test
- public void onCreate_showSilent_hasExtraPreference() {
+ public void onStart_showSilent_hasExtraPreference() {
Bundle args = new Bundle();
args.putInt(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
args.putBoolean(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
@@ -165,13 +168,14 @@
mPreferenceController.setArguments(args);
mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
// Has 2 ringtones + silent option.
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
}
@Test
- public void onCreate_showSilent_firstPreferenceIsSilent() {
+ public void onStart_showSilent_firstPreferenceIsSilent() {
Bundle args = new Bundle();
args.putInt(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
args.putBoolean(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
@@ -180,6 +184,7 @@
mPreferenceController.setArguments(args);
mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
Preference preference = mPreferenceGroup.getPreference(0);
int posKey = Integer.parseInt(preference.getKey());
@@ -187,7 +192,7 @@
}
@Test
- public void onCreate_hasSilent_defaultRingtoneSelected() {
+ public void onStart_hasSilent_defaultRingtoneSelected() {
Bundle args = new Bundle();
args.putInt(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
args.putBoolean(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
@@ -205,6 +210,7 @@
mPreferenceController.setArguments(args);
mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
// Currently selected ringtone is the first ringtone in the list. However, since we also
// have the "silent" item, it is the second item in the overall list.
@@ -230,6 +236,7 @@
mPreferenceController.setArguments(args);
mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
mPreferenceGroup.getPreference(1).performClick();
// Currently selected ringtone is the first ringtone in the list. However, since we also
@@ -256,6 +263,7 @@
mPreferenceController.setArguments(args);
mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
mPreferenceGroup.getPreference(2).performClick();
assertThat(mPreferenceController.getCurrentlySelectedPreferencePos()).isEqualTo(2);
@@ -280,6 +288,7 @@
mPreferenceController.setArguments(args);
mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.onStart(mLifecycleOwner);
mPreferenceGroup.getPreference(2).performClick();
mPreferenceController.onStop(mLifecycleOwner);
diff --git a/tests/unit/src/com/android/car/settings/sound/VolumeSeekBarPreferenceTest.java b/tests/unit/src/com/android/car/settings/sound/VolumeSeekBarPreferenceTest.java
new file mode 100644
index 0000000..ef8ffc3
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/sound/VolumeSeekBarPreferenceTest.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.sound;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.expectThrows;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.sound.VolumeSeekBarPreference.SavedVolumeState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public final class VolumeSeekBarPreferenceTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+
+ private VolumeSeekBarPreference mVolumeSeekBarPreference;
+
+ @Mock
+ private Drawable mMockMutedIconDrawable;
+
+ @Mock
+ private Drawable mMockUnMutedIconDrawable;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mVolumeSeekBarPreference = new VolumeSeekBarPreference(mContext);
+ }
+
+ @Test
+ public void constructor_failOnNullContext() {
+ NullPointerException thrown =
+ expectThrows(NullPointerException.class, () -> new VolumeSeekBarPreference(null));
+ assertWithMessage("Constructor Exception").that(thrown).hasMessageThat()
+ .contains("Context");
+ }
+
+ @Test
+ public void setMutedIcon_succeedsInSettingMutedIcon() {
+ mVolumeSeekBarPreference.setMutedIcon(mMockMutedIconDrawable);
+
+ assertWithMessage("Volume muted icon")
+ .that(mVolumeSeekBarPreference.getMutedIcon()).isEqualTo(mMockMutedIconDrawable);
+ }
+
+ @Test
+ public void setUnMutedIcon_succeedsInSettingUnMutedIcon() {
+ mVolumeSeekBarPreference.setUnMutedIcon(mMockUnMutedIconDrawable);
+
+ assertWithMessage("Volume un-muted icon")
+ .that(mVolumeSeekBarPreference.getUnMutedIcon())
+ .isEqualTo(mMockUnMutedIconDrawable);
+ }
+
+ @Test
+ public void setMutedIcon_withDefaults_setsIconToUnMuted() {
+ mVolumeSeekBarPreference.setUnMutedIcon(mMockUnMutedIconDrawable);
+ mVolumeSeekBarPreference.setMutedIcon(mMockMutedIconDrawable);
+
+ assertWithMessage("Preference icon")
+ .that(mVolumeSeekBarPreference.getIcon()).isEqualTo(mMockUnMutedIconDrawable);
+ }
+
+ @Test
+ public void setMutedIcon_afterSetIsMuteToTrue_setsIconToMuted() {
+ mVolumeSeekBarPreference.setIsMuted(true);
+
+ mVolumeSeekBarPreference.setMutedIcon(mMockMutedIconDrawable);
+
+ assertWithMessage("Preference icon")
+ .that(mVolumeSeekBarPreference.getIcon()).isEqualTo(mMockMutedIconDrawable);
+ }
+
+ @Test
+ public void setMutedIcon_afterSetIsMuteToFalse_setsIconToUnMuted() {
+ mVolumeSeekBarPreference.setIsMuted(true);
+
+ mVolumeSeekBarPreference.setMutedIcon(mMockMutedIconDrawable);
+
+ assertWithMessage("Preference icon")
+ .that(mVolumeSeekBarPreference.getIcon()).isEqualTo(mMockMutedIconDrawable);
+ }
+
+ @Test
+ public void setIsMuted_withMuted_succeeds() {
+ mVolumeSeekBarPreference.setIsMuted(true);
+
+ assertWithMessage("Is muted state")
+ .that(mVolumeSeekBarPreference.isMuted()).isEqualTo(true);
+ }
+
+ @Test
+ public void setIsMuted_withUnMuted_succeeds() {
+ mVolumeSeekBarPreference.setIsMuted(false);
+
+ assertWithMessage("Is muted state")
+ .that(mVolumeSeekBarPreference.isMuted()).isEqualTo(false);
+ }
+
+ @Test
+ public void setIsMuted_withMutedState_changesIconToMutedIcon() {
+ mVolumeSeekBarPreference.setMutedIcon(mMockMutedIconDrawable);
+ mVolumeSeekBarPreference.setUnMutedIcon(mMockUnMutedIconDrawable);
+ mVolumeSeekBarPreference.setIsMuted(false);
+
+ mVolumeSeekBarPreference.setIsMuted(true);
+
+ assertWithMessage("Preference icon")
+ .that(mVolumeSeekBarPreference.getIcon()).isEqualTo(mMockMutedIconDrawable);
+ }
+
+ @Test
+ public void setIsMuted_withUnMutedState_changesIconToUnMutedIcon() {
+ mVolumeSeekBarPreference.setMutedIcon(mMockMutedIconDrawable);
+ mVolumeSeekBarPreference.setUnMutedIcon(mMockUnMutedIconDrawable);
+ mVolumeSeekBarPreference.setIsMuted(true);
+
+ mVolumeSeekBarPreference.setIsMuted(false);
+
+ assertWithMessage("Preference icon")
+ .that(mVolumeSeekBarPreference.getIcon()).isEqualTo(mMockUnMutedIconDrawable);
+ }
+
+ @Test
+ public void onSaveInstanceState_withPersistent_doesNotReturnVolumeSavedState() {
+ mVolumeSeekBarPreference.setPersistent(true);
+ Parcelable parcelable = mVolumeSeekBarPreference.onSaveInstanceState();
+
+ assertWithMessage("Saved state").that(parcelable.getClass())
+ .isNotEqualTo(SavedVolumeState.class);
+ }
+
+ @Test
+ public void onSaveInstanceState_withoutPersistent_doesReturnVolumeSavedState() {
+ mVolumeSeekBarPreference.setPersistent(false);
+
+ Parcelable parcelable = mVolumeSeekBarPreference.onSaveInstanceState();
+
+ assertWithMessage("Saved state").that(parcelable.getClass())
+ .isEqualTo(SavedVolumeState.class);
+ }
+
+ @Test
+ public void onSaveInstanceState_withPersistent_returnsLastSetIsMuted() {
+ mVolumeSeekBarPreference.setPersistent(false);
+ mVolumeSeekBarPreference.setIsMuted(true);
+
+ Parcelable parcelable = mVolumeSeekBarPreference.onSaveInstanceState();
+
+ SavedVolumeState state =
+ ((SavedVolumeState) parcelable);
+
+ assertWithMessage("Saved state is muted").that(state.isMuted())
+ .isEqualTo(true);
+ }
+
+ @Test
+ public void onRestoreInstanceState_withMutedState_loadsIsUnMuted() {
+ Parcel parcel = mock(Parcel.class);
+ when(parcel.readBoolean()).thenReturn(false);
+ SavedVolumeState savedState = new SavedVolumeState(parcel);
+ mVolumeSeekBarPreference.setIsMuted(true);
+
+ mVolumeSeekBarPreference.onRestoreInstanceState(savedState);
+
+ assertWithMessage("Loaded is un-muted")
+ .that(mVolumeSeekBarPreference.isMuted())
+ .isEqualTo(false);
+ }
+
+ @Test
+ public void onRestoreInstanceState_withMutedState_loadsIsMuted() {
+ Parcel parcel = mock(Parcel.class);
+ when(parcel.readBoolean()).thenReturn(true);
+ SavedVolumeState savedState = new SavedVolumeState(parcel);
+ mVolumeSeekBarPreference.setIsMuted(false);
+
+ mVolumeSeekBarPreference.onRestoreInstanceState(savedState);
+
+ assertWithMessage("Loaded is muted")
+ .that(mVolumeSeekBarPreference.isMuted())
+ .isEqualTo(true);
+ }
+
+ @Test
+ public void writeToParcel_withMuted_writesMutedToParcel() {
+ Parcel parcel = mock(Parcel.class);
+ SavedVolumeState savedState = new SavedVolumeState(parcel);
+ savedState.setIsMuted(true);
+
+ savedState.writeToParcel(parcel, /* flags= */ 0);
+
+ verify(parcel).writeBoolean(true);
+ }
+
+ @Test
+ public void isMuted_forSaveVolumeState_readMutedState() {
+ Parcel parcel = mock(Parcel.class);
+ SavedVolumeState savedState = new SavedVolumeState(parcel);
+ savedState.setIsMuted(true);
+
+ assertWithMessage("Set is muted")
+ .that(savedState.isMuted())
+ .isEqualTo(true);
+ }
+
+ @Test
+ public void isMuted_loadsIsMutedFromParcel() {
+ Parcel parcel = mock(Parcel.class);
+ when(parcel.readBoolean()).thenReturn(true);
+ SavedVolumeState savedState = new SavedVolumeState(parcel);
+
+
+ assertWithMessage("Loaded is muted")
+ .that(savedState.isMuted())
+ .isEqualTo(true);
+ }
+
+}
diff --git a/tests/unit/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java
index 1d233a7..54e8406 100644
--- a/tests/unit/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java
@@ -16,10 +16,19 @@
package com.android.car.settings.sound;
+import static android.car.media.CarAudioManager.PRIMARY_AUDIO_ZONE;
+import static android.os.UserManager.DISALLOW_ADJUST_VOLUME;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -30,6 +39,8 @@
import android.car.drivingstate.CarUxRestrictions;
import android.car.media.CarAudioManager;
import android.content.Context;
+import android.os.UserManager;
+import android.widget.Toast;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.PreferenceGroup;
@@ -45,29 +56,37 @@
import com.android.car.settings.common.LogicalPreferenceGroup;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.common.SeekBarPreference;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
@RunWith(AndroidJUnit4.class)
public class VolumeSettingsPreferenceControllerTest {
- private static final int ZONE_ID = 1;
+ private static final int ZONE_ID = PRIMARY_AUDIO_ZONE;
+ private static final int INVALID_ZONE_ID = 1;
private static final int GROUP_ID = 0;
private static final int TEST_MIN_VOLUME = 0;
private static final int TEST_VOLUME = 40;
private static final int TEST_NEW_VOLUME = 80;
private static final int TEST_MAX_VOLUME = 100;
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private static final String TEST_RESTRICTION = DISALLOW_ADJUST_VOLUME;
+
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
private PreferenceGroup mPreferenceGroup;
private VolumeSettingsPreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
+ private MockitoSession mSession;
@Mock
private FragmentController mFragmentController;
@@ -77,22 +96,34 @@
private CarAudioManager mCarAudioManager;
@Mock
private VolumeSettingsRingtoneManager mRingtoneManager;
+ @Mock
+ private UserManager mMockUserManager;
+ @Mock
+ private Toast mMockToast;
@Before
@UiThreadTest
public void setUp() {
- MockitoAnnotations.initMocks(this);
mLifecycleOwner = new TestLifecycleOwner();
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(Toast.class)
+ .strictness(Strictness.LENIENT)
+ .startMocking();
when(mCar.getCarManager(Car.AUDIO_SERVICE)).thenReturn(mCarAudioManager);
when(mCarAudioManager.getVolumeGroupCount()).thenReturn(1);
when(mCarAudioManager.getUsagesForVolumeGroupId(GROUP_ID)).thenReturn(new int[]{1, 2});
when(mCarAudioManager.getGroupMinVolume(GROUP_ID)).thenReturn(TEST_MIN_VOLUME);
when(mCarAudioManager.getGroupVolume(GROUP_ID)).thenReturn(TEST_VOLUME);
when(mCarAudioManager.getGroupMaxVolume(GROUP_ID)).thenReturn(TEST_MAX_VOLUME);
+ when(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, GROUP_ID)).thenReturn(false);
+
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ when(Toast.makeText(any(), anyString(), anyInt())).thenReturn(mMockToast);
PreferenceManager preferenceManager = new PreferenceManager(mContext);
PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
@@ -103,6 +134,14 @@
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
}
+ @After
+ @UiThreadTest
+ public void tearDown() {
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
@Test
public void testRefreshUi_serviceNotStarted() {
mPreferenceController.refreshUi();
@@ -187,6 +226,120 @@
assertThat(preference.getValue()).isEqualTo(TEST_NEW_VOLUME);
}
+ @Test
+ public void onGroupVolumeChanged_invalidZoneId_doesNotUpdateVolumeSeekbar() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+ when(mCarAudioManager.getGroupVolume(GROUP_ID)).thenReturn(TEST_NEW_VOLUME);
+ mPreferenceController.mVolumeChangeCallback.onGroupVolumeChanged(INVALID_ZONE_ID,
+ GROUP_ID, /* flags= */ 0);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ SeekBarPreference preference =
+ (SeekBarPreference) spy(mPreferenceGroup.getPreference(0));
+ verify(preference, never()).setValue(any(Integer.class));
+ }
+
+ @Test
+ public void onGroupMuteChanged_sameValue_doesNotUpdateIsMuted() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+ VolumeSeekBarPreference preference =
+ spy((VolumeSeekBarPreference) mPreferenceGroup.getPreference(0));
+ mPreferenceController.mVolumeChangeCallback.onGroupMuteChanged(ZONE_ID,
+ GROUP_ID, /* flags= */ 0);
+
+ verify(preference, never()).setIsMuted(any(Boolean.class));
+ }
+
+ @Test
+ public void onGroupMuteChanged_differentValue_updatesMutedState() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+ when(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, GROUP_ID)).thenReturn(true);
+ mPreferenceController.mVolumeChangeCallback.onGroupMuteChanged(ZONE_ID,
+ GROUP_ID, /* flags= */ 0);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ VolumeSeekBarPreference preference =
+ (VolumeSeekBarPreference) mPreferenceGroup.getPreference(0);
+ assertThat(preference.isMuted()).isEqualTo(true);
+ }
+
+ @Test
+ public void onGroupMuteChanged_invalidZoneId_doesNotUpdateMutedState() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.refreshUi();
+ when(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, GROUP_ID)).thenReturn(true);
+ mPreferenceController.mVolumeChangeCallback.onGroupMuteChanged(ZONE_ID,
+ GROUP_ID, /* flags= */ 0);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ VolumeSeekBarPreference preference =
+ (VolumeSeekBarPreference) spy(mPreferenceGroup.getPreference(0));
+ verify(preference, never()).setIsMuted(any(Boolean.class));
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_restrictedByUm_unavailable() {
+ mockUserRestrictionSetByUm(true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ VolumeSeekBarPreference preference =
+ spy((VolumeSeekBarPreference) mPreferenceGroup.getPreference(0));
+ assertThat(preference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_restrictedByDpm_unavailable() {
+ mockUserRestrictionSetByDpm(true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ VolumeSeekBarPreference preference =
+ spy((VolumeSeekBarPreference) mPreferenceGroup.getPreference(0));
+ assertThat(preference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void testGetAvailabilityStatus_unrestricted_available() {
+ mockUserRestrictionSetByDpm(false);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ VolumeSeekBarPreference preference =
+ spy((VolumeSeekBarPreference) mPreferenceGroup.getPreference(0));
+ assertThat(preference.isEnabled()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void testDisabledClick_restrictedByDpm_showDialog() {
+ mockUserRestrictionSetByDpm(true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ VolumeSeekBarPreference preference =
+ spy((VolumeSeekBarPreference) mPreferenceGroup.getPreference(0));
+
+ preference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ @Test
+ @UiThreadTest
+ public void testDisabledClick_restrictedByUm_showToast() {
+ mockUserRestrictionSetByUm(true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ VolumeSeekBarPreference preference =
+ spy((VolumeSeekBarPreference) mPreferenceGroup.getPreference(0));
+
+ preference.performClick();
+
+ assertShowingBlockedToast();
+ }
+
private static class TestVolumeSettingsPreferenceController extends
VolumeSettingsPreferenceController {
@@ -202,4 +355,26 @@
return R.xml.test_car_volume_items;
}
}
+
+ private void mockUserRestrictionSetByUm(boolean restricted) {
+ when(mMockUserManager.hasBaseUserRestriction(eq(TEST_RESTRICTION), any()))
+ .thenReturn(restricted);
+ }
+
+ private void mockUserRestrictionSetByDpm(boolean restricted) {
+ mockUserRestrictionSetByUm(false);
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(restricted);
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+
+ private void assertShowingBlockedToast() {
+ String toastText = mContext.getString(R.string.action_unavailable);
+ ExtendedMockito.verify(
+ () -> Toast.makeText(any(), eq(toastText), anyInt()));
+ verify(mMockToast).show();
+ }
}
diff --git a/tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java b/tests/unit/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
similarity index 92%
rename from tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
rename to tests/unit/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
index 35ca4d1..a063efc 100644
--- a/tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
+++ b/tests/unit/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,6 +26,8 @@
import android.os.Bundle;
import androidx.loader.app.LoaderManager;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settingslib.applications.StorageStatsSource;
@@ -36,16 +38,13 @@
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-/** Unit test for {@link AppsStorageStatsManager}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class AppsStorageStatsManagerTest {
private static final int USER_ID = 10;
- private Context mContext;
+ private Context mContext = ApplicationProvider.getApplicationContext();
private AppsStorageStatsManager mAppsStorageStatsManager;
@Captor
@@ -67,7 +66,7 @@
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
+
mAppsStorageStatsManager = new AppsStorageStatsManager(mContext);
mAppsStorageStatsManager.startLoading(mLoaderManager, mApplicationInfo, USER_ID, false,
false);
@@ -76,7 +75,7 @@
}
@Test
- public void callback_onLoadFinished_listenerOnDataLoadedCalled() throws Exception {
+ public void callback_onLoadFinished_listenerOnDataLoadedCalled() {
mAppsStorageStatsManager.registerListener(mCallback1);
mAppsStorageStatsManager.registerListener(mCallback2);
@@ -91,7 +90,7 @@
}
@Test
- public void callback_unregisterListener_onlyOneListenerOnDataLoadedCalled() throws Exception {
+ public void callback_unregisterListener_onlyOneListenerOnDataLoadedCalled() {
mAppsStorageStatsManager.registerListener(mCallback1);
mAppsStorageStatsManager.registerListener(mCallback2);
mAppsStorageStatsManager.unregisterListener(mCallback2);
@@ -106,7 +105,7 @@
}
@Test
- public void callback_notLoaded_listenerOnDataLoadedCalled() throws Exception {
+ public void callback_notLoaded_listenerOnDataLoadedCalled() {
mAppsStorageStatsManager.registerListener(mCallback1);
mAppsStorageStatsManager.registerListener(mCallback2);
@@ -119,7 +118,7 @@
}
@Test
- public void callback_cachedCleared_listenerOnDataLoadedCalled() throws Exception {
+ public void callback_cachedCleared_listenerOnDataLoadedCalled() {
mAppsStorageStatsManager = new AppsStorageStatsManager(mContext);
mAppsStorageStatsManager.startLoading(mLoaderManager, mApplicationInfo, USER_ID, true,
false);
@@ -136,7 +135,7 @@
}
@Test
- public void callback_userDataCleared_listenerOnDataLoadedCalled() throws Exception {
+ public void callback_userDataCleared_listenerOnDataLoadedCalled() {
mAppsStorageStatsManager = new AppsStorageStatsManager(mContext);
mAppsStorageStatsManager.startLoading(mLoaderManager, mApplicationInfo, USER_ID, false,
true);
diff --git a/tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java b/tests/unit/src/com/android/car/settings/storage/FileSizeFormatterTest.java
similarity index 89%
rename from tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java
rename to tests/unit/src/com/android/car/settings/storage/FileSizeFormatterTest.java
index ff092be..9dabc01 100644
--- a/tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java
+++ b/tests/unit/src/com/android/car/settings/storage/FileSizeFormatterTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,22 +23,16 @@
import android.content.Context;
-import org.junit.Before;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-/** Unit test for {@link FileSizeFormatter}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class FileSizeFormatterTest {
- private Context mContext;
- @Before
- public void setUp() throws Exception {
- mContext = RuntimeEnvironment.application;
- }
+ private Context mContext = ApplicationProvider.getApplicationContext();
@Test
public void formatFileSize_zero() {
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
similarity index 65%
rename from tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
rename to tests/unit/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
index cdfbae7..2e62f9e 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,26 +18,33 @@
import static com.google.common.truth.Truth.assertThat;
+import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.content.pm.ApplicationInfo;
-import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
-/** Unit test for {@link StorageApplicationListPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class StorageApplicationListPreferenceControllerTest {
private static final String SOURCE = "source";
@@ -47,20 +54,33 @@
private static final String UPDATED_SIZE_STR = "15.34 MB";
private static final String PACKAGE_NAME = "com.google.packageName";
- private Context mContext;
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
private LogicalPreferenceGroup mLogicalPreferenceGroup;
- private StorageApplicationListPreferenceController mController;
- private PreferenceControllerTestHelper<StorageApplicationListPreferenceController>
- mPreferenceControllerHelper;
+ private StorageApplicationListPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
@Before
+ @UiThreadTest
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
mLogicalPreferenceGroup = new LogicalPreferenceGroup(mContext);
- mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- StorageApplicationListPreferenceController.class, mLogicalPreferenceGroup);
- mController = mPreferenceControllerHelper.getController();
- mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+ screen.addPreference(mLogicalPreferenceGroup);
+ mPreferenceController = new StorageApplicationListPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController, mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mLogicalPreferenceGroup);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
}
@Test
@@ -83,7 +103,7 @@
appEntry.info.packageName = PACKAGE_NAME;
apps.add(appEntry);
- mController.onDataLoaded(apps);
+ mPreferenceController.onDataLoaded(apps);
assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(1);
assertThat(mLogicalPreferenceGroup.getPreference(0).getTitle()).isEqualTo(LABEL);
@@ -105,7 +125,7 @@
appEntry.info.packageName = PACKAGE_NAME;
apps.add(appEntry);
- mController.onDataLoaded(apps);
+ mPreferenceController.onDataLoaded(apps);
apps.clear();
appEntry = new ApplicationsState.AppEntry(mContext, appInfo, 1234L);
@@ -115,7 +135,7 @@
appEntry.info.packageName = PACKAGE_NAME;
apps.add(appEntry);
- mController.onDataLoaded(apps);
+ mPreferenceController.onDataLoaded(apps);
assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(1);
assertThat(mLogicalPreferenceGroup.getPreference(0).getTitle()).isEqualTo(LABEL);
diff --git a/tests/unit/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java b/tests/unit/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java
new file mode 100644
index 0000000..e0f7947
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.app.usage.StorageStats;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.net.TrafficStats;
+import android.os.UserHandle;
+import android.util.SparseArray;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.profiles.ProfileHelper;
+import com.android.settingslib.applications.StorageStatsSource;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class StorageAsyncLoaderTest {
+
+ private static final int PRIMARY_USER_ID = 0;
+ private static final int SECONDARY_USER_ID = 10;
+ private static final String PACKAGE_NAME_1 = "com.blah.test";
+ private static final String PACKAGE_NAME_2 = "com.blah.test2";
+ private static final long DEFAULT_QUOTA = 64 * TrafficStats.MB_IN_BYTES;
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private List<UserInfo> mUsers;
+
+ private StorageAsyncLoader mLoader;
+
+ @Mock
+ private StorageStatsSource mMockSource;
+ @Mock
+ private PackageManager mMockPackageManager;
+ @Mock
+ private ProfileHelper mMockProfileHelper;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ mLoader = new StorageAsyncLoader(mContext, mMockSource, mMockPackageManager,
+ mMockProfileHelper);
+ UserInfo info = new UserInfo();
+ info.id = PRIMARY_USER_ID;
+ mUsers = new ArrayList<>();
+ mUsers.add(info);
+ when(mMockProfileHelper.getAllProfiles()).thenReturn(mUsers);
+ when(mMockSource.getCacheQuotaBytes(any(), anyInt())).thenReturn(DEFAULT_QUOTA);
+ }
+
+ @Test
+ public void testLoadingApps() throws Exception {
+ ApplicationInfo appInfo1 = createAppInfo(PACKAGE_NAME_1, 0, 1, 10,
+ ApplicationInfo.CATEGORY_UNDEFINED);
+ ApplicationInfo appInfo2 = createAppInfo(PACKAGE_NAME_2, 0, 100, 1000,
+ ApplicationInfo.CATEGORY_UNDEFINED);
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ 0, PRIMARY_USER_ID))
+ .thenReturn(Arrays.asList(appInfo1, appInfo2));
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(1);
+ assertThat(result.get(PRIMARY_USER_ID).getGamesSize()).isEqualTo(0L);
+ assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(2200L);
+ }
+
+ @Test
+ public void testGamesAreFiltered() throws Exception {
+ ApplicationInfo appInfo = createAppInfo(PACKAGE_NAME_1, 0, 1, 10,
+ ApplicationInfo.CATEGORY_GAME);
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ 0, PRIMARY_USER_ID))
+ .thenReturn(Collections.singletonList(appInfo));
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(1);
+ assertThat(result.get(PRIMARY_USER_ID).getGamesSize()).isEqualTo(11L);
+ assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(0L);
+ }
+
+ @Test
+ public void testLegacyGamesAreFiltered() throws Exception {
+ ApplicationInfo appInfo = createAppInfo(PACKAGE_NAME_1, 0, 1, 10,
+ ApplicationInfo.CATEGORY_UNDEFINED);
+ appInfo.flags = ApplicationInfo.FLAG_IS_GAME;
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ 0, PRIMARY_USER_ID))
+ .thenReturn(Collections.singletonList(appInfo));
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(1);
+ assertThat(result.get(PRIMARY_USER_ID).getGamesSize()).isEqualTo(11L);
+ assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(0L);
+ }
+
+ @Test
+ public void testCacheIsNotIgnored() throws Exception {
+ ApplicationInfo appInfo = createAppInfo(PACKAGE_NAME_1, 100, 1, 10,
+ ApplicationInfo.CATEGORY_UNDEFINED);
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ 0, PRIMARY_USER_ID))
+ .thenReturn(Collections.singletonList(appInfo));
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(1);
+ assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(111L);
+ }
+
+ @Test
+ public void testMultipleUsers() throws Exception {
+ UserInfo info = new UserInfo();
+ info.id = SECONDARY_USER_ID;
+ mUsers.add(info);
+ ApplicationInfo appInfo = createAppInfo(PACKAGE_NAME_1, 100, 1, 10,
+ ApplicationInfo.CATEGORY_UNDEFINED);
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ eq(0), anyInt()))
+ .thenReturn(Collections.singletonList(appInfo));
+ when(mMockSource.getExternalStorageStats(any(), eq(UserHandle.SYSTEM)))
+ .thenReturn(new StorageStatsSource.ExternalStorageStats(9, 2, 3, 4, 0));
+ when(mMockSource.getExternalStorageStats(any(), eq(new UserHandle(SECONDARY_USER_ID))))
+ .thenReturn(new StorageStatsSource.ExternalStorageStats(10, 3, 3, 4, 0));
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(2);
+ assertThat(result.get(PRIMARY_USER_ID).getExternalStats().totalBytes).isEqualTo(9L);
+ assertThat(result.get(SECONDARY_USER_ID).getExternalStats().totalBytes).isEqualTo(10L);
+ }
+
+ @Test
+ public void testUpdatedSystemAppCodeSizeIsCounted() throws Exception {
+ ApplicationInfo appInfo = createAppInfo(PACKAGE_NAME_1, 100, 1, 10,
+ ApplicationInfo.CATEGORY_UNDEFINED);
+ appInfo.flags = ApplicationInfo.FLAG_SYSTEM & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ 0, PRIMARY_USER_ID))
+ .thenReturn(Collections.singletonList(appInfo));
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(1);
+ assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(111L);
+ }
+
+ @Test
+ public void testVideoAppsAreFiltered() throws Exception {
+ ApplicationInfo appInfo = createAppInfo(PACKAGE_NAME_1, 0, 1, 10,
+ ApplicationInfo.CATEGORY_VIDEO);
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ 0, PRIMARY_USER_ID))
+ .thenReturn(Collections.singletonList(appInfo));
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(1);
+ assertThat(result.get(PRIMARY_USER_ID).getVideoAppsSize()).isEqualTo(11L);
+ assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(0L);
+ }
+
+ @Test
+ public void testRemovedPackageDoesNotCrash() throws Exception {
+ ApplicationInfo appInfo = createAppInfo(PACKAGE_NAME_1, 0, 1, 10,
+ ApplicationInfo.CATEGORY_UNDEFINED);
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ 0, PRIMARY_USER_ID))
+ .thenReturn(Collections.singletonList(appInfo));
+ when(mMockSource.getStatsForPackage(any(), anyString(), any(UserHandle.class)))
+ .thenThrow(new PackageManager.NameNotFoundException());
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ // Should not crash.
+ }
+
+ @Test
+ public void testPackageIsNotDoubleCounted() throws Exception {
+ UserInfo info = new UserInfo();
+ info.id = SECONDARY_USER_ID;
+ mUsers.add(info);
+ when(mMockSource.getExternalStorageStats(anyString(), eq(UserHandle.SYSTEM)))
+ .thenReturn(new StorageStatsSource.ExternalStorageStats(9, 2, 3,
+ 4, 0));
+ when(mMockSource.getExternalStorageStats(anyString(),
+ eq(new UserHandle(SECONDARY_USER_ID))))
+ .thenReturn(new StorageStatsSource.ExternalStorageStats(10, 3, 3,
+ 4, 0));
+
+ ApplicationInfo appInfo = createAppInfo(PACKAGE_NAME_1, 0, 1, 10,
+ ApplicationInfo.CATEGORY_VIDEO);
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ eq(0), anyInt()))
+ .thenReturn(Collections.singletonList(appInfo));
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(2);
+ assertThat(result.get(PRIMARY_USER_ID).getVideoAppsSize()).isEqualTo(11L);
+ // No code size for the second user.
+ assertThat(result.get(SECONDARY_USER_ID).getVideoAppsSize()).isEqualTo(10L);
+ }
+
+ @Test
+ public void testCacheOveragesAreCountedAsFree() throws Exception {
+ ApplicationInfo appInfo = createAppInfo(PACKAGE_NAME_1, DEFAULT_QUOTA + 100, 1, 10,
+ ApplicationInfo.CATEGORY_UNDEFINED);
+
+ when(mMockPackageManager.getInstalledApplicationsAsUser(
+ /* getAllInstalledApplications= */ 0, PRIMARY_USER_ID))
+ .thenReturn(Collections.singletonList(appInfo));
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(1);
+ assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(DEFAULT_QUOTA + 11);
+ }
+
+ private ApplicationInfo createAppInfo(String packageName, long cacheSize, long codeSize,
+ long dataSize, int category) throws Exception {
+ StorageStats stats = new StorageStats();
+ stats.codeBytes = codeSize;
+ stats.dataBytes = dataSize + cacheSize;
+ stats.cacheBytes = cacheSize;
+ StorageStatsSource.AppStorageStats storageStats =
+ new StorageStatsSource.AppStorageStatsImpl(stats);
+
+ when(mMockSource.getStatsForPackage(any(), anyString(), any(UserHandle.class)))
+ .thenReturn(storageStats);
+
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = packageName;
+ info.category = category;
+ PackageInfo packageInfo = new PackageInfo();
+ packageInfo.applicationInfo = info;
+ packageInfo.packageName = packageName;
+
+ return info;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java
new file mode 100644
index 0000000..2c2c1c7
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.os.storage.VolumeInfo;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.common.ProgressBarPreference;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.deviceinfo.StorageVolumeProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class StorageFileCategoryPreferenceControllerTest {
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private ProgressBarPreference mProgressBarPreference;
+ private StorageFileCategoryPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+ private UserHandle mUserHandle;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private StorageVolumeProvider mMockStorageVolumeProvider;
+ @Mock
+ private VolumeInfo mMockVolumeInfo;
+ @Mock
+ private Intent mMockIntent;
+ @Mock
+ private ComponentName mMockComponentName;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ int myUserId = UserHandle.myUserId();
+ mUserHandle = UserHandle.of(myUserId);
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mProgressBarPreference = new ProgressBarPreference(mContext);
+ mPreferenceController = new StorageFileCategoryPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController, mCarUxRestrictions,
+ mMockStorageVolumeProvider);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mProgressBarPreference);
+
+ when(mMockStorageVolumeProvider.findEmulatedForPrivate(any())).thenReturn(mMockVolumeInfo);
+ }
+
+ @Test
+ public void onCreate_nonResolvableIntent_notSelectable() {
+ when(mMockVolumeInfo.buildBrowseIntent()).thenReturn(mMockIntent);
+ when(mMockIntent.resolveActivity(mContext.getPackageManager())).thenReturn(null);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mProgressBarPreference.isSelectable()).isFalse();
+ }
+
+ @Test
+ public void onCreate_resolvableIntent_selectable() {
+ when(mMockVolumeInfo.buildBrowseIntent()).thenReturn(mMockIntent);
+ when(mMockIntent.resolveActivity(mContext.getPackageManager()))
+ .thenReturn(mMockComponentName);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mProgressBarPreference.isSelectable()).isTrue();
+ }
+
+ @Test
+ public void handlePreferenceClicked_currentUserAndNoActivityToHandleIntent_doesNotThrow() {
+ when(mMockVolumeInfo.buildBrowseIntent()).thenReturn(mMockIntent);
+ when(mMockIntent.resolveActivity(mContext.getPackageManager())).thenReturn(null);
+
+ mProgressBarPreference.performClick();
+
+ verify(mContext, never()).startActivityAsUser(mMockIntent, mUserHandle);
+ }
+
+ @Test
+ public void handlePreferenceClicked_currentUserAndActivityToHandleIntent_startsNewActivity() {
+ when(mMockVolumeInfo.buildBrowseIntent()).thenReturn(mMockIntent);
+ when(mMockIntent.resolveActivity(mContext.getPackageManager()))
+ .thenReturn(mMockComponentName);
+
+ doNothing().when(mContext).startActivityAsUser(mMockIntent, mUserHandle);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mProgressBarPreference.performClick();
+
+ verify(mContext).startActivityAsUser(mMockIntent, mUserHandle);
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
similarity index 60%
rename from tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
rename to tests/unit/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
index a990e84..e5ab11c 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,26 +18,33 @@
import static com.google.common.truth.Truth.assertThat;
+import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.content.pm.ApplicationInfo;
-import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
-/** Unit test for {@link StorageMediaCategoryDetailPreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class StorageMediaCategoryDetailPreferenceControllerTest {
private static final String SOURCE = "source";
@@ -47,20 +54,33 @@
private static final String SIZE_STR = "12.34 MB";
private static final String PACKAGE_NAME = "com.google.packageName";
- private Context mContext;
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
private LogicalPreferenceGroup mLogicalPreferenceGroup;
- private StorageMediaCategoryDetailPreferenceController mController;
- private PreferenceControllerTestHelper<StorageMediaCategoryDetailPreferenceController>
- mPreferenceControllerHelper;
+ private StorageMediaCategoryDetailPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
@Before
+ @UiThreadTest
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
mLogicalPreferenceGroup = new LogicalPreferenceGroup(mContext);
- mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- StorageMediaCategoryDetailPreferenceController.class, mLogicalPreferenceGroup);
- mController = mPreferenceControllerHelper.getController();
- mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+ screen.addPreference(mLogicalPreferenceGroup);
+ mPreferenceController = new StorageMediaCategoryDetailPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController, mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mLogicalPreferenceGroup);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
}
@Test
@@ -83,11 +103,11 @@
appEntry.info.packageName = PACKAGE_NAME;
apps.add(appEntry);
- mController.setExternalAudioBytes(EXTRA_AUDIO_BYTES);
- mController.onDataLoaded(apps);
+ mPreferenceController.setExternalAudioBytes(EXTRA_AUDIO_BYTES);
+ mPreferenceController.onDataLoaded(apps);
// even when the manager notifies the controller again on data loaded the preference
// count should remain the same if new appEntries are not added.
- mController.onDataLoaded(apps);
+ mPreferenceController.onDataLoaded(apps);
assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(2);
@@ -99,5 +119,4 @@
assertThat(mLogicalPreferenceGroup.getPreference(1).getSummary()).isEqualTo(
Long.toString(EXTRA_AUDIO_BYTES));
}
-
}
diff --git a/tests/unit/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java
new file mode 100644
index 0000000..f091ef3
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.common.ProgressBarPreference;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class StorageMediaCategoryPreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private ProgressBarPreference mProgressBarPreference;
+ private StorageMediaCategoryPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mProgressBarPreference = new ProgressBarPreference(mContext);
+ mPreferenceController = new StorageMediaCategoryPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController, mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mProgressBarPreference);
+ }
+
+ @Test
+ @UiThreadTest
+ public void handlePreferenceClicked_shouldLaunchAccountSyncDetailsFragment() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mProgressBarPreference.performClick();
+
+ verify(mMockFragmentController).launchFragment(
+ any(StorageMediaCategoryDetailFragment.class));
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java b/tests/unit/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
similarity index 95%
rename from tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
rename to tests/unit/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
index b4f57c0..cc1a248 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
+++ b/tests/unit/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -30,6 +30,8 @@
import android.util.SparseArray;
import androidx.loader.app.LoaderManager;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settingslib.deviceinfo.PrivateStorageInfo;
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
@@ -41,35 +43,30 @@
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-/** Unit test for {@link StorageSettingsManager}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class StorageSettingsManagerTest {
- private Context mContext;
+ private Context mContext = ApplicationProvider.getApplicationContext();
private VolumeInfo mVolumeInfo;
private StorageSettingsManager mStorageSettingsManager;
+
@Captor
private ArgumentCaptor<LoaderManager
.LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>>> mAppsStorageResult;
@Captor
private ArgumentCaptor<LoaderManager.LoaderCallbacks<PrivateStorageInfo>> mVolumeSizeCallback;
-
@Mock
private StorageSettingsManager.VolumeListener mVolumeListener1;
-
@Mock
private StorageSettingsManager.VolumeListener mVolumeListener2;
-
@Mock
private LoaderManager mLoaderManager;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
+
mStorageSettingsManager = new StorageSettingsManager(mContext, mVolumeInfo);
mStorageSettingsManager.startLoading(mLoaderManager);
verify(mLoaderManager, times(1)).restartLoader(eq(0), eq(Bundle.EMPTY),
diff --git a/tests/unit/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java
new file mode 100644
index 0000000..5bce14e
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import android.app.usage.StorageStats;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.settingslib.applications.StorageStatsSource;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class StorageSizeBasePreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private StorageAppDetailPreference mStorageAppDetailPreference;
+ private TestStorageSizeBasePreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+ @Mock
+ private AppsStorageStatsManager mAppsStorageStatsManager;
+
+ private static class TestStorageSizeBasePreferenceController extends
+ StorageSizeBasePreferenceController {
+
+ TestStorageSizeBasePreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ }
+
+ @Override
+ protected long getSize() {
+ return 1_000_000_000;
+ }
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mStorageAppDetailPreference = new StorageAppDetailPreference(mContext);
+ mPreferenceController = new TestStorageSizeBasePreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController, mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mStorageAppDetailPreference);
+ }
+
+ @Test
+ public void onCreate_defaultState_nothingIsSet() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ assertThat(mStorageAppDetailPreference.getDetailText()).isNull();
+ assertThat(mPreferenceController.isCachedCleared()).isFalse();
+ assertThat(mPreferenceController.isDataCleared()).isFalse();
+ assertThat(mPreferenceController.getAppStorageStats()).isNull();
+ }
+
+ @Test
+ public void setAppsStorageStatsManager_shouldRegisterController() {
+ mPreferenceController.setAppsStorageStatsManager(mAppsStorageStatsManager);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ verify(mAppsStorageStatsManager).registerListener(mPreferenceController);
+ }
+
+ @Test
+ public void onDataLoaded_shouldUpdateCachedAndDataClearedState() {
+ mPreferenceController.onDataLoaded(null, true, true);
+
+ assertThat(mPreferenceController.isCachedCleared()).isTrue();
+ assertThat(mPreferenceController.isDataCleared()).isTrue();
+ }
+
+ @Test
+ public void onDataLoaded_appStorageStatsNotSet_shouldNotUpdateDetailText() {
+ mPreferenceController.onDataLoaded(null, true, true);
+
+ assertThat(mPreferenceController.getAppStorageStats()).isNull();
+ assertThat(mStorageAppDetailPreference.getDetailText()).isNull();
+ }
+
+ @Test
+ public void onDataLoaded_appStorageStatsSet_shouldUpdateDetailText() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ StorageStats stats = new StorageStats();
+ StorageStatsSource.AppStorageStats storageStats =
+ new StorageStatsSource.AppStorageStatsImpl(stats);
+ mPreferenceController.setAppStorageStats(storageStats);
+ mPreferenceController.onDataLoaded(null, true, true);
+
+ assertThat(mPreferenceController.getAppStorageStats()).isNotNull();
+ assertThat(mStorageAppDetailPreference.getDetailText()).isEqualTo("1.00 GB");
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java
new file mode 100644
index 0000000..9f0c71a
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.verify;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.common.ProgressBarPreference;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class StorageSystemCategoryPreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private ProgressBarPreference mProgressBarPreference;
+ private StorageSystemCategoryPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+ mProgressBarPreference = new ProgressBarPreference(mContext);
+ mPreferenceController = new StorageSystemCategoryPreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController, mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mProgressBarPreference);
+ }
+
+ @Test
+ @UiThreadTest
+ public void handlePreferenceClicked_openAlertDialog() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mProgressBarPreference.performClick();
+
+ verify(mMockFragmentController).showDialog(any(ConfirmationDialogFragment.class),
+ anyString());
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
similarity index 73%
rename from tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
rename to tests/unit/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
index 980b166..a613d1b 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,30 +24,34 @@
import android.content.Context;
import android.util.SparseArray;
-import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.common.ProgressBarPreference;
+import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.settingslib.applications.StorageStatsSource;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-/** Unit test for {@link StorageUsageBasePreferenceController}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class StorageUsageBasePreferenceControllerTest {
- private Context mContext;
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
private ProgressBarPreference mProgressBarPreference;
- private TestStorageUsageBasePreferenceController mController;
- private PreferenceControllerTestHelper<TestStorageUsageBasePreferenceController>
- mPreferenceControllerHelper;
+ private TestStorageUsageBasePreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mMockFragmentController;
private static class TestStorageUsageBasePreferenceController extends
StorageUsageBasePreferenceController {
@@ -67,12 +71,16 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
mProgressBarPreference = new ProgressBarPreference(mContext);
- mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- TestStorageUsageBasePreferenceController.class, mProgressBarPreference);
- mController = mPreferenceControllerHelper.getController();
- mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+ mPreferenceController = new TestStorageUsageBasePreferenceController(mContext,
+ /* preferenceKey= */ "key", mMockFragmentController, mCarUxRestrictions);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController,
+ mProgressBarPreference);
+ mPreferenceController.onCreate(mLifecycleOwner);
}
@Test
@@ -93,7 +101,7 @@
MEGABYTE_IN_BYTES * 150, // video
MEGABYTE_IN_BYTES * 200, 0)); // image
results.put(0, result);
- mController.onDataLoaded(results, 100, 100);
+ mPreferenceController.onDataLoaded(results, 100, 100);
assertThat(mProgressBarPreference.getSummary().toString()).isEqualTo("1.0 GB");
}
@@ -110,7 +118,7 @@
MEGABYTE_IN_BYTES * 150, // video
MEGABYTE_IN_BYTES * 200, 0)); // image
results.put(0, result);
- mController.onDataLoaded(results, 100, 2_000_000_000);
+ mPreferenceController.onDataLoaded(results, 100, 2_000_000_000);
// usage size is half the total size i.e percentage of storage used should be 50.
assertThat(mProgressBarPreference.getProgress()).isEqualTo(50);
}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java b/tests/unit/src/com/android/car/settings/storage/StorageUtilsTest.java
similarity index 95%
rename from tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java
rename to tests/unit/src/com/android/car/settings/storage/StorageUtilsTest.java
index e305f59..48610dd 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java
+++ b/tests/unit/src/com/android/car/settings/storage/StorageUtilsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,15 +26,15 @@
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-/** Unit test for {@link StorageUtils}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class StorageUtilsTest {
@Mock
diff --git a/tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java b/tests/unit/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
similarity index 81%
rename from tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
rename to tests/unit/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
index 0d8c211..e8b6216 100644
--- a/tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
+++ b/tests/unit/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,25 +25,19 @@
import android.content.Context;
import android.os.storage.VolumeInfo;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settingslib.deviceinfo.PrivateStorageInfo;
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-/** Unit test for {@link VolumeSizesLoader}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class VolumeSizesLoaderTest {
- private Context mContext;
-
- @Before
- public void setUp() throws Exception {
- mContext = RuntimeEnvironment.application;
- }
+ private Context mContext = ApplicationProvider.getApplicationContext();
@Test
public void getVolumeSize_getsValidSizes() throws Exception {
diff --git a/tests/unit/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
index 9c95aa6..196c228 100644
--- a/tests/unit/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
@@ -46,6 +46,7 @@
import com.android.car.settings.development.DevelopmentSettingsUtil;
import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.settingslib.utils.StringUtil;
import org.junit.After;
import org.junit.Before;
@@ -156,8 +157,8 @@
}
int remainingClicks = getTapsToBecomeDeveloper() - getTapsToShowToast();
- assertToastShown(mContext.getResources().getQuantityString(R.plurals.show_dev_countdown,
- remainingClicks, remainingClicks));
+ assertToastShown(StringUtil.getIcuPluralsString(mContext, remainingClicks,
+ R.string.show_dev_countdown));
}
@Test
diff --git a/tests/unit/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
index 0bb52ce..aa00305 100644
--- a/tests/unit/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
@@ -17,11 +17,14 @@
package com.android.car.settings.system;
import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -35,14 +38,16 @@
import android.provider.Settings;
import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
+import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.development.DevelopmentSettingsUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
import com.android.dx.mockito.inline.extended.ExtendedMockito;
import org.junit.After;
@@ -56,9 +61,12 @@
@RunWith(AndroidJUnit4.class)
public class DeveloperOptionsEntryPreferenceControllerTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_DEBUGGING_FEATURES;
+
private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
- private Preference mPreference;
+ private CarUiPreference mPreference;
private DeveloperOptionsEntryPreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
private MockitoSession mSession;
@@ -80,12 +88,11 @@
.mockStatic(UserManager.class, withSettings().lenient())
.startMocking();
when(UserManager.get(mContext)).thenReturn(mMockUserManager);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
when(mMockUserManager.isAdminUser()).thenReturn(true);
- when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES))
- .thenReturn(false);
doNothing().when(mContext).startActivity(any());
- mPreference = new Preference(mContext);
+ mPreference = new CarUiPreference(mContext);
mPreference.setIntent(new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS));
mPreferenceController = new DeveloperOptionsEntryPreferenceController(mContext,
"key", mFragmentController, mCarUxRestrictions);
@@ -113,15 +120,24 @@
}
@Test
- public void testGetAvailabilityStatus_devOptionsEnabled_hasUserRestriction_isUnavailable() {
+ public void testGetAvailabilityStatus_devOptionsEnabled_restrictedByUm_isUnavailable() {
setDeveloperOptionsEnabled(true);
- when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES))
- .thenReturn(true);
+ mockUserRestrictionSetByUm(true);
+
assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
CONDITIONALLY_UNAVAILABLE);
}
@Test
+ public void testGetAvailabilityStatus_devOptionsEnabled_restrictedByDpm_availableForViewing() {
+ setDeveloperOptionsEnabled(true);
+ mockUserRestrictionSetByDpm(true);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(
+ AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
public void performClick_startsActivity() {
setDeveloperOptionsEnabled(true);
mPreferenceController.onCreate(mLifecycleOwner);
@@ -134,9 +150,40 @@
assertThat(intent.getAction()).isEqualTo(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
}
+ @Test
+ @UiThreadTest
+ public void disabledClick_restrictedByDpm_dialog() {
+ setDeveloperOptionsEnabled(true);
+ mockUserRestrictionSetByDpm(true);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ mPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
private void setDeveloperOptionsEnabled(boolean enabled) {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, enabled ? 1 : 0);
DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(mContext, enabled);
}
+
+ private void mockUserRestrictionSetByUm(boolean restricted) {
+ when(mMockUserManager.hasBaseUserRestriction(eq(TEST_RESTRICTION), any()))
+ .thenReturn(restricted);
+ if (restricted) {
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(restricted);
+ }
+ }
+
+ private void mockUserRestrictionSetByDpm(boolean restricted) {
+ when(mMockUserManager.hasBaseUserRestriction(eq(TEST_RESTRICTION), any()))
+ .thenReturn(false);
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(restricted);
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
}
diff --git a/tests/unit/src/com/android/car/settings/system/FactoryResetEntryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/system/FactoryResetEntryPreferenceControllerTest.java
index cd7df7d..a3b35cb 100644
--- a/tests/unit/src/com/android/car/settings/system/FactoryResetEntryPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/system/FactoryResetEntryPreferenceControllerTest.java
@@ -29,28 +29,27 @@
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.withSettings;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
-import android.os.UserHandle;
import android.os.UserManager;
-import android.provider.Settings;
import android.widget.Toast;
import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.R;
-import com.android.car.settings.common.ClickableWhileDisabledPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
import com.android.dx.mockito.inline.extended.ExtendedMockito;
import org.junit.After;
@@ -60,13 +59,14 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
/** Unit test for {@link FactoryResetEntryPreferenceController}. */
@RunWith(AndroidJUnit4.class)
public class FactoryResetEntryPreferenceControllerTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
- private ClickableWhileDisabledPreference mPreference;
+ private Preference mPreference;
private FactoryResetEntryPreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
private MockitoSession mSession;
@@ -86,16 +86,17 @@
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mDefaultDemoMode = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.DEVICE_DEMO_MODE, 0);
mSession = ExtendedMockito.mockitoSession()
- .mockStatic(UserManager.class, withSettings().lenient())
- .mockStatic(Toast.class, withSettings().lenient())
+ .mockStatic(UserManager.class)
+ .mockStatic(Toast.class)
+ .strictness(Strictness.LENIENT)
.startMocking();
when(UserManager.get(mContext)).thenReturn(mMockUserManager);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+
when(Toast.makeText(any(), anyString(), anyInt())).thenReturn(mMockToast);
- mPreference = new ClickableWhileDisabledPreference(mContext);
+ mPreference = new CarUiPreference(mContext);
mPreferenceController = new FactoryResetEntryPreferenceController(mContext,
"key", mFragmentController, mCarUxRestrictions);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
@@ -106,8 +107,6 @@
if (mSession != null) {
mSession.finishMocking();
}
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE,
- mDefaultDemoMode);
}
@Test
@@ -139,7 +138,7 @@
}
@Test
- public void getAvailabilityStatus_adminUser_baseRestricted_dpmRestricted_available() {
+ public void getAvailabilityStatus_adminUser_baseRestricted_dpmRestricted_disabledForUser() {
switchToUser(/* isAdmin= */ true, /* isDemo= */ false);
addBaseUserRestriction(DISALLOW_FACTORY_RESET);
addUserRestriction(DISALLOW_FACTORY_RESET);
@@ -150,19 +149,18 @@
}
@Test
- public void getAvailabilityStatus_adminUser_notBaseRestricted_dpmRestricted_available() {
+ public void getAvailabilityStatus_adminUser_notBaseRestricted_dpmRestricted_disabledForUser() {
switchToUser(/* isAdmin= */ true, /* isDemo= */ false);
addUserRestriction(DISALLOW_FACTORY_RESET);
mPreferenceController.onCreate(mLifecycleOwner);
- assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- assertThat(mPreference.isEnabled()).isTrue();
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ assertThat(mPreference.isEnabled()).isFalse();
}
@Test
public void getAvailabilityStatus_demoMode_demoUser_available() {
switchToUser(/* isAdmin= */ false, /* isDemo= */ true);
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
mPreferenceController.onCreate(mLifecycleOwner);
assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
@@ -173,7 +171,6 @@
public void getAvailabilityStatus_demoMode_demoUser_baseRestricted_disabledForUser() {
switchToUser(/* isAdmin= */ false, /* isDemo= */ true);
addBaseUserRestriction(DISALLOW_FACTORY_RESET);
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
mPreferenceController.onCreate(mLifecycleOwner);
assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
@@ -181,14 +178,13 @@
}
@Test
- public void getAvailabilityStatus_demoMode_demoUser_dpmRestricted_available() {
+ public void getAvailabilityStatus_demoMode_demoUser_dpmRestricted_disabledForUser() {
switchToUser(/* isAdmin= */ false, /* isDemo= */ true);
addUserRestriction(DISALLOW_FACTORY_RESET);
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
mPreferenceController.onCreate(mLifecycleOwner);
- assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- assertThat(mPreference.isEnabled()).isTrue();
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ assertThat(mPreference.isEnabled()).isFalse();
}
@Test
@@ -253,7 +249,6 @@
@UiThreadTest
public void performClick_triggersAction_demoUser_unrestricted() {
switchToUser(/* isAdmin= */ false, /* isDemo= */ true);
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
mPreferenceController.onCreate(mLifecycleOwner);
mPreference.performClick();
@@ -266,7 +261,6 @@
public void performClick_showsBlockedToast_demoUser_baseRestricted() {
switchToUser(/* isAdmin= */ false, /* isDemo= */ true);
addBaseUserRestriction(DISALLOW_FACTORY_RESET);
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
mPreferenceController.onCreate(mLifecycleOwner);
mPreference.performClick();
@@ -278,7 +272,6 @@
public void performClick_showsBlockedDialog_demoUser_dpmRestricted() {
switchToUser(/* isAdmin= */ false, /* isDemo= */ true);
addUserRestriction(DISALLOW_FACTORY_RESET);
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
mPreferenceController.onCreate(mLifecycleOwner);
mPreference.performClick();
@@ -294,7 +287,7 @@
private void addBaseUserRestriction(String restriction) {
when(mMockUserManager.hasBaseUserRestriction(
- restriction, UserHandle.of(mContext.getUserId()))).thenReturn(true);
+ eq(restriction), any())).thenReturn(true);
}
private void addUserRestriction(String restriction) {
@@ -302,10 +295,9 @@
}
private void assertShowingBlockedToast() {
+ String toastText = mContext.getResources().getString(R.string.action_unavailable);
ExtendedMockito.verify(
- () -> Toast.makeText(any(),
- eq(mContext.getResources().getString(R.string.action_unavailable)),
- anyInt()));
+ () -> Toast.makeText(any(), eq(toastText), anyInt()));
verify(mMockToast).show();
}
diff --git a/tests/unit/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
index fe3a5ec..ec3993f 100644
--- a/tests/unit/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
@@ -16,44 +16,50 @@
package com.android.car.settings.system;
-import static android.os.UserManager.DISALLOW_NETWORK_RESET;
-
import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_PROFILE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.withSettings;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.os.UserManager;
-import androidx.preference.Preference;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiPreference;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.mockito.MockitoSession;
/** Unit test for {@link ResetNetworkEntryPreferenceController}. */
@RunWith(AndroidJUnit4.class)
public class ResetNetworkEntryPreferenceControllerTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
- private Preference mPreference;
+ private static final String TEST_RESTRICTION = android.os.UserManager.DISALLOW_NETWORK_RESET;
+
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private final LifecycleOwner mLifecycleOwner = new TestLifecycleOwner();
+ private CarUiPreference mPreference;
private ResetNetworkEntryPreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
- private MockitoSession mSession;
@Mock
private FragmentController mFragmentController;
@@ -64,46 +70,85 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
-
- mSession = ExtendedMockito.mockitoSession()
- .mockStatic(UserManager.class, withSettings().lenient())
- .startMocking();
- when(UserManager.get(mContext)).thenReturn(mMockUserManager);
-
- mPreference = new Preference(mContext);
+ mPreference = new CarUiPreference(mContext);
mPreferenceController = new ResetNetworkEntryPreferenceController(mContext,
"key", mFragmentController, mCarUxRestrictions);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
}
- @After
- public void tearDown() {
- if (mSession != null) {
- mSession.finishMocking();
- }
- }
-
@Test
public void getAvailabilityStatus_nonAdminUser_disabledForUser() {
- when(mMockUserManager.isAdminUser()).thenReturn(false);
+ mockUserIsAdmin(false);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
}
@Test
- public void getAvailabilityStatus_adminUser_available() {
- when(mMockUserManager.isAdminUser()).thenReturn(true);
+ public void getAvailabilityStatus_adminUser_restrictedByUm_disabledForUser() {
+ mockUserIsAdmin(true);
+ mockUserRestrictionSetByUm(true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_adminUser_restrictedByDpm_disabledForUser() {
+ mockUserIsAdmin(true);
+ mockUserRestrictionSetByDpm(true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void getAvailabilityStatus_adminUser_notRestricted_available() {
+ mockUserIsAdmin(true);
+ mockUserRestrictionSetByDpm(false);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ assertThat(mPreference.isEnabled()).isTrue();
}
@Test
- public void getAvailabilityStatus_adminUser_restricted_disabledForUser() {
- when(mMockUserManager.isAdminUser()).thenReturn(true);
- when(mMockUserManager.hasUserRestriction(DISALLOW_NETWORK_RESET)).thenReturn(true);
+ @UiThreadTest
+ public void testDisabledClick_restrictedByDpm_showDialog() {
+ mockUserIsAdmin(true);
+ mockUserRestrictionSetByDpm(true);
- assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_PROFILE);
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void mockUserIsAdmin(boolean isAdmin) {
+ when(mMockUserManager.isAdminUser()).thenReturn(isAdmin);
+ }
+
+ private void mockUserRestrictionSetByUm(boolean restricted) {
+ when(mMockUserManager.hasBaseUserRestriction(eq(TEST_RESTRICTION), any()))
+ .thenReturn(restricted);
+ }
+
+ private void mockUserRestrictionSetByDpm(boolean restricted) {
+ mockUserRestrictionSetByUm(false);
+ when(mMockUserManager.hasUserRestriction(TEST_RESTRICTION)).thenReturn(restricted);
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
}
}
diff --git a/tests/unit/src/com/android/car/settings/testutils/EnterpriseTestUtils.java b/tests/unit/src/com/android/car/settings/testutils/EnterpriseTestUtils.java
new file mode 100644
index 0000000..71136cc
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/testutils/EnterpriseTestUtils.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.os.UserManager;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+/**
+ * Collection of helper methods for PreferenceController with restricted access.
+ */
+public class EnterpriseTestUtils {
+ public static void mockUserRestrictionSetByUm(UserManager um, String restriction,
+ boolean restricted) {
+ when(um.hasBaseUserRestriction(eq(restriction), any()))
+ .thenReturn(restricted);
+ if (restricted) {
+ // In this test infra, setting base user restriction does not automatically set
+ // user restriction
+ when(um.hasUserRestriction(restriction)).thenReturn(restricted);
+ }
+ }
+
+ public static void mockUserRestrictionSetByDpm(UserManager um, String restriction,
+ boolean restricted) {
+ mockUserRestrictionSetByUm(um, restriction, false);
+ when(um.hasUserRestriction(restriction)).thenReturn(restricted);
+ }
+
+ private EnterpriseTestUtils() {
+ throw new AssertionError();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..62c9adf
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.car.ui.preference.CarUiTwoActionIconPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class PreferredEngineEntryPreferenceControllerTest {
+
+ private static final TextToSpeech.EngineInfo ENGINE_INFO = new TextToSpeech.EngineInfo();
+ private static final String INTENT_ACTION = "test_action";
+
+ static {
+ ENGINE_INFO.label = "Test Engine";
+ ENGINE_INFO.name = "com.android.car.settings.tts.test.Engine";
+ }
+
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private LifecycleOwner mLifecycleOwner;
+ private CarUiTwoActionIconPreference mPreference;
+ private PreferredEngineEntryPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mFragmentController;
+ @Mock
+ private TtsEngines mEnginesHelper;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ mPreference = new CarUiTwoActionIconPreference(mContext);
+ mPreferenceController = new PreferredEngineEntryPreferenceController(mContext,
+ "key", mFragmentController, mCarUxRestrictions, mEnginesHelper);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+
+ Intent intent = new Intent(INTENT_ACTION);
+ when(mEnginesHelper.getSettingsIntent(ENGINE_INFO.name)).thenReturn(intent);
+ when(mEnginesHelper.getEngineInfo(ENGINE_INFO.name)).thenReturn(
+ ENGINE_INFO);
+ when(mEnginesHelper.getDefaultEngine()).thenReturn(ENGINE_INFO.name);
+ doNothing().when(mContext).startActivity(any());
+ }
+
+ @Test
+ public void performButtonClick_navigateToNextActivity() {
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreference.performSecondaryActionClick();
+
+ ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(
+ Intent.class);
+ verify(mContext).startActivity(intentArgumentCaptor.capture());
+
+ Intent intent = intentArgumentCaptor.getValue();
+ assertThat(intent.getAction()).isEqualTo(INTENT_ACTION);
+ }
+}
diff --git a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
similarity index 67%
rename from tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
rename to tests/unit/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
index 4019f00..ca2e166 100644
--- a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
@@ -31,39 +32,37 @@
import android.speech.tts.TtsEngines;
import android.speech.tts.Voice;
-import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.android.car.settings.R;
import com.android.car.settings.common.ActivityResultCallback;
+import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.LogicalPreferenceGroup;
-import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.common.SeekBarPreference;
-import com.android.car.settings.testutils.ShadowSecureSettings;
-import com.android.car.settings.testutils.ShadowTextToSpeech;
-import com.android.car.settings.testutils.ShadowTtsEngines;
+import com.android.car.settings.testutils.TestLifecycleOwner;
import com.google.android.collect.Lists;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
import java.util.Locale;
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowTextToSpeech.class, ShadowTtsEngines.class,
- ShadowSecureSettings.class})
+@RunWith(AndroidJUnit4.class)
public class TtsPlaybackPreferenceControllerTest {
private static final String DEFAULT_ENGINE_NAME = "com.android.car.settings.tts.test.default";
@@ -76,30 +75,38 @@
ENGINE_INFO.name = "com.android.car.settings.tts.test.other";
}
- private Context mContext;
- private PreferenceControllerTestHelper<TtsPlaybackPreferenceController>
- mControllerHelper;
- private TtsPlaybackPreferenceController mController;
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private TtsPlaybackPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
private PreferenceGroup mPreferenceGroup;
private ListPreference mDefaultLanguagePreference;
private SeekBarPreference mSpeechRatePreference;
private SeekBarPreference mVoicePitchPreference;
private Preference mResetPreference;
+
@Mock
private TextToSpeech mTextToSpeech;
@Mock
private TtsEngines mEnginesHelper;
+ @Mock
+ private FragmentController mFragmentController;
@Before
+ @UiThreadTest
public void setUp() {
MockitoAnnotations.initMocks(this);
- ShadowTextToSpeech.setInstance(mTextToSpeech);
- ShadowTtsEngines.setInstance(mEnginesHelper);
+ mLifecycleOwner = new TestLifecycleOwner();
- mContext = RuntimeEnvironment.application;
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
mPreferenceGroup = new LogicalPreferenceGroup(mContext);
- mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
- TtsPlaybackPreferenceController.class, mPreferenceGroup);
+ screen.addPreference(mPreferenceGroup);
+ mPreferenceController = new TestTtsPlaybackPreferenceController(mContext,
+ "key", mFragmentController, mCarUxRestrictions, mEnginesHelper);
mDefaultLanguagePreference = new ListPreference(mContext);
mDefaultLanguagePreference.setKey(mContext.getString(R.string.pk_tts_default_language));
@@ -116,8 +123,7 @@
mResetPreference = new Preference(mContext);
mResetPreference.setKey(mContext.getString(R.string.pk_tts_reset));
mPreferenceGroup.addPreference(mResetPreference);
-
- mController = mControllerHelper.getController();
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreferenceGroup);
when(mTextToSpeech.getCurrentEngine()).thenReturn(ENGINE_INFO.name);
when(mTextToSpeech.getVoice()).thenReturn(VOICE);
@@ -132,21 +138,14 @@
TextToSpeech.Engine.DEFAULT_PITCH);
}
- @After
- public void tearDown() {
- ShadowTtsEngines.reset();
- ShadowTextToSpeech.reset();
- ShadowSecureSettings.reset();
- }
-
@Test
public void onCreate_startsCheckVoiceData() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
- verify(mControllerHelper.getMockFragmentController()).startActivityForResult(
+ verify(mFragmentController).startActivityForResult(
intent.capture(), eq(TtsPlaybackPreferenceController.VOICE_DATA_CHECK),
any(ActivityResultCallback.class));
@@ -157,11 +156,11 @@
@Test
public void voiceDataCheck_processActivityResult_dataIsNull_defaultSynthRemainsUnchanged() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+ mPreferenceController.onCreate(mLifecycleOwner);
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_SYNTH,
DEFAULT_ENGINE_NAME);
- mController.processActivityResult(
+ mPreferenceController.processActivityResult(
TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, /* data= */ null);
@@ -171,12 +170,12 @@
@Test
public void voiceDataCheck_processActivityResult_dataIsNotNull_updatesDefaultSynth() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+ mPreferenceController.onCreate(mLifecycleOwner);
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_SYNTH,
DEFAULT_ENGINE_NAME);
Intent data = new Intent();
- mController.processActivityResult(
+ mPreferenceController.processActivityResult(
TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
@@ -186,7 +185,7 @@
@Test
public void voiceDataCheck_processActivityResult_checkSuccess_hasVoices_populatesPreference() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+ mPreferenceController.onCreate(mLifecycleOwner);
// Check that the length is 0 initially.
assertThat(mDefaultLanguagePreference.getEntries()).isNull();
@@ -199,10 +198,11 @@
Locale.KOREA.toString()
));
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ mPreferenceController.processActivityResult(
+ TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
- waitForBackgroundTasksToComplete();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
// Length is 3 languages + default language.
assertThat(mDefaultLanguagePreference.getEntries().length).isEqualTo(4);
@@ -210,10 +210,10 @@
@Test
public void getSampleText_processActivityResult_dataIsNull_setsDefaultText() {
- mController.processActivityResult(TtsPlaybackPreferenceController.GET_SAMPLE_TEXT,
+ mPreferenceController.processActivityResult(TtsPlaybackPreferenceController.GET_SAMPLE_TEXT,
TextToSpeech.LANG_AVAILABLE, /* data= */ null);
- assertThat(mController.getSampleText()).isEqualTo(
+ assertThat(mPreferenceController.getSampleText()).isEqualTo(
mContext.getString(R.string.tts_default_sample_string));
}
@@ -224,10 +224,10 @@
Intent data = new Intent();
data.putExtra(TextToSpeech.Engine.EXTRA_SAMPLE_TEXT, testData);
- mController.processActivityResult(TtsPlaybackPreferenceController.GET_SAMPLE_TEXT,
+ mPreferenceController.processActivityResult(TtsPlaybackPreferenceController.GET_SAMPLE_TEXT,
TextToSpeech.LANG_AVAILABLE, data);
- assertThat(mController.getSampleText()).isEqualTo(
+ assertThat(mPreferenceController.getSampleText()).isEqualTo(
mContext.getString(R.string.tts_default_sample_string));
}
@@ -238,17 +238,17 @@
Intent data = new Intent();
data.putExtra(TextToSpeech.Engine.EXTRA_SAMPLE_TEXT, testData);
- mController.processActivityResult(TtsPlaybackPreferenceController.GET_SAMPLE_TEXT,
+ mPreferenceController.processActivityResult(TtsPlaybackPreferenceController.GET_SAMPLE_TEXT,
TextToSpeech.LANG_AVAILABLE, data);
- assertThat(mController.getSampleText()).isEqualTo(testData);
+ assertThat(mPreferenceController.getSampleText()).isEqualTo(testData);
}
@Test
public void defaultLanguage_handlePreferenceChanged_passEmptyValue_setsDefault() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
Intent data = new Intent();
data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
@@ -257,9 +257,10 @@
Locale.CANADA.toString(),
Locale.KOREA.toString()
));
- mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+ mPreferenceController.processActivityResult(
+ TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
- waitForBackgroundTasksToComplete();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
// Test change listener.
mDefaultLanguagePreference.callChangeListener("");
@@ -269,9 +270,9 @@
@Test
public void defaultLanguage_handlePreferenceChanged_passLocale_setsLocale() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
Intent data = new Intent();
data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
@@ -280,9 +281,10 @@
Locale.CANADA.toString(),
Locale.KOREA.toString()
));
- mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+ mPreferenceController.processActivityResult(
+ TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
- waitForBackgroundTasksToComplete();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
// Test change listener.
mDefaultLanguagePreference.callChangeListener(Locale.ENGLISH.toString());
@@ -292,9 +294,9 @@
@Test
public void defaultLanguage_handlePreferenceChanged_passLocale_setsSummary() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
Intent data = new Intent();
data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
@@ -303,9 +305,10 @@
Locale.CANADA.toString(),
Locale.KOREA.toString()
));
- mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+ mPreferenceController.processActivityResult(
+ TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
- waitForBackgroundTasksToComplete();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
mDefaultLanguagePreference.callChangeListener(Locale.ENGLISH.toString());
@@ -315,9 +318,9 @@
@Test
public void speechRate_handlePreferenceChanged_updatesSecureSettings() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
mSpeechRatePreference.callChangeListener(newSpeechRate);
@@ -329,9 +332,9 @@
@Test
public void speechRate_handlePreferenceChanged_updatesTts() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
mSpeechRatePreference.callChangeListener(newSpeechRate);
@@ -342,9 +345,9 @@
@Test
public void speechRate_handlePreferenceChanged_speaksSampleText() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
mSpeechRatePreference.callChangeListener(newSpeechRate);
@@ -354,9 +357,9 @@
@Test
public void voicePitch_handlePreferenceChanged_updatesSecureSettings() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
mVoicePitchPreference.callChangeListener(newVoicePitch);
@@ -368,9 +371,9 @@
@Test
public void voicePitch_handlePreferenceChanged_updatesTts() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
mVoicePitchPreference.callChangeListener(newVoicePitch);
@@ -381,9 +384,9 @@
@Test
public void voicePitch_handlePreferenceChanged_speaksSampleText() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
mVoicePitchPreference.callChangeListener(newVoicePitch);
@@ -393,9 +396,9 @@
@Test
public void refreshUi_notInitialized_disablesPreference() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+ mPreferenceController.onCreate(mLifecycleOwner);
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mDefaultLanguagePreference.isEnabled()).isFalse();
// Default language preference is always hidden
@@ -409,11 +412,11 @@
public void refreshUi_initialized_defaultLocaleIsNull_disablesPreference() {
when(mEnginesHelper.parseLocaleString(any())).thenReturn(null);
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mDefaultLanguagePreference.isEnabled()).isFalse();
// Default language preference is always hidden
@@ -425,9 +428,9 @@
@Test
public void refreshUi_defaultLocaleNotSupported_disablesPreferencesExceptLanguage() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
Intent data = new Intent();
data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
@@ -436,11 +439,12 @@
Locale.CANADA.toString(),
Locale.KOREA.toString()
));
- mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+ mPreferenceController.processActivityResult(
+ TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
- waitForBackgroundTasksToComplete();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mDefaultLanguagePreference.isEnabled()).isTrue();
// Default language preference is always hidden
@@ -452,9 +456,9 @@
@Test
public void refreshUi_initialized_defaultLocaleSupported_enablesPreference() {
- mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
- ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
- waitForBackgroundTasksToComplete();
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mPreferenceController.mOnInitListener.onInit(TextToSpeech.SUCCESS);
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
Intent data = new Intent();
data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
@@ -463,11 +467,12 @@
Locale.CANADA.toString(),
Locale.KOREA.toString()
));
- mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+ mPreferenceController.processActivityResult(
+ TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
- waitForBackgroundTasksToComplete();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
- mController.refreshUi();
+ mPreferenceController.refreshUi();
assertThat(mPreferenceGroup.isEnabled()).isTrue();
assertThat(mDefaultLanguagePreference.isEnabled()).isTrue();
@@ -478,8 +483,17 @@
assertThat(mResetPreference.isEnabled()).isTrue();
}
- private void waitForBackgroundTasksToComplete() {
- Shadows.shadowOf(mController.mBackgroundHandler.getLooper())
- .getScheduler().advanceToLastPostedRunnable();
+ private class TestTtsPlaybackPreferenceController extends TtsPlaybackPreferenceController {
+
+ TestTtsPlaybackPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController,
+ CarUxRestrictions uxRestrictions, TtsEngines enginesHelper) {
+ super(context, preferenceKey, fragmentController, uxRestrictions, enginesHelper);
+ }
+
+ @Override
+ TextToSpeech createTts() {
+ return mTextToSpeech;
+ }
}
}
diff --git a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java b/tests/unit/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
similarity index 88%
rename from tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
rename to tests/unit/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
index 1015dfc..b40a31c 100644
--- a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
+++ b/tests/unit/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,42 +19,39 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.AlertDialog;
import android.content.Context;
import android.provider.Settings;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TtsEngines;
import android.speech.tts.Voice;
-import com.android.car.settings.testutils.ShadowSecureSettings;
-import com.android.car.settings.testutils.ShadowTextToSpeech;
-import com.android.car.settings.testutils.ShadowTtsEngines;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAlertDialog;
import java.util.Locale;
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowTtsEngines.class, ShadowTextToSpeech.class, ShadowSecureSettings.class})
+@RunWith(AndroidJUnit4.class)
public class TtsPlaybackSettingsManagerTest {
-
private static final String ENGINE_NAME = "com.android.car.settings.tts.test";
private static final String SAMPLE_TEXT = "Sample text";
- private Context mContext;
+ private Context mContext = ApplicationProvider.getApplicationContext();
private TtsPlaybackSettingsManager mPlaybackSettingsManager;
+
@Mock
private TextToSpeech mTts;
@Mock
@@ -63,10 +60,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- ShadowTextToSpeech.setInstance(mTts);
- ShadowTtsEngines.setInstance(mEnginesHelper);
- mContext = RuntimeEnvironment.application;
mPlaybackSettingsManager = new TtsPlaybackSettingsManager(mContext, mTts, mEnginesHelper);
when(mTts.getCurrentEngine()).thenReturn(ENGINE_NAME);
@@ -76,14 +70,6 @@
TextToSpeech.Engine.DEFAULT_PITCH);
}
- @After
- public void tearDown() {
- ShadowTextToSpeech.reset();
- ShadowTtsEngines.reset();
- ShadowAlertDialog.reset();
- ShadowSecureSettings.reset();
- }
-
@Test
public void updateSpeechRate_updatesSetting() {
int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
@@ -200,7 +186,12 @@
}
@Test
+ @UiThreadTest
public void speakSampleText_requiresNetworkConnection_languageNotAvailable_showsAlert() {
+ TtsPlaybackSettingsManager spiedManager = spy(mPlaybackSettingsManager);
+ AlertDialog alertDialog = mock(AlertDialog.class);
+ when(spiedManager.createNetworkAlertDialog()).thenReturn(alertDialog);
+
Voice voice = new Voice("Test Name", Locale.FRANCE, /* quality= */ 0,
/* latency= */ 0, /* requiresNetworkConnection= */ true, /* features= */ null);
when(mTts.getVoice()).thenReturn(voice);
@@ -208,9 +199,9 @@
when(mTts.isLanguageAvailable(any(Locale.class))).thenReturn(
TextToSpeech.LANG_MISSING_DATA);
- mPlaybackSettingsManager.speakSampleText(SAMPLE_TEXT);
+ spiedManager.speakSampleText(SAMPLE_TEXT);
- assertThat(ShadowAlertDialog.getLatestAlertDialog()).isNotNull();
+ verify(alertDialog).show();
}
@Test
diff --git a/tests/unit/src/com/android/car/settings/wifi/WifiEntryGroupPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/WifiEntryGroupPreferenceControllerTest.java
index b15d60e..54e3c7b 100644
--- a/tests/unit/src/com/android/car/settings/wifi/WifiEntryGroupPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/wifi/WifiEntryGroupPreferenceControllerTest.java
@@ -17,6 +17,7 @@
package com.android.car.settings.wifi;
import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
import static com.google.common.truth.Truth.assertThat;
@@ -27,7 +28,9 @@
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.UserManager;
+import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
@@ -36,6 +39,7 @@
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.LogicalPreferenceGroup;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
import org.junit.Before;
@@ -46,6 +50,8 @@
@RunWith(AndroidJUnit4.class)
public class WifiEntryGroupPreferenceControllerTest {
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_CONFIG_WIFI;
private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
private LogicalPreferenceGroup mPreference;
@@ -56,36 +62,66 @@
private FragmentController mFragmentController;
@Mock
private PackageManager mPackageManager;
+ @Mock
+ private Lifecycle mMockLifecycle;
+ @Mock
+ private UserManager mMockUserManager;
@Before
@UiThreadTest
public void setUp() {
MockitoAnnotations.initMocks(this);
mLifecycleOwner = new TestLifecycleOwner();
-
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
-
mPreference = new LogicalPreferenceGroup(mContext);
mController = new WifiEntryGroupPreferenceController(mContext,
/* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ when(mFragmentController.getSettingsLifecycle()).thenReturn(mMockLifecycle);
}
@Test
- public void getAvailabilityStatus_wifiAvailable_available() {
- when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ public void getAvailabilityStatus_wifiAvailable_notRestricted_available() {
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true);
PreferenceControllerTestUtil.assignPreference(mController, mPreference);
+
mController.onCreate(mLifecycleOwner);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
+ public void getAvailabilityStatus_wifiAvailable_restrictedByUm_viewing() {
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByUm(mMockUserManager, TEST_RESTRICTION, true);
+ PreferenceControllerTestUtil.assignPreference(mController, mPreference);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void getAvailabilityStatus_wifiAvailable_restrictedByDpm_viewing() {
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+ PreferenceControllerTestUtil.assignPreference(mController, mPreference);
+
+ mController.onCreate(mLifecycleOwner);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
public void getAvailabilityStatus_wifiNotAvailable_unsupportedOnDevice() {
- when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(false);
PreferenceControllerTestUtil.assignPreference(mController, mPreference);
+
mController.onCreate(mLifecycleOwner);
assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
diff --git a/tests/unit/src/com/android/car/settings/wifi/WifiEntryListPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/WifiEntryListPreferenceControllerTest.java
index 7401655..38f6fd6 100644
--- a/tests/unit/src/com/android/car/settings/wifi/WifiEntryListPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/wifi/WifiEntryListPreferenceControllerTest.java
@@ -56,7 +56,9 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
@RunWith(AndroidJUnit4.class)
public class WifiEntryListPreferenceControllerTest {
@@ -250,8 +252,60 @@
verify(mMockWifiManager).connect(eq(config), any());
}
+ @Test
+ public void fetchWifiEntries_getSavedWifiEntries() {
+ String ssid = "test_ssid";
+ when(mMockWifiEntry1.getSsid()).thenReturn(ssid);
+ when(mMockWifiEntry1.getSecurity()).thenReturn(WifiEntry.SECURITY_PSK);
+ when(mMockWifiEntry1.isSaved()).thenReturn(false);
+ List<WifiEntry> wifiEntryList = Arrays.asList(mMockWifiEntry1);
+ List<WifiEntry> noWifiEntries = new ArrayList<>();
+
+ when(mMockCarWifiManager.getSavedWifiEntries()).thenReturn(wifiEntryList);
+ when(mMockCarWifiManager.getAllWifiEntries()).thenReturn(noWifiEntries);
+
+ TestWifiEntryListPreferenceController prefController =
+ (TestWifiEntryListPreferenceController) mPreferenceController;
+ Set<String> prefsThatIgnore = new HashSet<>();
+ prefsThatIgnore.add("unknown key");
+
+ prefController.setUxRestrictionsIgnoredConfig(false, prefsThatIgnore);
+ CarUxRestrictions noSetupRestrictions = new CarUxRestrictions.Builder(
+ true, CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP, 0).build();
+ mPreferenceController.onUxRestrictionsChanged(noSetupRestrictions);
+
+ List<WifiEntry> result = prefController.fetchWifiEntries();
+
+ assertThat(result.size()).isEqualTo(wifiEntryList.size());
+ }
+
+ @Test
+ public void fetchWifiEntries_getAllWifiEntries() {
+ String ssid = "test_ssid";
+ when(mMockWifiEntry1.getSsid()).thenReturn(ssid);
+ when(mMockWifiEntry1.getSecurity()).thenReturn(WifiEntry.SECURITY_PSK);
+ when(mMockWifiEntry1.isSaved()).thenReturn(false);
+ List<WifiEntry> wifiEntryList = Arrays.asList(mMockWifiEntry1);
+ List<WifiEntry> noWifiEntries = new ArrayList<>();
+
+ when(mMockCarWifiManager.getSavedWifiEntries()).thenReturn(wifiEntryList);
+ when(mMockCarWifiManager.getAllWifiEntries()).thenReturn(noWifiEntries);
+
+ TestWifiEntryListPreferenceController prefController =
+ (TestWifiEntryListPreferenceController) mPreferenceController;
+
+ prefController.setUxRestrictionsIgnoredConfig(false, new HashSet<String>());
+
+ List<WifiEntry> result = prefController.fetchWifiEntries();
+
+ assertThat(result.size()).isEqualTo(noWifiEntries.size());
+ }
+
private class TestWifiEntryListPreferenceController extends WifiEntryListPreferenceController {
+ private boolean mAllIgnoresUxRestrictions = false;
+ private Set<String> mPreferencesIgnoringUxRestrictions = new HashSet<>();
+
TestWifiEntryListPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController,
CarUxRestrictions uxRestrictions) {
@@ -267,5 +321,16 @@
WifiManager getWifiManager() {
return mMockWifiManager;
}
+
+ public void setUxRestrictionsIgnoredConfig(boolean allIgnore, Set preferencesThatIgnore) {
+ mAllIgnoresUxRestrictions = allIgnore;
+ mPreferencesIgnoringUxRestrictions = preferencesThatIgnore;
+ }
+
+ @Override
+ protected boolean isUxRestrictionsIgnored(boolean allIgnores, Set prefsThatIgnore) {
+ return super.isUxRestrictionsIgnored(mAllIgnoresUxRestrictions,
+ mPreferencesIgnoringUxRestrictions);
+ }
}
}
diff --git a/tests/unit/src/com/android/car/settings/wifi/WifiStateSwitchPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/WifiStateSwitchPreferenceControllerTest.java
index ad95403..fb8be8d 100644
--- a/tests/unit/src/com/android/car/settings/wifi/WifiStateSwitchPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/wifi/WifiStateSwitchPreferenceControllerTest.java
@@ -16,22 +16,37 @@
package com.android.car.settings.wifi;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+import static com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment.DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG;
+
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
+import android.os.UserManager;
import androidx.lifecycle.Lifecycle;
-import androidx.preference.SwitchPreference;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.car.settings.common.ClickableWhileDisabledSwitchPreference;
+import com.android.car.settings.common.ColoredSwitchPreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.enterprise.ActionDisabledByAdminDialogFragment;
+import com.android.car.settings.testutils.EnterpriseTestUtils;
+import com.android.car.settings.testutils.TestLifecycleOwner;
import org.junit.Before;
import org.junit.Test;
@@ -41,30 +56,42 @@
@RunWith(AndroidJUnit4.class)
public class WifiStateSwitchPreferenceControllerTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
- private SwitchPreference mSwitchPreference;
+ private static final String TEST_RESTRICTION =
+ android.os.UserManager.DISALLOW_CONFIG_WIFI;
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private ColoredSwitchPreference mSwitchPreference;
+ private LifecycleOwner mLifecycleOwner;
private WifiStateSwitchPreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
- private CarWifiManager mCarWifiManager;
@Mock
private FragmentController mFragmentController;
@Mock
private Lifecycle mMockLifecycle;
+ @Mock
+ private PackageManager mMockPackageManager;
+ @Mock
+ private UserManager mMockUserManager;
+ @Mock
+ private WifiManager mMockWifiManager;
@Before
+ @UiThreadTest
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
-
- mSwitchPreference = new ClickableWhileDisabledSwitchPreference(mContext);
- when(mFragmentController.getSettingsLifecycle()).thenReturn(mMockLifecycle);
+ mSwitchPreference = new ColoredSwitchPreference(mContext);
mPreferenceController = new WifiStateSwitchPreferenceController(mContext,
/* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
- mCarWifiManager = new CarWifiManager(mContext, mMockLifecycle);
PreferenceControllerTestUtil.assignPreference(mPreferenceController, mSwitchPreference);
+
+ when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mMockWifiManager);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ when(mFragmentController.getSettingsLifecycle()).thenReturn(mMockLifecycle);
}
@Test
@@ -111,9 +138,59 @@
assertThat(mSwitchPreference.isEnabled()).isFalse();
}
+ @Test
+ public void getAvailabilityStatus_wifiAvailable_notRestricted_available() {
+ when(mMockPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_wifiAvailable_restrictedByDpm_viewing() {
+ when(mMockPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE_FOR_VIEWING);
+ }
+
+ @Test
+ public void getAvailabilityStatus_wifiNotAvailable_unsupportedOnDevice() {
+ when(mMockPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(false);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreferenceController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onPreferenceClicked_wifiAvailable_restrictedByDpm_showAdminDialog() {
+ when(mMockPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true);
+ EnterpriseTestUtils
+ .mockUserRestrictionSetByDpm(mMockUserManager, TEST_RESTRICTION, true);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+ mSwitchPreference.performClick();
+
+ assertShowingDisabledByAdminDialog();
+ }
+
+ private void assertShowingDisabledByAdminDialog() {
+ verify(mFragmentController).showDialog(any(ActionDisabledByAdminDialogFragment.class),
+ eq(DISABLED_BY_ADMIN_CONFIRM_DIALOG_TAG));
+ }
+
private void initializePreference(boolean checked, boolean enabled) {
- mCarWifiManager.setWifiEnabled(checked);
+ when(mMockPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true);
+ when(mMockWifiManager.isWifiEnabled()).thenReturn(enabled);
mSwitchPreference.setChecked(checked);
mSwitchPreference.setEnabled(enabled);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
}
}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiDetailsBasePreferenceControllerTestCase.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiDetailsBasePreferenceControllerTestCase.java
new file mode 100644
index 0000000..037d348
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiDetailsBasePreferenceControllerTestCase.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.details;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.wifitrackerlib.WifiEntry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public abstract class WifiDetailsBasePreferenceControllerTestCase {
+
+ protected Context mContext = ApplicationProvider.getApplicationContext();
+ protected WifiDetailsPreference mPreference;
+ protected LifecycleOwner mLifecycleOwner;
+ protected CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ protected FragmentController mFragmentController;
+ @Mock
+ protected WifiEntry mMockWifiEntry;
+ @Mock
+ protected WifiInfoProvider mMockWifiInfoProvider;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ mPreference = new WifiDetailsPreference(mContext);
+ getController().init(mMockWifiEntry, mMockWifiInfoProvider);
+ PreferenceControllerTestUtil.assignPreference(getController(), mPreference);
+ initTest();
+ }
+
+ @Test
+ public void onCreate_connected_shouldHaveDetailTextSet() {
+ setUpConnectedState();
+ getController().onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.getDetailText()).isEqualTo(getDesiredDetailText());
+ }
+
+ @Test
+ public void onWifiChanged_isNotActive_preferenceNotVisible() {
+ setUpDisconnectedState();
+ getController().onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ protected void initTest() {
+ }
+
+ protected abstract WifiDetailsBasePreferenceController<WifiDetailsPreference> getController();
+
+ protected void setUpConnectedState() {
+ when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
+ }
+
+ protected void setUpDisconnectedState() {
+ when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED);
+ }
+
+ protected abstract String getDesiredDetailText();
+}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java
index c1841a3..82a09e9 100644
--- a/tests/unit/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java
@@ -16,78 +16,46 @@
package com.android.car.settings.wifi.details;
-import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.Mockito.when;
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.Context;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.testutils.ResourceTestUtils;
-import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.wifitrackerlib.WifiEntry;
-import org.junit.Before;
-import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
-public class WifiFrequencyPreferenceControllerTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
- private LifecycleOwner mLifecycleOwner;
- private WifiDetailsPreference mPreference;
+public class WifiFrequencyPreferenceControllerTest
+ extends WifiDetailsBasePreferenceControllerTestCase {
+
private WifiFrequencyPreferenceController mPreferenceController;
- private CarUxRestrictions mCarUxRestrictions;
- @Mock
- private FragmentController mFragmentController;
- @Mock
- private WifiEntry mMockWifiEntry;
- @Mock
- private WifiInfoProvider mMockWifiInfoProvider;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mLifecycleOwner = new TestLifecycleOwner();
-
- mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
- CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
-
- mPreference = new WifiDetailsPreference(mContext);
- mPreferenceController = new WifiFrequencyPreferenceController(mContext,
- /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
- mPreferenceController.init(mMockWifiEntry, mMockWifiInfoProvider);
- PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ @Override
+ protected WifiDetailsBasePreferenceController<WifiDetailsPreference> getController() {
+ if (mPreferenceController == null) {
+ mPreferenceController = new WifiFrequencyPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ }
+ return mPreferenceController;
}
- @Test
- public void onCreate_shouldHaveDetailTextSet() {
+ @Override
+ protected void setUpConnectedState() {
+ super.setUpConnectedState();
WifiEntry.ConnectedInfo connectedInfo = new WifiEntry.ConnectedInfo();
connectedInfo.frequencyMhz = WifiEntry.FREQUENCY_2_4_GHZ;
when(mMockWifiEntry.getConnectedInfo()).thenReturn(connectedInfo);
- when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
- mPreferenceController.onCreate(mLifecycleOwner);
-
- assertThat(mPreference.isVisible()).isTrue();
- assertThat(mPreference.getDetailText()).isEqualTo(
- ResourceTestUtils.getString(mContext, "wifi_band_24ghz"));
}
- @Test
- public void onWifiChanged_isNotActive_preferenceNotVisible() {
+ @Override
+ protected void setUpDisconnectedState() {
+ super.setUpDisconnectedState();
when(mMockWifiEntry.getConnectedInfo()).thenReturn(null);
- when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED);
- mPreferenceController.onCreate(mLifecycleOwner);
+ }
- assertThat(mPreference.isVisible()).isFalse();
+ @Override
+ protected String getDesiredDetailText() {
+ return ResourceTestUtils.getString(mContext, "wifi_band_24ghz");
}
}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java
index 08c631a..a0312aa 100644
--- a/tests/unit/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java
@@ -16,51 +16,28 @@
package com.android.car.settings.wifi.details;
-import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.Mockito.when;
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.Context;
import android.net.IpPrefix;
import android.net.LinkProperties;
import android.net.RouteInfo;
-import androidx.lifecycle.LifecycleOwner;
-import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceControllerTestUtil;
-import com.android.car.settings.testutils.TestLifecycleOwner;
-import com.android.wifitrackerlib.WifiEntry;
-
-import org.junit.Before;
-import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
import java.net.InetAddress;
import java.util.Arrays;
@RunWith(AndroidJUnit4.class)
-public class WifiGatewayPreferenceControllerTest {
+public class WifiGatewayPreferenceControllerTest
+ extends WifiDetailsBasePreferenceControllerTestCase {
private static final String GATE_WAY = "gateway";
- private Context mContext = ApplicationProvider.getApplicationContext();
- private LifecycleOwner mLifecycleOwner;
- private WifiDetailsPreference mPreference;
private WifiGatewayPreferenceController mPreferenceController;
- private CarUxRestrictions mCarUxRestrictions;
@Mock
- private FragmentController mFragmentController;
- @Mock
- private WifiEntry mMockWifiEntry;
- @Mock
- private WifiInfoProvider mMockWifiInfoProvider;
- @Mock
private LinkProperties mMockLinkProperties;
@Mock
private RouteInfo mMockRouteInfo;
@@ -69,25 +46,23 @@
@Mock
private IpPrefix mMockIpPrefix;
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mLifecycleOwner = new TestLifecycleOwner();
-
- mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
- CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
-
- mPreference = new WifiDetailsPreference(mContext);
- mPreferenceController = new WifiGatewayPreferenceController(mContext,
- /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
- mPreferenceController.init(mMockWifiEntry, mMockWifiInfoProvider);
- PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ @Override
+ protected void initTest() {
when(mMockWifiInfoProvider.getLinkProperties()).thenReturn(mMockLinkProperties);
}
- @Test
- public void onCreate_shouldHaveDetailTextSet() {
- when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
+ @Override
+ protected WifiDetailsBasePreferenceController<WifiDetailsPreference> getController() {
+ if (mPreferenceController == null) {
+ mPreferenceController = new WifiGatewayPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ }
+ return mPreferenceController;
+ }
+
+ @Override
+ protected void setUpConnectedState() {
+ super.setUpConnectedState();
when(mMockLinkProperties.getRoutes()).thenReturn(Arrays.asList(mMockRouteInfo));
when(mMockRouteInfo.isDefaultRoute()).thenReturn(true);
try {
@@ -98,17 +73,10 @@
when(mMockRouteInfo.hasGateway()).thenReturn(true);
when(mMockRouteInfo.getGateway()).thenReturn(mMockInetAddress);
when(mMockInetAddress.getHostAddress()).thenReturn(GATE_WAY);
-
- mPreferenceController.onCreate(mLifecycleOwner);
- assertThat(mPreference.isVisible()).isTrue();
- assertThat(mPreference.getDetailText()).isEqualTo(GATE_WAY);
}
- @Test
- public void onWifiChanged_isNotActive_preferenceNotVisible() {
- when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED);
- mPreferenceController.onCreate(mLifecycleOwner);
-
- assertThat(mPreference.isVisible()).isFalse();
+ @Override
+ protected String getDesiredDetailText() {
+ return GATE_WAY;
}
}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceControllerTest.java
new file mode 100644
index 0000000..fb4b8ce
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceControllerTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.details;
+
+import static org.mockito.Mockito.when;
+
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.util.Collections;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiIpAddressPreferenceControllerTest
+ extends WifiDetailsBasePreferenceControllerTestCase {
+
+ private WifiIpAddressPreferenceController mPreferenceController;
+
+ @Mock
+ private LinkProperties mMockLinkProperties;
+ @Mock
+ private LinkAddress mMockLinkAddress;
+
+ @Override
+ protected void initTest() {
+ when(mMockWifiInfoProvider.getLinkProperties()).thenReturn(mMockLinkProperties);
+ when(mMockLinkProperties.getLinkAddresses()).thenReturn(Collections.emptyList());
+ }
+
+ @Override
+ protected WifiDetailsBasePreferenceController<WifiDetailsPreference> getController() {
+ if (mPreferenceController == null) {
+ mPreferenceController = new WifiIpAddressPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ }
+ return mPreferenceController;
+ }
+
+ @Override
+ protected void setUpConnectedState() {
+ super.setUpConnectedState();
+ when(mMockLinkProperties.getLinkAddresses()).thenReturn(
+ Collections.singletonList(mMockLinkAddress));
+ InetAddress address = Inet4Address.LOOPBACK;
+ when(mMockLinkAddress.getAddress()).thenReturn(address);
+ }
+
+ @Override
+ protected String getDesiredDetailText() {
+ return "127.0.0.1";
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceControllerTest.java
new file mode 100644
index 0000000..1b82de7
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceControllerTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.details;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestUtil;
+import com.android.car.settings.testutils.TestLifecycleOwner;
+import com.android.wifitrackerlib.WifiEntry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.util.Collections;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiIpv6AddressPreferenceControllerTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private LifecycleOwner mLifecycleOwner;
+ private Preference mPreference;
+ private WifiIpv6AddressPreferenceController mPreferenceController;
+ private CarUxRestrictions mCarUxRestrictions;
+
+ @Mock
+ private FragmentController mFragmentController;
+ @Mock
+ private WifiEntry mMockWifiEntry;
+ @Mock
+ private WifiInfoProvider mMockWifiInfoProvider;
+ @Mock
+ private LinkProperties mMockLinkProperties;
+ @Mock
+ private LinkAddress mMockLinkAddress;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = new TestLifecycleOwner();
+
+ mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+ mPreference = new Preference(mContext);
+ mPreferenceController = new WifiIpv6AddressPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ mPreferenceController.init(mMockWifiEntry, mMockWifiInfoProvider);
+ PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ when(mMockWifiInfoProvider.getLinkProperties()).thenReturn(mMockLinkProperties);
+ when(mMockLinkProperties.getLinkAddresses()).thenReturn(Collections.emptyList());
+ }
+
+ @Test
+ public void onCreate_hasIpv6Address_summaryTextSet() {
+ when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
+ when(mMockLinkProperties.getLinkAddresses()).thenReturn(
+ Collections.singletonList(mMockLinkAddress));
+ InetAddress address = Inet6Address.LOOPBACK;
+ when(mMockLinkAddress.getAddress()).thenReturn(address);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.getSummary()).isEqualTo("::1");
+ }
+
+ @Test
+ public void onCreate_isNotActive_preferenceNotVisible() {
+ when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED);
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceControllerTest.java
new file mode 100644
index 0000000..34a40df
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceControllerTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.details;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.net.wifi.WifiInfo;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.settings.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiLinkSpeedPreferenceControllerTest
+ extends WifiDetailsBasePreferenceControllerTestCase {
+ private static final int VALID_LINK_SPEED = 100;
+
+ private WifiLinkSpeedPreferenceController mPreferenceController;
+
+ @Mock
+ private WifiInfo mMockWifiInfo;
+
+ @Override
+ protected void initTest() {
+ when(mMockWifiInfoProvider.getWifiInfo()).thenReturn(mMockWifiInfo);
+ }
+
+ @Override
+ protected WifiDetailsBasePreferenceController<WifiDetailsPreference> getController() {
+ if (mPreferenceController == null) {
+ mPreferenceController = new WifiLinkSpeedPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ }
+ return mPreferenceController;
+ }
+
+ @Override
+ protected void setUpConnectedState() {
+ super.setUpConnectedState();
+ when(mMockWifiInfo.getLinkSpeed()).thenReturn(VALID_LINK_SPEED);
+ }
+
+ @Override
+ protected String getDesiredDetailText() {
+ return mContext.getString(R.string.link_speed, VALID_LINK_SPEED);
+ }
+
+ @Test
+ public void onCreate_negativeLinkSpeed_preferenceNotVisible() {
+ super.setUpConnectedState();
+ int linkSpeed = -1;
+ when(mMockWifiInfo.getLinkSpeed()).thenReturn(linkSpeed);
+
+ mPreferenceController.onCreate(mLifecycleOwner);
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java
index 8ecdcdb..4f4301c 100644
--- a/tests/unit/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java
@@ -16,76 +16,42 @@
package com.android.car.settings.wifi.details;
-import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.Mockito.when;
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.Context;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceControllerTestUtil;
-import com.android.car.settings.testutils.TestLifecycleOwner;
-import com.android.wifitrackerlib.WifiEntry;
-
-import org.junit.Before;
-import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
-public class WifiMacAddressPreferenceControllerTest {
+public class WifiMacAddressPreferenceControllerTest
+ extends WifiDetailsBasePreferenceControllerTestCase {
private static final String MAC_ADDRESS = "mac_address";
- private Context mContext = ApplicationProvider.getApplicationContext();
- private LifecycleOwner mLifecycleOwner;
- private WifiDetailsPreference mPreference;
private WifiMacAddressPreferenceController mPreferenceController;
- private CarUxRestrictions mCarUxRestrictions;
- @Mock
- private FragmentController mFragmentController;
- @Mock
- private WifiEntry mMockWifiEntry;
- @Mock
- private WifiInfoProvider mMockWifiInfoProvider;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mLifecycleOwner = new TestLifecycleOwner();
-
- mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
- CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
-
- mPreference = new WifiDetailsPreference(mContext);
- mPreferenceController = new WifiMacAddressPreferenceController(mContext,
- /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
- mPreferenceController.init(mMockWifiEntry, mMockWifiInfoProvider);
- PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ @Override
+ protected WifiDetailsBasePreferenceController<WifiDetailsPreference> getController() {
+ if (mPreferenceController == null) {
+ mPreferenceController = new WifiMacAddressPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ }
+ return mPreferenceController;
}
- @Test
- public void onCreate_shouldHaveDetailTextSet() {
- when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
+ @Override
+ protected void setUpConnectedState() {
+ super.setUpConnectedState();
when(mMockWifiEntry.getMacAddress()).thenReturn(MAC_ADDRESS);
- mPreferenceController.onCreate(mLifecycleOwner);
-
- assertThat(mPreference.isVisible()).isTrue();
- assertThat(mPreference.getDetailText()).isEqualTo(MAC_ADDRESS);
}
- @Test
- public void onCreate_isNotActive_preferenceNotVisible() {
- when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED);
+ @Override
+ protected void setUpDisconnectedState() {
+ super.setUpDisconnectedState();
when(mMockWifiEntry.getMacAddress()).thenReturn(null);
- mPreferenceController.onCreate(mLifecycleOwner);
+ }
- assertThat(mPreference.isVisible()).isFalse();
+ @Override
+ protected String getDesiredDetailText() {
+ return MAC_ADDRESS;
}
}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceControllerTest.java
new file mode 100644
index 0000000..8df0265
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceControllerTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.details;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.when;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiSecurityPreferenceControllerTest
+ extends WifiDetailsBasePreferenceControllerTestCase {
+ private static final String TEST_SECURITY_STRING = "test_security";
+
+ private WifiSecurityPreferenceController mPreferenceController;
+
+ @Override
+ protected WifiDetailsBasePreferenceController<WifiDetailsPreference> getController() {
+ if (mPreferenceController == null) {
+ mPreferenceController = new WifiSecurityPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ }
+ return mPreferenceController;
+ }
+
+ @Override
+ protected void setUpConnectedState() {
+ super.setUpConnectedState();
+ when(mMockWifiEntry.getSecurityString(anyBoolean())).thenReturn(TEST_SECURITY_STRING);
+ }
+
+ @Override
+ protected String getDesiredDetailText() {
+ return TEST_SECURITY_STRING;
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java
index e0ab687..c96d715 100644
--- a/tests/unit/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java
@@ -16,79 +16,38 @@
package com.android.car.settings.wifi.details;
-import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.Mockito.when;
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.Context;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.settings.R;
-import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.PreferenceControllerTestUtil;
-import com.android.car.settings.testutils.TestLifecycleOwner;
-import com.android.wifitrackerlib.WifiEntry;
-import org.junit.Before;
-import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
-public class WifiSignalStrengthPreferenceControllerTest {
+public class WifiSignalStrengthPreferenceControllerTest
+ extends WifiDetailsBasePreferenceControllerTestCase {
private static final int LEVEL = 1;
- private Context mContext = ApplicationProvider.getApplicationContext();
- private LifecycleOwner mLifecycleOwner;
- private WifiDetailsPreference mPreference;
private WifiSignalStrengthPreferenceController mPreferenceController;
- private CarUxRestrictions mCarUxRestrictions;
- @Mock
- private FragmentController mFragmentController;
- @Mock
- private WifiEntry mMockWifiEntry;
- @Mock
- private WifiInfoProvider mMockWifiInfoProvider;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mLifecycleOwner = new TestLifecycleOwner();
-
- mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
- CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
-
- mPreference = new WifiDetailsPreference(mContext);
- mPreferenceController = new WifiSignalStrengthPreferenceController(mContext,
- /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
- mPreferenceController.init(mMockWifiEntry, mMockWifiInfoProvider);
- PreferenceControllerTestUtil.assignPreference(mPreferenceController, mPreference);
+ @Override
+ protected WifiDetailsBasePreferenceController<WifiDetailsPreference> getController() {
+ if (mPreferenceController == null) {
+ mPreferenceController = new WifiSignalStrengthPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ }
+ return mPreferenceController;
}
- @Test
- public void onCreate_shouldHaveDetailTextSet() {
- when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
- String expectedStrength =
- mContext.getResources().getStringArray(R.array.wifi_signals)[LEVEL];
+ @Override
+ protected void setUpConnectedState() {
+ super.setUpConnectedState();
when(mMockWifiEntry.getLevel()).thenReturn(LEVEL);
- mPreferenceController.onCreate(mLifecycleOwner);
-
- assertThat(mPreference.isVisible()).isTrue();
- assertThat(mPreference.getDetailText()).isEqualTo(expectedStrength);
}
- @Test
- public void onCreate_isNotActive_preferenceNotVisible() {
- when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED);
- mPreferenceController.onCreate(mLifecycleOwner);
-
- assertThat(mPreference.isVisible()).isFalse();
- assertThat(mPreference.getDetailText()).isNull();
+ @Override
+ protected String getDesiredDetailText() {
+ return mContext.getResources().getStringArray(R.array.wifi_signals)[LEVEL];
}
}
diff --git a/tests/unit/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceControllerTest.java
new file mode 100644
index 0000000..78edf36
--- /dev/null
+++ b/tests/unit/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceControllerTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.details;
+
+import static org.mockito.Mockito.when;
+
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.util.Collections;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiSubnetPreferenceControllerTest
+ extends WifiDetailsBasePreferenceControllerTestCase{
+
+ private WifiSubnetPreferenceController mPreferenceController;
+
+ @Mock
+ private LinkProperties mMockLinkProperties;
+ @Mock
+ private LinkAddress mMockLinkAddress;
+
+ @Override
+ protected void initTest() {
+ when(mMockWifiInfoProvider.getLinkProperties()).thenReturn(mMockLinkProperties);
+ when(mMockLinkProperties.getLinkAddresses()).thenReturn(Collections.emptyList());
+ }
+
+ @Override
+ protected WifiDetailsBasePreferenceController<WifiDetailsPreference> getController() {
+ if (mPreferenceController == null) {
+ mPreferenceController = new WifiSubnetPreferenceController(mContext,
+ /* preferenceKey= */ "key", mFragmentController, mCarUxRestrictions);
+ }
+ return mPreferenceController;
+ }
+
+ @Override
+ protected void setUpConnectedState() {
+ super.setUpConnectedState();
+ when(mMockLinkProperties.getLinkAddresses()).thenReturn(
+ Collections.singletonList(mMockLinkAddress));
+ InetAddress address = Inet4Address.LOOPBACK;
+ when(mMockLinkAddress.getAddress()).thenReturn(address);
+ }
+
+ @Override
+ protected String getDesiredDetailText() {
+ return "0.0.0.0";
+ }
+}
diff --git a/tests/unit/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java
index 9673a00..cdc15dc 100644
--- a/tests/unit/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java
@@ -22,6 +22,7 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;
@@ -30,7 +31,6 @@
import android.content.Context;
import android.location.LocationManager;
import android.net.wifi.WifiManager;
-import android.os.UserHandle;
import android.provider.Settings;
import android.widget.Toast;
@@ -40,12 +40,12 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.car.settings.R;
import com.android.car.settings.common.ColoredSwitchPreference;
import com.android.car.settings.common.ConfirmationDialogFragment;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.PreferenceControllerTestUtil;
import com.android.car.settings.location.LocationSettingsFragment;
-import com.android.car.settings.testutils.ResourceTestUtils;
import com.android.car.settings.testutils.TestLifecycleOwner;
import com.android.dx.mockito.inline.extended.ExtendedMockito;
@@ -59,18 +59,18 @@
@RunWith(AndroidJUnit4.class)
public class WifiWakeupTogglePreferenceControllerTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext = spy(ApplicationProvider.getApplicationContext());
private LifecycleOwner mLifecycleOwner;
private SwitchPreference mSwitchPreference;
private WifiWakeupTogglePreferenceController mPreferenceController;
private CarUxRestrictions mCarUxRestrictions;
- private LocationManager mLocationManager;
- private UserHandle mUserHandle;
private MockitoSession mSession;
@Mock
private FragmentController mFragmentController;
@Mock
+ private LocationManager mLocationManager;
+ @Mock
private WifiManager mWifiManager;
@Mock
private Toast mMockToast;
@@ -83,8 +83,7 @@
mCarUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
- mLocationManager = mContext.getSystemService(LocationManager.class);
- mUserHandle = UserHandle.of(UserHandle.myUserId());
+ when(mContext.getSystemService(LocationManager.class)).thenReturn(mLocationManager);
mSwitchPreference = new ColoredSwitchPreference(mContext);
mPreferenceController = new WifiWakeupTogglePreferenceController(mContext,
@@ -106,7 +105,7 @@
@Test
@UiThreadTest
public void handlePreferenceClicked_locationDisabled_launchFragment() {
- setLocationEnabled(false);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
mPreferenceController.onCreate(mLifecycleOwner);
mSwitchPreference.performClick();
@@ -116,7 +115,7 @@
@Test
public void handlePreferenceClicked_wifiWakeupEnabled_disablesWifiWakeup() {
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
1);
mPreferenceController.onCreate(mLifecycleOwner);
@@ -130,7 +129,7 @@
@Test
public void handlePreferenceClicked_wifiScanningDisabled_showsDialog() {
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
0);
@@ -144,7 +143,7 @@
@Test
public void handlePreferenceClicked_wifiScanningEnabled_wifiWakeupDisabled_enablesWifiWakeup() {
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
0);
@@ -159,7 +158,7 @@
@Test
public void onCreate_wifiWakeupEnabled_wifiScanningEnabled_locationEnabled_isChecked() {
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
1);
@@ -171,7 +170,7 @@
@Test
public void onCreate_wifiWakeupDisabled_wifiScanningEnabled_locationEnabled_isNotChecked() {
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
0);
@@ -183,7 +182,7 @@
@Test
public void onCreate_wifiWakeupEnabled_wifiScanningDisabled_locationEnabled_isNotChecked() {
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
1);
@@ -195,7 +194,7 @@
@Test
public void onCreate_wifiWakeupEnabled_wifiScanningEnabled_locationDisabled_isNotChecked() {
- setLocationEnabled(false);
+ when(mLocationManager.isLocationEnabled()).thenReturn(false);
when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
1);
@@ -209,7 +208,7 @@
@Test
@UiThreadTest
public void onConfirmWifiScanning_setsWifiScanningOn() {
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
ExtendedMockito.when(Toast.makeText(any(), anyString(), anyInt())).thenReturn(mMockToast);
when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
@@ -224,9 +223,10 @@
@Test
@UiThreadTest
public void onConfirmWifiScanning_showsToast() {
- setLocationEnabled(true);
- ExtendedMockito.when(Toast.makeText(any(), eq(ResourceTestUtils.getString(mContext,
- "wifi_settings_scanning_required_enabled")), anyInt())).thenReturn(mMockToast);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
+ String toastString = mContext.getString(R.string.wifi_settings_scanning_required_enabled);
+ ExtendedMockito.when(Toast.makeText(any(), eq(toastString), anyInt()))
+ .thenReturn(mMockToast);
when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
0);
@@ -240,7 +240,7 @@
@Test
@UiThreadTest
public void onConfirmWifiScanning_enablesWifiWakeup() {
- setLocationEnabled(true);
+ when(mLocationManager.isLocationEnabled()).thenReturn(true);
ExtendedMockito.when(Toast.makeText(any(), anyString(), anyInt())).thenReturn(mMockToast);
when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
@@ -252,8 +252,4 @@
assertThat(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.WIFI_WAKEUP_ENABLED, 0)).isEqualTo(1);
}
-
- private void setLocationEnabled(boolean enabled) {
- mLocationManager.setLocationEnabledForUser(enabled, mUserHandle);
- }
}